From 768c0774d82c8dc8eb9c14684b619b0d3b4e2f05 Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Sun, 15 Apr 2018 00:06:59 +0200 Subject: avdevice/decklink_commmon: enhance error messages when iterator creation fails Show a more useful error message which specifies the required driver version for the build, and use the correct context in the error message for WIN32. Signed-off-by: Marton Balint --- libavdevice/decklink_common.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp index b889033cf8..d8cced7c74 100644 --- a/libavdevice/decklink_common.cpp +++ b/libavdevice/decklink_common.cpp @@ -53,25 +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; } +#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"); return iter; } -#endif #ifdef _WIN32 static char *dup_wchar_to_utf8(wchar_t *w) @@ -285,13 +289,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 +444,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; -- cgit v1.2.3