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;
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;
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);
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;
}
.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,