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

Steve Lhomme robux4 at gmail.com
Wed Feb 18 18:12:33 CET 2015


Slightly better version with the right macros to access the semantic
context master.

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

diff --git a/modules/demux/mkv/Ebml_parser.cpp
b/modules/demux/mkv/Ebml_parser.cpp
index 21e219e..a42b936 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;
@@ -170,8 +192,13 @@ EbmlElement *EbmlParser::Get( int n_call )

     }

+    // ignore global Void/CRC32 elements when looking for level 1 elements
in the Segment
+    EbmlSemanticContext e_context =
+            EBML_CTX_MASTER( EBML_CONTEXT(m_el[mi_level - 1]) ) ==
EBML_CTX_MASTER( Context_KaxSegmentVLC )
+            ? Context_KaxSegmentVLC
+            : EBML_CONTEXT(m_el[mi_level - 1]);
     /* Ignore unknown level 0 or 1 elements */
-    m_el[mi_level] = m_es->FindNextElement( 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


On Wed, Feb 18, 2015 at 5:57 PM, Steve Lhomme <robux4 at gmail.com> wrote:

> Fixes https://trac.videolan.org/vlc/ticket/9623 without requiring
> `--mkv-use-dummy` and only when Parsing at the Segment level.
>
> ---
>  modules/demux/mkv/Ebml_parser.cpp | 27 ++++++++++++++++++++++++++-
>  modules/demux/mkv/Ebml_parser.hpp |  1 +
>  2 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/modules/demux/mkv/Ebml_parser.cpp
> b/modules/demux/mkv/Ebml_parser.cpp
> index 21e219e..119d5c9 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,10 @@ 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 = ( EBML_CONTEXT(m_el[mi_level -
> 1]).GetMaster() == Context_KaxSegmentVLC.GetMaster() )
> +            ? 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
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20150218/6b6dde18/attachment.html>


More information about the vlc-devel mailing list