diff --git a/modules/demux/mp4/libmp4.c b/modules/demux/mp4/libmp4.c index 8996cd7ae869ce858ee9e1590ce4fcf09c9d82f4..3ea7d8619e16b9681795f5ea3e27b8f9e036bbb9 100644 --- a/modules/demux/mp4/libmp4.c +++ b/modules/demux/mp4/libmp4.c @@ -1665,8 +1665,8 @@ static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box ) { /* SoundDescriptionV2 */ double f_sample_rate; - int64_t dummy; - uint32_t i_channel; + int64_t i_dummy64; + uint32_t i_channel, i_extoffset, i_dummy32; /* Checks */ if ( p_box->data.p_sample_soun->i_channelcount != 0x3 || @@ -1676,15 +1676,14 @@ static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box ) p_box->data.p_sample_soun->i_sampleratehi != 0x1 ||//65536 p_box->data.p_sample_soun->i_sampleratelo != 0x0 ) //remainder { - msg_Err( p_stream, "invalid stsd V2 box" ); + msg_Err( p_stream, "invalid stsd V2 box defaults" ); MP4_READBOX_EXIT( 0 ); } /* !Checks */ - MP4_GET4BYTES( p_box->data.p_sample_soun->i_sample_per_packet ); - MP4_GET8BYTES( dummy ); - memcpy( &f_sample_rate, &dummy, 8 ); - + MP4_GET4BYTES( i_extoffset ); /* offset to stsd extentions */ + MP4_GET8BYTES( i_dummy64 ); + memcpy( &f_sample_rate, &i_dummy64, 8 ); msg_Dbg( p_stream, "read box: %f Hz", f_sample_rate ); p_box->data.p_sample_soun->i_sampleratehi = (int)f_sample_rate % BLOCK16x16; p_box->data.p_sample_soun->i_sampleratelo = f_sample_rate / BLOCK16x16; @@ -1692,11 +1691,31 @@ static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box ) MP4_GET4BYTES( i_channel ); p_box->data.p_sample_soun->i_channelcount = i_channel; + MP4_GET4BYTES( i_dummy32 ); + if ( i_dummy32 != 0x7F000000 ) + { + msg_Err( p_stream, "invalid stsd V2 box" ); + MP4_READBOX_EXIT( 0 ); + } + + MP4_GET4BYTES( p_box->data.p_sample_soun->i_constbitsperchannel ); + MP4_GET4BYTES( p_box->data.p_sample_soun->i_formatflags ); + MP4_GET4BYTES( p_box->data.p_sample_soun->i_constbytesperaudiopacket ); + MP4_GET4BYTES( p_box->data.p_sample_soun->i_constLPCMframesperaudiopacket ); + #ifdef MP4_VERBOSE - msg_Dbg( p_stream, "read box: \"soun\" V2" ); + msg_Dbg( p_stream, "read box: \"soun\" V2 rate=%f bitsperchannel=%u " + "flags=%u bytesperpacket=%u lpcmframesperpacket=%u", + f_sample_rate, + p_box->data.p_sample_soun->i_constbitsperchannel, + p_box->data.p_sample_soun->i_formatflags, + p_box->data.p_sample_soun->i_constbytesperaudiopacket, + p_box->data.p_sample_soun->i_constLPCMframesperaudiopacket ); #endif - stream_Seek( p_stream, p_box->i_pos + - mp4_box_headersize( p_box ) + 28 + 36 ); + if ( i_extoffset < p_box->i_size ) + stream_Seek( p_stream, p_box->i_pos + i_extoffset ); + else + stream_Seek( p_stream, p_box->i_pos + p_box->i_size ); } else { @@ -1725,6 +1744,7 @@ static int MP4_ReadBox_sample_soun( stream_t *p_stream, MP4_Box_t *p_box ) p_box->data.p_sample_soun->i_channelcount = 1; } + /* Loads extensions */ MP4_ReadBoxContainerRaw( p_stream, p_box ); /* esds/wave/... */ #ifdef MP4_VERBOSE diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h index 967dfe79f55dfdd5ae9803eaf2eab05b59213a92..7b2cbfc961160eddb019c39221215780b9e4189f 100644 --- a/modules/demux/mp4/libmp4.h +++ b/modules/demux/mp4/libmp4.h @@ -508,6 +508,12 @@ typedef struct MP4_Box_data_sample_soun_s uint32_t i_bytes_per_frame; uint32_t i_bytes_per_sample; + /* v2 */ + uint32_t i_constbitsperchannel; /* consts are nonzero only if constant */ + uint32_t i_formatflags; + uint32_t i_constbytesperaudiopacket; + uint32_t i_constLPCMframesperaudiopacket; + /* XXX hack */ int i_qt_description; uint8_t *p_qt_description; diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c index 8173ffe5eb1a1a96d4e930a429b10175dedf9ca4..320d122f8c328be4b76944ac73bdada240fad590 100644 --- a/modules/demux/mp4/mp4.c +++ b/modules/demux/mp4/mp4.c @@ -2448,8 +2448,7 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track, case VLC_CODEC_DVD_LPCM: { MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun; - if( p_soun->i_qt_version == 2 && - p_soun->i_qt_description > 20 + 28 ) + if( p_soun->i_qt_version == 2 ) { /* Flags: * 0x01: IsFloat @@ -2487,17 +2486,16 @@ static int TrackCreateES( demux_t *p_demux, mp4_track_t *p_track, {0, 0, 0, 0} }; - uint32_t i_bits = GetDWBE(&p_soun->p_qt_description[20 + 20]); - uint32_t i_flags = GetDWBE(&p_soun->p_qt_description[20 + 24]); for( int i = 0; p_formats[i].i_codec; i++ ) { - if( p_formats[i].i_bits == i_bits && - (i_flags & p_formats[i].i_mask) == p_formats[i].i_flags ) + if( p_formats[i].i_bits == p_soun->i_constbitsperchannel && + (p_soun->i_formatflags & p_formats[i].i_mask) == p_formats[i].i_flags ) { p_track->fmt.i_codec = p_formats[i].i_codec; - p_track->fmt.audio.i_bitspersample = i_bits; - p_track->fmt.audio.i_blockalign = p_soun->i_channelcount * i_bits / 8; + p_track->fmt.audio.i_bitspersample = p_soun->i_constbitsperchannel; + p_track->fmt.audio.i_blockalign = + p_soun->i_channelcount * p_soun->i_constbitsperchannel / 8; p_track->i_sample_size = p_track->fmt.audio.i_blockalign; p_soun->i_qt_version = 0;