+static void Ogg_ReadDiracHeader( logical_stream_t *p_stream,
+ ogg_packet *p_oggpacket )
+{
+ bs_t bs;
+
+ p_stream->fmt.i_cat = VIDEO_ES;
+ p_stream->fmt.i_codec = VLC_FOURCC( 'd','r','a','c' );
+ p_stream->i_granule_shift = 32;
+
+ /* Backing up stream headers is not required -- seqhdrs are repeated
+ * thoughout the stream at suitable decoding start points */
+ p_stream->b_force_backup = 0;
+
+ /* read in useful bits from sequence header */
+ bs_init( &bs, p_oggpacket->packet, p_oggpacket->bytes );
+ bs_skip( &bs, 13*8); /* parse_info_header */
+ dirac_uint( &bs ); /* major_version */
+ dirac_uint( &bs ); /* minor_version */
+ dirac_uint( &bs ); /* profile */
+ dirac_uint( &bs ); /* level */
+
+ uint32_t u_video_format = dirac_uint( &bs ); /* index */
+
+ if (dirac_bool( &bs )) {
+ dirac_uint( &bs ); /* frame_width */
+ dirac_uint( &bs ); /* frame_height */
+ }
+
+ if (dirac_bool( &bs )) {
+ dirac_uint( &bs ); /* chroma_format */
+ }
+ if (dirac_bool( &bs )) {
+ if (dirac_bool( &bs )) { /* interlaced */
+ dirac_bool( &bs ); /* top_field_first */
+ }
+ }
+
+ static const struct {
+ uint32_t u_n /* numerator */, u_d /* denominator */;
+ } dirac_frate_tbl[] = { /* table 10.3 */
+ {24000,1001}, {24,1}, {25,1}, {30000,1001}, {30,1},
+ {50,1}, {60000,1001}, {60,1}, {15000,1001}, {25,2},
+ };
+
+ static const uint32_t dirac_vidfmt_frate[] = { /* table C.1 */
+ 1, 9, 10, 9, 10, 9, 10, 4, 3, 7, 6, 4, 3, 7, 6, 2, 2, 7, 6, 7, 6,
+ };
+
+ uint32_t u_n = dirac_frate_tbl[dirac_vidfmt_frate[u_video_format]].u_n;
+ uint32_t u_d = dirac_frate_tbl[dirac_vidfmt_frate[u_video_format]].u_d;
+ if (dirac_bool( &bs )) {
+ uint32_t frame_rate_index = dirac_uint( &bs );
+ u_n = dirac_frate_tbl[frame_rate_index].u_n;
+ u_d = dirac_frate_tbl[frame_rate_index].u_d;
+ if (frame_rate_index == 0) {
+ u_n = dirac_uint( &bs ); /* frame_rate_numerator */
+ u_d = dirac_uint( &bs ); /* frame_rate_denominator */
+ }