1
mirror of https://code.videolan.org/videolan/vlc synced 2024-09-04 09:11:33 +02:00

* modules/demux/asf/asf.c: ignore the ES extra data for mpeg audio.

* modules/mux/asf.c: bring the tracks back to a 0 based offset.
This commit is contained in:
Gildas Bazin 2004-08-27 20:44:39 +00:00
parent 1d08e9ca23
commit 24f83b8b4f
2 changed files with 23 additions and 15 deletions

View File

@ -647,23 +647,29 @@ static int DemuxInit( demux_t *p_demux )
if( ASF_CmpGUID( &p_sp->i_stream_type, &asf_object_stream_type_audio ) &&
p_sp->i_type_specific_data_length >= sizeof( WAVEFORMATEX ) - 2 )
{
es_format_t fmt;
uint8_t *p_data = p_sp->p_type_specific_data;
es_format_t fmt;
uint8_t *p_data = p_sp->p_type_specific_data;
int i_format;
es_format_Init( &fmt, AUDIO_ES, 0 );
wf_tag_to_fourcc( GetWLE( &p_data[0] ), &fmt.i_codec, NULL );
i_format = GetWLE( &p_data[0] );
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] );
if( p_sp->i_type_specific_data_length > sizeof( WAVEFORMATEX ) )
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 ) );
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 );
memcpy( fmt.p_extra, &p_data[sizeof( WAVEFORMATEX )],
fmt.i_extra );
}
tk->i_cat = AUDIO_ES;

View File

@ -33,6 +33,8 @@
#include "codecs.h"
typedef GUID guid_t;
#define MAX_ASF_TRACKS 128
/*****************************************************************************
* Module descriptor
*****************************************************************************/
@ -116,7 +118,7 @@ struct sout_mux_sys_t
int64_t i_bitrate;
int i_track;
asf_track_t track[128];
asf_track_t track[MAX_ASF_TRACKS];
vlc_bool_t b_write_header;
@ -194,7 +196,7 @@ static int Open( vlc_object_t *p_this )
p_sys->i_seq = 0;
p_sys->b_write_header = VLC_TRUE;
p_sys->i_track = 1;
p_sys->i_track = 0;
p_sys->i_packet_size = 4096;
p_sys->i_packet_count= 0;
@ -262,7 +264,7 @@ static void Close( vlc_object_t * p_this )
sout_AccessOutWrite( p_mux->p_access, out );
}
for( i = 1; i < p_sys->i_track; i++ )
for( i = 0; i < p_sys->i_track; i++ )
{
free( p_sys->track[i].p_extra );
}
@ -314,7 +316,7 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
bo_t bo;
msg_Dbg( p_mux, "adding input" );
if( p_sys->i_track > 127 )
if( p_sys->i_track >= MAX_ASF_TRACKS )
{
msg_Dbg( p_mux, "cannot add this track (too much track)" );
return VLC_EGENERIC;
@ -785,7 +787,7 @@ static block_t *asf_header_create( sout_mux_t *p_mux, vlc_bool_t b_broadcast )
/* calculate header size */
i_size = 30 + 104 + 46;
i_ci_size = 44;
for( i = 1; i < p_sys->i_track; i++ )
for( i = 0; i < p_sys->i_track; i++ )
{
i_size += 78 + p_sys->track[i].i_extra;
i_ci_size += 8 + 2 * strlen( p_sys->track[i].psz_name );
@ -826,7 +828,7 @@ static block_t *asf_header_create( sout_mux_t *p_mux, vlc_bool_t b_broadcast )
/* header object */
bo_add_guid ( &bo, &asf_object_header_guid );
bo_addle_u64( &bo, i_size );
bo_addle_u32( &bo, 2 + p_sys->i_track - 1 );
bo_addle_u32( &bo, 2 + p_sys->i_track );
bo_add_u8 ( &bo, 1 );
bo_add_u8 ( &bo, 2 );
@ -874,7 +876,7 @@ static block_t *asf_header_create( sout_mux_t *p_mux, vlc_bool_t b_broadcast )
}
/* stream properties */
for( i = 1; i < p_sys->i_track; i++ )
for( i = 0; i < p_sys->i_track; i++ )
{
tk = &p_sys->track[i];
@ -902,8 +904,8 @@ static block_t *asf_header_create( sout_mux_t *p_mux, vlc_bool_t b_broadcast )
bo_add_guid ( &bo, &asf_object_codec_comment_guid );
bo_addle_u64( &bo, i_ci_size );
bo_add_guid ( &bo, &asf_object_codec_comment_reserved_guid );
bo_addle_u32( &bo, p_sys->i_track - 1 );
for( i = 1; i < p_sys->i_track; i++ )
bo_addle_u32( &bo, p_sys->i_track );
for( i = 0; i < p_sys->i_track; i++ )
{
tk = &p_sys->track[i];