[FFmpeg-cvslog] avdevice/decklink: always free decklink resources on error

Marton Balint git at videolan.org
Sun Jun 26 19:20:08 CEST 2016


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Sat Jun 18 17:40:06 2016 +0200| [e22760aafd3048bcb006191d55432561b50070ea] | committer: Marton Balint

avdevice/decklink: always free decklink resources on error

Reviewed-by: Deti Fliegl <deti at fliegl.de>
Signed-off-by: Marton Balint <cus at passwd.hu>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e22760aafd3048bcb006191d55432561b50070ea
---

 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-cvslog mailing list