aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/proresenc_anatoliy.c
diff options
context:
space:
mode:
authorMartin Vignali <martin.vignali@gmail.com>2018-12-02 21:40:56 +0100
committerMartin Vignali <martin.vignali@gmail.com>2018-12-04 15:17:47 +0100
commit1edaf601f3a25b2c6d264d39078aa28ae9300615 (patch)
tree1c8ba5cdda8723a1434754538309632a0b32080b /libavcodec/proresenc_anatoliy.c
parentbbbbf237597e116f6af9094b57e979a7acc4afcb (diff)
downloadffmpeg-1edaf601f3a25b2c6d264d39078aa28ae9300615.tar.gz
avcodec/prores_aw : add 4444 xq support
Diffstat (limited to 'libavcodec/proresenc_anatoliy.c')
-rw-r--r--libavcodec/proresenc_anatoliy.c37
1 files 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)){