DirectShow & MinGW-W64



  • 1. Ich will DirectShow Filter schreiben using mingw-w64.

    2. Hat schonmal jemand strmbasd/strmbase mit mingw-w64 gebaut,
    oder grundsätzlich DirectShow mit mingw zum laufen gebracht (in meinem Fall msys2)?

    Ich kann Visual Studio und MSVC nicht verwenden, da keine Lizenz.

    Beim Versuch die basefilter zu bauen lande ich zumindest schon bei linker Fehler gegen IID_* (zB IID_IMemAllocator). Aber ich weiß nicht wo die externen GUIDs liegen. (verweis auf externa in strmif.h)

    EDIT: Ich habe nur ein 12 Jahre alten Link gefunden auf eine Seite, die überall verlinkt wird, aber diese existiert nicht mehr: http://home.clara.net/raoulgough/vidmodem/dshow.html 😞

    EDIT 2: Oh ich bin im falschen Subforum (?) 😃 - https://www.c-plusplus.net/forum/170562-full. Ob jetzt 12 Jahre später einer eine Antwort hat? 😞

    EDIT 3:
    -lstrmiids (IID_*)
    (-lole32)
    (-luuid)

    fehlten bisher. Schonmal ein Schritt weiter

    bleibt noch "undefined reference to g_Templates" und g_cTemplates

    EDIT 4:
    folgendes angefügt:

    CFactoryTemplate g_Templates [0] = {};
    int g_cTemplates = 0;
    

    sowie

    -lwinmm
    -lgid32
    -loleaut32

    IID_IReferenceClockTimerControl ist jetzt noch nicht linkbar.

    EDIT 5:
    *schluck* die sollte in strmiids drin sein, ist sie aber nicht (?)



  • Solved?

    Hab mir das selbst gehacked mit

    #define MAKE_GUID_HACK(NAME, DATA1, DATA2, DATA3, B0, B1, B2, B3, B4, B5, B6, B7) \
    auto NAME = GUID { \
        DATA1, \
        DATA2, \
        DATA3, \
        { B0, B1, B2, B3, B4, B5, B6, B7 } \
    };
    
    #if ENABLE_IREFERENCE_CLOCK_TIMER_CONTROL_FIX
    MAKE_GUID_HACK(IID_IReferenceClockTimerControl, 0xebec459c, 0x2eca, 0x4d42, 0xa8,0xaf, 0x30,0xdf,0x55,0x76,0x14,0xb8)
    #endif
    

    Zum Glück kann sich die GUID nicht ändern.

    Sowie für die die es interessiert ein header den ich überall reingeklatscht habe, um die Windows SAL kurzzuschließen. Hätte man auch schöner machen können, aber das hier ist schnell schnell.

    #ifndef COMPAT_H_INCLUDED
    #define COMPAT_H_INCLUDED
    
    #include <intsafe.h>
    #include <windows.h>
    //#include <algorithm> // min, max
    
    #define ENABLE_IREFERENCE_CLOCK_TIMER_CONTROL_FIX 1
    
    #ifndef _In_
    #define _In_
    #endif
    
    #ifndef _Out_
    #define _Out_
    #endif
    
    #define __inout_opt
    #define __in_bcount(T)
    #define __in
    #define __out
    //#define _asm asm
    #define __out_ecount(T)
    #define __deref_out
    #define __deref_in
    #define __deref_inout_opt
    #define __in_opt
    #define __inout
    #define __out_opt
    #define __in_ecount(T)
    #define __deref_out_opt
    #define __out_ecount_part(T, V)
    #define __field_ecount_opt(T)
    #define __in_bcount_opt(T)
    #define __out_bcount(T)
    #define __range(T, V)
    #define __inout_ecount_full(T)
    #define __out_bcount_part(T, V)
    #define __in_ecount_opt(T)
    #define _Outptr_
    #define __allowed(T)
    #define __deref_out_range(T, V)
    #define __success(T)
    #define __out_range(T, V)
    
    #define __control_entrypoint(category)     __allowed(on_function)
    
    //#define AM_NOVTABLE __declspec(novtable)
    #define AM_NOVTABLE
    
    /*
        #include <windows.h>
        #undef max
        #undef min
    */
    
    constexpr long long operator "" I64 (unsigned long long int i)
    {
        return i;
    }
    
    #endif // COMPAT_H_INCLUDED
    

    Außerdem müssen die inline Assembler stellen entweder mit dem x64 codestellen ausgetauscht werden, oder umgeformt werden.

    Entweder mit -fpermissive kompilieren, oder code stelle fixen, die einen ctor direkt aufruft.

    Die meisten anderen Sachen kann man auch selbst lösen.

    Und nochmal alle Libraries:

    • strmiids
    • ole32
    • uuid
    • winmm
    • gdi32
    • oleaut32


  • 5cript schrieb:

    EDIT: Ich habe nur ein 12 Jahre alten Link gefunden auf eine Seite, die überall verlinkt wird, aber diese existiert nicht mehr: http://home.clara.net/raoulgough/vidmodem/dshow.html 😞

    http://web.archive.org/web/20100822154613/http://home.clara.net/raoulgough/vidmodem/dshow.html



  • Hmmm mit dem smarten trick hätte ich zumindest ein oder zwei stunden gespart.

    EDIT: Aber ich denke, dass ich die sourcen ohnehin noch schwer abändern muss. Die laxe Art des MSVC scheint den Codestil zu verderben.
    Das war eine noch nette Kritik


Log in to reply