+static bool Ogg_ReadDaalaHeader( logical_stream_t *p_stream,
+ ogg_packet *p_oggpacket )
+{
+ oggpack_buffer opb;
+ uint32_t i_timebase_numerator;
+ uint32_t i_timebase_denominator;
+ int i_keyframe_frequency_force;
+ uint8_t i_major;
+ uint8_t i_minor;
+ uint8_t i_subminor;
+ int i_version;
+
+ p_stream->fmt.i_cat = VIDEO_ES;
+ p_stream->fmt.i_codec = VLC_CODEC_DAALA;
+
+ /* Signal that we want to keep a backup of the daala
+ * stream headers. They will be used when switching between
+ * audio streams. */
+ p_stream->b_force_backup = true;
+
+ /* Cheat and get additionnal info ;) */
+ oggpack_readinit( &opb, p_oggpacket->packet, p_oggpacket->bytes );
+ oggpack_adv( &opb, 48 );
+
+ i_major = oggpack_read( &opb, 8 ); /* major version num */
+ i_minor = oggpack_read( &opb, 8 ); /* minor version num */
+ i_subminor = oggpack_read( &opb, 8 ); /* subminor version num */
+
+ oggpack_adv( &opb, 32 ); /* width */
+ oggpack_adv( &opb, 32 ); /* height */
+
+ oggpack_adv( &opb, 32 ); /* aspect numerator */
+ oggpack_adv( &opb, 32 ); /* aspect denominator */
+ i_timebase_numerator = oggpack_read( &opb, 32 );
+
+ i_timebase_denominator = oggpack_read( &opb, 32 );
+ i_timebase_denominator = __MAX( i_timebase_denominator, 1 );
+
+ p_stream->fmt.video.i_frame_rate = i_timebase_numerator;
+ p_stream->fmt.video.i_frame_rate_base = i_timebase_denominator;
+
+ oggpack_adv( &opb, 32 ); /* frame duration */
+
+ i_keyframe_frequency_force = 1 << oggpack_read( &opb, 8 );
+
+ /* granule_shift = i_log( frequency_force -1 ) */
+ p_stream->i_granule_shift = 0;
+ i_keyframe_frequency_force--;
+ while( i_keyframe_frequency_force )
+ {
+ p_stream->i_granule_shift++;
+ i_keyframe_frequency_force >>= 1;
+ }
+
+ i_version = i_major * 1000000 + i_minor * 1000 + i_subminor;
+ p_stream->i_keyframe_offset = 0;
+ p_stream->f_rate = ((double)i_timebase_numerator) / i_timebase_denominator;
+ if ( p_stream->f_rate == 0 ) return false;
+
+ return true;
+}
+