[vlc-devel] [PATCH 11/11] demux/mkv: Reimplemented MkvTree and moved it to Util.hpp
Denis Charmet
typx at dinauz.org
Wed Mar 2 20:12:17 CET 2016
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
More information about the vlc-devel
mailing list