[vlc-devel] [PATCH 11/11] demux/mkv: Reimplemented MkvTree and moved it to Util.hpp

Filip Roséen filip at videolabs.io
Wed Mar 2 20:13:53 CET 2016


It will make more sense when the upcoming patches are submitted to `vlc-devel`,
I haven't gotten around to isolate the changes where the function will be used
yet.

Especially MkvTree_va will make a lot of sense quite soon, things will be hella
clean! `;-)`

------------------------------------------------------------------------------

On 16/03/02 20:12, Denis Charmet wrote:

> On 2016-03-02 18:04, Filip Roséen wrote:
> >`MkvTree` can be used all across the module, meaning that it better
> >belongs in `Util.hpp` than with static linkage in `matroska_segment_parse.cpp`.
> 
> I fail to see the point of that since its only purpose is to debug the parsing of
> elements... but the rest is nice.
> 
> >
> > - A helper function `MkvTree_va` has been introduced so that one can
> >   easily call the function from functions that accepts a variadic
> >   number of arguments (using va_list).
> >
> > - The implementation has been optimized so that we do not need to
> >   allocate storage for the format string on every invocation if it
> >   would fit inside a fixed length buffer.
> >
> > - An error check has been added to signal if we run out of memory.
> >---
> > modules/demux/mkv/matroska_segment_parse.cpp | 25 -----------------
> > modules/demux/mkv/mkv.cpp                    |  1 -
> > modules/demux/mkv/util.cpp                   | 42 ++++++++++++++++++++++++++++
> > modules/demux/mkv/util.hpp                   |  4 +++
> > 4 files changed, 46 insertions(+), 26 deletions(-)
> >
> >diff --git a/modules/demux/mkv/matroska_segment_parse.cpp
> >b/modules/demux/mkv/matroska_segment_parse.cpp
> >index be1d967..bb590b5 100644
> >--- a/modules/demux/mkv/matroska_segment_parse.cpp
> >+++ b/modules/demux/mkv/matroska_segment_parse.cpp
> >@@ -187,31 +187,6 @@ void matroska_segment_c::ParseSeekHead(
> >KaxSeekHead *seekhead )
> >     }
> > }
> >
> >-
> >-/**
> >- * Helper function to print the mkv parse tree
> >- */
> >-static void MkvTree( demux_t & demuxer, int i_level, const char
> >*psz_format, ... )
> >-{
> >-    va_list args;
> >-    if( i_level > 9 )
> >-    {
> >-        msg_Err( &demuxer, "MKV tree is too deep" );
> >-        return;
> >-    }
> >-    va_start( args, psz_format );
> >-    static const char psz_foo[] = "|   |   |   |   |   |   |   |   |  |";
> >-    char *psz_foo2 = (char*)malloc( i_level * 4 + 3 + strlen( psz_format ) );
> >-    strncpy( psz_foo2, psz_foo, 4 * i_level );
> >-    psz_foo2[ 4 * i_level ] = '+';
> >-    psz_foo2[ 4 * i_level + 1 ] = ' ';
> >-    strcpy( &psz_foo2[ 4 * i_level + 2 ], psz_format );
> >-    msg_GenericVa( &demuxer,VLC_MSG_DBG, psz_foo2, args );
> >-    free( psz_foo2 );
> >-    va_end( args );
> >-}
> >-
> >-
> >/*****************************************************************************
> >  * ParseTrackEntry:
> >*****************************************************************************/
> >diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
> >index bb55ad7..0459176 100644
> >--- a/modules/demux/mkv/mkv.cpp
> >+++ b/modules/demux/mkv/mkv.cpp
> >@@ -794,4 +794,3 @@ static int Demux( demux_t *p_demux)
> >
> >     return i_return;
> > }
> >-
> >diff --git a/modules/demux/mkv/util.cpp b/modules/demux/mkv/util.cpp
> >index acb2d29..96ba128 100644
> >--- a/modules/demux/mkv/util.cpp
> >+++ b/modules/demux/mkv/util.cpp
> >@@ -415,3 +415,45 @@ block_t * packetize_wavpack( mkv_track_t * p_tk,
> >uint8_t * buffer, size_t  size)
> >
> >     return p_block;
> > }
> >+
> >+void MkvTree_va( demux_t& demuxer, int i_level, const char* fmt, va_list args)
> >+{
> >+    static char const * indent = "|    ";
> >+    static char const * prefix = "+ ";
> >+    static int  const   indent_len = strlen( indent );
> >+    static int  const   prefix_len = strlen( prefix );
> >+
> >+    char   fixed_buffer[256] = {};
> >+    size_t const  static_len = sizeof( fixed_buffer );
> >+    char *            buffer = fixed_buffer;
> >+    size_t         total_len = indent_len * i_level + prefix_len +
> >strlen( fmt );
> >+
> >+    if( total_len >= static_len ) {
> >+        buffer = new (std::nothrow) char[total_len] ();
> >+
> >+        if (buffer == NULL) {
> >+            msg_Err (&demuxer, "Unable to allocate memory for format string");
> >+            return;
> >+        }
> >+    }
> >+
> >+    char * dst = buffer;
> >+
> >+    for (int i = 0; i < i_level; ++i, dst += indent_len)
> >+        memcpy( dst, indent, indent_len );
> >+
> >+    strcat( dst, prefix );
> >+    strcat( dst, fmt );
> >+
> >+    msg_GenericVa( &demuxer, VLC_MSG_DBG, buffer, args );
> >+
> >+    if (buffer != fixed_buffer)
> >+        delete [] buffer;
> >+}
> >+
> >+void MkvTree( demux_t & demuxer, int i_level, const char *psz_format, ... )
> >+{
> >+    va_list args; va_start( args, psz_format );
> >+    MkvTree_va( demuxer, i_level, psz_format, args );
> >+    va_end( args );
> >+}
> >diff --git a/modules/demux/mkv/util.hpp b/modules/demux/mkv/util.hpp
> >index 8c6cc6a..5867d1d 100644
> >--- a/modules/demux/mkv/util.hpp
> >+++ b/modules/demux/mkv/util.hpp
> >@@ -90,3 +90,7 @@ public:
> > };
> >
> > block_t * packetize_wavpack( mkv_track_t *, uint8_t *, size_t);
> >+
> >+/* helper functions to print the mkv parse tree */
> >+void MkvTree_va( demux_t& demuxer, int i_level, const char* fmt, va_list args);
> >+void MkvTree( demux_t & demuxer, int i_level, const char *psz_format, ... );
> 
> Regards,
> -- 
> Denis Charmet - TypX
> Le mauvais esprit est un art de vivre
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20160302/08b87cf9/attachment.html>


More information about the vlc-devel mailing list