diff options
author | Paul B Mahol <onemda@gmail.com> | 2018-08-30 11:35:07 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2018-08-31 17:45:35 +0200 |
commit | aeb73c73e112130fe344529bebb71bca3d286cb9 (patch) | |
tree | b57c0f0ee6482530438eebe4c95945fb095f14c2 | |
parent | 56f68a099cc607658118e00cad30569103ae3751 (diff) | |
download | ffmpeg-aeb73c73e112130fe344529bebb71bca3d286cb9.tar.gz |
avcodec/dnxhdenc: stop leaking memory when initalization fails
Fixes #6593.
-rw-r--r-- | libavcodec/dnxhdenc.c | 18 | ||||
-rw-r--r-- | libavcodec/dnxhdenc.h | 2 |
2 files changed, 11 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, diff --git a/libavcodec/dnxhdenc.h b/libavcodec/dnxhdenc.h index 963821ac81..7b0d862e28 100644 --- a/libavcodec/dnxhdenc.h +++ b/libavcodec/dnxhdenc.h @@ -86,6 +86,8 @@ typedef struct DNXHDEncContext { unsigned frame_bits; uint8_t *src[3]; + uint32_t *orig_vlc_codes; + uint8_t *orig_vlc_bits; uint32_t *vlc_codes; uint8_t *vlc_bits; uint16_t *run_codes; |