+static void Ogg_ReadSpeexHeader( logical_stream_t *p_stream,
+ ogg_packet *p_oggpacket )
+{
+ oggpack_buffer opb;
+
+ p_stream->fmt.i_cat = AUDIO_ES;
+ p_stream->fmt.i_codec = VLC_FOURCC( 's','p','x',' ' );
+
+ /* Signal that we want to keep a backup of the speex
+ * stream headers. They will be used when switching between
+ * audio streams. */
+ p_stream->b_force_backup = 1;
+
+ /* Cheat and get additionnal info ;) */
+ oggpack_readinit( &opb, p_oggpacket->packet, p_oggpacket->bytes);
+ oggpack_adv( &opb, 224 );
+ oggpack_adv( &opb, 32 ); /* speex_version_id */
+ oggpack_adv( &opb, 32 ); /* header_size */
+ p_stream->f_rate = p_stream->fmt.audio.i_rate = oggpack_read( &opb, 32 );
+ oggpack_adv( &opb, 32 ); /* mode */
+ oggpack_adv( &opb, 32 ); /* mode_bitstream_version */
+ p_stream->fmt.audio.i_channels = oggpack_read( &opb, 32 );
+ p_stream->fmt.i_bitrate = oggpack_read( &opb, 32 );
+}
+
+static void Ogg_ReadFlacHeader( demux_t *p_demux, logical_stream_t *p_stream,
+ ogg_packet *p_oggpacket )
+{
+ /* Parse the STREAMINFO metadata */
+ bs_t s;
+
+ bs_init( &s, p_oggpacket->packet, p_oggpacket->bytes );
+
+ bs_read( &s, 1 );
+ if( bs_read( &s, 7 ) == 0 )
+ {
+ if( bs_read( &s, 24 ) >= 34 /*size STREAMINFO*/ )
+ {
+ bs_skip( &s, 80 );
+ p_stream->f_rate = p_stream->fmt.audio.i_rate = bs_read( &s, 20 );
+ p_stream->fmt.audio.i_channels = bs_read( &s, 3 ) + 1;
+
+ msg_Dbg( p_demux, "FLAC header, channels: %i, rate: %i",
+ p_stream->fmt.audio.i_channels, (int)p_stream->f_rate );
+ }
+ else msg_Dbg( p_demux, "FLAC STREAMINFO metadata too short" );
+
+ /* Fake this as the last metadata block */
+ *((uint8_t*)p_oggpacket->packet) |= 0x80;
+ }
+ else
+ {
+ /* This ain't a STREAMINFO metadata */
+ msg_Dbg( p_demux, "Invalid FLAC STREAMINFO metadata" );
+ }
+}
+