[x265] [PATCH][master] Add CLI option for simplifying colorimetry parameters

Niranjan Bala niranjan at multicorewareinc.com
Fri Feb 26 11:04:43 UTC 2021


>From 980823a240b95d2fd88c50e2bf30185ef6b0f18b Mon Sep 17 00:00:00 2001
From: Niranjan <niranjan at multicorewareinc.com>
Date: Fri, 5 Feb 2021 00:24:30 +0530
Subject: [PATCH] Add CLI option for simplifying colorimetry parameters

The CLI option covers commonly used combinations of color primaries,
transfer characteristics, color matrix, range of luma and chroma signals,
and chroma sample location
---
 doc/reST/cli.rst                 |  72 ++++++++++++++
 source/CMakeLists.txt            |   2 +-
 source/common/param.cpp          | 161 +++++++++++++++++++++++++++++++
 source/test/regression-tests.txt |   1 +
 source/x265cli.cpp               |  22 +++++
 source/x265cli.h                 |   1 +
 6 files changed, 258 insertions(+), 1 deletion(-)

diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst
index f19a28734..45757e576 100755
--- a/doc/reST/cli.rst
+++ b/doc/reST/cli.rst
@@ -2386,6 +2386,78 @@ VUI fields must be manually specified.
  Values in the range 0..12. See D.3.3 of the HEVC spec. for a detailed
explanation.
  Required for HLG (Hybrid Log Gamma) signaling. Not signaled by default.

+.. option:: --video-signal-type-preset <string>
+
+ Specify combinations of color primaries, transfer characteristics, color
matrix,
+ range of luma and chroma signals, and chroma sample location.
+ String format: <system-id>[:<color-volume>]
+
+ system-id options and their corresponding values:
+
+----------------+---------------------------------------------------------------+
+ | system-id      | Value
        |
+
+================+===============================================================+
+ | BT601_525      | --colorprim smpte170m --transfer smpte170m
       |
+ |                | --colormatrix smpte170m --range limited --chromaloc 0
        |
+
+----------------+---------------------------------------------------------------+
+ | BT601_626      | --colorprim bt470bg --transfer smpte170m --colormatrix
bt470bg|
+ |                | --range limited --chromaloc 0
        |
+
+----------------+---------------------------------------------------------------+
+ | BT709_YCC      | --colorprim bt709 --transfer bt709 --colormatrix bt709
       |
+ |                | --range limited --chromaloc 0
        |
+
+----------------+---------------------------------------------------------------+
+ | BT709_RGB      | --colorprim bt709 --transfer bt709 --colormatrix gbr
       |
+ |                | --range limited
        |
+
+----------------+---------------------------------------------------------------+
+ | BT2020_YCC_NCL | --colorprim bt2020 --transfer bt2020-10 --colormatrix
bt709   |
+ |                | --range limited --chromaloc 2
        |
+
+----------------+---------------------------------------------------------------+
+ | BT2020_RGB     | --colorprim bt2020 --transfer smpte2084 --colormatrix
bt2020nc|
+ |                | --range limited
        |
+
+----------------+---------------------------------------------------------------+
+ | BT2100_PQ_YCC  | --colorprim bt2020 --transfer smpte2084 --colormatrix
bt2020nc|
+ |                | --range limited --chromaloc 2
        |
+
+----------------+---------------------------------------------------------------+
+ | BT2100_PQ_ICTCP| --colorprim bt2020 --transfer smpte2084 --colormatrix
ictcp   |
+ |                | --range limited --chromaloc 2
        |
+
+----------------+---------------------------------------------------------------+
+ | BT2100_PQ_RGB  | --colorprim bt2020 --transfer smpte2084 --colormatrix
gbr     |
+ |                | --range limited
        |
+
+----------------+---------------------------------------------------------------+
+ | BT2100_HLG_YCC | --colorprim bt2020 --transfer arib-std-b67
       |
+ |                | --colormatrix bt2020nc --range limited --chromaloc 2
       |
+
+----------------+---------------------------------------------------------------+
+ | BT2100_HLG_RGB | --colorprim bt2020 --transfer arib-std-b67
--colormatrix gbr  |
+ |                | --range limited
        |
+
+----------------+---------------------------------------------------------------+
+ | FR709_RGB      | --colorprim bt709 --transfer bt709 --colormatrix gbr
       |
