From e527210321013fd477673c36c472e3ca9a2a9fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Ros=C3=A9en?= Date: Fri, 4 Mar 2016 17:04:13 +0100 Subject: [PATCH] mkv: removed unnecessary dynamic memory allocations As written in the commit title, a few uses of dynamic memory management has been removed, effectivelly fixing a memory leak as well as making the code cleaner/faster. Signed-off-by: Jean-Baptiste Kempf --- modules/demux/mkv/matroska_segment.cpp | 57 +++++++++++--------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index a634ebdd74..452173a273 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -108,7 +108,6 @@ matroska_segment_c::~matroska_segment_c() void matroska_segment_c::LoadCues( KaxCues *cues ) { bool b_invalid_cue; - EbmlParser *ep; EbmlElement *el; if( b_cues ) @@ -117,9 +116,8 @@ void matroska_segment_c::LoadCues( KaxCues *cues ) return; } - ep = new EbmlParser( &es, cues, &sys.demuxer, - var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); - while( ( el = ep->Get() ) != NULL ) + EbmlParser eparser (&es, cues, &sys.demuxer, var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); + while( ( el = eparser.Get() ) != NULL ) { if( MKV_IS_ID( el, KaxCuePoint ) ) { @@ -132,8 +130,8 @@ void matroska_segment_c::LoadCues( KaxCues *cues ) last_idx.i_mk_time = -1; last_idx.b_key = true; - ep->Down(); - while( ( el = ep->Get() ) != NULL ) + eparser.Down(); + while( ( el = eparser.Get() ) != NULL ) { if ( MKV_CHECKED_PTR_DECL( kct_ptr, KaxCueTime, el ) ) { @@ -157,14 +155,14 @@ void matroska_segment_c::LoadCues( KaxCues *cues ) } else if( MKV_IS_ID( el, KaxCueTrackPositions ) ) { - ep->Down(); + eparser.Down(); try { - while( ( el = ep->Get() ) != NULL ) + while( ( el = eparser.Get() ) != NULL ) { if( unlikely( !el->ValidateSize() ) ) { - ep->Up(); + eparser.Up(); msg_Err( &sys.demuxer, "Error %s too big, aborting", typeid(*el).name() ); b_invalid_cue = true; break; @@ -203,19 +201,19 @@ void matroska_segment_c::LoadCues( KaxCues *cues ) } catch(...) { - ep->Up(); + eparser.Up(); msg_Err( &sys.demuxer, "Error while reading %s", typeid(*el).name() ); b_invalid_cue = true; break; } - ep->Up(); + eparser.Up(); } else { msg_Dbg( &sys.demuxer, " * Unknown (%s)", typeid(*el).name() ); } } - ep->Up(); + eparser.Up(); #if 0 msg_Dbg( &sys.demuxer, " * added time=%" PRId64 " pos=%" PRId64 @@ -230,7 +228,6 @@ void matroska_segment_c::LoadCues( KaxCues *cues ) msg_Dbg( &sys.demuxer, " * Unknown (%s)", typeid(*el).name() ); } } - delete ep; b_cues = true; msg_Dbg( &sys.demuxer, "| - loading cues done." ); } @@ -262,9 +259,8 @@ static const struct { SimpleTag * matroska_segment_c::ParseSimpleTags( KaxTagSimple *tag, int target_type ) { + EbmlParser eparser ( &es, tag, &sys.demuxer, var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); EbmlElement *el; - EbmlParser *ep = new EbmlParser( &es, tag, &sys.demuxer, - var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); SimpleTag * p_simple = new (std::nothrow) SimpleTag; size_t max_size = tag->GetSize(); size_t size = 0; @@ -281,7 +277,7 @@ SimpleTag * matroska_segment_c::ParseSimpleTags( KaxTagSimple *tag, int target_t msg_Dbg( &sys.demuxer, "| + Simple Tag "); try { - while( ( el = ep->Get() ) != NULL && size < max_size) + while( ( el = eparser.Get() ) != NULL && size < max_size) { if( unlikely( !el->ValidateSize() ) ) { @@ -328,7 +324,6 @@ SimpleTag * matroska_segment_c::ParseSimpleTags( KaxTagSimple *tag, int target_t delete p_simple; return NULL; } - delete ep; if( !p_simple->psz_tag_name || !p_simple->p_value ) { @@ -366,10 +361,10 @@ done: void matroska_segment_c::LoadTags( KaxTags *tags ) { /* Master elements */ - EbmlParser *ep = new EbmlParser( &es, tags, &sys.demuxer, true ); + EbmlParser eparser = EbmlParser( &es, tags, &sys.demuxer, true ); EbmlElement *el; - while( ( el = ep->Get() ) != NULL ) + while( ( el = eparser.Get() ) != NULL ) { if( MKV_IS_ID( el, KaxTag ) ) { @@ -380,15 +375,15 @@ void matroska_segment_c::LoadTags( KaxTags *tags ) continue; } msg_Dbg( &sys.demuxer, "+ Tag" ); - ep->Down(); + eparser.Down(); int target_type = 50; - while( ( el = ep->Get() ) != NULL ) + while( ( el = eparser.Get() ) != NULL ) { if( MKV_IS_ID( el, KaxTagTargets ) ) { msg_Dbg( &sys.demuxer, "| + Targets" ); - ep->Down(); - while( ( el = ep->Get() ) != NULL ) + eparser.Down(); + while( ( el = eparser.Get() ) != NULL ) { try { @@ -444,7 +439,7 @@ void matroska_segment_c::LoadTags( KaxTags *tags ) break; } } - ep->Up(); + eparser.Up(); } else if( MKV_CHECKED_PTR_DECL ( kts_ptr, KaxTagSimple, el ) ) { @@ -495,7 +490,7 @@ void matroska_segment_c::LoadTags( KaxTags *tags ) msg_Dbg( &sys.demuxer, "| + LoadTag Unknown (%s)", typeid( *el ).name() ); } } - ep->Up(); + eparser.Up(); this->tags.push_back(p_tag); } else @@ -503,7 +498,6 @@ void matroska_segment_c::LoadTags( KaxTags *tags ) msg_Dbg( &sys.demuxer, "+ Unknown (%s)", typeid( *el ).name() ); } } - delete ep; msg_Dbg( &sys.demuxer, "loading tags done." ); } @@ -1220,13 +1214,12 @@ void matroska_segment_c::EnsureDuration() // find the last timecode in the Cluster if ( i_last_cluster_pos ) { - EbmlParser *ep; - es.I_O().setFilePointer( i_last_cluster_pos, seek_beginning ); - ep = new EbmlParser( &es , segment, &sys.demuxer, - var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); - KaxCluster *p_last_cluster = static_cast( ep->Get() ); + EbmlParser eparser ( + &es , segment, &sys.demuxer, var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); + + KaxCluster *p_last_cluster = static_cast( eparser.Get() ); if( p_last_cluster == NULL ) return; ParseCluster( p_last_cluster, false, SCOPE_PARTIAL_DATA ); @@ -1265,8 +1258,6 @@ void matroska_segment_c::EnsureDuration() i_duration = ( i_last_timecode - cluster->GlobalTimecode() ) / INT64_C(1000000); msg_Dbg( &sys.demuxer, " extracted Duration=%" PRId64, i_duration ); - - delete ep; } // get back to the reading position we were at before looking for a duration -- GitLab