From e22760aafd3048bcb006191d55432561b50070ea Mon Sep 17 00:00:00 2001 From: Marton Balint Date: Sat, 18 Jun 2016 17:40:06 +0200 Subject: [PATCH] avdevice/decklink: always free decklink resources on error Reviewed-by: Deti Fliegl Signed-off-by: Marton Balint --- 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 0d789425fd..371be20ef9 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 f59bd82a6b..5e796fa9cc 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)