X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdnxhdenc.c;h=41b8079a09ca9ba6176b4e2df0db48318d84c0ee;hb=92c25963e8b68c47055b813334eaf76599936a90;hp=86e71ca8b034d602083fd670f64de9cf79bf7c80;hpb=f75ba4c2d632a613df9eb40e8ae7ac9fb162b67e;p=ffmpeg diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c index 86e71ca8b03..41b8079a09c 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; @@ -473,10 +473,16 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx) ctx->m.mb_height /= 2; } + if (ctx->interlaced && ctx->profile != FF_PROFILE_DNXHD) { + av_log(avctx, AV_LOG_ERROR, + "Interlaced encoding is not supported for DNxHR profiles.\n"); + return AVERROR(EINVAL); + } + ctx->m.mb_num = ctx->m.mb_height * ctx->m.mb_width; if (ctx->cid_table->frame_size == DNXHD_VARIABLE) { - ctx->frame_size = ff_dnxhd_get_hr_frame_size(ctx->cid, + ctx->frame_size = avpriv_dnxhd_get_hr_frame_size(ctx->cid, avctx->width, avctx->height); av_assert0(ctx->frame_size >= 0); ctx->coding_unit_size = ctx->frame_size; @@ -1348,11 +1354,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); @@ -1369,8 +1374,10 @@ static av_cold int dnxhd_encode_end(AVCodecContext *avctx) av_freep(&ctx->qmatrix_c16); av_freep(&ctx->qmatrix_l16); - for (i = 1; i < avctx->thread_count; i++) - av_freep(&ctx->thread[i]); + if (avctx->active_thread_type == FF_THREAD_SLICE) { + for (i = 1; i < avctx->thread_count; i++) + av_freep(&ctx->thread[i]); + } return 0; } @@ -1390,6 +1397,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,