vlc | branch: master | Filip Roséen <[email protected]> | Mon May 9 14:53:00 2016 +0200| [9436cd0c603e11bdc91ef3434a5f8d833b18c6cf] | committer: Jean-Baptiste Kempf
mkv: introduced matroska_segment_c::PreloadClusters If FAST_SEEK is enabled we can "preload" the location of all the clusters when first opening our file in order to speed up seeking at a later time. Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9436cd0c603e11bdc91ef3434a5f8d833b18c6cf --- modules/demux/mkv/matroska_segment.cpp | 45 ++++++++++++++++++++++++++++++++ modules/demux/mkv/matroska_segment.hpp | 1 + modules/demux/mkv/mkv.cpp | 4 +++ 3 files changed, 50 insertions(+) diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index 1489c59..4665fb7 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -470,6 +470,46 @@ void matroska_segment_c::IndexAppendCluster( KaxCluster *cluster ) indexes.push_back (mkv_index_t ()); } +bool matroska_segment_c::PreloadClusters(uint64 i_cluster_pos) +{ + struct ClusterHandlerPayload + { + matroska_segment_c * const obj; + bool stop_parsing; + + } payload = { this, false }; + + MKV_SWITCH_CREATE(EbmlTypeDispatcher, ClusterHandler, ClusterHandlerPayload ) + { + MKV_SWITCH_INIT(); + + E_CASE( KaxCluster, kcluster ) + { + vars.obj->ParseCluster( &kcluster, false ); + vars.obj->IndexAppendCluster( &kcluster ); + } + + E_CASE_DEFAULT( el ) + { + VLC_UNUSED( el ); + vars.stop_parsing = true; + } + }; + + { + es.I_O().setFilePointer( i_cluster_pos ); + + while (payload.stop_parsing == false) + { + EbmlParser parser ( &es, segment, &sys.demuxer, var_InheritBool( &sys.demuxer, "mkv-use-dummy" ) ); + + ClusterHandler::Dispatcher().send( parser.Get(), ClusterHandler::Payload( payload ) ); + } + } + + return true; +} + bool matroska_segment_c::PreloadFamily( const matroska_segment_c & of_segment ) { if ( b_preloaded ) @@ -579,6 +619,11 @@ bool matroska_segment_c::Preload( ) } else if( MKV_CHECKED_PTR_DECL ( kc_ptr, KaxCluster, el ) ) { + if( var_InheritBool( &sys.demuxer, "mkv-preload-clusters" ) ) + { + PreloadClusters ( kc_ptr->GetElementPosition() ); + es.I_O().setFilePointer( kc_ptr->GetElementPosition() ); + } msg_Dbg( &sys.demuxer, "| + Cluster" ); cluster = kc_ptr; diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp index 8b9d569..292a1c9 100644 --- a/modules/demux/mkv/matroska_segment.hpp +++ b/modules/demux/mkv/matroska_segment.hpp @@ -133,6 +133,7 @@ public: bool Preload(); bool PreloadFamily( const matroska_segment_c & segment ); + bool PreloadClusters( uint64 i_cluster_position ); void InformationCreate(); void Seek( mtime_t i_mk_date, mtime_t i_mk_time_offset ); int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *); diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp index f4756b6..6d646cd 100644 --- a/modules/demux/mkv/mkv.cpp +++ b/modules/demux/mkv/mkv.cpp @@ -76,6 +76,10 @@ vlc_module_begin () N_("Dummy Elements"), N_("Read and discard unknown EBML elements (not good for broken files)."), true ); + add_bool( "mkv-preload-clusters", false, + N_("Preload clusters"), + N_("Find all cluster positions by jumping cluster-to-cluster before playback"), true ); + add_shortcut( "mka", "mkv" ) vlc_module_end () _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
