Browse Source

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>
tags/n4.4
Andreas Rheinhardt 5 years ago
parent
commit
fe63b3eedc
1 changed files with 4 additions and 12 deletions
  1. +4
    -12
      libavcodec/ffv1.c

+ 4
- 12
libavcodec/ffv1.c View File

@@ -119,7 +119,7 @@ av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)


av_assert0(max_slice_count > 0); 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 sx = i % f->num_h_slices;
int sy = i / f->num_h_slices; int sy = i / f->num_h_slices;
int sxs = f->avctx->width * sx / 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) if (!fs)
goto memfail; goto memfail;


f->slice_context[i] = fs;
f->slice_context[i++] = fs;
memcpy(fs, f, sizeof(*fs)); memcpy(fs, f, sizeof(*fs));
memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2)); 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)); sizeof(*fs->sample_buffer));
fs->sample_buffer32 = av_malloc_array((fs->width + 6), 3 * MAX_PLANES * fs->sample_buffer32 = av_malloc_array((fs->width + 6), 3 * MAX_PLANES *
sizeof(*fs->sample_buffer32)); 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; goto memfail;
}
} }
f->max_slice_count = max_slice_count; f->max_slice_count = max_slice_count;
return 0; return 0;


memfail: 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); return AVERROR(ENOMEM);
} }




Loading…
Cancel
Save