[x265] level: fix bug in level and tier determination (#refs 278)

Deepthi Nandakumar deepthi at multicorewareinc.com
Thu Jun 2 15:29:18 CEST 2016


# HG changeset patch
# User Deepthi Nandakumar <deepthi at multicorewareinc.com>
# Date 1464874032 -19800
#      Thu Jun 02 18:57:12 2016 +0530
# Node ID 64cf1830b03410048070641fb0ac6da6f41a42b1
# Parent  6098ba3e0cf16b110cff3b2519ce2d997ecac396
level: fix bug in level and tier determination (#refs 278)

This patch changes the behaviour of tier determination (and sometimes level
as
a side-effect), and hence bumping up build number to warn users. High-tier
is
"allowed" by default, and --no-high-tier tells the encoder to never choose
high
tier.

diff -r 6098ba3e0cf1 -r 64cf1830b034 doc/reST/cli.rst
--- a/doc/reST/cli.rst Tue May 31 14:06:55 2016 +0100
+++ b/doc/reST/cli.rst Thu Jun 02 18:57:12 2016 +0530
@@ -522,16 +522,14 @@

 .. option:: --high-tier, --no-high-tier

- If :option:`--level-idc` has been specified, the option adds the
- intention to support the High tier of that level. If your specified
- level does not support a High tier, a warning is issued and this
- modifier flag is ignored. If :option:`--level-idc` has been specified,
- but not --high-tier, then the encoder will attempt to encode at the
- specified level, main tier first, turning on high tier only if
- necessary and available at that level.
+ If :option:`--level-idc` has been specified, --high-tier allows the
+ support of high tier at that level. The encoder will first attempt to
encode
+ at the specified level, main tier first, turning on high tier only if
+ necessary and available at that level.If your requested level does not
+ support a High tier, high tier will not be supported. If --no-high-tier
+ has been specified, then the encoder will attempt to encode only at the
main tier.

- If :option:`--level-idc` has not been specified, this argument is
- ignored.
+ Default: enabled

 .. option:: --ref <1..16>

diff -r 6098ba3e0cf1 -r 64cf1830b034 source/CMakeLists.txt
--- a/source/CMakeLists.txt Tue May 31 14:06:55 2016 +0100
+++ b/source/CMakeLists.txt Thu Jun 02 18:57:12 2016 +0530
@@ -30,7 +30,7 @@
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)

 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 84)
+set(X265_BUILD 85)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r 6098ba3e0cf1 -r 64cf1830b034 source/common/param.cpp
--- a/source/common/param.cpp Tue May 31 14:06:55 2016 +0100
+++ b/source/common/param.cpp Thu Jun 02 18:57:12 2016 +0530
@@ -121,9 +121,9 @@
     /* Source specifications */
     param->internalBitDepth = X265_DEPTH;
     param->internalCsp = X265_CSP_I420;
-    param->levelIdc = 0;
+    param->levelIdc = 0; //Auto-detect level
     param->uhdBluray = 0;
-    param->bHighTier = 0;
+    param->bHighTier = 1; //Allow high tier by default
     param->interlaceMode = 0;
     param->bAnnexB = 1;
     param->bRepeatHeaders = 0;
diff -r 6098ba3e0cf1 -r 64cf1830b034 source/encoder/level.cpp
--- a/source/encoder/level.cpp Tue May 31 14:06:55 2016 +0100
+++ b/source/encoder/level.cpp Thu Jun 02 18:57:12 2016 +0530
@@ -198,7 +198,7 @@
             CHECK_RANGE((uint32_t)param.rc.vbvBufferSize,
levels[i].maxCpbSizeMain, levels[i].maxCpbSizeHigh))
         {
             /* The bitrate or buffer size are out of range for Main tier,
but in
-             * range for High tier. If the user requested High tier then
give
+             * range for High tier. If the user allowed High tier then give
              * them High tier at this level.  Otherwise allow the loop to
              * progress to the Main tier of the next level */
             if (param.bHighTier)
@@ -209,8 +209,9 @@
         else
             vps.ptl.tierFlag = Level::MAIN;
 #undef CHECK_RANGE
-        if (param.uhdBluray || param.bHighTier)
+        if (param.uhdBluray)
             vps.ptl.tierFlag = Level::HIGH;
+
         vps.ptl.levelIdc = levels[i].levelEnum;
         vps.ptl.minCrForLevel = levels[i].minCompressionRatio;
         vps.ptl.maxLumaSrForLevel = levels[i].maxLumaSamplesPerSecond;
@@ -306,12 +307,9 @@
     }

     LevelSpec& l = levels[level];
