>From 980823a240b95d2fd88c50e2bf30185ef6b0f18b Mon Sep 17 00:00:00 2001 From: Niranjan <niran...@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/>
x265.diff
Description: Binary data
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel