+ else if( ASF_CmpGUID( &p_sp->i_stream_type, &asf_object_extended_stream_header ) &&
+ p_sp->i_type_specific_data_length >= 64 )
+ {
+ /* Now follows a 64 byte header of which we don't know much */
+ guid_t *p_ref = (guid_t *)p_sp->p_type_specific_data;
+ uint8_t *p_data = p_sp->p_type_specific_data + 64;
+ unsigned int i_data = p_sp->i_type_specific_data_length - 64;
+
+ msg_Dbg( p_demux, "Ext stream header detected. datasize = %d", p_sp->i_type_specific_data_length );
+ if( ASF_CmpGUID( p_ref, &asf_object_extended_stream_type_audio ) &&
+ i_data >= sizeof( WAVEFORMATEX ) - 2)
+ {
+ int i_format;
+ es_format_Init( &fmt, AUDIO_ES, 0 );
+ i_format = GetWLE( &p_data[0] );
+ if( i_format == 0 )
+ fmt.i_codec = VLC_CODEC_A52;
+ else
+ wf_tag_to_fourcc( i_format, &fmt.i_codec, NULL );
+ fmt.audio.i_channels = GetWLE( &p_data[2] );
+ fmt.audio.i_rate = GetDWLE( &p_data[4] );
+ fmt.i_bitrate = GetDWLE( &p_data[8] ) * 8;
+ fmt.audio.i_blockalign = GetWLE( &p_data[12] );
+ fmt.audio.i_bitspersample = GetWLE( &p_data[14] );
+ fmt.b_packetized = true;
+
+ if( p_sp->i_type_specific_data_length > sizeof( WAVEFORMATEX ) &&
+ i_format != WAVE_FORMAT_MPEGLAYER3 &&
+ i_format != WAVE_FORMAT_MPEG )
+ {
+ fmt.i_extra = __MIN( GetWLE( &p_data[16] ),
+ p_sp->i_type_specific_data_length -
+ sizeof( WAVEFORMATEX ) );
+ fmt.p_extra = malloc( fmt.i_extra );
+ memcpy( fmt.p_extra, &p_data[sizeof( WAVEFORMATEX )],
+ fmt.i_extra );
+ }
+
+ msg_Dbg( p_demux, "added new audio stream (codec:0x%x,ID:%d)",
+ i_format, p_sp->i_stream_number );
+ }
+ else
+ {
+ es_format_Init( &fmt, UNKNOWN_ES, 0 );
+ }
+ }
+ else
+ {
+ es_format_Init( &fmt, UNKNOWN_ES, 0 );
+ }
+
+ tk->i_cat = fmt.i_cat;
+ if( fmt.i_cat != UNKNOWN_ES )
+ {
+ if( p_esp && p_languages &&
+ p_esp->i_language_index >= 0 &&
+ p_esp->i_language_index < p_languages->i_language )
+ {
+ fmt.psz_language = strdup( p_languages->ppsz_language[p_esp->i_language_index] );
+ char *p;
+ if( fmt.psz_language && (p = strchr( fmt.psz_language, '-' )) )
+ *p = '\0';
+ }
+
+ tk->p_es = es_out_Add( p_demux->out, &fmt );
+ }