[x265] [PATCH] Add command line support for scene cut aware qp feature
Mahesh Pittala
mahesh at multicorewareinc.com
Fri Jan 20 05:22:12 UTC 2023
Pushed to the master branch
On Fri, Jan 13, 2023 at 3:02 PM Kirithika Kalirathnam <
kirithika at multicorewareinc.com> wrote:
> From e3402211edcd19acf172d2597ff65890d7fc227e Mon Sep 17 00:00:00 2001
> From: Kirithika <kirithika at multicorewareinc.com>
> Date: Thu, 12 Jan 2023 15:50:58 +0530
> Subject: [PATCH] Add command line support for scene cut aware qp feature
>
> This commit enables the scene cut aware qp feature through the command
> line parameters
> --scenecut-aware-qp and --masking-strength.It doesn't disable the scenecut
> aware qp configuration via config file.
> User can choose between either of these two ways to configure
> scenecut-aware-qp.
> ---
> doc/reST/cli.rst | 3 +-
> source/CMakeLists.txt | 2 +-
> source/common/param.cpp | 290 ++++++++++++++++++++--------------------
> source/common/param.h | 1 +
> 4 files changed, 151 insertions(+), 145 deletions(-)
>
> diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst
> index f1d9fa36c..a98c860d0 100755
> --- a/doc/reST/cli.rst
> +++ b/doc/reST/cli.rst
> @@ -1987,7 +1987,6 @@ Quality, rate control and rate distortion options
> It reduces the bits spent on the inter-frames within the scenecut window
> before and after a scenecut by increasing their QP in ratecontrol pass2
> algorithm
> without any deterioration in visual quality.
> - It is mentioned inside :option:`--scenecut-qp-config` file.
> :option:`--scenecut-aware-qp` works only with --pass 2. Default 0.
>
> +-------+---------------------------------------------------------------+
> @@ -2010,7 +2009,7 @@ Quality, rate control and rate distortion options
>
> Comma separated list of values which specifies the duration and offset
> for the QP increment for inter-frames when :option:`--scenecut-aware-qp`
> - is enabled. It is mentioned inside :option:`--scenecut-qp-config` file.
> + is enabled.
>
> When :option:`--scenecut-aware-qp` is:
>
> diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
> index 04ceea0ec..4c3274f63 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 206)
> +set(X265_BUILD 207)
> 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 fe85d8726..8c32fafa2 100755
> --- a/source/common/param.cpp
> +++ b/source/common/param.cpp
> @@ -711,148 +711,7 @@ int x265_scenecut_aware_qp_param_parse(x265_param*
> p, const char* name, const ch
> #define OPT(STR) else if (!strcmp(name, STR))
> if (0);
> OPT("scenecut-aware-qp") p->bEnableSceneCutAwareQp = x265_atoi(value,
> bError);
> - OPT("masking-strength")
> - {
> - int window1[6];
> - double refQpDelta1[6], nonRefQpDelta1[6];
> - if (p->bEnableSceneCutAwareQp == FORWARD)
> - {
> - if (3 == sscanf(value, "%d,%lf,%lf", &window1[0],
> &refQpDelta1[0], &nonRefQpDelta1[0]))
> - {
> - if (window1[0] > 0)
> - p->fwdMaxScenecutWindow = window1[0];
> - if (refQpDelta1[0] > 0)
> - p->fwdRefQpDelta[0] = refQpDelta1[0];
> - if (nonRefQpDelta1[0] > 0)
> - p->fwdNonRefQpDelta[0] = nonRefQpDelta1[0];
> -
> - p->fwdScenecutWindow[0] = p->fwdMaxScenecutWindow / 6;
> - for (int i = 1; i < 6; i++)
> - {
> - p->fwdScenecutWindow[i] = p->fwdMaxScenecutWindow / 6;
> - p->fwdRefQpDelta[i] = p->fwdRefQpDelta[i - 1] - (0.15
> * p->fwdRefQpDelta[i - 1]);
> - p->fwdNonRefQpDelta[i] = p->fwdNonRefQpDelta[i - 1] -
> (0.15 * p->fwdNonRefQpDelta[i - 1]);
> - }
> - }
> - else if (18 == sscanf(value,
> "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
> - , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0],
> &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
> - , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2],
> &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
> - , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4],
> &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]))
> - {
> - p->fwdMaxScenecutWindow = 0;
> - for (int i = 0; i < 6; i++)
> - {
> - p->fwdScenecutWindow[i] = window1[i];
> - p->fwdRefQpDelta[i] = refQpDelta1[i];
> - p->fwdNonRefQpDelta[i] = nonRefQpDelta1[i];
> - p->fwdMaxScenecutWindow += p->fwdScenecutWindow[i];
> - }
> - }
> - else
> - {
> - x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary
> offsets for masking-strength \n");
> - bError = true;
> - }
> - }
> - else if (p->bEnableSceneCutAwareQp == BACKWARD)
> - {
> - if (3 == sscanf(value, "%d,%lf,%lf", &window1[0],
> &refQpDelta1[0], &nonRefQpDelta1[0]))
> - {
> - if (window1[0] > 0)
> - p->bwdMaxScenecutWindow = window1[0];
> - if (refQpDelta1[0] > 0)
> - p->bwdRefQpDelta[0] = refQpDelta1[0];
> - if (nonRefQpDelta1[0] > 0)
> - p->bwdNonRefQpDelta[0] = nonRefQpDelta1[0];
> -
> - p->bwdScenecutWindow[0] = p->bwdMaxScenecutWindow / 6;
> - for (int i = 1; i < 6; i++)
> - {
> - p->bwdScenecutWindow[i] = p->bwdMaxScenecutWindow / 6;
> - p->bwdRefQpDelta[i] = p->bwdRefQpDelta[i - 1] - (0.15
> * p->bwdRefQpDelta[i - 1]);
> - p->bwdNonRefQpDelta[i] = p->bwdNonRefQpDelta[i - 1] -
> (0.15 * p->bwdNonRefQpDelta[i - 1]);
> - }
> - }
> - else if (18 == sscanf(value,
> "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
> - , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0],
> &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
> - , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2],
> &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
> - , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4],
> &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]))
> - {
> - p->bwdMaxScenecutWindow = 0;
> - for (int i = 0; i < 6; i++)
> - {
> - p->bwdScenecutWindow[i] = window1[i];
> - p->bwdRefQpDelta[i] = refQpDelta1[i];
> - p->bwdNonRefQpDelta[i] = nonRefQpDelta1[i];
> - p->bwdMaxScenecutWindow += p->bwdScenecutWindow[i];
> - }
> - }
> - else
> - {
> - x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary
> offsets for masking-strength \n");
> - bError = true;
> - }
> - }
> - else if (p->bEnableSceneCutAwareQp == BI_DIRECTIONAL)
> - {
> - int window2[6];
> - double refQpDelta2[6], nonRefQpDelta2[6];
> - if (6 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf", &window1[0],
> &refQpDelta1[0], &nonRefQpDelta1[0], &window2[0], &refQpDelta2[0],
> &nonRefQpDelta2[0]))
> - {
> - if (window1[0] > 0)
> - p->fwdMaxScenecutWindow = window1[0];
> - if (refQpDelta1[0] > 0)
> - p->fwdRefQpDelta[0] = refQpDelta1[0];
> - if (nonRefQpDelta1[0] > 0)
> - p->fwdNonRefQpDelta[0] = nonRefQpDelta1[0];
> - if (window2[0] > 0)
> - p->bwdMaxScenecutWindow = window2[0];
> - if (refQpDelta2[0] > 0)
> - p->bwdRefQpDelta[0] = refQpDelta2[0];
> - if (nonRefQpDelta2[0] > 0)
> - p->bwdNonRefQpDelta[0] = nonRefQpDelta2[0];
> -
> - p->fwdScenecutWindow[0] = p->fwdMaxScenecutWindow / 6;
> - p->bwdScenecutWindow[0] = p->bwdMaxScenecutWindow / 6;
> - for (int i = 1; i < 6; i++)
> - {
> - p->fwdScenecutWindow[i] = p->fwdMaxScenecutWindow / 6;
> - p->bwdScenecutWindow[i] = p->bwdMaxScenecutWindow / 6;
> - p->fwdRefQpDelta[i] = p->fwdRefQpDelta[i - 1] - (0.15
> * p->fwdRefQpDelta[i - 1]);
> - p->fwdNonRefQpDelta[i] = p->fwdNonRefQpDelta[i - 1] -
> (0.15 * p->fwdNonRefQpDelta[i - 1]);
> - p->bwdRefQpDelta[i] = p->bwdRefQpDelta[i - 1] - (0.15
> * p->bwdRefQpDelta[i - 1]);
> - p->bwdNonRefQpDelta[i] = p->bwdNonRefQpDelta[i - 1] -
> (0.15 * p->bwdNonRefQpDelta[i - 1]);
> - }
> - }
> - else if (36 == sscanf(value,
> "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
> - , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0],
> &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
> - , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2],
> &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
> - , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4],
> &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]
> - , &window2[0], &refQpDelta2[0], &nonRefQpDelta2[0],
> &window2[1], &refQpDelta2[1], &nonRefQpDelta2[1]
> - , &window2[2], &refQpDelta2[2], &nonRefQpDelta2[2],
> &window2[3], &refQpDelta2[3], &nonRefQpDelta2[3]
> - , &window2[4], &refQpDelta2[4], &nonRefQpDelta2[4],
> &window2[5], &refQpDelta2[5], &nonRefQpDelta2[5]))
> - {
> - p->fwdMaxScenecutWindow = 0;
> - p->bwdMaxScenecutWindow = 0;
> - for (int i = 0; i < 6; i++)
> - {
> - p->fwdScenecutWindow[i] = window1[i];
> - p->fwdRefQpDelta[i] = refQpDelta1[i];
> - p->fwdNonRefQpDelta[i] = nonRefQpDelta1[i];
> - p->bwdScenecutWindow[i] = window2[i];
> - p->bwdRefQpDelta[i] = refQpDelta2[i];
> - p->bwdNonRefQpDelta[i] = nonRefQpDelta2[i];
> - p->fwdMaxScenecutWindow += p->fwdScenecutWindow[i];
> - p->bwdMaxScenecutWindow += p->bwdScenecutWindow[i];
> - }
> - }
> - else
> - {
> - x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary
> offsets for masking-strength \n");
> - bError = true;
> - }
> - }
> - }
> + OPT("masking-strength") bError = parseMaskingStrength(p, value);
> else
> return X265_PARAM_BAD_NAME;
> #undef OPT
> @@ -1534,6 +1393,8 @@ int x265_param_parse(x265_param* p, const char*
> name, const char* value)
> p->selectiveSAO = atoi(value);
> }
> OPT("fades") p->bEnableFades = atobool(value);
> + OPT("scenecut-aware-qp") p->bEnableSceneCutAwareQp = atoi(value);
> + OPT("masking-strength") bError |= parseMaskingStrength(p, value);
> OPT("field") p->bField = atobool( value );
> OPT("cll") p->bEmitCLL = atobool(value);
> OPT("frame-dup") p->bEnableFrameDuplication = atobool(value);
> @@ -2548,6 +2409,151 @@ bool parseLambdaFile(x265_param* param)
> return false;
> }
>
> +bool parseMaskingStrength(x265_param* p, const char* value)
> +{
> + bool bError = false;
> + int window1[6];
> + double refQpDelta1[6], nonRefQpDelta1[6];
> + if (p->bEnableSceneCutAwareQp == FORWARD)
> + {
> + if (3 == sscanf(value, "%d,%lf,%lf", &window1[0],
> &refQpDelta1[0], &nonRefQpDelta1[0]))
> + {
> + if (window1[0] > 0)
> + p->fwdMaxScenecutWindow = window1[0];
> + if (refQpDelta1[0] > 0)
> + p->fwdRefQpDelta[0] = refQpDelta1[0];
> + if (nonRefQpDelta1[0] > 0)
> + p->fwdNonRefQpDelta[0] = nonRefQpDelta1[0];
> +
> + p->fwdScenecutWindow[0] = p->fwdMaxScenecutWindow / 6;
> + for (int i = 1; i < 6; i++)
> + {
> + p->fwdScenecutWindow[i] = p->fwdMaxScenecutWindow / 6;
> + p->fwdRefQpDelta[i] = p->fwdRefQpDelta[i - 1] - (0.15 *
> p->fwdRefQpDelta[i - 1]);
> + p->fwdNonRefQpDelta[i] = p->fwdNonRefQpDelta[i - 1] -
> (0.15 * p->fwdNonRefQpDelta[i - 1]);
> + }
> + }
> + else if (18 == sscanf(value,
> "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
> + , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0],
> &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
> + , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2],
> &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
> + , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4],
> &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]))
> + {
> + p->fwdMaxScenecutWindow = 0;
> + for (int i = 0; i < 6; i++)
> + {
> + p->fwdScenecutWindow[i] = window1[i];
> + p->fwdRefQpDelta[i] = refQpDelta1[i];
> + p->fwdNonRefQpDelta[i] = nonRefQpDelta1[i];
> + p->fwdMaxScenecutWindow += p->fwdScenecutWindow[i];
> + }
> + }
> + else
> + {
> + x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary
> offsets for masking-strength \n");
> + bError = true;
> + }
> + }
> + else if (p->bEnableSceneCutAwareQp == BACKWARD)
> + {
> + if (3 == sscanf(value, "%d,%lf,%lf", &window1[0],
> &refQpDelta1[0], &nonRefQpDelta1[0]))
> + {
> + if (window1[0] > 0)
> + p->bwdMaxScenecutWindow = window1[0];
> + if (refQpDelta1[0] > 0)
> + p->bwdRefQpDelta[0] = refQpDelta1[0];
> + if (nonRefQpDelta1[0] > 0)
> + p->bwdNonRefQpDelta[0] = nonRefQpDelta1[0];
> +
> + p->bwdScenecutWindow[0] = p->bwdMaxScenecutWindow / 6;
> + for (int i = 1; i < 6; i++)
> + {
> + p->bwdScenecutWindow[i] = p->bwdMaxScenecutWindow / 6;
> + p->bwdRefQpDelta[i] = p->bwdRefQpDelta[i - 1] - (0.15 *
> p->bwdRefQpDelta[i - 1]);
> + p->bwdNonRefQpDelta[i] = p->bwdNonRefQpDelta[i - 1] -
> (0.15 * p->bwdNonRefQpDelta[i - 1]);
> + }
> + }
> + else if (18 == sscanf(value,
> "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
> + , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0],
> &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
> + , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2],
> &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
> + , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4],
> &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]))
> + {
> + p->bwdMaxScenecutWindow = 0;
> + for (int i = 0; i < 6; i++)
> + {
> + p->bwdScenecutWindow[i] = window1[i];
> + p->bwdRefQpDelta[i] = refQpDelta1[i];
> + p->bwdNonRefQpDelta[i] = nonRefQpDelta1[i];
> + p->bwdMaxScenecutWindow += p->bwdScenecutWindow[i];
> + }
> + }
> + else
> + {
> + x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary
> offsets for masking-strength \n");
> + bError = true;
> + }
> + }
> + else if (p->bEnableSceneCutAwareQp == BI_DIRECTIONAL)
> + {
> + int window2[6];
> + double refQpDelta2[6], nonRefQpDelta2[6];
> + if (6 == sscanf(value, "%d,%lf,%lf,%d,%lf,%lf", &window1[0],
> &refQpDelta1[0], &nonRefQpDelta1[0], &window2[0], &refQpDelta2[0],
> &nonRefQpDelta2[0]))
> + {
> + if (window1[0] > 0)
> + p->fwdMaxScenecutWindow = window1[0];
> + if (refQpDelta1[0] > 0)
> + p->fwdRefQpDelta[0] = refQpDelta1[0];
> + if (nonRefQpDelta1[0] > 0)
> + p->fwdNonRefQpDelta[0] = nonRefQpDelta1[0];
> + if (window2[0] > 0)
> + p->bwdMaxScenecutWindow = window2[0];
> + if (refQpDelta2[0] > 0)
> + p->bwdRefQpDelta[0] = refQpDelta2[0];
> + if (nonRefQpDelta2[0] > 0)
> + p->bwdNonRefQpDelta[0] = nonRefQpDelta2[0];
> +
> + p->fwdScenecutWindow[0] = p->fwdMaxScenecutWindow / 6;
> + p->bwdScenecutWindow[0] = p->bwdMaxScenecutWindow / 6;
> + for (int i = 1; i < 6; i++)
> + {
> + p->fwdScenecutWindow[i] = p->fwdMaxScenecutWindow / 6;
> + p->bwdScenecutWindow[i] = p->bwdMaxScenecutWindow / 6;
> + p->fwdRefQpDelta[i] = p->fwdRefQpDelta[i - 1] - (0.15 *
> p->fwdRefQpDelta[i - 1]);
> + p->fwdNonRefQpDelta[i] = p->fwdNonRefQpDelta[i - 1] -
> (0.15 * p->fwdNonRefQpDelta[i - 1]);
> + p->bwdRefQpDelta[i] = p->bwdRefQpDelta[i - 1] - (0.15 *
> p->bwdRefQpDelta[i - 1]);
> + p->bwdNonRefQpDelta[i] = p->bwdNonRefQpDelta[i - 1] -
> (0.15 * p->bwdNonRefQpDelta[i - 1]);
> + }
> + }
> + else if (36 == sscanf(value,
> "%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf,%d,%lf,%lf"
> + , &window1[0], &refQpDelta1[0], &nonRefQpDelta1[0],
> &window1[1], &refQpDelta1[1], &nonRefQpDelta1[1]
> + , &window1[2], &refQpDelta1[2], &nonRefQpDelta1[2],
> &window1[3], &refQpDelta1[3], &nonRefQpDelta1[3]
> + , &window1[4], &refQpDelta1[4], &nonRefQpDelta1[4],
> &window1[5], &refQpDelta1[5], &nonRefQpDelta1[5]
> + , &window2[0], &refQpDelta2[0], &nonRefQpDelta2[0],
> &window2[1], &refQpDelta2[1], &nonRefQpDelta2[1]
> + , &window2[2], &refQpDelta2[2], &nonRefQpDelta2[2],
> &window2[3], &refQpDelta2[3], &nonRefQpDelta2[3]
> + , &window2[4], &refQpDelta2[4], &nonRefQpDelta2[4],
> &window2[5], &refQpDelta2[5], &nonRefQpDelta2[5]))
> + {
> + p->fwdMaxScenecutWindow = 0;
> + p->bwdMaxScenecutWindow = 0;
> + for (int i = 0; i < 6; i++)
> + {
> + p->fwdScenecutWindow[i] = window1[i];
> + p->fwdRefQpDelta[i] = refQpDelta1[i];
> + p->fwdNonRefQpDelta[i] = nonRefQpDelta1[i];
> + p->bwdScenecutWindow[i] = window2[i];
> + p->bwdRefQpDelta[i] = refQpDelta2[i];
> + p->bwdNonRefQpDelta[i] = nonRefQpDelta2[i];
> + p->fwdMaxScenecutWindow += p->fwdScenecutWindow[i];
> + p->bwdMaxScenecutWindow += p->bwdScenecutWindow[i];
> + }
> + }
> + else
> + {
> + x265_log(NULL, X265_LOG_ERROR, "Specify all the necessary
> offsets for masking-strength \n");
> + bError = true;
> + }
> + }
> + return bError;
> +}
> +
> void x265_copy_params(x265_param* dst, x265_param* src)
> {
> dst->cpuid = src->cpuid;
> diff --git a/source/common/param.h b/source/common/param.h
> index 7808947f6..f504ec9e4 100644
> --- a/source/common/param.h
> +++ b/source/common/param.h
> @@ -38,6 +38,7 @@ void setParamAspectRatio(x265_param *p, int width, int
> height);
> void getParamAspectRatio(x265_param *p, int& width, int& height);
> bool parseLambdaFile(x265_param *param);
> void x265_copy_params(x265_param* dst, x265_param* src);
> +bool parseMaskingStrength(x265_param* p, const char* value);
>
> /* this table is kept internal to avoid confusion, since log level
> indices start at -1 */
> static const char * const logLevelNames[] = { "none", "error", "warning",
> "info", "debug", "full", 0 };
> --
> 2.28.0.windows.1
>
> *Thanks,*
> *Kirithika*
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20230120/40c0fe36/attachment-0001.htm>
More information about the x265-devel
mailing list