summaryrefslogtreecommitdiff
path: root/libavcodec/dnxhdenc.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2018-08-30 11:35:07 +0200
committerPaul B Mahol <onemda@gmail.com>2018-08-31 17:45:35 +0200
commitaeb73c73e112130fe344529bebb71bca3d286cb9 (patch)
treeb57c0f0ee6482530438eebe4c95945fb095f14c2 /libavcodec/dnxhdenc.c
parent56f68a099cc607658118e00cad30569103ae3751 (diff)
downloadffmpeg-aeb73c73e112130fe344529bebb71bca3d286cb9.tar.gz
avcodec/dnxhdenc: stop leaking memory when initalization fails
Fixes #6593.
Diffstat (limited to 'libavcodec/dnxhdenc.c')
-rw-r--r--libavcodec/dnxhdenc.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c
index 01e22e7764..5135eedfd6 100644
--- a/libavcodec/dnxhdenc.c
+++ b/libavcodec/dnxhdenc.c
@@ -207,17 +207,17 @@ static av_cold int dnxhd_init_vlc(DNXHDEncContext *ctx)
int i, j, level, run;
int max_level = 1 << (ctx->bit_depth + 2);
- FF_ALLOCZ_ARRAY_OR_GOTO(ctx->m.avctx, ctx->vlc_codes,
- max_level, 4 * sizeof(*ctx->vlc_codes), fail);
- FF_ALLOCZ_ARRAY_OR_GOTO(ctx->m.avctx, ctx->vlc_bits,
- max_level, 4 * sizeof(*ctx->vlc_bits), fail);
+ FF_ALLOCZ_ARRAY_OR_GOTO(ctx->m.avctx, ctx->orig_vlc_codes,
+ max_level, 4 * sizeof(*ctx->orig_vlc_codes), fail);
+ FF_ALLOCZ_ARRAY_OR_GOTO(ctx->m.avctx, ctx->orig_vlc_bits,
+ max_level, 4 * sizeof(*ctx->orig_vlc_bits), fail);
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_codes,
63 * 2, fail);
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_bits,
63, fail);
- ctx->vlc_codes += max_level * 2;
- ctx->vlc_bits += max_level * 2;
+ ctx->vlc_codes = ctx->orig_vlc_codes + max_level * 2;
+ ctx->vlc_bits = ctx->orig_vlc_bits + max_level * 2;
for (level = -max_level; level < max_level; level++) {
for (run = 0; run < 2; run++) {
int index = (level << 1) | run;
@@ -1348,11 +1348,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
static av_cold int dnxhd_encode_end(AVCodecContext *avctx)
{
DNXHDEncContext *ctx = avctx->priv_data;
- int max_level = 1 << (ctx->bit_depth + 2);
int i;
- av_free(ctx->vlc_codes - max_level * 2);
- av_free(ctx->vlc_bits - max_level * 2);
+ av_freep(&ctx->orig_vlc_codes);
+ av_freep(&ctx->orig_vlc_bits);
av_freep(&ctx->run_codes);
av_freep(&ctx->run_bits);
@@ -1392,6 +1391,7 @@ AVCodec ff_dnxhd_encoder = {
.encode2 = dnxhd_encode_picture,
.close = dnxhd_encode_end,
.capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_INTRA_ONLY,
+ .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
.pix_fmts = (const enum AVPixelFormat[]) {
AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV422P10,