[FFmpeg-devel] avdevice/decklink_commmon: enhance error messages when iterator creation fails

Submitted by Marton Balint on April 14, 2018, 10:43 p.m.

Details

Message ID 20180414224329.18292-1-cus@passwd.hu
State Accepted
Commit 768c0774d82c8dc8eb9c14684b619b0d3b4e2f05
Headers show

Commit Message

Marton Balint April 14, 2018, 10:43 p.m.
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 <cus@passwd.hu>
---
 libavdevice/decklink_common.cpp | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

Comments

Marton Balint April 18, 2018, 8:37 p.m.
On Sun, 15 Apr 2018, Marton Balint wrote:

> 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 <cus@passwd.hu>
> ---
> libavdevice/decklink_common.cpp | 28 ++++++++++++++--------------
> 1 file changed, 14 insertions(+), 14 deletions(-)

Pushed.

Regards,
Marton

Patch hide | download patch | download mbox

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;