+ |                | --range full
       |
+
+----------------+---------------------------------------------------------------+
+ | FR2020_RGB     | --colorprim bt2020 --transfer bt2020-10 --colormatrix
gbr     |
+ |                | --range full
       |
+
+----------------+---------------------------------------------------------------+
+ | FRP3D65_YCC    | --colorprim smpte432 --transfer bt709 --colormatrix
smpte170m |
+ |                | --range full --chromaloc 1
       |
+
+----------------+---------------------------------------------------------------+
+
+ color-volume options and their corresponding values:
+
+----------------+---------------------------------------------------------------+
+ | color-volume   | Value
        |
+
+================+===============================================================+
+ | P3D65x1000n0005| --master-display
G(13250,34500)B(7500,3000)R(34000,16000)     |
+ |                |                  WP(15635,16450)L(10000000,5)
        |
+
+----------------+---------------------------------------------------------------+
+ | P3D65x4000n005 | --master-display
G(13250,34500)B(7500,3000)R(34000,16000)     |
+ |                |                  WP(15635,16450)L(40000000,50)
       |
+
+----------------+---------------------------------------------------------------+
+ | BT2100x108n0005| --master-display
G(8500,39850)B(6550,2300)R(34000,146000)     |
+ |                |                  WP(15635,16450)L(10000000,1)
        |
+
+----------------+---------------------------------------------------------------+
+
+ Note: The color-volume options can be used only with the system-id
options BT2100_PQ_YCC,
+       BT2100_PQ_ICTCP, and BT2100_PQ_RGB. It is incompatible with other
options.
+
+    **CLI ONLY**
+
 Bitstream options
 =================

diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 95218f5dc..a407271b4 100755
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF)
 option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 198)
+set(X265_BUILD 199)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff --git a/source/common/param.cpp b/source/common/param.cpp
index 47a7a7c47..ce914ba42 100755
--- a/source/common/param.cpp
+++ b/source/common/param.cpp
@@ -1381,6 +1381,167 @@ int x265_param_parse(x265_param* p, const char*
name, const char* value)
         OPT("vbv-live-multi-pass") p->bliveVBV2pass = atobool(value);
         OPT("min-vbv-fullness") p->minVbvFullness = atof(value);
         OPT("max-vbv-fullness") p->maxVbvFullness = atof(value);
