mkv: remove typeid code in EBML dispatcher
authorAlexandre Janniaux <ajanni@videolabs.io>
Mon, 15 Jun 2020 14:30:53 +0000 (16:30 +0200)
committerAlexandre Janniaux <ajanni@videolabs.io>
Wed, 17 Jun 2020 15:43:05 +0000 (17:43 +0200)
commitc764461180d70d1c9fa81e72cd7ad9d9b289eea6
treed2ad3f482dffad820a0f41c1be104546a2d9d103
parentf763d0a6b89e118891f03e55f3818ef3483e3517
mkv: remove typeid code in EBML dispatcher

EBML can associate multiple class to a single EBML ID, which mean that
it potentially needs typeid checks. However, libmatroska always exposes
a single type per EBML ID, so it never needs those checks.

In addition, those checks are leading to warnings (attached below) and
issues depending on the visibility and optimization level on clang. See
the following mail on the mailing list for reference:

https://lists.llvm.org/pipermail/llvm-dev/2014-June/073465.html

To sum up, typeinfo are becoming different between libmatroska and the
matroska modules for the same classes, so the matroska demuxer is never
able to open correctly in those case, and it fallbacks on avformat
demuxer if available.

Compilation warning fixed by this patch:

    ../../../modules/demux/mkv/chapter_command.cpp:35:13: warning: expression with side effects will be evaluated despite being used as an operand to 'typeid'
          [-Wpotentially-evaluated-expression]
            if( MKV_CHECKED_PTR_DECL( p_cpt, KaxChapterProcessTime const, command[i] ) )
                ^
    ../../../modules/demux/mkv/mkv.hpp:116:63: note: expanded from macro 'MKV_CHECKED_PTR_DECL'
    #define MKV_CHECKED_PTR_DECL( name, type, src ) type * name = MKV_IS_ID(src, type) ? static_cast<type*>(src) : NULL
                                                                  ^
    ../../../modules/demux/mkv/mkv.hpp:115:52: note: expanded from macro 'MKV_IS_ID'
    #define MKV_IS_ID( el, C ) ( el != NULL && typeid( *el ) == typeid( C ) )
                                                       ^
    ../../../modules/demux/mkv/chapter_command.cpp:44:13: warning: expression with side effects will be evaluated despite being used as an operand to 'typeid'
          [-Wpotentially-evaluated-expression]
            if( MKV_CHECKED_PTR_DECL( p_cpd, KaxChapterProcessData const, command[i] ) )
                ^
    ../../../modules/demux/mkv/mkv.hpp:116:63: note: expanded from macro 'MKV_CHECKED_PTR_DECL'
    #define MKV_CHECKED_PTR_DECL( name, type, src ) type * name = MKV_IS_ID(src, type) ? static_cast<type*>(src) : NULL
                                                                  ^
    ../../../modules/demux/mkv/mkv.hpp:115:52: note: expanded from macro 'MKV_IS_ID'
    #define MKV_IS_ID( el, C ) ( el != NULL && typeid( *el ) == typeid( C ) )

The issue was initially spotted through link-time warnings mentionning
incompatible visibility settings between the library archives and the
final static libvlc archive when compiling for iOS.

Fix videolan/VLCKit#372
modules/demux/mkv/Ebml_dispatcher.hpp
modules/demux/mkv/chapter_command.cpp
modules/demux/mkv/mkv.hpp