avcodec/libdav1d: unref the frame on failure
authorJames Almer <jamrial@gmail.com>
Tue, 12 Mar 2019 22:45:10 +0000 (19:45 -0300)
committerJames Almer <jamrial@gmail.com>
Tue, 12 Mar 2019 22:45:10 +0000 (19:45 -0300)
Signed-off-by: James Almer <jamrial@gmail.com>
libavcodec/libdav1d.c

index f20ae7d..8c8584f 100644 (file)
@@ -231,7 +231,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame)
     if (c->width != p->p.w || c->height != p->p.h) {
         res = ff_set_dimensions(c, p->p.w, p->p.h);
         if (res < 0)
-            return res;
+            goto fail;
     }
 
     switch (p->seq_hdr->chr) {
@@ -272,13 +272,16 @@ FF_ENABLE_DEPRECATION_WARNINGS
         frame->pict_type = AV_PICTURE_TYPE_SP;
         break;
     default:
-        return AVERROR_INVALIDDATA;
+        res = AVERROR_INVALIDDATA;
+        goto fail;
     }
 
     if (p->mastering_display) {
         AVMasteringDisplayMetadata *mastering = av_mastering_display_metadata_create_side_data(frame);
-        if (!mastering)
-            return AVERROR(ENOMEM);
+        if (!mastering) {
+            res = AVERROR(ENOMEM);
+            goto fail;
+        }
 
         for (int i = 0; i < 3; i++) {
             mastering->display_primaries[i][0] = av_make_q(p->mastering_display->primaries[i][0], 1 << 16);
@@ -295,14 +298,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
     }
     if (p->content_light) {
         AVContentLightMetadata *light = av_content_light_metadata_create_side_data(frame);
-        if (!light)
-            return AVERROR(ENOMEM);
-
+        if (!light) {
+            res = AVERROR(ENOMEM);
+            goto fail;
+        }
         light->MaxCLL = p->content_light->max_content_light_level;
         light->MaxFALL = p->content_light->max_frame_average_light_level;
     }
 
-    return 0;
+    res = 0;
+fail:
+    if (res < 0)
+        av_frame_unref(frame);
+    return res;
 }
 
 static av_cold int libdav1d_close(AVCodecContext *c)