[vlc-devel] [PATCH 1/2] demux/mkv: make it possible to check result of ParseCluster
Filip Roséen
filip at atch.se
Mon Oct 31 12:57:14 CET 2016
Parsing a cluster can fail for a number of different reasons, though
previously it was impossible for the callee to know whether parsing
was successful or not.
These changes changes the signature of
matroska_segment_c::ParseCluster so that it returns a boolean (true on
success, false on failure).
---
modules/demux/mkv/matroska_segment.cpp | 13 ++++++++-----
modules/demux/mkv/matroska_segment.hpp | 2 +-
modules/demux/mkv/matroska_segment_parse.cpp | 8 +++++---
3 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index acb8a54..266477f 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -492,8 +492,8 @@ bool matroska_segment_c::PreloadClusters(uint64 i_cluster_pos)
E_CASE( KaxCluster, kcluster )
{
- vars.obj->ParseCluster( &kcluster, false );
- vars.obj->IndexAppendCluster( &kcluster );
+ if( vars.obj->ParseCluster( &kcluster, false ) )
+ vars.obj->IndexAppendCluster( &kcluster );
}
E_CASE_DEFAULT( el )
@@ -633,9 +633,10 @@ bool matroska_segment_c::Preload( )
}
msg_Dbg( &sys.demuxer, "| + Cluster" );
- cluster = kc_ptr;
+ if( !ParseCluster( kc_ptr ) )
+ break;
- ParseCluster( cluster );
+ cluster = kc_ptr;
IndexAppendCluster( cluster );
// add first cluster as trusted seekpoint for all tracks
@@ -1025,7 +1026,9 @@ void matroska_segment_c::EnsureDuration()
KaxCluster *p_last_cluster = static_cast<KaxCluster*>( eparser.Get() );
if( p_last_cluster == NULL )
return;
- ParseCluster( p_last_cluster, false, SCOPE_PARTIAL_DATA );
+
+ if( !ParseCluster( p_last_cluster, false, SCOPE_PARTIAL_DATA ) )
+ return;
if( p_last_cluster->IsFiniteSize() == false )
{
diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp
index 0aa01be..f8df9f6 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -164,7 +164,7 @@ private:
void ParseTracks( KaxTracks *tracks );
void ParseChapterAtom( int i_level, KaxChapterAtom *ca, chapter_item_c & chapters );
void ParseTrackEntry( KaxTrackEntry *m );
- void ParseCluster( KaxCluster *cluster, bool b_update_start_time = true, ScopeMode read_fully = SCOPE_ALL_DATA );
+ bool ParseCluster( KaxCluster *cluster, bool b_update_start_time = true, ScopeMode read_fully = SCOPE_ALL_DATA );
bool ParseSimpleTags( SimpleTag* out, KaxTagSimple *tag, int level = 50 );
void IndexAppendCluster( KaxCluster *cluster );
int32_t TrackInit( mkv_track_t * p_tk );
diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp
index 4eb0e7a..5429b1f 100644
--- a/modules/demux/mkv/matroska_segment_parse.cpp
+++ b/modules/demux/mkv/matroska_segment_parse.cpp
@@ -1207,12 +1207,12 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
KaxChapterHandler::Dispatcher().iterate( chapters->begin(), chapters->end(), KaxChapterHandler::Payload( *this ) );
}
-void matroska_segment_c::ParseCluster( KaxCluster *cluster, bool b_update_start_time, ScopeMode read_fully )
+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;
+ return false;
}
try
@@ -1225,7 +1225,7 @@ void matroska_segment_c::ParseCluster( KaxCluster *cluster, bool b_update_start_
catch(...)
{
msg_Err( &sys.demuxer, "Error while reading cluster" );
- return;
+ return false;
}
for( unsigned int i = 0; i < cluster->ListSize(); ++i )
@@ -1240,6 +1240,8 @@ void matroska_segment_c::ParseCluster( KaxCluster *cluster, bool b_update_start_
if( b_update_start_time )
i_mk_start_time = cluster->GlobalTimecode() / INT64_C( 1000 );
+
+ return true;
}
--
2.10.1
More information about the vlc-devel
mailing list