[x264-devel] Add support for levels 6, 6.1, and 6.2
Henrik Gramner
git at videolan.org
Mon Jun 26 21:58:26 CEST 2017
x264 | branch: master | Henrik Gramner <henrik at gramner.com> | Wed Feb 15 22:00:25 2017 +0100| [6f8aa71ce797be01fd2ebe53c072a6696ea19828] | committer: Anton Mitrofanov
Add support for levels 6, 6.1, and 6.2
These levels were added in the 2016-10 revision of the H.264 specification and
improves support for content with high resolutions and/or high frame rates.
Level 6.2 supports 8K resolution at 120 fps.
Also shrink the x264_levels array by using smaller data types.
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=6f8aa71ce797be01fd2ebe53c072a6696ea19828
---
common/common.c | 2 +-
encoder/encoder.c | 2 +-
encoder/ratecontrol.c | 2 +-
encoder/set.c | 37 ++++++++++++++++++++-----------------
tools/checkasm.c | 2 +-
x264.h | 28 ++++++++++++++--------------
6 files changed, 38 insertions(+), 35 deletions(-)
diff --git a/common/common.c b/common/common.c
index 445eb0f2..561212d3 100644
--- a/common/common.c
+++ b/common/common.c
@@ -669,7 +669,7 @@ int x264_param_parse( x264_param_t *p, const char *name, const char *value )
{
if( !strcmp(value, "1b") )
p->i_level_idc = 9;
- else if( atof(value) < 6 )
+ else if( atof(value) < 7 )
p->i_level_idc = (int)(10*atof(value)+.5);
else
p->i_level_idc = atoi(value);
diff --git a/encoder/encoder.c b/encoder/encoder.c
index 0b379aef..d183460c 100644
--- a/encoder/encoder.c
+++ b/encoder/encoder.c
@@ -1171,7 +1171,7 @@ static int x264_validate_parameters( x264_t *h, int b_open )
if( h->param.analyse.i_mv_range <= 0 )
h->param.analyse.i_mv_range = l->mv_range >> PARAM_INTERLACED;
else
- h->param.analyse.i_mv_range = x264_clip3(h->param.analyse.i_mv_range, 32, 512 >> PARAM_INTERLACED);
+ h->param.analyse.i_mv_range = x264_clip3(h->param.analyse.i_mv_range, 32, 8192 >> PARAM_INTERLACED);
}
h->param.analyse.i_weighted_pred = x264_clip3( h->param.analyse.i_weighted_pred, X264_WEIGHTP_NONE, X264_WEIGHTP_SMART );
diff --git a/encoder/ratecontrol.c b/encoder/ratecontrol.c
index 4ed1d993..5289316b 100644
--- a/encoder/ratecontrol.c
+++ b/encoder/ratecontrol.c
@@ -1469,7 +1469,7 @@ void x264_ratecontrol_start( x264_t *h, int i_force_qp, int overhead )
if( h->i_frame == 0 )
{
//384 * ( Max( PicSizeInMbs, fR * MaxMBPS ) + MaxMBPS * ( tr( 0 ) - tr,n( 0 ) ) ) / MinCR
- double fr = 1. / 172;
+ double fr = 1. / (h->param.i_level_idc >= 60 ? 300 : 172);
int pic_size_in_mbs = h->mb.i_mb_width * h->mb.i_mb_height;
rc->frame_size_maximum = 384 * BIT_DEPTH * X264_MAX( pic_size_in_mbs, fr*l->mbps ) / mincr;
}
diff --git a/encoder/set.c b/encoder/set.c
index f86189f5..2ab4e4e8 100644
--- a/encoder/set.c
+++ b/encoder/set.c
@@ -783,23 +783,26 @@ int x264_sei_avcintra_vanc_write( x264_t *h, bs_t *s, int len )
const x264_level_t x264_levels[] =
{
- { 10, 1485, 99, 396, 64, 175, 64, 64, 0, 2, 0, 0, 1 },
- { 9, 1485, 99, 396, 128, 350, 64, 64, 0, 2, 0, 0, 1 }, /* "1b" */
- { 11, 3000, 396, 900, 192, 500, 128, 64, 0, 2, 0, 0, 1 },
- { 12, 6000, 396, 2376, 384, 1000, 128, 64, 0, 2, 0, 0, 1 },
- { 13, 11880, 396, 2376, 768, 2000, 128, 64, 0, 2, 0, 0, 1 },
- { 20, 11880, 396, 2376, 2000, 2000, 128, 64, 0, 2, 0, 0, 1 },
- { 21, 19800, 792, 4752, 4000, 4000, 256, 64, 0, 2, 0, 0, 0 },
- { 22, 20250, 1620, 8100, 4000, 4000, 256, 64, 0, 2, 0, 0, 0 },
- { 30, 40500, 1620, 8100, 10000, 10000, 256, 32, 22, 2, 0, 1, 0 },
- { 31, 108000, 3600, 18000, 14000, 14000, 512, 16, 60, 4, 1, 1, 0 },
- { 32, 216000, 5120, 20480, 20000, 20000, 512, 16, 60, 4, 1, 1, 0 },
- { 40, 245760, 8192, 32768, 20000, 25000, 512, 16, 60, 4, 1, 1, 0 },
- { 41, 245760, 8192, 32768, 50000, 62500, 512, 16, 24, 2, 1, 1, 0 },
- { 42, 522240, 8704, 34816, 50000, 62500, 512, 16, 24, 2, 1, 1, 1 },
- { 50, 589824, 22080, 110400, 135000, 135000, 512, 16, 24, 2, 1, 1, 1 },
- { 51, 983040, 36864, 184320, 240000, 240000, 512, 16, 24, 2, 1, 1, 1 },
- { 52, 2073600, 36864, 184320, 240000, 240000, 512, 16, 24, 2, 1, 1, 1 },
+ { 10, 1485, 99, 396, 64, 175, 64, 64, 0, 2, 0, 0, 1 },
+ { 9, 1485, 99, 396, 128, 350, 64, 64, 0, 2, 0, 0, 1 }, /* "1b" */
+ { 11, 3000, 396, 900, 192, 500, 128, 64, 0, 2, 0, 0, 1 },
+ { 12, 6000, 396, 2376, 384, 1000, 128, 64, 0, 2, 0, 0, 1 },
+ { 13, 11880, 396, 2376, 768, 2000, 128, 64, 0, 2, 0, 0, 1 },
+ { 20, 11880, 396, 2376, 2000, 2000, 128, 64, 0, 2, 0, 0, 1 },
+ { 21, 19800, 792, 4752, 4000, 4000, 256, 64, 0, 2, 0, 0, 0 },
+ { 22, 20250, 1620, 8100, 4000, 4000, 256, 64, 0, 2, 0, 0, 0 },
+ { 30, 40500, 1620, 8100, 10000, 10000, 256, 32, 22, 2, 0, 1, 0 },
+ { 31, 108000, 3600, 18000, 14000, 14000, 512, 16, 60, 4, 1, 1, 0 },
+ { 32, 216000, 5120, 20480, 20000, 20000, 512, 16, 60, 4, 1, 1, 0 },
+ { 40, 245760, 8192, 32768, 20000, 25000, 512, 16, 60, 4, 1, 1, 0 },
+ { 41, 245760, 8192, 32768, 50000, 62500, 512, 16, 24, 2, 1, 1, 0 },
+ { 42, 522240, 8704, 34816, 50000, 62500, 512, 16, 24, 2, 1, 1, 1 },
+ { 50, 589824, 22080, 110400, 135000, 135000, 512, 16, 24, 2, 1, 1, 1 },
+ { 51, 983040, 36864, 184320, 240000, 240000, 512, 16, 24, 2, 1, 1, 1 },
+ { 52, 2073600, 36864, 184320, 240000, 240000, 512, 16, 24, 2, 1, 1, 1 },
+ { 60, 4177920, 139264, 696320, 240000, 240000, 8192, 16, 24, 2, 1, 1, 1 },
+ { 61, 8355840, 139264, 696320, 480000, 480000, 8192, 16, 24, 2, 1, 1, 1 },
+ { 62, 16711680, 139264, 696320, 800000, 800000, 8192, 16, 24, 2, 1, 1, 1 },
{ 0 }
};
diff --git a/tools/checkasm.c b/tools/checkasm.c
index bc159fa5..8e90235d 100644
--- a/tools/checkasm.c
+++ b/tools/checkasm.c
@@ -1981,7 +1981,7 @@ static int check_deblock( int cpu_ref, int cpu_new )
{
ref[j][k] = ((rand()&3) != 3) ? 0 : (rand() & 31) - 2;
for( int l = 0; l < 2; l++ )
- mv[j][k][l] = ((rand()&7) != 7) ? (rand()&7) - 3 : (rand()&1023) - 512;
+ mv[j][k][l] = ((rand()&7) != 7) ? (rand()&7) - 3 : (rand()&16383) - 8192;
}
call_c( db_c.deblock_strength, nnz, ref, mv, bs[0], 2<<(i&1), ((i>>1)&1) );
call_a( db_a.deblock_strength, nnz, ref, mv, bs[1], 2<<(i&1), ((i>>1)&1) );
diff --git a/x264.h b/x264.h
index 2b6a16f6..0f340672 100644
--- a/x264.h
+++ b/x264.h
@@ -45,7 +45,7 @@ extern "C" {
#include "x264_config.h"
-#define X264_BUILD 151
+#define X264_BUILD 152
/* Application developers planning to link against a shared library version of
* libx264 from a Microsoft Visual Studio or similar development environment
@@ -564,19 +564,19 @@ void x264_nal_encode( x264_t *h, uint8_t *dst, x264_nal_t *nal );
typedef struct x264_level_t
{
- int level_idc;
- int mbps; /* max macroblock processing rate (macroblocks/sec) */
- int frame_size; /* max frame size (macroblocks) */
- int dpb; /* max decoded picture buffer (mbs) */
- int bitrate; /* max bitrate (kbit/sec) */
- int cpb; /* max vbv buffer (kbit) */
- int mv_range; /* max vertical mv component range (pixels) */
- int mvs_per_2mb; /* max mvs per 2 consecutive mbs. */
- int slice_rate; /* ?? */
- int mincr; /* min compression ratio */
- int bipred8x8; /* limit bipred to >=8x8 */
- int direct8x8; /* limit b_direct to >=8x8 */
- int frame_only; /* forbid interlacing */
+ uint8_t level_idc;
+ uint32_t mbps; /* max macroblock processing rate (macroblocks/sec) */
+ uint32_t frame_size; /* max frame size (macroblocks) */
+ uint32_t dpb; /* max decoded picture buffer (mbs) */
+ uint32_t bitrate; /* max bitrate (kbit/sec) */
+ uint32_t cpb; /* max vbv buffer (kbit) */
+ uint16_t mv_range; /* max vertical mv component range (pixels) */
+ uint8_t mvs_per_2mb; /* max mvs per 2 consecutive mbs. */
+ uint8_t slice_rate; /* ?? */
+ uint8_t mincr; /* min compression ratio */
+ uint8_t bipred8x8; /* limit bipred to >=8x8 */
+ uint8_t direct8x8; /* limit b_direct to >=8x8 */
+ uint8_t frame_only; /* forbid interlacing */
} x264_level_t;
/* all of the levels defined in the standard, terminated by .level_idc=0 */
More information about the x264-devel
mailing list