diff --git a/Changelog b/Changelog index 32f5ec4808..f9be9ed1be 100644 --- a/Changelog +++ b/Changelog @@ -11,6 +11,7 @@ version : - RTP/mpegts muxer - VP8 in Ogg demuxing - OpenH264 encoder wrapper +- Support DNx100 (960x720@8) version 11: diff --git a/libavcodec/dnxhddata.c b/libavcodec/dnxhddata.c index 0edaeec98a..b23e337705 100644 --- a/libavcodec/dnxhddata.c +++ b/libavcodec/dnxhddata.c @@ -231,6 +231,28 @@ static const uint8_t dnxhd_1256_chroma_weight[] = { 34, 37, 39, 44, 51, 56, 61, 70, }; +static const uint8_t dnxhd_1258_luma_weight[] = { + 0, 32, 36, 36, 40, 40, 55, 60, + 34, 36, 37, 40, 41, 48, 57, 82, + 35, 36, 41, 41, 46, 52, 73, 82, + 37, 40, 42, 45, 50, 65, 80, 87, + 39, 41, 44, 49, 62, 78, 88, 90, + 41, 44, 49, 58, 73, 90, 95, 95, + 43, 52, 55, 68, 90, 100, 97, 93, + 52, 53, 71, 82, 107, 103, 99, 99, +}; + +static const uint8_t dnxhd_1258_chroma_weight[] = { + 0, 32, 37, 38, 49, 53, 65, 66, + 35, 37, 40, 49, 56, 64, 65, 82, + 36, 42, 50, 56, 64, 67, 73, 85, + 46, 50, 57, 63, 71, 72, 89, 87, + 49, 58, 65, 72, 78, 88, 88, 90, + 60, 64, 74, 81, 84, 90, 95, 134, + 62, 74, 77, 80, 90, 114, 129, 125, + 74, 74, 90, 100, 128, 125, 116, 116, +}; + static const uint8_t dnxhd_1237_dc_codes[12] = { 0, 12, 13, 1, 2, 3, 4, 5, 14, 30, 62, 63, }; @@ -1073,6 +1095,14 @@ static const uint8_t dnxhd_1252_ac_index_flag[257] = { 1, }; +static const uint8_t dnxhd_1258_dc_codes[14] = { + 0, 12, 13, 1, 2, 3, 4, 5, 14, 30, 62, 63, 0, 0, +}; + +static const uint8_t dnxhd_1258_dc_bits[14] = { + 3, 4, 4, 3, 3, 3, 3, 3, 4, 5, 6, 6, 0, 0, +}; + const CIDEntry ff_dnxhd_cid_table[] = { { 1235, 1920, 1080, 0, 917504, 917504, 6, 10, dnxhd_1235_luma_weight, dnxhd_1235_chroma_weight, @@ -1151,6 +1181,13 @@ const CIDEntry ff_dnxhd_cid_table[] = { dnxhd_1235_1241_ac_run_flag, dnxhd_1235_1241_ac_index_flag, dnxhd_1235_1238_1241_run_codes, dnxhd_1235_1238_1241_run_bits, dnxhd_1235_1241_run, { 350, 390, 440, 730, 880 } }, + { 1258, 960, 720, 0, 212992, 212992, 4, 8, + dnxhd_1258_luma_weight, dnxhd_1258_chroma_weight, + dnxhd_1258_dc_codes, dnxhd_1258_dc_bits, + dnxhd_1252_ac_codes, dnxhd_1252_ac_bits, dnxhd_1252_ac_level, + dnxhd_1252_ac_run_flag, dnxhd_1252_ac_index_flag, + dnxhd_1251_run_codes, dnxhd_1251_run_bits, dnxhd_1251_run, + { 42, 60, 75, 115 } }, }; int ff_dnxhd_get_cid_table(int cid) diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index 9b1e48158d..eb00e86af3 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -165,6 +165,15 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, if ((ret = dnxhd_init_vlc(ctx, cid)) < 0) return ret; + // make sure profile size constraints are respected + // DNx100 allows 1920->1440 and 1280->960 subsampling + if (ctx->width != ctx->cid_table->width) { + av_reduce(&ctx->avctx->sample_aspect_ratio.num, + &ctx->avctx->sample_aspect_ratio.den, + ctx->width, ctx->cid_table->width, 255); + ctx->width = ctx->cid_table->width; + } + if (buf_size < ctx->cid_table->coding_unit_size) { av_log(ctx->avctx, AV_LOG_ERROR, "incorrect frame size (%d < %d).\n", buf_size, ctx->cid_table->coding_unit_size);