+        OPT("video-signal-type-preset")
+        {
+            char systemId[20] = {};
+            char colorVolume[20] = {};
+            sscanf(value, "%[^:]:%s", systemId, colorVolume);
+            p->vui.bEnableVideoSignalTypePresentFlag = 1;
+            p->vui.bEnableColorDescriptionPresentFlag = 1;
+            if (!strcmp(systemId, "BT601_525"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 6;
+                p->vui.transferCharacteristics = 6;
+                p->vui.matrixCoeffs = 6;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 0;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT601_626"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 5;
+                p->vui.transferCharacteristics = 6;
+                p->vui.matrixCoeffs = 5;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 0;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT709_YCC"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 1;
+                p->vui.transferCharacteristics = 1;
+                p->vui.matrixCoeffs = 1;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 0;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT709_RGB"))
+            {
+                p->vui.colorPrimaries = 1;
+                p->vui.transferCharacteristics = 1;
+                p->vui.matrixCoeffs = 0;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+            }
+            else if (!strcmp(systemId, "BT2020_YCC_NCL"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 14;
+                p->vui.matrixCoeffs = 1;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 2;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT2020_RGB"))
+            {
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 16;
+                p->vui.matrixCoeffs = 9;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+            }
+            else if (!strcmp(systemId, "BT2100_PQ_YCC"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 16;
+                p->vui.matrixCoeffs = 9;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 2;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT2100_PQ_ICTCP"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 16;
+                p->vui.matrixCoeffs = 14;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 2;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT2100_PQ_RGB"))
+            {
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 16;
+                p->vui.matrixCoeffs = 0;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+            }
+            else if (!strcmp(systemId, "BT2100_HLG_YCC"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 18;
+                p->vui.matrixCoeffs = 9;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+                p->vui.chromaSampleLocTypeTopField = 2;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else if (!strcmp(systemId, "BT2100_HLG_RGB"))
+            {
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 18;
+                p->vui.matrixCoeffs = 0;
+                p->vui.bEnableVideoFullRangeFlag = 0;
+            }
+            else if (!strcmp(systemId, "FR709_RGB"))
+            {
+                p->vui.colorPrimaries = 1;
+                p->vui.transferCharacteristics = 1;
+                p->vui.matrixCoeffs = 0;
+                p->vui.bEnableVideoFullRangeFlag = 1;
+            }
+            else if (!strcmp(systemId, "FR2020_RGB"))
+            {
+                p->vui.colorPrimaries = 9;
+                p->vui.transferCharacteristics = 14;
+                p->vui.matrixCoeffs = 0;
+                p->vui.bEnableVideoFullRangeFlag = 1;
+            }
+            else if (!strcmp(systemId, "FRP3D65_YCC"))
+            {
+                p->vui.bEnableChromaLocInfoPresentFlag = 1;
+                p->vui.colorPrimaries = 12;
+                p->vui.transferCharacteristics = 1;
+                p->vui.matrixCoeffs = 6;
+                p->vui.bEnableVideoFullRangeFlag = 1;
+                p->vui.chromaSampleLocTypeTopField = 1;
+                p->vui.chromaSampleLocTypeBottomField =
p->vui.chromaSampleLocTypeTopField;
+            }
+            else
+            {
+                bError = true;
+            }
+
+            if (colorVolume[0] != '\0')
+            {
+                if (!strcmp(systemId, "BT2100_PQ_YCC") ||
!strcmp(systemId, "BT2100_PQ_ICTCP") || !strcmp(systemId, "BT2100_PQ_RGB"))
+                {
+                    if (!strcmp(colorVolume, "P3D65x1000n0005"))
+                    {
+                        p->masteringDisplayColorVolume =
"G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,5)";
+                    }
+                    else if (!strcmp(colorVolume, "P3D65x4000n005"))
+                    {
+                        p->masteringDisplayColorVolume =
"G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50)";
+                    }
+                    else if (!strcmp(colorVolume, "BT2100x108n0005"))
+                    {
+                        p->masteringDisplayColorVolume =
"G(8500,39850)B(6550,2300)R(34000,146000)WP(15635,16450)L(10000000,1)";
+                    }
+                    else
+                    {
+                        bError = true;
+                    }
+                }
+                else
+                {
+                    bError = true;
+                }
+            }
+        }
         else
             return X265_PARAM_BAD_NAME;
     }
diff --git a/source/test/regression-tests.txt
b/source/test/regression-tests.txt
index 26f6b7ed3..a4fcab87f 100644
--- a/source/test/regression-tests.txt
+++ b/source/test/regression-tests.txt
@@ -165,6 +165,7 @@ crowd_run_1920x1080_50.yuv, --preset faster --ctu 32
--rskip 2 --rskip-edge-thre
 crowd_run_1920x1080_50.yuv, --preset fast --ctu 64 --rskip 2
--rskip-edge-threshold 5 --aq-mode 4
 crowd_run_1920x1080_50.yuv, --preset slow --ctu 32 --rskip 2
--rskip-edge-threshold 5 --hist-scenecut --hist-threshold 0.1
 crowd_run_1920x1080_50.yuv, --preset slower --ctu 16 --rskip 2
--rskip-edge-threshold 5 --hist-scenecut --hist-threshold 0.1 --aq-mode 4
+crowd_run_1920x1080_50.yuv, --preset ultrafast --video-signal-type-preset
BT2100_PQ_YCC:BT2100x108n0005

 # Main12 intraCost overflow bug test
 720p50_parkrun_ter.y4m,--preset medium
diff --git a/source/x265cli.cpp b/source/x265cli.cpp
index c28dd7f8c..cfb832d2e 100755
--- a/source/x265cli.cpp
+++ b/source/x265cli.cpp
@@ -313,6 +313,28 @@ namespace X265_NS {
         H0("   --master-display <string>     SMPTE ST 2086 master display
color volume info SEI (HDR)\n");
         H0("                                    format:
G(x,y)B(x,y)R(x,y)WP(x,y)L(max,min)\n");
         H0("   --max-cll <string>            Specify content light level
info SEI as \"cll,fall\" (HDR).\n");
+        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");
+        H0("                                            format:
<system-id>[:<color-volume>]\n");
+        H0("                                            The color-volume
can be used only with the system-id options BT2100_PQ_YCC, BT2100_PQ_ICTCP,
and BT2100_PQ_RGB.\n");
+        H0("                                            system-id options
and their corresponding values:\n");
+        H0("                                              BT601_525:
--colorprim smpte170m --transfer smpte170m --colormatrix smpte170m --range
limited --chromaloc 0\n");
+        H0("                                              BT601_626:
--colorprim bt470bg --transfer smpte170m --colormatrix bt470bg --range
limited --chromaloc 0\n");
+        H0("                                              BT709_YCC:
--colorprim bt709 --transfer bt709 --colormatrix bt709 --range limited
--chromaloc 0\n");
+        H0("                                              BT709_RGB:
--colorprim bt709 --transfer bt709 --colormatrix gbr --range limited\n");
+        H0("                                              BT2020_YCC_NCL:
 --colorprim bt2020 --transfer bt2020-10 --colormatrix bt709 --range
limited --chromaloc 2\n");
+        H0("                                              BT2020_RGB:
 --colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc --range
limited\n");
+        H0("                                              BT2100_PQ_YCC:
--colorprim bt2020 --transfer smpte2084 --colormatrix bt2020nc --range
limited --chromaloc 2\n");
+        H0("                                              BT2100_PQ_ICTCP:
--colorprim bt2020 --transfer smpte2084 --colormatrix ictcp --range limited
--chromaloc 2\n");
+        H0("                                              BT2100_PQ_RGB:
--colorprim bt2020 --transfer smpte2084 --colormatrix gbr --range
limited\n");
+        H0("                                              BT2100_HLG_YCC:
 --colorprim bt2020 --transfer arib-std-b67 --colormatrix bt2020nc --range
limited --chromaloc 2\n");
+        H0("                                              BT2100_HLG_RGB:
 --colorprim bt2020 --transfer arib-std-b67 --colormatrix gbr --range
limited\n");
+        H0("                                              FR709_RGB:
--colorprim bt709 --transfer bt709 --colormatrix gbr --range full\n");
+        H0("                                              FR2020_RGB:
 --colorprim bt2020 --transfer bt2020-10 --colormatrix gbr --range full\n");
+        H0("                                              FRP3D65_YCC:
--colorprim smpte432 --transfer bt709 --colormatrix smpte170m --range full
--chromaloc 1\n");
+        H0("                                            color-volume
options and their corresponding values:\n");
+        H0("                                              P3D65x1000n0005:
--master-display
G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,5)\n");
+        H0("                                              P3D65x4000n005:
 --master-display
G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(40000000,50)\n");
+        H0("                                              BT2100x108n0005:
--master-display
G(8500,39850)B(6550,2300)R(34000,146000)WP(15635,16450)L(10000000,1)\n");
         H0("   --[no-]cll                    Emit content light level info
SEI. Default %s\n", OPT(param->bEmitCLL));
         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));
         H0("   --[no-]hdr-opt                Add luma and chroma offsets
for HDR/WCG content. Default %s. Now deprecated.\n", OPT(param->bHDROpt));
diff --git a/source/x265cli.h b/source/x265cli.h
index a24d25435..3d2480374 100644
--- a/source/x265cli.h
+++ b/source/x265cli.h
@@ -249,6 +249,7 @@ static const struct option long_options[] =
     { "crop-rect",      required_argument, NULL, 0 }, /* DEPRECATED */
     { "master-display", required_argument, NULL, 0 },
     { "max-cll",        required_argument, NULL, 0 },
+    {"video-signal-type-preset", required_argument, NULL, 0 },
     { "min-luma",       required_argument, NULL, 0 },
     { "max-luma",       required_argument, NULL, 0 },
     { "log2-max-poc-lsb", required_argument, NULL, 8 },
-- 
2.18.0.windows.1


-- 

Thanks & Regards
*Niranjan Kumar B*
Video Codec Engineer
Media & AI Analytics
+91 958 511 1449
<https://multicorewareinc.com/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20210226/e297fc70/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.diff
Type: application/octet-stream
Size: 20831 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20210226/e297fc70/attachment-0001.obj>


More information about the x265-devel mailing list