summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-14 05:39:26 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-17 00:09:08 +0200
commitfe63b3eedcb2b92b3e086676ebed470d9f0ed64d (patch)
treee96b5be0a4c75b0cb955105e6df2f24b6464c0f5
parentf9215d0bb20242299f3654fd4646511665b20c4c (diff)
avcodec/ffv1: Simplify cleanup after allocation failure
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>
-rw-r--r--libavcodec/ffv1.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
index 5b52849400..1c580c3b49 100644
--- a/libavcodec/ffv1.c
+++ b/libavcodec/ffv1.c
@@ -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);
}