[vlc-commits] [Git][videolan/vlc][3.0.x] 5 commits: demux: mkv: use local upper element handling
Steve Lhomme (@robUx4)
gitlab at videolan.org
Thu Aug 28 16:03:04 UTC 2025
Steve Lhomme pushed to branch 3.0.x at VideoLAN / VLC
Commits:
49aa2af7 by Steve Lhomme at 2025-08-28T15:31:57+00:00
demux: mkv: use local upper element handling
We don't need to keep the data in the parser.
(cherry picked from commit f2b070a8ef74407777896cd6b702ee2c72e07fae) (edited)
edited:
- 3.0 doesn't keep the duration
- - - - -
98b5a0b2 by Steve Lhomme at 2025-08-28T15:31:57+00:00
demux: mkv: release upper EBML elements when reading an element in memory
The element is created but we don't use it.
Fixes #29260
(cherry picked from commit 74407acf6547bdd644063d739c54c4b421661d22) (edited)
- 3.0 doesn't read tags fully in memory
- - - - -
8e85ff80 by Steve Lhomme at 2025-08-28T15:31:57+00:00
demux: mkv: allow dummy elements inside KaxBlockAdditions
There might be new elements that libmatroska doesn't know about.
It's better to assume they are new elements rather than bogus data.
This is how we read elements in general to be forward compatible.
(cherry picked from commit 30ec492274356c7c5795d3d3a87dd06e943b8253)
- - - - -
1e8f353b by Steve Lhomme at 2025-08-28T15:31:57+00:00
demux: mkv: remove unnecessary cast
(cherry picked from commit 0fe8906c08593379f713cee634dddb5e6c66de58)
- - - - -
bad977d0 by Steve Lhomme at 2025-08-28T15:31:57+00:00
demux: mkv: factorize code to read a whole master element
(cherry picked from commit 6a9d6e8e92527853a8c0fde4069411cd0fe07614) (edited)
edited:
- 3.0 doesn't read tags fully in memory
- 3.0 doesn't have an internal b_seekable flag
- 3.0 doesn't know about demux_sys_t in the header so move code in .cpp
- - - - -
3 changed files:
- modules/demux/mkv/matroska_segment.cpp
- modules/demux/mkv/matroska_segment.hpp
- modules/demux/mkv/matroska_segment_parse.cpp
Changes:
=====================================
modules/demux/mkv/matroska_segment.cpp
=====================================
@@ -1294,14 +1294,11 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
}
E_CASE( KaxBlockAdditions, kadditions )
{
- EbmlElement *el;
- int i_upper_level = 0;
- try
+ if ( vars.obj->ReadMaster( kadditions ) )
{
- kadditions.Read( vars.obj->es, EBML_CONTEXT(&kadditions), i_upper_level, el, false );
vars.additions = &kadditions;
vars.ep->Keep ();
- } catch (...) {}
+ }
}
E_CASE( KaxBlockDuration, kduration )
{
@@ -1466,3 +1463,30 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
}
}
}
+
+bool matroska_segment_c::ReadMaster(EbmlMaster & m, ScopeMode scope)
+{
+ if( unlikely( m.IsFiniteSize() && m.GetSize() >= SIZE_MAX ) )
+ {
+ msg_Err( VLC_OBJECT(&sys.demuxer), "%s too big, aborting", EBML_NAME(&m) );
+ return false;
+ }
+ try
+ {
+ EbmlElement *el;
+ int i_upper_level = 0;
+ m.Read( es, EBML_CONTEXT(&m), i_upper_level, el, true, scope );
+ if (i_upper_level != 0)
+ {
+ assert(el != nullptr);
+ delete el;
+ }
+ }
+ catch(...)
+ {
+ msg_Err( VLC_OBJECT(&sys.demuxer), "Couldn't read %s", EBML_NAME(&m) );
+ return false;
+ }
+
+ return true;
+}
=====================================
modules/demux/mkv/matroska_segment.hpp
=====================================
@@ -156,6 +156,9 @@ public:
bool SameFamily( const matroska_segment_c & of_segment ) const;
+ // read a whole EBML master element at once
+ bool ReadMaster(EbmlMaster & m, ScopeMode scope = SCOPE_ALL_DATA);
+
private:
void LoadCues( KaxCues *cues );
void LoadTags( KaxTags *tags );
=====================================
modules/demux/mkv/matroska_segment_parse.cpp
=====================================
@@ -922,24 +922,9 @@ void matroska_segment_c::ParseTrackEntry( const KaxTrackEntry *m )
*****************************************************************************/
void matroska_segment_c::ParseTracks( KaxTracks *tracks )
{
- EbmlElement *el;
- int i_upper_level = 0;
-
/* Master elements */
- if( unlikely( tracks->IsFiniteSize() && tracks->GetSize() >= SIZE_MAX ) )
- {
- msg_Err( &sys.demuxer, "Track too big, aborting" );
+ if ( !ReadMaster( *tracks ) )
return;
- }
- try
- {
- tracks->Read( es, EBML_CONTEXT(tracks), i_upper_level, el, true );
- }
- catch(...)
- {
- msg_Err( &sys.demuxer, "Couldn't read tracks" );
- return;
- }
struct Capture {
matroska_segment_c * obj;
@@ -978,35 +963,17 @@ void matroska_segment_c::ParseTracks( KaxTracks *tracks )
*****************************************************************************/
void matroska_segment_c::ParseInfo( KaxInfo *info )
{
- EbmlElement *el;
- EbmlMaster *m;
- int i_upper_level = 0;
+ EbmlMaster *m = info;
- /* Master elements */
- m = static_cast<EbmlMaster *>(info);
- if( unlikely( m->IsFiniteSize() && m->GetSize() >= SIZE_MAX ) )
- {
- msg_Err( &sys.demuxer, "Info too big, aborting" );
- return;
- }
- try
- {
- m->Read( es, EBML_CONTEXT(info), i_upper_level, el, true );
- }
- catch(...)
- {
- msg_Err( &sys.demuxer, "Couldn't read info" );
+ if ( !ReadMaster( *info ) )
return;
- }
struct InfoHandlerPayload {
demux_t * p_demuxer;
matroska_segment_c * obj;
- EbmlElement *& el;
EbmlMaster *& m;
- int& i_upper_level;
- } captures = { &sys.demuxer, this, el, m, i_upper_level };
+ } captures = { &sys.demuxer, this, m };
MKV_SWITCH_CREATE(EbmlTypeDispatcher, InfoHandlers, InfoHandlerPayload)
{
@@ -1114,13 +1081,8 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
};
try
{
- if( unlikely( trans.IsFiniteSize() && trans.GetSize() >= SIZE_MAX ) )
- {
- msg_Err( vars.p_demuxer, "Chapter translate too big, aborting" );
+ if ( !vars.obj->ReadMaster( trans ) )
return;
- }
-
- trans.Read( vars.obj->es, EBML_CONTEXT(&trans), vars.i_upper_level, vars.el, true );
chapter_translation_c *p_translate = new chapter_translation_c();
@@ -1310,23 +1272,8 @@ void matroska_segment_c::ParseChapterAtom( int i_level, KaxChapterAtom *ca, chap
*****************************************************************************/
void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
{
- EbmlElement *el;
- int i_upper_level = 0;
-
- if( unlikely( attachments->IsFiniteSize() && attachments->GetSize() >= SIZE_MAX ) )
- {
- msg_Err( &sys.demuxer, "Attachments too big, aborting" );
- return;
- }
- try
- {
- attachments->Read( es, EBML_CONTEXT(attachments), i_upper_level, el, true );
- }
- catch(...)
- {
- msg_Err( &sys.demuxer, "Error while reading attachments" );
+ if ( !ReadMaster( *attachments ))
return;
- }
KaxAttached *attachedFile = FindChild<KaxAttached>( *attachments );
@@ -1372,22 +1319,9 @@ void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
*****************************************************************************/
void matroska_segment_c::ParseChapters( KaxChapters *chapters )
{
- if( unlikely( chapters->IsFiniteSize() && chapters->GetSize() >= SIZE_MAX ) )
- {
- msg_Err( &sys.demuxer, "Chapters too big, aborting" );
- return;
- }
- try
- {
- EbmlElement *el;
- int i_upper_level = 0;
- chapters->Read( es, EBML_CONTEXT(chapters), i_upper_level, el, true );
- }
- catch(...)
- {
- msg_Err( &sys.demuxer, "Error while reading chapters" );
+ if ( !ReadMaster( *chapters ) )
return;
- }
+
MKV_SWITCH_CREATE( EbmlTypeDispatcher, KaxChapterHandler, matroska_segment_c )
{
MKV_SWITCH_INIT();
@@ -1455,29 +1389,13 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
bool matroska_segment_c::ParseCluster( KaxCluster *cluster, bool b_update_start_time, ScopeMode read_fully )
{
- if( unlikely( cluster->IsFiniteSize() && cluster->GetSize() >= SIZE_MAX ) )
- {
- msg_Err( &sys.demuxer, "Cluster too big, aborting" );
- return false;
- }
-
bool b_seekable;
vlc_stream_Control( sys.demuxer.s, STREAM_CAN_SEEK, &b_seekable );
if (!b_seekable)
return false;
- try
- {
- EbmlElement *el;
- int i_upper_level = 0;
-
- cluster->Read( es, EBML_CONTEXT(cluster), i_upper_level, el, true, read_fully );
- }
- catch(...)
- {
- msg_Err( &sys.demuxer, "Error while reading cluster" );
+ if ( !ReadMaster( *cluster, read_fully ) )
return false;
- }
bool b_has_timecode = false;
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/30f31c7ed61cf7ac57a7b2fd108338c75a258b89...bad977d0342751fcbcb8d885226ce5fbd8bbffd0
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/30f31c7ed61cf7ac57a7b2fd108338c75a258b89...bad977d0342751fcbcb8d885226ce5fbd8bbffd0
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list