-    bool highTier = !!param.bHighTier;
-    if (highTier && l.maxBitrateHigh == MAX_UINT)
-    {
-        highTier = false;
-        x265_log(&param, X265_LOG_WARNING, "Level %s has no High tier,
using Main tier\n", l.name);
-    }
+
+    //highTier is allowed for this level and has not been explicitly
disabled. This does not mean it is the final chosen tier
+    bool allowHighTier = l.maxBitrateHigh < MAX_UINT && param.bHighTier;

     uint32_t lumaSamples = param.sourceWidth * param.sourceHeight;
     uint32_t samplesPerSec = (uint32_t)(lumaSamples *
((double)param.fpsNum / param.fpsDenom));
@@ -333,23 +331,27 @@
         return false;
     }

-    if ((uint32_t)param.rc.vbvMaxBitrate > (highTier ? l.maxBitrateHigh :
l.maxBitrateMain))
+    /* Adjustments of Bitrate, VBV buffer size, refs will be triggered
only if specified params do not fit
+     * within the max limits of that level (high tier if allowed, main
otherwise)
+     */
+
+    if ((uint32_t)param.rc.vbvMaxBitrate > (allowHighTier ?
l.maxBitrateHigh : l.maxBitrateMain))
     {
-        param.rc.vbvMaxBitrate = highTier ? l.maxBitrateHigh :
l.maxBitrateMain;
+        param.rc.vbvMaxBitrate = allowHighTier ? l.maxBitrateHigh :
l.maxBitrateMain;
         x265_log(&param, X265_LOG_WARNING, "lowering VBV max bitrate to
%dKbps\n", param.rc.vbvMaxBitrate);
     }
-    if ((uint32_t)param.rc.vbvBufferSize > (highTier ? l.maxCpbSizeHigh :
l.maxCpbSizeMain))
+    if ((uint32_t)param.rc.vbvBufferSize > (allowHighTier ?
l.maxCpbSizeHigh : l.maxCpbSizeMain))
     {
-        param.rc.vbvBufferSize = highTier ? l.maxCpbSizeHigh :
l.maxCpbSizeMain;
+        param.rc.vbvBufferSize = allowHighTier ? l.maxCpbSizeHigh :
l.maxCpbSizeMain;
         x265_log(&param, X265_LOG_WARNING, "lowering VBV buffer size to
%dKb\n", param.rc.vbvBufferSize);
     }

     switch (param.rc.rateControlMode)
     {
     case X265_RC_ABR:
-        if ((uint32_t)param.rc.bitrate > (highTier ? l.maxBitrateHigh :
l.maxBitrateMain))
+        if ((uint32_t)param.rc.bitrate > (allowHighTier ? l.maxBitrateHigh
: l.maxBitrateMain))
         {
-            param.rc.bitrate = l.maxBitrateHigh;
+            param.rc.bitrate =  allowHighTier ? l.maxBitrateHigh :
l.maxBitrateMain;
             x265_log(&param, X265_LOG_WARNING, "lowering target bitrate to
High tier limit of %dKbps\n", param.rc.bitrate);
         }
         break;
@@ -362,9 +364,9 @@
         if (!param.rc.vbvBufferSize || !param.rc.vbvMaxBitrate)
         {
             if (!param.rc.vbvMaxBitrate)
-                param.rc.vbvMaxBitrate = highTier ? l.maxBitrateHigh :
l.maxBitrateMain;
+                param.rc.vbvMaxBitrate = allowHighTier ? l.maxBitrateHigh
: l.maxBitrateMain;
             if (!param.rc.vbvBufferSize)
-                param.rc.vbvBufferSize = highTier ? l.maxCpbSizeHigh :
l.maxCpbSizeMain;
+                param.rc.vbvBufferSize = allowHighTier ? l.maxCpbSizeHigh
: l.maxCpbSizeMain;
             x265_log(&param, X265_LOG_WARNING, "Specifying a decoder level
with constant rate factor rate-control requires\n");
             x265_log(&param, X265_LOG_WARNING, "enabling VBV with
vbv-bufsize=%dkb vbv-maxrate=%dkbps. VBV outputs are non-deterministic!\n",
                      param.rc.vbvBufferSize, param.rc.vbvMaxBitrate);


-- 
Deepthi Nandakumar
Engineering Manager, x265
Multicoreware, Inc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20160602/6ac41586/attachment.html>


More information about the x265-devel mailing list