<div dir="ltr">From 980823a240b95d2fd88c50e2bf30185ef6b0f18b Mon Sep 17 00:00:00 2001<br>From: Niranjan <<a href="mailto:niranjan@multicorewareinc.com">niranjan@multicorewareinc.com</a>><br>Date: Fri, 5 Feb 2021 00:24:30 +0530<br>Subject: [PATCH] Add CLI option for simplifying colorimetry parameters<br><br>The CLI option covers commonly used combinations of color primaries, transfer characteristics, color matrix, range of luma and chroma signals, and chroma sample location<br>---<br> doc/reST/cli.rst                 |  72 ++++++++++++++<br> source/CMakeLists.txt            |   2 +-<br> source/common/param.cpp          | 161 +++++++++++++++++++++++++++++++<br> source/test/regression-tests.txt |   1 +<br> source/x265cli.cpp               |  22 +++++<br> source/x265cli.h                 |   1 +<br> 6 files changed, 258 insertions(+), 1 deletion(-)<br><br>diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst<br>index f19a28734..45757e576 100755<br>--- a/doc/reST/cli.rst<br>+++ b/doc/reST/cli.rst<br>@@ -2386,6 +2386,78 @@ VUI fields must be manually specified.<br>       Values in the range 0..12. See D.3.3 of the HEVC spec. for a detailed explanation.<br>   Required for HLG (Hybrid Log Gamma) signaling. Not signaled by default.<br> <br>+.. option:: --video-signal-type-preset <string><br>+<br>+       Specify combinations of color primaries, transfer characteristics, color matrix,<br>+     range of luma and chroma signals, and chroma sample location.<br>+        String format: <system-id>[:<color-volume>]<br>+<br>+   system-id options and their corresponding values:<br>+    +----------------+---------------------------------------------------------------+<br>+   | system-id      | Value                                                         |<br>+    +================+===============================================================+<br>+   | BT601_525      | --colorprim smpte170m --transfer smpte170m                    |<br>+      |                | --colormatrix smpte170m --range limited --chromaloc 0         |<br>+       +----------------+---------------------------------------------------------------+<br>+   | BT601_626      | --colorprim bt470bg --transfer smpte170m --colormatrix bt470bg|<br>+        |                | --range limited --chromaloc 0                                 |<br>+   +----------------+---------------------------------------------------------------+<br>+   | BT709_YCC      | --colorprim bt709 --transfer bt709 --colormatrix bt709        |<br>+    |                | --range limited --chromaloc 0                                 |<br>+   +----------------+---------------------------------------------------------------+<br>+   | BT709_RGB      | --colorprim bt709 --transfer bt709 --colormatrix gbr          |<br>+   |                | --range limited                                               |<br>+    +----------------+---------------------------------------------------------------+<br>+   | BT2020_YCC_NCL | --colorprim bt2020 --transfer bt2020-10 --colormatrix bt709   |<br>+  |                | --range limited --chromaloc 2                                 |<br>+   +----------------+---------------------------------------------------------------+<br>+   | BT2020_RGB     | --colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc|<br>+ |                | --range limited                                               |<br>+    +----------------+---------------------------------------------------------------+<br>+   | BT2100_PQ_YCC  | --colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc|<br>+  |                | --range limited --chromaloc 2                                 |<br>+   +----------------+---------------------------------------------------------------+<br>+   | BT2100_PQ_ICTCP| --colorprim bt2020 --transfer smpte2084 --colormatrix ictcp   |<br>+  |                | --range limited --chromaloc 2                                 |<br>+   +----------------+---------------------------------------------------------------+<br>+   | BT2100_PQ_RGB  | --colorprim bt2020 --transfer smpte2084 --colormatrix gbr     |<br>+        |                | --range limited                                               |<br>+    +----------------+---------------------------------------------------------------+<br>+   | BT2100_HLG_YCC | --colorprim bt2020 --transfer arib-std-b67                    |<br>+ |                | --colormatrix bt2020nc --range limited --chromaloc 2          |<br>+      +----------------+---------------------------------------------------------------+<br>+   | BT2100_HLG_RGB | --colorprim bt2020 --transfer arib-std-b67 --colormatrix gbr  |<br>+  |                | --range limited                                               |<br>+    +----------------+---------------------------------------------------------------+<br>+   | FR709_RGB      | --colorprim bt709 --transfer bt709 --colormatrix gbr          |<br>+   |                | --range full                                                  |<br>+  +----------------+---------------------------------------------------------------+<br>+   | FR2020_RGB     | --colorprim bt2020 --transfer bt2020-10 --colormatrix gbr     |<br>+       |                | --range full                                                  |<br>+  +----------------+---------------------------------------------------------------+<br>+   | FRP3D65_YCC    | --colorprim smpte432 --transfer bt709 --colormatrix smpte170m |<br>+ |                | --range full --chromaloc 1                                    |<br>+ +----------------+---------------------------------------------------------------+<br>+<br>+        color-volume options and their corresponding values:<br>+ +----------------+---------------------------------------------------------------+<br>+   | color-volume   | Value                                                         |<br>+      +================+===============================================================+<br>+   | P3D65x1000n0005| --master-display G(13250,34500)B(7500,3000)R(34000,16000)     |<br>+ |                |                  WP(15635,16450)L(10000000,5)                 |<br>+  +----------------+---------------------------------------------------------------+<br>+   | P3D65x4000n005 | --master-display G(13250,34500)B(7500,3000)R(34000,16000)     |<br>+ |                |                  WP(15635,16450)L(40000000,50)                |<br>+  +----------------+---------------------------------------------------------------+<br>+   | BT2100x108n0005| --master-display G(8500,39850)B(6550,2300)R(34000,146000)     |<br>+ |                |                  WP(15635,16450)L(10000000,1)                 |<br>+  +----------------+---------------------------------------------------------------+<br>+<br>+        Note: The color-volume options can be used only with the system-id options BT2100_PQ_YCC,<br>+           BT2100_PQ_ICTCP, and BT2100_PQ_RGB. It is incompatible with other options.<br>+<br>+    **CLI ONLY**<br>+<br> Bitstream options<br> =================<br> <br>diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt<br>index 95218f5dc..a407271b4 100755<br>--- a/source/CMakeLists.txt<br>+++ b/source/CMakeLists.txt<br>@@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF)<br> option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)<br> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)<br> # X265_BUILD must be incremented each time the public API is changed<br>-set(X265_BUILD 198)<br>+set(X265_BUILD 199)<br> configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265.def.in">x265.def.in</a>"<br>                "${PROJECT_BINARY_DIR}/x265.def")<br> configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265_config.h.in">x265_config.h.in</a>"<br>diff --git a/source/common/param.cpp b/source/common/param.cpp<br>index 47a7a7c47..ce914ba42 100755<br>--- a/source/common/param.cpp<br>+++ b/source/common/param.cpp<br>@@ -1381,6 +1381,167 @@ int x265_param_parse(x265_param* p, const char* name, const char* value)<br>         OPT("vbv-live-multi-pass") p->bliveVBV2pass = atobool(value);<br>         OPT("min-vbv-fullness") p->minVbvFullness = atof(value);<br>         OPT("max-vbv-fullness") p->maxVbvFullness = atof(value);<br>+        OPT("video-signal-type-preset")<br>+        {<br>+            char systemId[20] = {};<br>+            char colorVolume[20] = {};<br>+            sscanf(value, "%[^:]:%s", systemId, colorVolume);<br>+            p->vui.bEnableVideoSignalTypePresentFlag = 1;<br>+            p->vui.bEnableColorDescriptionPresentFlag = 1;<br>+            if (!strcmp(systemId, "BT601_525"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 6;<br>+                p->vui.transferCharacteristics = 6;<br>+                p->vui.matrixCoeffs = 6;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 0;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT601_626"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 5;<br>+                p->vui.transferCharacteristics = 6;<br>+                p->vui.matrixCoeffs = 5;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 0;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT709_YCC"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 1;<br>+                p->vui.transferCharacteristics = 1;<br>+                p->vui.matrixCoeffs = 1;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 0;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT709_RGB"))<br>+            {<br>+                p->vui.colorPrimaries = 1;<br>+                p->vui.transferCharacteristics = 1;<br>+                p->vui.matrixCoeffs = 0;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+            }<br>+            else if (!strcmp(systemId, "BT2020_YCC_NCL"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 14;<br>+                p->vui.matrixCoeffs = 1;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 2;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT2020_RGB"))<br>+            {<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 16;<br>+                p->vui.matrixCoeffs = 9;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+            }<br>+            else if (!strcmp(systemId, "BT2100_PQ_YCC"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 16;<br>+                p->vui.matrixCoeffs = 9;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 2;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT2100_PQ_ICTCP"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 16;<br>+                p->vui.matrixCoeffs = 14;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 2;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT2100_PQ_RGB"))<br>+            {<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 16;<br>+                p->vui.matrixCoeffs = 0;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+            }<br>+            else if (!strcmp(systemId, "BT2100_HLG_YCC"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 18;<br>+                p->vui.matrixCoeffs = 9;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+                p->vui.chromaSampleLocTypeTopField = 2;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else if (!strcmp(systemId, "BT2100_HLG_RGB"))<br>+            {<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 18;<br>+                p->vui.matrixCoeffs = 0;<br>+                p->vui.bEnableVideoFullRangeFlag = 0;<br>+            }<br>+            else if (!strcmp(systemId, "FR709_RGB"))<br>+            {<br>+                p->vui.colorPrimaries = 1;<br>+                p->vui.transferCharacteristics = 1;<br>+                p->vui.matrixCoeffs = 0;<br>+                p->vui.bEnableVideoFullRangeFlag = 1;<br>+            }<br>+            else if (!strcmp(systemId, "FR2020_RGB"))<br>+            {<br>+                p->vui.colorPrimaries = 9;<br>+                p->vui.transferCharacteristics = 14;<br>+                p->vui.matrixCoeffs = 0;<br>+                p->vui.bEnableVideoFullRangeFlag = 1;<br>+            }<br>+            else if (!strcmp(systemId, "FRP3D65_YCC"))<br>+            {<br>+                p->vui.bEnableChromaLocInfoPresentFlag = 1;<br>+                p->vui.colorPrimaries = 12;<br>+                p->vui.transferCharacteristics = 1;<br>+                p->vui.matrixCoeffs = 6;<br>+                p->vui.bEnableVideoFullRangeFlag = 1;<br>+                p->vui.chromaSampleLocTypeTopField = 1;<br>+                p->vui.chromaSampleLocTypeBottomField = p->vui.chromaSampleLocTypeTopField;<br>+            }<br>+            else<br>+            {<br>+                bError = true;<br>+            }<br>+<br>+            if (colorVolume[0] != '\0')<br>+            {<br>+                if (!strcmp(systemId, "BT2100_PQ_YCC") || !strcmp(systemId, "BT2100_PQ_ICTCP") || !strcmp(systemId, "BT2100_PQ_RGB"))<br>+                {<br>+                    if (!strcmp(colorVolume, "P3D65x1000n0005"))<br>+                    {<br>+                        p->masteringDisplayColorVolume = "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,5)";<br>+                    }<br>+                    else if (!strcmp(colorVolume, "P3D65x4000n005"))<br>+                    {<br>+                        p->masteringDisplayColorVolume = "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50)";<br>+                    }<br>+                    else if (!strcmp(colorVolume, "BT2100x108n0005"))<br>+                    {<br>+                        p->masteringDisplayColorVolume = "G(8500,39850)B(6550,2300)R(34000,146000)WP(15635,16450)L(10000000,1)";<br>+                    }<br>+                    else<br>+                    {<br>+                        bError = true;<br>+                    }<br>+                }<br>+                else<br>+                {<br>+                    bError = true;<br>+                }<br>+            }<br>+        }<br>         else<br>             return X265_PARAM_BAD_NAME;<br>     }<br>diff --git a/source/test/regression-tests.txt b/source/test/regression-tests.txt<br>index 26f6b7ed3..a4fcab87f 100644<br>--- a/source/test/regression-tests.txt<br>+++ b/source/test/regression-tests.txt<br>@@ -165,6 +165,7 @@ crowd_run_1920x1080_50.yuv, --preset faster --ctu 32 --rskip 2 --rskip-edge-thre<br> crowd_run_1920x1080_50.yuv, --preset fast --ctu 64 --rskip 2 --rskip-edge-threshold 5 --aq-mode 4<br> crowd_run_1920x1080_50.yuv, --preset slow --ctu 32 --rskip 2 --rskip-edge-threshold 5 --hist-scenecut --hist-threshold 0.1<br> crowd_run_1920x1080_50.yuv, --preset slower --ctu 16 --rskip 2 --rskip-edge-threshold 5 --hist-scenecut --hist-threshold 0.1 --aq-mode 4<br>+crowd_run_1920x1080_50.yuv, --preset ultrafast --video-signal-type-preset BT2100_PQ_YCC:BT2100x108n0005<br>  <br> # Main12 intraCost overflow bug test<br> 720p50_parkrun_ter.y4m,--preset medium<br>diff --git a/source/x265cli.cpp b/source/x265cli.cpp<br>index c28dd7f8c..cfb832d2e 100755<br>--- a/source/x265cli.cpp<br>+++ b/source/x265cli.cpp<br>@@ -313,6 +313,28 @@ namespace X265_NS {<br>         H0("   --master-display <string>     SMPTE ST 2086 master display color volume info SEI (HDR)\n");<br>         H0("                                    format: G(x,y)B(x,y)R(x,y)WP(x,y)L(max,min)\n");<br>         H0("   --max-cll <string>            Specify content light level info SEI as \"cll,fall\" (HDR).\n");<br>+        H0("   --video-signal-type-preset <string>    Specify combinations of color primaries, transfer characteristics, color matrix, range of luma and chroma signals, and chroma sample location\n");<br>+        H0("                                            format: <system-id>[:<color-volume>]\n");<br>+        H0("                                            The color-volume can be used only with the system-id options BT2100_PQ_YCC, BT2100_PQ_ICTCP, and BT2100_PQ_RGB.\n");<br>+        H0("                                            system-id options and their corresponding values:\n");<br>+        H0("                                              BT601_525:       --colorprim smpte170m --transfer smpte170m --colormatrix smpte170m --range limited --chromaloc 0\n");<br>+        H0("                                              BT601_626:       --colorprim bt470bg --transfer smpte170m --colormatrix bt470bg --range limited --chromaloc 0\n");<br>+        H0("                                              BT709_YCC:       --colorprim bt709 --transfer bt709 --colormatrix bt709 --range limited --chromaloc 0\n");<br>+        H0("                                              BT709_RGB:       --colorprim bt709 --transfer bt709 --colormatrix gbr --range limited\n");<br>+        H0("                                              BT2020_YCC_NCL:  --colorprim bt2020 --transfer bt2020-10 --colormatrix bt709 --range limited --chromaloc 2\n");<br>+        H0("                                              BT2020_RGB:      --colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc --range limited\n");<br>+        H0("                                              BT2100_PQ_YCC:   --colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc --range limited --chromaloc 2\n");<br>+        H0("                                              BT2100_PQ_ICTCP: --colorprim bt2020 --transfer smpte2084 --colormatrix ictcp --range limited --chromaloc 2\n");<br>+        H0("                                              BT2100_PQ_RGB:   --colorprim bt2020 --transfer smpte2084 --colormatrix gbr --range limited\n");<br>+        H0("                                              BT2100_HLG_YCC:  --colorprim bt2020 --transfer arib-std-b67 --colormatrix bt2020nc --range limited --chromaloc 2\n");<br>+        H0("                                              BT2100_HLG_RGB:  --colorprim bt2020 --transfer arib-std-b67 --colormatrix gbr --range limited\n");<br>+        H0("                                              FR709_RGB:       --colorprim bt709 --transfer bt709 --colormatrix gbr --range full\n");<br>+        H0("                                              FR2020_RGB:      --colorprim bt2020 --transfer bt2020-10 --colormatrix gbr --range full\n");<br>+        H0("                                              FRP3D65_YCC:     --colorprim smpte432 --transfer bt709 --colormatrix smpte170m --range full --chromaloc 1\n");<br>+        H0("                                            color-volume options and their corresponding values:\n");<br>+        H0("                                              P3D65x1000n0005: --master-display G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,5)\n");<br>+        H0("                                              P3D65x4000n005:  --master-display G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50)\n");<br>+        H0("                                              BT2100x108n0005: --master-display G(8500,39850)B(6550,2300)R(34000,146000)WP(15635,16450)L(10000000,1)\n");<br>         H0("   --[no-]cll                    Emit content light level info SEI. Default %s\n", OPT(param->bEmitCLL));<br>         H0("   --[no-]hdr10                  Control dumping of HDR10 SEI packet. If max-cll or master-display has non-zero values, this is enabled. Default %s\n", OPT(param->bEmitHDR10SEI));<br>         H0("   --[no-]hdr-opt                Add luma and chroma offsets for HDR/WCG content. Default %s. Now deprecated.\n", OPT(param->bHDROpt));<br>diff --git a/source/x265cli.h b/source/x265cli.h<br>index a24d25435..3d2480374 100644<br>--- a/source/x265cli.h<br>+++ b/source/x265cli.h<br>@@ -249,6 +249,7 @@ static const struct option long_options[] =<br>     { "crop-rect",      required_argument, NULL, 0 }, /* DEPRECATED */<br>     { "master-display", required_argument, NULL, 0 },<br>     { "max-cll",        required_argument, NULL, 0 },<br>+    {"video-signal-type-preset", required_argument, NULL, 0 },<br>     { "min-luma",       required_argument, NULL, 0 },<br>     { "max-luma",       required_argument, NULL, 0 },<br>     { "log2-max-poc-lsb", required_argument, NULL, 8 },<br>-- <br>2.18.0.windows.1<br><br><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><font color="#0c343d" face="verdana, sans-serif"><br></font></div><div dir="ltr"><font color="#0c343d" face="verdana, sans-serif">Thanks & Regards</font><div><font color="#0c343d" face="verdana, sans-serif"><b>Niranjan Kumar B</b></font></div><div><font size="1" color="#0c343d" face="verdana, sans-serif">Video Codec Engineer </font></div><div><font size="1" color="#0c343d" face="verdana, sans-serif">Media & AI Analytics</font></div><div><font face="trebuchet ms, sans-serif" color="#0c343d">+91 958 511 1449</font></div><div><a href="https://multicorewareinc.com/" style="color:rgb(17,85,204)" target="_blank"><img src="https://docs.google.com/uc?export=download&id=1kc3RJu9M8bnIf6Xa5rUw2d-eEVUsPBE5&revid=0B7tw9XJBmynaemR1VUpQUi9DVytRVW5SVkRwVTFjb1hBMUcwPQ"></a></div></div></div></div></div></div></div></div>