From 8865b440d98a158f612f514459e37701805fbece Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Fri, 5 May 2017 04:30:59 +0530 Subject: [PATCH] decklink: Fix linking on MinGW MinGW does not provide comsupp.lib, so there's no implementation of _com_util::ConvertBSTRToString. Use a fallback implementation that uses wcstombs() instead. On MinGW we also truncate the name to 100 chars which should be fine. --- sys/decklink/gstdecklink.cpp | 4 ++-- sys/decklink/gstdecklink.h | 14 ++++++++++---- sys/decklink/meson.build | 13 ++++++++----- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index 1c79e3f..f39e2fc 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -967,7 +967,7 @@ init_devices (gpointer data) GST_DEBUG ("Input %d supports:", i); while ((ret = mode_iter->Next (&mode)) == S_OK) { - const char *name; + char *name; mode->GetName ((COMSTR_T *) & name); CONVERT_COM_STRING (name); @@ -1005,7 +1005,7 @@ init_devices (gpointer data) GST_DEBUG ("Output %d supports:", i); while ((ret = mode_iter->Next (&mode)) == S_OK) { - const char *name; + char *name; mode->GetName ((COMSTR_T *) & name); CONVERT_COM_STRING (name); diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h index 052f099..820fa44 100644 --- a/sys/decklink/gstdecklink.h +++ b/sys/decklink/gstdecklink.h @@ -39,13 +39,19 @@ #define bool BOOL #define COMSTR_T BSTR -#define FREE_COM_STRING(s) delete[] s; -#define CONVERT_COM_STRING(s) BSTR _s = (BSTR)s; s = _com_util::ConvertBSTRToString(_s); ::SysFreeString(_s); +/* MinGW does not have comsuppw.lib, so no _com_util::ConvertBSTRToString */ +# ifdef __MINGW32__ +# define CONVERT_COM_STRING(s) BSTR _s = (BSTR)s; s = (char*) malloc(100); wcstombs(s, _s, 100); ::SysFreeString(_s); +# define FREE_COM_STRING(s) free(s); +# else +# define CONVERT_COM_STRING(s) BSTR _s = (BSTR)s; s = _com_util::ConvertBSTRToString(_s); ::SysFreeString(_s); +# define FREE_COM_STRING(s) delete[] s; +# endif #else #define COMSTR_T const char* -#define FREE_COM_STRING(s) #define CONVERT_COM_STRING(s) -#endif /* _MSC_VER */ +#define FREE_COM_STRING(s) +#endif /* G_OS_WIN32 */ typedef enum { GST_DECKLINK_MODE_AUTO, diff --git a/sys/decklink/meson.build b/sys/decklink/meson.build index 12e086e..a7e094f 100644 --- a/sys/decklink/meson.build +++ b/sys/decklink/meson.build @@ -12,12 +12,15 @@ decklink_libs = [] if host_machine.system() == 'windows' decklink_sources += ['win/DeckLinkAPIDispatch.cpp', 'win/DeckLinkAPI_i.c'] - # Only used by MSVC. On MinGW, this is all inlined. - # FIXME: Use commsuppwd.lib for debug builds? - comutil_dep = cxx.find_library('comsuppw', required : false) - if comutil_dep.found() + if cxx.get_id() == 'msvc' + # FIXME: Use commsuppwd.lib for debug builds? + comutil_dep = cxx.find_library('comsuppw') + if comutil_dep.found() + build_decklink = true + decklink_libs = [comutil_dep] + endif + else build_decklink = true - decklink_libs = [comutil_dep] endif else libdl = cc.find_library('dl', required: false) -- 2.7.4