diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp index 43599b6b2b..2711fc1138 100644 --- a/libavdevice/decklink_common.cpp +++ b/libavdevice/decklink_common.cpp @@ -252,3 +252,32 @@ void ff_decklink_cleanup(AVFormatContext *avctx) if (ctx->dl) ctx->dl->Release(); } + +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"); + return AVERROR_EXTERNAL; + } + + while (iter->Next(&dl) == S_OK) { + const char *displayName; + ff_decklink_get_display_name(dl, &displayName); + if (!strcmp(name, displayName)) { + av_free((void *)displayName); + ctx->dl = dl; + break; + } + av_free((void *)displayName); + dl->Release(); + } + iter->Release(); + if (!ctx->dl) + return AVERROR(ENXIO); + + return 0; +} diff --git a/libavdevice/decklink_common.h b/libavdevice/decklink_common.h index 1a9feeba43..ee39ff234e 100644 --- a/libavdevice/decklink_common.h +++ b/libavdevice/decklink_common.h @@ -106,5 +106,6 @@ int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t directio int ff_decklink_list_devices(AVFormatContext *avctx); int ff_decklink_list_formats(AVFormatContext *avctx, decklink_direction_t direction = DIRECTION_OUT); void ff_decklink_cleanup(AVFormatContext *avctx); +int ff_decklink_init_device(AVFormatContext *avctx, const char* name); #endif /* AVDEVICE_DECKLINK_COMMON_H */ diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 0d652bc8db..0d789425fd 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -431,13 +431,12 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) { struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data; struct decklink_ctx *ctx; - IDeckLinkIterator *iter; - IDeckLink *dl = NULL; AVStream *st; HRESULT result; char fname[1024]; char *tmp; int mode_num = 0; + int ret; ctx = (struct decklink_ctx *) av_mallocz(sizeof(struct decklink_ctx)); if (!ctx) @@ -466,12 +465,6 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) return AVERROR(EINVAL); } - iter = CreateDeckLinkIteratorInstance(); - if (!iter) { - av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator\n"); - return AVERROR(EIO); - } - /* List available devices. */ if (ctx->list_devices) { ff_decklink_list_devices(avctx); @@ -485,23 +478,9 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx) *tmp = 0; } - /* Open device. */ - while (iter->Next(&dl) == S_OK) { - const char *displayName; - ff_decklink_get_display_name(dl, &displayName); - if (!strcmp(fname, displayName)) { - av_free((void *) displayName); - ctx->dl = dl; - break; - } - av_free((void *) displayName); - dl->Release(); - } - iter->Release(); - if (!ctx->dl) { - av_log(avctx, AV_LOG_ERROR, "Could not open '%s'\n", fname); - return AVERROR(EIO); - } + ret = ff_decklink_init_device(avctx, fname); + if (ret < 0) + return ret; /* Get input device. */ if (ctx->dl->QueryInterface(IID_IDeckLinkInput, (void **) &ctx->dli) != S_OK) { diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp index 3f4b22cdbf..f59bd82a6b 100644 --- a/libavdevice/decklink_enc.cpp +++ b/libavdevice/decklink_enc.cpp @@ -312,9 +312,8 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx) { struct decklink_cctx *cctx = (struct decklink_cctx *) avctx->priv_data; struct decklink_ctx *ctx; - IDeckLinkIterator *iter; - IDeckLink *dl = NULL; unsigned int n; + int ret; ctx = (struct decklink_ctx *) av_mallocz(sizeof(struct decklink_ctx)); if (!ctx) @@ -324,35 +323,15 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx) ctx->preroll = cctx->preroll; cctx->ctx = ctx; - iter = CreateDeckLinkIteratorInstance(); - if (!iter) { - av_log(avctx, AV_LOG_ERROR, "Could not create DeckLink iterator\n"); - return AVERROR(EIO); - } - /* List available devices. */ if (ctx->list_devices) { ff_decklink_list_devices(avctx); return AVERROR_EXIT; } - /* Open device. */ - while (iter->Next(&dl) == S_OK) { - const char *displayName; - ff_decklink_get_display_name(dl, &displayName); - if (!strcmp(avctx->filename, displayName)) { - av_free((void *) displayName); - ctx->dl = dl; - break; - } - av_free((void *) displayName); - dl->Release(); - } - iter->Release(); - if (!ctx->dl) { - av_log(avctx, AV_LOG_ERROR, "Could not open '%s'\n", avctx->filename); - return AVERROR(EIO); - } + ret = ff_decklink_init_device(avctx, avctx->filename); + if (ret < 0) + return ret; /* Get output device. */ if (ctx->dl->QueryInterface(IID_IDeckLinkOutput, (void **) &ctx->dlo) != S_OK) {