]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/ffv1: Simplify cleanup after allocation failure
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Mon, 14 Sep 2020 03:39:26 +0000 (05:39 +0200)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Wed, 16 Sep 2020 22:09:08 +0000 (00:09 +0200)
Now that ff_ffv1_close() is called upon failure for both the FFV1 encoder
and decoder, the code contained therein can be used to free the partially
allocated slice contexts if allocating the slice contexts failed. One just
has to set the correct number of slice contexts on error. This allows to
remove the code for freeing partially allocated slice contexts in
ff_ffv1_init_slice_contexts().

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavcodec/ffv1.c

index 5b528494003cbba27e015793f46c94d5bdde3904..1c580c3b49f16a409754b37a8c2b05010d8f89a7 100644 (file)
@@ -119,7 +119,7 @@ av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
 
     av_assert0(max_slice_count > 0);
 
-    for (i = 0; i < max_slice_count; i++) {
+    for (i = 0; i < max_slice_count;) {
         int sx          = i % f->num_h_slices;
         int sy          = i / f->num_h_slices;
         int sxs         = f->avctx->width  *  sx      / f->num_h_slices;
@@ -131,7 +131,7 @@ av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
         if (!fs)
             goto memfail;
 
-        f->slice_context[i] = fs;
+        f->slice_context[i++] = fs;
         memcpy(fs, f, sizeof(*fs));
         memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
 
@@ -144,22 +144,14 @@ av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
                                       sizeof(*fs->sample_buffer));
         fs->sample_buffer32 = av_malloc_array((fs->width + 6), 3 * MAX_PLANES *
                                         sizeof(*fs->sample_buffer32));
-        if (!fs->sample_buffer || !fs->sample_buffer32) {
-            av_freep(&fs->sample_buffer);
-            av_freep(&fs->sample_buffer32);
-            av_freep(&f->slice_context[i]);
+        if (!fs->sample_buffer || !fs->sample_buffer32)
             goto memfail;
-        }
     }
     f->max_slice_count = max_slice_count;
     return 0;
 
 memfail:
-    while(--i >= 0) {
-        av_freep(&f->slice_context[i]->sample_buffer);
-        av_freep(&f->slice_context[i]->sample_buffer32);
-        av_freep(&f->slice_context[i]);
-    }
+    f->max_slice_count = i;
     return AVERROR(ENOMEM);
 }