#include "../vobsub.h"
#include "../xiph.h"
#include "../windows_audio_commons.h"
+#include "../mp4/libmp4.h"
}
#include <vlc_codecs.h>
{
while( ( l = ep->Get() ) != NULL )
{
- if( unlikely( l->GetSize() >= SIZE_MAX ) )
+ if( unlikely( !l->ValidateSize() ) )
{
msg_Err( &sys.demuxer,"%s too big... skipping it", typeid(*l).name() );
continue;
{
if( id == EBML_ID(KaxCues) )
{
- msg_Dbg( &sys.demuxer, "| - cues at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - cues at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxCues), i_pos );
}
else if( id == EBML_ID(KaxInfo) )
{
- msg_Dbg( &sys.demuxer, "| - info at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - info at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxInfo), i_pos );
}
else if( id == EBML_ID(KaxChapters) )
{
- msg_Dbg( &sys.demuxer, "| - chapters at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - chapters at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxChapters), i_pos );
}
else if( id == EBML_ID(KaxTags) )
{
- msg_Dbg( &sys.demuxer, "| - tags at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - tags at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxTags), i_pos );
}
else if( id == EBML_ID(KaxSeekHead) )
{
- msg_Dbg( &sys.demuxer, "| - chained seekhead at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - chained seekhead at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxSeekHead), i_pos );
}
else if( id == EBML_ID(KaxTracks) )
{
- msg_Dbg( &sys.demuxer, "| - tracks at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - tracks at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxTracks), i_pos );
}
else if( id == EBML_ID(KaxAttachments) )
{
- msg_Dbg( &sys.demuxer, "| - attachments at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - attachments at %" PRId64, i_pos );
LoadSeekHeadItem( EBML_INFO(KaxAttachments), i_pos );
}
#ifdef MKV_DEBUG
else
- msg_Dbg( &sys.demuxer, "| - unknown seekhead reference at %"PRId64, i_pos );
+ msg_Dbg( &sys.demuxer, "| - unknown seekhead reference at %" PRId64, i_pos );
#endif
}
}
psz_foo2[ 4 * i_level ] = '+';
psz_foo2[ 4 * i_level + 1 ] = ' ';
strcpy( &psz_foo2[ 4 * i_level + 2 ], psz_format );
- msg_GenericVa( &demuxer,VLC_MSG_DBG, "mkv", psz_foo2, args );
+ msg_GenericVa( &demuxer,VLC_MSG_DBG, psz_foo2, args );
free( psz_foo2 );
va_end( args );
}
KaxTrackDefaultDuration &defd = *(KaxTrackDefaultDuration*)l;
tk->i_default_duration = uint64(defd);
- msg_Dbg( &sys.demuxer, "| | | + Track Default Duration=%"PRId64, uint64(defd) );
+ msg_Dbg( &sys.demuxer, "| | | + Track Default Duration=%" PRId64, uint64(defd) );
}
else if( MKV_IS_ID( l, KaxTrackTimecodeScale ) )
{
tk->p_extra_data = (uint8_t*)malloc( tk->i_extra_data );
memcpy( tk->p_extra_data, cpriv.GetBuffer(), tk->i_extra_data );
}
- msg_Dbg( &sys.demuxer, "| | | + Track CodecPrivate size=%"PRId64, cpriv.GetSize() );
+ msg_Dbg( &sys.demuxer, "| | | + Track CodecPrivate size=%" PRId64, cpriv.GetSize() );
}
else if( MKV_IS_ID( l, KaxCodecName ) )
{
{
KaxCodecDelay &codecdelay = *(KaxCodecDelay*)l;
tk->i_codec_delay = uint64_t( codecdelay ) / 1000;
- msg_Dbg( &sys.demuxer, "| | | + Track Codec Delay =%"PRIu64,
+ msg_Dbg( &sys.demuxer, "| | | + Track Codec Delay =%" PRIu64,
tk->i_codec_delay );
}
else if( MKV_IS_ID( l, KaxSeekPreRoll ) )
{
KaxSeekPreRoll &spr = *(KaxSeekPreRoll*)l;
tk->i_seek_preroll = uint64_t(spr) / 1000;
- msg_Dbg( &sys.demuxer, "| | | + Track Seek Preroll =%"PRIu64, tk->i_seek_preroll );
+ msg_Dbg( &sys.demuxer, "| | | + Track Seek Preroll =%" PRIu64, tk->i_seek_preroll );
}
#endif
else if( MKV_IS_ID( l, KaxContentEncodings ) )
int i_upper_level = 0;
/* Master elements */
- if( unlikely( tracks->GetSize() >= SIZE_MAX ) )
+ if( unlikely( tracks->IsFiniteSize() && tracks->GetSize() >= SIZE_MAX ) )
{
msg_Err( &sys.demuxer, "Track too big, aborting" );
return;
/* Master elements */
m = static_cast<EbmlMaster *>(info);
- if( unlikely( m->GetSize() >= SIZE_MAX ) )
+ if( unlikely( m->IsFiniteSize() && m->GetSize() >= SIZE_MAX ) )
{
msg_Err( &sys.demuxer, "Info too big, aborting" );
return;
i_timescale = uint64(tcs);
- msg_Dbg( &sys.demuxer, "| | + TimecodeScale=%"PRId64,
+ msg_Dbg( &sys.demuxer, "| | + TimecodeScale=%" PRId64,
i_timescale );
}
else if( MKV_IS_ID( l, KaxDuration ) )
i_duration = mtime_t( double( dur ) );
- msg_Dbg( &sys.demuxer, "| | + Duration=%"PRId64,
+ msg_Dbg( &sys.demuxer, "| | + Duration=%" PRId64,
i_duration );
}
else if( MKV_IS_ID( l, KaxMuxingApp ) )
KaxChapterTranslate *p_trans = static_cast<KaxChapterTranslate*>( l );
try
{
- if( unlikely( p_trans->GetSize() >= SIZE_MAX ) )
+ if( unlikely( p_trans->IsFiniteSize() && p_trans->GetSize() >= SIZE_MAX ) )
{
msg_Err( &sys.demuxer, "Chapter translate too big, aborting" );
continue;
if( MKV_IS_ID( l, KaxChapterUID ) )
{
chapters.i_uid = uint64_t(*(KaxChapterUID*)l);
- msg_Dbg( &sys.demuxer, "| | | | + ChapterUID: %"PRIu64"", chapters.i_uid );
+ msg_Dbg( &sys.demuxer, "| | | | + ChapterUID: %" PRIu64, chapters.i_uid );
}
else if( MKV_IS_ID( l, KaxChapterFlagHidden ) )
{
KaxChapterTimeStart &start =*(KaxChapterTimeStart*)l;
chapters.i_start_time = uint64( start ) / INT64_C(1000);
- msg_Dbg( &sys.demuxer, "| | | | + ChapterTimeStart: %"PRId64"", chapters.i_start_time );
+ msg_Dbg( &sys.demuxer, "| | | | + ChapterTimeStart: %" PRId64, chapters.i_start_time );
}
else if( MKV_IS_ID( l, KaxChapterTimeEnd ) )
{
KaxChapterTimeEnd &end =*(KaxChapterTimeEnd*)l;
chapters.i_end_time = uint64( end ) / INT64_C(1000);
- msg_Dbg( &sys.demuxer, "| | | | + ChapterTimeEnd: %"PRId64"", chapters.i_end_time );
+ msg_Dbg( &sys.demuxer, "| | | | + ChapterTimeEnd: %" PRId64, chapters.i_end_time );
}
else if( MKV_IS_ID( l, KaxChapterDisplay ) )
{
EbmlElement *el;
int i_upper_level = 0;
- if( unlikely( attachments->GetSize() >= SIZE_MAX ) )
+ if( unlikely( attachments->IsFiniteSize() && attachments->GetSize() >= SIZE_MAX ) )
{
msg_Err( &sys.demuxer, "Attachments too big, aborting" );
return;
int i_upper_level = 0;
/* Master elements */
- if( unlikely( chapters->GetSize() >= SIZE_MAX ) )
+ if( unlikely( chapters->IsFiniteSize() && chapters->GetSize() >= SIZE_MAX ) )
{
msg_Err( &sys.demuxer, "Chapters too big, aborting" );
return;
}
}
-void matroska_segment_c::ParseCluster( bool b_update_start_time )
+void matroska_segment_c::ParseCluster( KaxCluster *cluster, bool b_update_start_time, ScopeMode read_fully )
{
EbmlElement *el;
EbmlMaster *m;
/* Master elements */
m = static_cast<EbmlMaster *>( cluster );
- if( unlikely( m->GetSize() >= SIZE_MAX ) )
+ if( unlikely( m->IsFiniteSize() && m->GetSize() >= SIZE_MAX ) )
{
msg_Err( &sys.demuxer, "Cluster too big, aborting" );
return;
}
try
{
- m->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true );
+ m->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true, read_fully );
}
catch(...)
{
}
else if( !strcmp( p_tk->psz_codec, "A_AC3" ) )
{
+ // the AC-3 default duration cannot be trusted, see #8512
+ if ( p_tk->fmt.audio.i_rate == 8000 )
+ {
+ p_tk->b_no_duration = true;
+ p_tk->i_default_duration = 0;
+ }
p_tk->fmt.i_codec = VLC_CODEC_A52;
}
else if( !strcmp( p_tk->psz_codec, "A_EAC3" ) )