[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