[vlc-devel] [PATCH] Do not allow Void/CRC32 elements fallback when looking for a level 1 element

Steve Lhomme robux4 at outlook.com
Wed Feb 18 15:30:36 CET 2015


Fixes https://trac.videolan.org/vlc/ticket/9623 without requiring the 
use of `-mkv-use-dummy`

---
modules/demux/mkv/Ebml_parser.cpp | 25 ++++++++++++++++++++++++-
modules/demux/mkv/Ebml_parser.hpp | 1 +
2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/modules/demux/mkv/Ebml_parser.cpp 
b/modules/demux/mkv/Ebml_parser.cpp
index 21e219e..6041eaf 100644
--- a/modules/demux/mkv/Ebml_parser.cpp
+++ b/modules/demux/mkv/Ebml_parser.cpp
@@ -146,6 +146,28 @@ void EbmlParser::Reset( demux_t *p_demux )
mb_dummy = var_InheritBool( p_demux, "mkv-use-dummy" );
}

+
+// Define a special Segment context that doesn't allow void/crc32 elements
+static const EbmlSemanticContext & GetEbmlNoGlobal_Context();
+static const EbmlSemanticContext Context_EbmlNoGlobal = 
EbmlSemanticContext(0, NULL, NULL, *GetEbmlNoGlobal_Context, NULL);
+static const EbmlSemantic EbmlNoGlobal_ContextList[0] =
+{
+ //EbmlSemantic(false, false, EBML_INFO(EbmlCrc32)), ///< EbmlCrc32
+ //EbmlSemantic(false, false, EBML_INFO(EbmlVoid)), ///< EbmlVoid
+};
+static const EbmlSemanticContext EbmlNoGlobal_Context = 
EbmlSemanticContext(countof(EbmlNoGlobal_ContextList), 
EbmlNoGlobal_ContextList, NULL, *GetEbmlNoGlobal_Context, NULL);
+static const EbmlSemanticContext & GetEbmlNoGlobal_Context()
+{
+ return EbmlNoGlobal_Context;
+}
+
+// the Segment Context should not allow Void or CRC32 elements to avoid 
lookup false alarm
+const EbmlSemanticContext Context_KaxSegmentVLC = 
EbmlSemanticContext(KaxSegment_Context.GetSize(),
+ KaxSegment_Context.MyTable,
+ KaxSegment_Context.Parent(),
+ GetEbmlNoGlobal_Context,
+ KaxSegment_Context.GetMaster());
+
EbmlElement *EbmlParser::Get( int n_call )
{
int i_ulev = 0;
@@ -171,7 +193,8 @@ EbmlElement *EbmlParser::Get( int n_call )
}

/* Ignore unknown level 0 or 1 elements */
- m_el[mi_level] = m_es->FindNextElement( EBML_CONTEXT(m_el[mi_level - 1]),
+ EbmlSemanticContext e_context = mi_level == 1 ? Context_KaxSegmentVLC 
: EBML_CONTEXT(m_el[mi_level - 1]);
+ m_el[mi_level] = m_es->FindNextElement( e_context,
i_ulev, UINT64_MAX,
( mb_dummy | (mi_level > 1) ), 1 );
if( i_ulev > 0 )
diff --git a/modules/demux/mkv/Ebml_parser.hpp 
b/modules/demux/mkv/Ebml_parser.hpp
index 57fdf23..96f9f4b 100644
--- a/modules/demux/mkv/Ebml_parser.hpp
+++ b/modules/demux/mkv/Ebml_parser.hpp
@@ -60,6 +60,7 @@ class EbmlParser

int mi_user_level;
bool mb_keep;
+ /* Allow dummy/unknown EBML elements */
bool mb_dummy;
};

-- 
1.9.5.msysgit.0




More information about the vlc-devel mailing list