X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavdevice%2Fdecklink_common.cpp;h=aab9d85b940027c15c6347f300279ad1af184c11;hb=fb480a1f1e0cba88c3c7424655bacff7c465692b;hp=b889033cf8ea7a3c3614a744ef679c39c8acc79d;hpb=e46fab0f3cfb58398de9d2b8bd866f82606a90eb;p=ffmpeg diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp index b889033cf8e..aab9d85b940 100644 --- a/libavdevice/decklink_common.cpp +++ b/libavdevice/decklink_common.cpp @@ -53,55 +53,29 @@ extern "C" { #include "decklink_common.h" -#ifdef _WIN32 -IDeckLinkIterator *CreateDeckLinkIteratorInstance(void) +static IDeckLinkIterator *decklink_create_iterator(AVFormatContext *avctx) { IDeckLinkIterator *iter; +#ifdef _WIN32 if (CoInitialize(NULL) < 0) { - av_log(NULL, AV_LOG_ERROR, "COM initialization failed.\n"); + av_log(avctx, AV_LOG_ERROR, "COM initialization failed.\n"); return NULL; } if (CoCreateInstance(CLSID_CDeckLinkIterator, NULL, CLSCTX_ALL, IID_IDeckLinkIterator, (void**) &iter) != S_OK) { - av_log(NULL, AV_LOG_ERROR, "DeckLink drivers not installed.\n"); - return NULL; + iter = NULL; } - - return iter; -} +#else + iter = CreateDeckLinkIteratorInstance(); #endif + if (!iter) + av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator. " + "Make sure you have DeckLink drivers " BLACKMAGIC_DECKLINK_API_VERSION_STRING " or newer installed.\n"); -#ifdef _WIN32 -static char *dup_wchar_to_utf8(wchar_t *w) -{ - char *s = NULL; - int l = WideCharToMultiByte(CP_UTF8, 0, w, -1, 0, 0, 0, 0); - s = (char *) av_malloc(l); - if (s) - WideCharToMultiByte(CP_UTF8, 0, w, -1, s, l, 0, 0); - return s; -} -#define DECKLINK_STR OLECHAR * -#define DECKLINK_STRDUP dup_wchar_to_utf8 -#define DECKLINK_FREE(s) SysFreeString(s) -#elif defined(__APPLE__) -static char *dup_cfstring_to_utf8(CFStringRef w) -{ - char s[256]; - CFStringGetCString(w, s, 255, kCFStringEncodingUTF8); - return av_strdup(s); + return iter; } -#define DECKLINK_STR const __CFString * -#define DECKLINK_STRDUP dup_cfstring_to_utf8 -#define DECKLINK_FREE(s) CFRelease(s) -#else -#define DECKLINK_STR const char * -#define DECKLINK_STRDUP av_strdup -/* free() is needed for a string returned by the DeckLink SDL. */ -#define DECKLINK_FREE(s) free((void *) s) -#endif HRESULT ff_decklink_get_display_name(IDeckLink *This, const char **displayName) { @@ -285,13 +259,11 @@ int ff_decklink_list_devices(AVFormatContext *avctx, int show_inputs, int show_outputs) { IDeckLink *dl = NULL; - IDeckLinkIterator *iter = CreateDeckLinkIteratorInstance(); + IDeckLinkIterator *iter = decklink_create_iterator(avctx); int ret = 0; - if (!iter) { - av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator\n"); + if (!iter) return AVERROR(EIO); - } while (ret == 0 && iter->Next(&dl) == S_OK) { IDeckLinkOutput *output_config; @@ -442,11 +414,9 @@ int ff_decklink_init_device(AVFormatContext *avctx, const char* name) struct decklink_cctx *cctx = (struct decklink_cctx *)avctx->priv_data; struct decklink_ctx *ctx = (struct decklink_ctx *)cctx->ctx; IDeckLink *dl = NULL; - IDeckLinkIterator *iter = CreateDeckLinkIteratorInstance(); - if (!iter) { - av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator\n"); + IDeckLinkIterator *iter = decklink_create_iterator(avctx); + if (!iter) return AVERROR_EXTERNAL; - } while (iter->Next(&dl) == S_OK) { const char *displayName;