From ae03d92b52bb7581df2e75d571989cb1ecd19cbd Mon Sep 17 00:00:00 2001 From: Phillip Blucas <pblucas@gmail.com> Date: Thu, 4 Oct 2018 13:35:57 -0500 Subject: [PATCH] Add support for Sony XAVC Class 300 and 480 This allows for 2160p UHD at up to 960 Mbit/s. --- common/set.h | 3 +- common/tables.c | 47 +++++++++++++++--- common/tables.h | 3 ++ encoder/encoder.c | 121 ++++++++++++++++++++++++++++------------------ encoder/set.c | 32 ++++++++---- x264.c | 2 +- x264.h | 2 +- 7 files changed, 143 insertions(+), 67 deletions(-) diff --git a/common/set.h b/common/set.h index e297c57d..3f05ea99 100644 --- a/common/set.h +++ b/common/set.h @@ -140,7 +140,8 @@ typedef struct int b_qpprime_y_zero_transform_bypass; int i_chroma_format_idc; - int b_avcintra; + int b_avcintra_hd; + int b_avcintra_4k; int i_cqm_preset; const uint8_t *scaling_list[8]; /* could be 12, but we don't allow separate Cb/Cr lists */ diff --git a/common/tables.c b/common/tables.c index 1783a697..20d64559 100644 --- a/common/tables.c +++ b/common/tables.c @@ -243,7 +243,7 @@ const uint8_t * const x264_cqm_jvt[8] = x264_cqm_jvt8i, x264_cqm_jvt8p }; -// 1080i25_avci50, 1080p25_avci50 +// 720p_avci50, 1080i_avci50, 1080p_avci50 const uint8_t x264_cqm_avci50_4ic[16] = { 16,22,28,40, @@ -252,7 +252,7 @@ const uint8_t x264_cqm_avci50_4ic[16] = 40,44,48,60 }; -// 1080p25_avci50, 720p25_avci50, 720p50_avci50 +// 720p_avci50, 1080p_avci50 const uint8_t x264_cqm_avci50_p_8iy[64] = { 16,18,19,21,24,27,30,33, @@ -265,7 +265,7 @@ const uint8_t x264_cqm_avci50_p_8iy[64] = 33,78,81,84,87,90,93,96 }; -// 1080i25_avci50, +// 1080i_avci50 const uint8_t x264_cqm_avci50_1080i_8iy[64] = { 16,18,19,21,27,33,81,87, @@ -278,7 +278,7 @@ const uint8_t x264_cqm_avci50_1080i_8iy[64] = 30,33,33,78,81,84,87,96 }; -// 720p25_avci100, 720p50_avci100 +// 720p_avci100 const uint8_t x264_cqm_avci100_720p_4ic[16] = { 16,21,27,34, @@ -287,7 +287,7 @@ const uint8_t x264_cqm_avci100_720p_4ic[16] = 34,41,46,54 }; -// 720p25_avci100, 720p50_avci100 +// 720p_avci100 const uint8_t x264_cqm_avci100_720p_8iy[64] = { 16,18,19,21,22,24,26,32, @@ -300,7 +300,7 @@ const uint8_t x264_cqm_avci100_720p_8iy[64] = 32,32,32,34,34,36,38,42 }; -// 1080i25_avci100, 1080p25_avci100 +// 1080i_avci100, 1080p_avci100 const uint8_t x264_cqm_avci100_1080_4ic[16] = { 16,20,26,32, @@ -309,7 +309,7 @@ const uint8_t x264_cqm_avci100_1080_4ic[16] = 32,38,44,50 }; -// 1080i25_avci100, +// 1080i_avci100 const uint8_t x264_cqm_avci100_1080i_8iy[64] = { 16,19,20,23,24,26,32,42, @@ -322,7 +322,7 @@ const uint8_t x264_cqm_avci100_1080i_8iy[64] = 22,23,24,26,36,42,59,72 }; -// 1080p25_avci100, +// 1080p_avci100 const uint8_t x264_cqm_avci100_1080p_8iy[64] = { 16,18,19,20,22,23,24,26, @@ -335,6 +335,37 @@ const uint8_t x264_cqm_avci100_1080p_8iy[64] = 26,32,36,42,59,63,68,72 }; +// 2160p_avci300 +const uint8_t x264_cqm_avci300_2160p_4iy[16] = +{ + 12,16,19,20, + 16,19,20,24, + 19,20,24,33, + 20,24,33,39 +}; + +// 2160p_avci300 +const uint8_t x264_cqm_avci300_2160p_4ic[16] = +{ + 28,39,56,67, + 39,56,67,77, + 56,67,77,104, + 67,77,104,133 +}; + +// 2160p_avci300 +const uint8_t x264_cqm_avci300_2160p_8iy[64] = +{ + 12,14,16,17,19,20,20,24, + 14,16,17,19,20,20,24,30, + 16,17,19,20,20,24,30,42, + 17,19,20,20,24,30,42,56, + 19,20,20,24,30,42,56,72, + 20,20,24,30,42,56,72,76, + 20,24,30,42,56,72,76,80, + 24,30,42,56,72,76,80,84 +}; + /***************************************************************************** * QUANT *****************************************************************************/ diff --git a/common/tables.h b/common/tables.h index 7f13b9cd..8f120fe7 100644 --- a/common/tables.h +++ b/common/tables.h @@ -63,6 +63,9 @@ extern const uint8_t x264_cqm_avci100_720p_8iy[64]; extern const uint8_t x264_cqm_avci100_1080_4ic[16]; extern const uint8_t x264_cqm_avci100_1080i_8iy[64]; extern const uint8_t x264_cqm_avci100_1080p_8iy[64]; +extern const uint8_t x264_cqm_avci300_2160p_4iy[16]; +extern const uint8_t x264_cqm_avci300_2160p_4ic[16]; +extern const uint8_t x264_cqm_avci300_2160p_8iy[64]; extern const uint8_t x264_decimate_table4[16]; extern const uint8_t x264_decimate_table8[64]; diff --git a/encoder/encoder.c b/encoder/encoder.c index d8190b30..d4ddfa0c 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -717,7 +717,9 @@ static int validate_parameters( x264_t *h, int b_open ) return -1; } - int type = h->param.i_avcintra_class == 200 ? 2 : + int type = h->param.i_avcintra_class == 480 ? 4 : + h->param.i_avcintra_class == 300 ? 3 : + h->param.i_avcintra_class == 200 ? 2 : h->param.i_avcintra_class == 100 ? 1 : h->param.i_avcintra_class == 50 ? 0 : -1; if( type < 0 ) @@ -725,63 +727,88 @@ static int validate_parameters( x264_t *h, int b_open ) x264_log( h, X264_LOG_ERROR, "Invalid AVC-Intra class\n" ); return -1; } + else if( type > 2 && h->param.i_avcintra_flavor != X264_AVCINTRA_FLAVOR_SONY ) + { + x264_log( h, X264_LOG_ERROR, "AVC-Intra %d only supported by Sony XAVC flavor\n", h->param.i_avcintra_class ); + return -1; + } - /* [50/100/200][res][fps] */ + /* [50/100/200/300/480][res][fps] */ static const struct { uint16_t fps_num; uint16_t fps_den; uint8_t interlaced; uint16_t frame_size; + const uint8_t *cqm_4iy; const uint8_t *cqm_4ic; const uint8_t *cqm_8iy; - } avcintra_lut[3][2][7] = - { - {{{ 60000, 1001, 0, 912, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 50, 1, 0, 1100, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 30000, 1001, 0, 912, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 25, 1, 0, 1100, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 24000, 1001, 0, 912, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }}, - {{ 30000, 1001, 1, 1820, x264_cqm_avci50_4ic, x264_cqm_avci50_1080i_8iy }, - { 25, 1, 1, 2196, x264_cqm_avci50_4ic, x264_cqm_avci50_1080i_8iy }, - { 60000, 1001, 0, 1820, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 30000, 1001, 0, 1820, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 50, 1, 0, 2196, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 25, 1, 0, 2196, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, - { 24000, 1001, 0, 1820, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }}}, - {{{ 60000, 1001, 0, 1848, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, - { 50, 1, 0, 2224, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, - { 30000, 1001, 0, 1848, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, - { 25, 1, 0, 2224, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, - { 24000, 1001, 0, 1848, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }}, - {{ 30000, 1001, 1, 3692, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, - { 25, 1, 1, 4444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, - { 60000, 1001, 0, 3692, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 30000, 1001, 0, 3692, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 50, 1, 0, 4444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 25, 1, 0, 4444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 24000, 1001, 0, 3692, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }}}, - {{{ 60000, 1001, 0, 3724, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, - { 50, 1, 0, 4472, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }}, - {{ 30000, 1001, 1, 7444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, - { 25, 1, 1, 8940, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, - { 60000, 1001, 0, 7444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 30000, 1001, 0, 7444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 50, 1, 0, 8940, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 25, 1, 0, 8940, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, - { 24000, 1001, 0, 7444, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }}} + } avcintra_lut[5][2][7] = + { + {{{ 60000, 1001, 0, 912, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 50, 1, 0, 1100, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 30000, 1001, 0, 912, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 25, 1, 0, 1100, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 24000, 1001, 0, 912, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }}, + {{ 30000, 1001, 1, 1820, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_1080i_8iy }, + { 25, 1, 1, 2196, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_1080i_8iy }, + { 60000, 1001, 0, 1820, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 30000, 1001, 0, 1820, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 50, 1, 0, 2196, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 25, 1, 0, 2196, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }, + { 24000, 1001, 0, 1820, x264_cqm_jvt4i, x264_cqm_avci50_4ic, x264_cqm_avci50_p_8iy }}}, + {{{ 60000, 1001, 0, 1848, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, + { 50, 1, 0, 2224, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, + { 30000, 1001, 0, 1848, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, + { 25, 1, 0, 2224, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, + { 24000, 1001, 0, 1848, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }}, + {{ 30000, 1001, 1, 3692, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, + { 25, 1, 1, 4444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, + { 60000, 1001, 0, 3692, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 30000, 1001, 0, 3692, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 50, 1, 0, 4444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 25, 1, 0, 4444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 24000, 1001, 0, 3692, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }}}, + {{{ 60000, 1001, 0, 3724, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }, + { 50, 1, 0, 4472, x264_cqm_jvt4i, x264_cqm_avci100_720p_4ic, x264_cqm_avci100_720p_8iy }}, + {{ 30000, 1001, 1, 7444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, + { 25, 1, 1, 8940, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080i_8iy }, + { 60000, 1001, 0, 7444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 30000, 1001, 0, 7444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 50, 1, 0, 8940, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 25, 1, 0, 8940, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }, + { 24000, 1001, 0, 7444, x264_cqm_jvt4i, x264_cqm_avci100_1080_4ic, x264_cqm_avci100_1080p_8iy }}}, + {{{ 60000, 1001, 0, 9844, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 50, 1, 0, 9844, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 30000, 1001, 0, 9844, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 25, 1, 0, 9844, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 24000, 1001, 0, 9844, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }}}, + {{{ 60000, 1001, 0, 15700, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 50, 1, 0, 15700, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 30000, 1001, 0, 15700, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 25, 1, 0, 15700, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }, + { 24000, 1001, 0, 15700, x264_cqm_avci300_2160p_4iy, x264_cqm_avci300_2160p_4ic, x264_cqm_avci300_2160p_8iy }}} }; int res = -1; if( i_csp >= X264_CSP_I420 && i_csp < X264_CSP_I422 && !type ) { - if( h->param.i_width == 1440 && h->param.i_height == 1080 ) res = 1; - else if( h->param.i_width == 960 && h->param.i_height == 720 ) res = 0; + if( h->param.i_width == 1440 && h->param.i_height == 1080 ) res = 1; + else if( h->param.i_width == 960 && h->param.i_height == 720 ) res = 0; } else if( i_csp >= X264_CSP_I422 && i_csp < X264_CSP_I444 && type ) { - if( h->param.i_width == 1920 && h->param.i_height == 1080 ) res = 1; - else if( h->param.i_width == 1280 && h->param.i_height == 720 ) res = 0; + if( type < 3 ) + { + if( h->param.i_width == 1920 && h->param.i_height == 1080 ) res = 1; + else if( h->param.i_width == 2048 && h->param.i_height == 1080 ) res = 1; + else if( h->param.i_width == 1280 && h->param.i_height == 720 ) res = 0; + } + else + { + if( h->param.i_width == 3840 && h->param.i_height == 2160 ) res = 0; + else if( h->param.i_width == 4096 && h->param.i_height == 2160 ) res = 0; + } } else { @@ -822,8 +849,8 @@ static int validate_parameters( x264_t *h, int b_open ) } if( i == 7 ) { - x264_log( h, X264_LOG_ERROR, "FPS %d/%d%c not compatible with AVC-Intra\n", - h->param.i_fps_num, h->param.i_fps_den, PARAM_INTERLACED ? 'i' : 'p' ); + x264_log( h, X264_LOG_ERROR, "FPS %d/%d%c not compatible with AVC-Intra %d\n", + h->param.i_fps_num, h->param.i_fps_den, PARAM_INTERLACED ? 'i' : 'p', h->param.i_avcintra_class ); return -1; } @@ -843,7 +870,7 @@ static int validate_parameters( x264_t *h, int b_open ) h->param.b_pic_struct = 0; h->param.analyse.b_transform_8x8 = 1; h->param.analyse.intra = X264_ANALYSE_I8x8; - h->param.analyse.i_chroma_qp_offset = res && type ? 3 : 4; + h->param.analyse.i_chroma_qp_offset = type > 2 ? -4 : res && type ? 3 : 4; h->param.b_cabac = !type; h->param.rc.i_vbv_buffer_size = avcintra_lut[type][res][i].frame_size; h->param.rc.i_vbv_max_bitrate = @@ -852,7 +879,7 @@ static int validate_parameters( x264_t *h, int b_open ) h->param.rc.f_vbv_buffer_init = 1.0; h->param.rc.b_filler = 1; h->param.i_cqm_preset = X264_CQM_CUSTOM; - memcpy( h->param.cqm_4iy, x264_cqm_jvt4i, sizeof(h->param.cqm_4iy) ); + memcpy( h->param.cqm_4iy, avcintra_lut[type][res][i].cqm_4iy, sizeof(h->param.cqm_4iy) ); memcpy( h->param.cqm_4ic, avcintra_lut[type][res][i].cqm_4ic, sizeof(h->param.cqm_4ic) ); memcpy( h->param.cqm_8iy, avcintra_lut[type][res][i].cqm_8iy, sizeof(h->param.cqm_8iy) ); @@ -1545,7 +1572,7 @@ x264_t *x264_encoder_open( x264_param_t *param, void *api ) h->i_frame_num = 0; if( h->param.i_avcintra_class ) - h->i_idr_pic_id = 5; + h->i_idr_pic_id = h->param.i_avcintra_class > 200 ? 4 : 5; else h->i_idr_pic_id = 0; @@ -3665,7 +3692,7 @@ int x264_encoder_encode( x264_t *h, int total_len = 256; /* Sony XAVC uses an oversized PPS instead of SEI padding */ if( h->param.i_avcintra_flavor == X264_AVCINTRA_FLAVOR_SONY ) - total_len += h->param.i_height == 1080 ? 18*512 : 10*512; + total_len += h->param.i_height >= 1080 ? 18*512 : 10*512; h->out.nal[h->out.i_nal-1].i_padding = total_len - h->out.nal[h->out.i_nal-1].i_payload - NALU_OVERHEAD; } overhead += h->out.nal[h->out.i_nal-1].i_payload + h->out.nal[h->out.i_nal-1].i_padding + NALU_OVERHEAD; diff --git a/encoder/set.c b/encoder/set.c index fbebb5f4..ec79985c 100644 --- a/encoder/set.c +++ b/encoder/set.c @@ -241,7 +241,8 @@ void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param ) sps->vui.i_log2_max_mv_length_vertical = (int)log2f( X264_MAX( 1, param->analyse.i_mv_range*4-1 ) ) + 1; } - sps->b_avcintra = !!param->i_avcintra_class; + sps->b_avcintra_hd = param->i_avcintra_class && param->i_avcintra_class <= 200; + sps->b_avcintra_4k = param->i_avcintra_class > 200; sps->i_cqm_preset = param->i_cqm_preset; } @@ -325,8 +326,8 @@ void x264_sps_write( bs_t *s, x264_sps_t *sps ) bs_write_ue( s, BIT_DEPTH-8 ); // bit_depth_chroma_minus8 bs_write1( s, sps->b_qpprime_y_zero_transform_bypass ); /* Exactly match the AVC-Intra bitstream */ - bs_write1( s, sps->b_avcintra ); // seq_scaling_matrix_present_flag - if( sps->b_avcintra ) + bs_write1( s, sps->b_avcintra_hd ); // seq_scaling_matrix_present_flag + if( sps->b_avcintra_hd ) { scaling_list_write( s, sps, CQM_4IY ); scaling_list_write( s, sps, CQM_4IC ); @@ -524,7 +525,7 @@ void x264_pps_write( bs_t *s, x264_sps_t *sps, x264_pps_t *pps ) bs_write1( s, pps->b_constrained_intra_pred ); bs_write1( s, pps->b_redundant_pic_cnt ); - int b_scaling_list = !sps->b_avcintra && sps->i_cqm_preset != X264_CQM_FLAT; + int b_scaling_list = !sps->b_avcintra_hd && sps->i_cqm_preset != X264_CQM_FLAT; if( pps->b_transform_8x8_mode || b_scaling_list ) { bs_write1( s, pps->b_transform_8x8_mode ); @@ -533,14 +534,27 @@ void x264_pps_write( bs_t *s, x264_sps_t *sps, x264_pps_t *pps ) { scaling_list_write( s, sps, CQM_4IY ); scaling_list_write( s, sps, CQM_4IC ); - bs_write1( s, 0 ); // Cr = Cb - scaling_list_write( s, sps, CQM_4PY ); - scaling_list_write( s, sps, CQM_4PC ); - bs_write1( s, 0 ); // Cr = Cb + if( sps->b_avcintra_4k ) + { + scaling_list_write( s, sps, CQM_4IC ); + bs_write1( s, 0 ); // no inter + bs_write1( s, 0 ); // no inter + bs_write1( s, 0 ); // no inter + } + else + { + bs_write1( s, 0 ); // Cr = Cb + scaling_list_write( s, sps, CQM_4PY ); + scaling_list_write( s, sps, CQM_4PC ); + bs_write1( s, 0 ); // Cr = Cb + } if( pps->b_transform_8x8_mode ) { scaling_list_write( s, sps, CQM_8IY+4 ); - scaling_list_write( s, sps, CQM_8PY+4 ); + if( sps->b_avcintra_4k ) + bs_write1( s, 0 ); // no inter + else + scaling_list_write( s, sps, CQM_8PY+4 ); if( sps->i_chroma_format_idc == CHROMA_444 ) { scaling_list_write( s, sps, CQM_8IC+4 ); diff --git a/x264.c b/x264.c index 4765973a..747bf3c9 100644 --- a/x264.c +++ b/x264.c @@ -140,7 +140,7 @@ static cli_output_t cli_output; /* video filter operation struct */ static cli_vid_filter_t filter; -const char * const x264_avcintra_class_names[] = { "50", "100", "200", 0 }; +const char * const x264_avcintra_class_names[] = { "50", "100", "200", "300", "480", 0 }; const char * const x264_cqm_names[] = { "flat", "jvt", 0 }; const char * const x264_log_level_names[] = { "none", "error", "warning", "info", "debug", 0 }; const char * const x264_partition_names[] = { "p8x8", "p4x4", "b8x8", "i8x8", "i4x4", "none", "all", 0 }; diff --git a/x264.h b/x264.h index d9644b6f..d685efbd 100644 --- a/x264.h +++ b/x264.h @@ -45,7 +45,7 @@ extern "C" { #include "x264_config.h" -#define X264_BUILD 163 +#define X264_BUILD 164 #ifdef _WIN32 # define X264_DLL_IMPORT __declspec(dllimport) -- 2.40.0