[FFmpeg-devel] [PATCH 4/8] avdevice/decklink: factorize device finder function
Deti Fliegl
deti at fliegl.de
Sun Jun 26 11:10:24 CEST 2016
Patch accepted, please apply.
On 23/06/16 02:47, Marton Balint wrote:
> 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) {
>
More information about the ffmpeg-devel
mailing list