[x265] [PATCH] add UHD bluray compatibility support

mahesh at multicorewareinc.com mahesh at multicorewareinc.com
Mon Mar 21 09:36:36 CET 2016


# HG changeset patch
# User Mahesh Pittala <mahesh at multicorewareinc.com>
# Date 1455872812 -19800
#      Fri Feb 19 14:36:52 2016 +0530
# Node ID 97e7ce9d662039afb8bba0b15acda10a160e6415
# Parent  2de6cb99313a03c3577934ac5e2e116f7ba6cd10
add UHD bluray compatibility support

diff -r 2de6cb99313a -r 97e7ce9d6620 source/common/param.cpp
--- a/source/common/param.cpp	Mon Mar 21 13:50:14 2016 +0530
+++ b/source/common/param.cpp	Fri Feb 19 14:36:52 2016 +0530
@@ -121,8 +121,8 @@
     /* Source specifications */
     param->internalBitDepth = X265_DEPTH;
     param->internalCsp = X265_CSP_I420;
-
     param->levelIdc = 0;
+    param->uhdBluray = 0;
     param->bHighTier = 0;
     param->interlaceMode = 0;
     param->bAnnexB = 1;
@@ -877,6 +877,7 @@
     OPT("max-cll") bError |= sscanf(value, "%hu,%hu", &p->maxCLL, &p->maxFALL) != 2;
     OPT("min-luma") p->minLuma = (uint16_t)atoi(value);
     OPT("max-luma") p->maxLuma = (uint16_t)atoi(value);
+    OPT("uhd-bd") p->uhdBluray = atobool(value);
     else
         return X265_PARAM_BAD_NAME;
 #undef OPT
