From 1edaf601f3a25b2c6d264d39078aa28ae9300615 Mon Sep 17 00:00:00 2001 From: Martin Vignali Date: Sun, 2 Dec 2018 21:40:56 +0100 Subject: [PATCH] avcodec/prores_aw : add 4444 xq support --- libavcodec/proresenc_anatoliy.c | 37 +++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/libavcodec/proresenc_anatoliy.c b/libavcodec/proresenc_anatoliy.c index b9524b3d99..2bed58bdc1 100644 --- a/libavcodec/proresenc_anatoliy.c +++ b/libavcodec/proresenc_anatoliy.c @@ -45,12 +45,13 @@ static const AVProfile profiles[] = { { FF_PROFILE_PRORES_STANDARD, "apcn"}, { FF_PROFILE_PRORES_HQ, "apch"}, { FF_PROFILE_PRORES_4444, "ap4h"}, + { FF_PROFILE_PRORES_XQ, "ap4x"}, { FF_PROFILE_UNKNOWN } }; -static const int qp_start_table[5] = { 8, 3, 2, 1, 1}; -static const int qp_end_table[5] = { 13, 9, 6, 6, 5}; -static const int bitrate_table[5] = { 1000, 2100, 3500, 5400, 7000}; +static const int qp_start_table[6] = { 8, 3, 2, 1, 1, 1}; +static const int qp_end_table[6] = { 13, 9, 6, 6, 5, 4}; +static const int bitrate_table[6] = { 1000, 2100, 3500, 5400, 7000, 10000}; static const int valid_primaries[9] = { AVCOL_PRI_RESERVED0, AVCOL_PRI_BT709, AVCOL_PRI_UNSPECIFIED, AVCOL_PRI_BT470BG, AVCOL_PRI_SMPTE170M, AVCOL_PRI_BT2020, AVCOL_PRI_SMPTE431, AVCOL_PRI_SMPTE432,INT_MAX }; @@ -58,7 +59,7 @@ static const int valid_trc[4] = { AVCOL_TRC_RESERVED0, AVCOL_TRC_BT709, A static const int valid_colorspace[5] = { AVCOL_SPC_BT709, AVCOL_SPC_UNSPECIFIED, AVCOL_SPC_SMPTE170M, AVCOL_SPC_BT2020_NCL, INT_MAX }; -static const uint8_t QMAT_LUMA[5][64] = { +static const uint8_t QMAT_LUMA[6][64] = { { 4, 7, 9, 11, 13, 14, 15, 63, 7, 7, 11, 12, 14, 15, 63, 63, @@ -104,10 +105,19 @@ static const uint8_t QMAT_LUMA[5][64] = { 4, 4, 4, 4, 4, 5, 5, 6, 4, 4, 4, 4, 5, 5, 6, 7, 4, 4, 4, 4, 5, 6, 7, 7 + }, { /* 444 XQ */ + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 3, 3, + 2, 2, 2, 2, 2, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 4, + 2, 2, 2, 2, 3, 3, 4, 4, } }; -static const uint8_t QMAT_CHROMA[5][64] = { +static const uint8_t QMAT_CHROMA[6][64] = { { 4, 7, 9, 11, 13, 14, 63, 63, 7, 7, 11, 12, 14, 63, 63, 63, @@ -153,6 +163,15 @@ static const uint8_t QMAT_CHROMA[5][64] = { 4, 4, 4, 4, 4, 5, 5, 6, 4, 4, 4, 4, 5, 5, 6, 7, 4, 4, 4, 4, 5, 6, 7, 7 + }, { /* 444 xq */ + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 5, + 4, 4, 4, 4, 4, 4, 5, 5, + 4, 4, 4, 4, 4, 5, 5, 6, + 4, 4, 4, 4, 5, 5, 6, 7, + 4, 4, 4, 4, 5, 6, 7, 7 } }; @@ -686,7 +705,7 @@ static int prores_encode_frame(AVCodecContext *avctx, AVPacket *pkt, bytestream_put_buffer(&buf, ctx->vendor, 4); bytestream_put_be16(&buf, avctx->width); bytestream_put_be16(&buf, avctx->height); - if (avctx->profile == FF_PROFILE_PRORES_4444) { + if (avctx->profile >= FF_PROFILE_PRORES_4444) { /* 4444 or 4444 Xq */ *buf++ = 0xC2; // 444, not interlaced } else { *buf++ = 0x82; // 422, not interlaced @@ -768,16 +787,16 @@ static av_cold int prores_encode_init(AVCodecContext *avctx) return AVERROR(EINVAL); } } else if (avctx->profile < FF_PROFILE_PRORES_PROXY - || avctx->profile > FF_PROFILE_PRORES_4444) { + || avctx->profile > FF_PROFILE_PRORES_XQ) { av_log( avctx, AV_LOG_ERROR, - "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch, 4 - ap4h]\n", + "unknown profile %d, use [0 - apco, 1 - apcs, 2 - apcn (default), 3 - apch, 4 - ap4h, 5 - ap4x]\n", avctx->profile); return AVERROR(EINVAL); } else if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P10) && (avctx->profile > FF_PROFILE_PRORES_HQ)){ av_log(avctx, AV_LOG_ERROR, - "encoding with ProRes 444 (ap4h) profile, need YUV444P10 input\n"); + "encoding with ProRes 444/Xq (ap4h/ap4x) profile, need YUV444P10 input\n"); return AVERROR(EINVAL); } else if ((avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) && (avctx->profile < FF_PROFILE_PRORES_4444)){