[FFmpeg-devel] [PATCH 5/8] avdevice/decklink: always free decklink resources on error

Deti Fliegl deti at fliegl.de
Sun Jun 26 11:10:31 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_dec.cpp | 18 ++++++++++++------
>  libavdevice/decklink_enc.cpp | 12 ++++++------
>  2 files changed, 18 insertions(+), 12 deletions(-)
>
> diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp
> index 0d78942..371be20 100644
> --- a/libavdevice/decklink_dec.cpp
> +++ b/libavdevice/decklink_dec.cpp
> @@ -486,21 +486,21 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>      if (ctx->dl->QueryInterface(IID_IDeckLinkInput, (void **) &ctx->dli) != S_OK) {
>          av_log(avctx, AV_LOG_ERROR, "Could not open output device from '%s'\n",
>                 avctx->filename);
> -        ctx->dl->Release();
> -        return AVERROR(EIO);
> +        ret = AVERROR(EIO);
> +        goto error;
>      }
>
>      /* List supported formats. */
>      if (ctx->list_formats) {
>          ff_decklink_list_formats(avctx, DIRECTION_IN);
> -        ctx->dli->Release();
> -        ctx->dl->Release();
> -        return AVERROR_EXIT;
> +        ret = AVERROR_EXIT;
> +        goto error;
>      }
>
>      if (mode_num > 0) {
>          if (ff_decklink_set_format(avctx, DIRECTION_IN, mode_num) < 0) {
>              av_log(avctx, AV_LOG_ERROR, "Could not set mode %d for %s\n", mode_num, fname);
> +            ret = AVERROR(EIO);
>              goto error;
>          }
>      }
> @@ -509,6 +509,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>      st = avformat_new_stream(avctx, NULL);
>      if (!st) {
>          av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");
> +        ret = AVERROR(ENOMEM);
>          goto error;
>      }
>      st->codecpar->codec_type  = AVMEDIA_TYPE_AUDIO;
> @@ -521,6 +522,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>      st = avformat_new_stream(avctx, NULL);
>      if (!st) {
>          av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");
> +        ret = AVERROR(ENOMEM);
>          goto error;
>      }
>      st->codecpar->codec_type  = AVMEDIA_TYPE_VIDEO;
> @@ -549,6 +551,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>          st = avformat_new_stream(avctx, NULL);
>          if (!st) {
>              av_log(avctx, AV_LOG_ERROR, "Cannot add stream\n");
> +            ret = AVERROR(ENOMEM);
>              goto error;
>          }
>          st->codecpar->codec_type  = AVMEDIA_TYPE_SUBTITLE;
> @@ -564,6 +567,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>
>      if (result != S_OK) {
>          av_log(avctx, AV_LOG_ERROR, "Cannot enable audio input\n");
> +        ret = AVERROR(EIO);
>          goto error;
>      }
>
> @@ -573,6 +577,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>
>      if (result != S_OK) {
>          av_log(avctx, AV_LOG_ERROR, "Cannot enable video input\n");
> +        ret = AVERROR(EIO);
>          goto error;
>      }
>
> @@ -580,6 +585,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>
>      if (decklink_start_input (avctx) != S_OK) {
>          av_log(avctx, AV_LOG_ERROR, "Cannot start input stream\n");
> +        ret = AVERROR(EIO);
>          goto error;
>      }
>
> @@ -587,7 +593,7 @@ av_cold int ff_decklink_read_header(AVFormatContext *avctx)
>
>  error:
>      ff_decklink_cleanup(avctx);
> -    return AVERROR(EIO);
> +    return ret;
>  }
>
>  int ff_decklink_read_packet(AVFormatContext *avctx, AVPacket *pkt)
> diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp
> index f59bd82..5e796fa 100644
> --- a/libavdevice/decklink_enc.cpp
> +++ b/libavdevice/decklink_enc.cpp
> @@ -337,19 +337,19 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx)
>      if (ctx->dl->QueryInterface(IID_IDeckLinkOutput, (void **) &ctx->dlo) != S_OK) {
>          av_log(avctx, AV_LOG_ERROR, "Could not open output device from '%s'\n",
>                 avctx->filename);
> -        ctx->dl->Release();
> -        return AVERROR(EIO);
> +        ret = AVERROR(EIO);
> +        goto error;
>      }
>
>      /* List supported formats. */
>      if (ctx->list_formats) {
>          ff_decklink_list_formats(avctx);
> -        ctx->dlo->Release();
> -        ctx->dl->Release();
> -        return AVERROR_EXIT;
> +        ret = AVERROR_EXIT;
> +        goto error;
>      }
>
>      /* Setup streams. */
> +    ret = AVERROR(EIO);
>      for (n = 0; n < avctx->nb_streams; n++) {
>          AVStream *st = avctx->streams[n];
>          AVCodecContext *c = st->codec;
> @@ -369,7 +369,7 @@ av_cold int ff_decklink_write_header(AVFormatContext *avctx)
>
>  error:
>      ff_decklink_cleanup(avctx);
> -    return AVERROR(EIO);
> +    return ret;
>  }
>
>  int ff_decklink_write_packet(AVFormatContext *avctx, AVPacket *pkt)
>



More information about the ffmpeg-devel mailing list