@@ -1023,7 +1024,8 @@
 {
 #define CHECK(expr, msg) check_failed |= _confirm(param, expr, msg)
     int check_failed = 0; /* abort if there is a fatal configuration problem */
-
+    CHECK(param->uhdBluray == 1 && (X265_DEPTH != 10 || param->internalCsp != 1 || param->interlaceMode != 0),
+        "for bluray compatibility x265 bit depth, chroma subsample, source picture type must be 10, 4:2:0, progressive");
     CHECK(param->maxCUSize != 64 && param->maxCUSize != 32 && param->maxCUSize != 16,
           "max cu size must be 16, 32, or 64");
     if (check_failed == 1)
diff -r 2de6cb99313a -r 97e7ce9d6620 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Mon Mar 21 13:50:14 2016 +0530
+++ b/source/encoder/encoder.cpp	Fri Feb 19 14:36:52 2016 +0530
@@ -1604,7 +1604,41 @@
 void Encoder::configure(x265_param *p)
 {
     this->m_param = p;
-
+    if (p->uhdBluray)
+    {
+        p->bEnableAccessUnitDelimiters = 1;
+        p->vui.aspectRatioIdc = 1;
+        p->bEmitHRDSEI = 1;
+        p->bRepeatHeaders = 1;
+        p->bIntraRefresh = 0;
+        p->keyframeMin = 1;
+        int fps = (p->fpsNum + p->fpsDenom - 1) / p->fpsDenom;
+        if (p->keyframeMax > fps)
+        {
+            x265_log(p, X265_LOG_WARNING, "keyframeMax should be equal to fps of input video for UHD bluray compatibility, so keyframeMax setting to %d\n", fps);
+            p->keyframeMax = fps;
+        }
+        if (p->maxNumReferences > 6)
+        {
+            x265_log(p, X265_LOG_WARNING, "maxNumReferences should be lessthan or equal to 6 for UHD bluray compatibility, so maxNumReferences setting to %d\n", X265_MIN(6, p->maxNumReferences));
+            p->maxNumReferences = X265_MIN(6, p->maxNumReferences);
+        }
+        p->bEnableTemporalSubLayers = 0;
+        if (p->vui.colorPrimaries != 1 && p->vui.colorPrimaries != 9)
+            x265_log(p, X265_LOG_ERROR, "for ITR(BT.709) colour primaries set to 1(BT.709) for content type SDR and for ITR(BT.2020) set to 9(BT.2020) for content type SDR and HDR to support UHD bluray compatibility\n");
+        else if (p->vui.colorPrimaries == 9)
+        {
+            p->vui.bEnableChromaLocInfoPresentFlag = 1;
+            p->vui.chromaSampleLocTypeTopField = 2;
+            p->vui.chromaSampleLocTypeBottomField = 2;
+        }
+        if (p->vui.transferCharacteristics != 1 && p->vui.transferCharacteristics != 14 && p->vui.transferCharacteristics != 16)
+            x265_log(p, X265_LOG_ERROR, "for ITR(BT.709) transfer_characteristics set to 1 for content type SDR and for ITR(BT.2020) set to 14(16 for HDR) for content type SDR and HDR to support UHD bluray compatibility\n");
+        if (p->vui.matrixCoeffs != 1 && p->vui.matrixCoeffs != 9)
+            x265_log(p, X265_LOG_ERROR, "for ITR(BT.709) matrix_coeffs set to 1 for content type SDR and for ITR(BT.2020) set to 9 for content type SDR and HDR to support UHD bluray compatibility\n");
+        if ((p->sourceWidth != 1920 && p->sourceWidth != 3840) || (p->sourceHeight != 1080 && p->sourceHeight != 1088 && p->sourceHeight != 2160))
+            x265_log(p, X265_LOG_ERROR, "UHD bluray supported resolutions are 1920x1080, 1920x1088 and 3840x2160\n");
+    }
     if (p->keyframeMax < 0)
     {
         /* A negative max GOP size indicates the user wants only one I frame at
diff -r 2de6cb99313a -r 97e7ce9d6620 source/encoder/level.cpp
--- a/source/encoder/level.cpp	Mon Mar 21 13:50:14 2016 +0530
+++ b/source/encoder/level.cpp	Fri Feb 19 14:36:52 2016 +0530
@@ -133,21 +133,31 @@
     }
     else for (i = 0; i < NumLevels; i++)
     {
-        if (lumaSamples > levels[i].maxLumaSamples)
+        if (param.uhdBluray && levels[i].levelIdc != 51)
+        {
             continue;
-        else if (samplesPerSec > levels[i].maxLumaSamplesPerSecond)
-            continue;
-        else if (bitrate > levels[i].maxBitrateMain && levels[i].maxBitrateHigh == MAX_UINT)
-            continue;
-        else if (bitrate > levels[i].maxBitrateHigh)
-            continue;
-        else if (param.sourceWidth > sqrt(levels[i].maxLumaSamples * 8.0f))
-            continue;
-        else if (param.sourceHeight > sqrt(levels[i].maxLumaSamples * 8.0f))
-            continue;
-
+        }
+        else if (!param.uhdBluray)
+        {
+            if (lumaSamples > levels[i].maxLumaSamples)
+                continue;
+            else if (samplesPerSec > levels[i].maxLumaSamplesPerSecond)
+                continue;
+            else if (bitrate > levels[i].maxBitrateMain && levels[i].maxBitrateHigh == MAX_UINT)
+                continue;
+            else if (bitrate > levels[i].maxBitrateHigh)
+                continue;
+            else if (param.sourceWidth > sqrt(levels[i].maxLumaSamples * 8.0f))
+                continue;
+            else if (param.sourceHeight > sqrt(levels[i].maxLumaSamples * 8.0f))
+                continue;
+            else if (param.levelIdc && param.levelIdc != levels[i].levelIdc)
+                continue;
+        }
         uint32_t maxDpbSize = MaxDpbPicBuf;
-        if (lumaSamples <= (levels[i].maxLumaSamples >> 2))
+        if (param.uhdBluray)
+            maxDpbSize = 6;
+        else if (lumaSamples <= (levels[i].maxLumaSamples >> 2))
             maxDpbSize = X265_MIN(4 * MaxDpbPicBuf, 16);
         else if (lumaSamples <= (levels[i].maxLumaSamples >> 1))
             maxDpbSize = X265_MIN(2 * MaxDpbPicBuf, 16);
@@ -199,7 +209,8 @@
         else
             vps.ptl.tierFlag = Level::MAIN;
 #undef CHECK_RANGE
-
+        if (param.uhdBluray || param.bHighTier)
+            vps.ptl.tierFlag = Level::HIGH;
         vps.ptl.levelIdc = levels[i].levelEnum;
         vps.ptl.minCrForLevel = levels[i].minCompressionRatio;
         vps.ptl.maxLumaSrForLevel = levels[i].maxLumaSamplesPerSecond;
diff -r 2de6cb99313a -r 97e7ce9d6620 source/x265.h
--- a/source/x265.h	Mon Mar 21 13:50:14 2016 +0530
+++ b/source/x265.h	Fri Feb 19 14:36:52 2016 +0530
@@ -610,7 +610,8 @@
     /* if levelIdc is specified (non-zero) this flag will differentiate between
      * Main (0) and High (1) tier. Default is Main tier (0) */
     int       bHighTier;
-
+    /* Enable UHD Blu-ray compatibility support */
+    int       uhdBluray;
     /* The maximum number of L0 references a P or B slice may use. This
      * influences the size of the decoded picture buffer. The higher this
      * number, the more reference frames there will be available for motion
diff -r 2de6cb99313a -r 97e7ce9d6620 source/x265cli.h
--- a/source/x265cli.h	Mon Mar 21 13:50:14 2016 +0530
+++ b/source/x265cli.h	Fri Feb 19 14:36:52 2016 +0530
@@ -53,6 +53,7 @@
     { "profile",        required_argument, NULL, 'P' },
     { "level-idc",      required_argument, NULL, 0 },
     { "high-tier",            no_argument, NULL, 0 },
+    { "uhd-bd",               no_argument, NULL, 0 },
     { "no-high-tier",         no_argument, NULL, 0 },
     { "allow-non-conformance",no_argument, NULL, 0 },
     { "no-allow-non-conformance",no_argument, NULL, 0 },
@@ -283,6 +284,7 @@
     H0("-P/--profile <string>            Enforce an encode profile: main, main10, mainstillpicture\n");
     H0("   --level-idc <integer|float>   Force a minimum required decoder level (as '5.0' or '50')\n");
     H0("   --[no-]high-tier              If a decoder level is specified, this modifier selects High tier of that level\n");
+    H0("   --uhd-bd                      Enable UHD Bluray compatibility support\n");
     H0("   --[no-]allow-non-conformance  Allow the encoder to generate profile NONE bitstreams. Default %s\n", OPT(param->bAllowNonConformance));
     H0("\nThreading, performance:\n");
     H0("   --pools <integer,...>         Comma separated thread count per thread pool (pool per NUMA node)\n");


More information about the x265-devel mailing list