[FFmpeg-devel] [PATCH 4/8] avdevice/decklink: factorize device finder function
Marton Balint
cus at passwd.hu
Thu Jun 23 02:47:50 CEST 2016
Signed-off-by: Marton Balint <cus at passwd.hu>
---
libavdevice/decklink_common.cpp | 29 +++++++++++++++++++++++++++++
libavdevice/decklink_common.h | 1 +
libavdevice/decklink_dec.cpp | 29 ++++-------------------------
libavdevice/decklink_enc.cpp | 29 ++++-------------------------
4 files changed, 38 insertions(+), 50 deletions(-)
diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp
index 43599b6..2711fc1 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 1a9feeb..ee39ff2 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 0d652bc..0d78942 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 3f4b22c..f59bd82 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) {
--
2.6.6
More information about the ffmpeg-devel
mailing list