[vlc-devel] [PATCH 04/34] mkv: cleanup of matroska_segment_c::Parse{Attachments, Chapters}

Filip Roséen filip at videolabs.io
Fri May 6 19:08:43 CEST 2016


 - Moved variable declarations to a more narrow scope, there is no point
   having them elsewhere (ParseAttachments).

 - Introduced usage of EbmlTypeDispatcher in ParseChapters, both for
   maintainability and performance reasons.
---
 modules/demux/mkv/matroska_segment_parse.cpp | 80 ++++++++++++++++------------
 1 file changed, 46 insertions(+), 34 deletions(-)

diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp
index 90ae366..8751f2e 100644
--- a/modules/demux/mkv/matroska_segment_parse.cpp
+++ b/modules/demux/mkv/matroska_segment_parse.cpp
@@ -1086,10 +1086,6 @@ void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
  *****************************************************************************/
 void matroska_segment_c::ParseChapters( KaxChapters *chapters )
 {
-    EbmlElement *el;
-    int i_upper_level = 0;
-
-    /* Master elements */
     if( unlikely( chapters->IsFiniteSize() && chapters->GetSize() >= SIZE_MAX ) )
     {
         msg_Err( &sys.demuxer, "Chapters too big, aborting" );
@@ -1097,6 +1093,8 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
     }
     try
     {
+        EbmlElement *el;
+        int i_upper_level = 0;
         chapters->Read( es, EBML_CONTEXT(chapters), i_upper_level, el, true );
     }
     catch(...)
@@ -1104,56 +1102,70 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
         msg_Err( &sys.demuxer, "Error while reading chapters" );
         return;
     }
-
-    for( size_t i = 0; i < chapters->ListSize(); i++ )
+    MKV_SWITCH_CREATE( EbmlTypeDispatcher, KaxChapterHandler, matroska_segment_c )
     {
-        EbmlElement *l = (*chapters)[i];
-
-        if( MKV_IS_ID( l, KaxEditionEntry ) )
+        MKV_SWITCH_INIT();
+        E_CASE( KaxEditionEntry, entry )
         {
-            chapter_edition_c *p_edition = new chapter_edition_c();
+            struct EditionPayload {
+                matroska_segment_c * const obj;
+                demux_t            * const p_demuxer;
+                chapter_edition_c  * const p_edition;
 
-            EbmlMaster *E = static_cast<EbmlMaster *>(l );
-            msg_Dbg( &sys.demuxer, "|   |   + EditionEntry" );
-            for( size_t j = 0; j < E->ListSize(); j++ )
-            {
-                EbmlElement *l = (*E)[j];
+            } data = { &vars, &vars.sys.demuxer, new chapter_edition_c };
 
-                if( MKV_IS_ID( l, KaxChapterAtom ) )
+            MKV_SWITCH_CREATE( EbmlTypeDispatcher, KaxEditionHandler, EditionPayload )
+            {
+                MKV_SWITCH_INIT();
+                E_CASE( KaxChapterAtom, chapter_atom )
                 {
                     chapter_item_c *new_sub_chapter = new chapter_item_c();
-                    ParseChapterAtom( 0, static_cast<KaxChapterAtom *>(l), *new_sub_chapter );
-                    p_edition->sub_chapters.push_back( new_sub_chapter );
+                    vars.obj->ParseChapterAtom( 0, &chapter_atom, *new_sub_chapter );
+                    vars.p_edition->sub_chapters.push_back( new_sub_chapter );
                 }
-                else if( MKV_IS_ID( l, KaxEditionUID ) )
+                E_CASE( KaxEditionUID, euid )
                 {
-                    p_edition->i_uid = static_cast<uint64> (*static_cast<KaxEditionUID *>( l ));
+                    vars.p_edition->i_uid = static_cast<uint64> ( euid );
                 }
-                else if( MKV_IS_ID( l, KaxEditionFlagOrdered ) )
+                E_CASE( KaxEditionFlagOrdered, flag_ordered )
                 {
-                    p_edition->b_ordered = var_InheritBool( &sys.demuxer, "mkv-use-ordered-chapters" ) ? (uint8(*static_cast<KaxEditionFlagOrdered *>( l )) != 0) : 0;
+                    vars.p_edition->b_ordered = var_InheritBool(vars.p_demuxer, "mkv-use-ordered-chapters") && static_cast<uint8>( flag_ordered );
                 }
-                else if( MKV_IS_ID( l, KaxEditionFlagDefault ) )
+                E_CASE( KaxEditionFlagDefault, flag_default )
                 {
-                    if (static_cast<uint8>( *static_cast<KaxEditionFlagDefault *>( l ) ) != 0)
-                        i_default_edition = stored_editions.size();
+                    if( static_cast<uint8>( flag_default ) )
+                        vars.obj->i_default_edition = vars.obj->stored_editions.size();
                 }
-                else if( MKV_IS_ID( l, KaxEditionFlagHidden ) )
+                E_CASE( KaxEditionFlagHidden, flag_hidden )
                 {
-                    // FIXME to implement
+                    VLC_UNUSED( flag_hidden ); // TODO: FIXME: implement
+                    VLC_UNUSED( vars );
                 }
-                else if ( !MKV_IS_ID( l, EbmlVoid ) )
+                E_CASE( EbmlVoid, el )
                 {
-                    msg_Dbg( &sys.demuxer, "|   |   |   + Unknown (%s)", typeid(*l).name() );
+                    VLC_UNUSED( el );
+                    VLC_UNUSED( vars );
                 }
-            }
-            stored_editions.push_back( p_edition );
+                E_CASE_DEFAULT( el )
+                {
+                    msg_Dbg( vars.p_demuxer, "|   |   |   + Unknown (%s)", typeid(el).name() );
+                }
+            };
+            KaxEditionHandler::Dispatcher().iterate( entry.begin(), entry.end(), KaxEditionHandler::Payload( data ) );
+
+            data.obj->stored_editions.push_back( data.p_edition );
         }
-        else if ( !MKV_IS_ID( l, EbmlVoid ) )
+        E_CASE( EbmlVoid, el ) {
+            VLC_UNUSED( el );
+            VLC_UNUSED( vars );
+        }
+        E_CASE_DEFAULT( el )
         {
-            msg_Dbg( &sys.demuxer, "|   |   + Unknown (%s)", typeid(*l).name() );
+            msg_Dbg( &vars.sys.demuxer, "|   |   + Unknown (%s)", typeid(el).name() );
         }
-    }
+    };
+
+    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 )
-- 
2.8.2



More information about the vlc-devel mailing list