[x265] [PATCH] api: add options max-luma and min-luma to set the maximum and minimum luma range
Steve Borho
steve at borho.org
Sun Aug 9 20:28:24 CEST 2015
On 08/09, kavitha at multicorewareinc.com wrote:
> # HG changeset patch
> # User Kavitha Sampath <kavitha at multicorewareinc.com>
> # Date 1439128645 -19800
> # Sun Aug 09 19:27:25 2015 +0530
> # Node ID f9c4219faab20fdc329eca670542e25bfd74af3e
> # Parent cbdefdfca87723342d21d90c41a93254553ed3d1
> api: add options max-luma and min-luma to set the maximum and minimum luma range
>
> diff -r cbdefdfca877 -r f9c4219faab2 doc/reST/cli.rst
> --- a/doc/reST/cli.rst Thu Aug 06 14:23:43 2015 +0530
> +++ b/doc/reST/cli.rst Sun Aug 09 19:27:25 2015 +0530
> @@ -1638,6 +1638,16 @@
> Note that this string value will need to be escaped or quoted to
> protect against shell expansion on many platforms. No default.
>
> +.. option:: --min-luma <integer>
> +
> + Increase any luma values that are below the specified min-luma vlaue to
> + that value. No default.
> +
> +.. option:: --max-luma <integer>
> +
> + Decrease any luma values that are above the specified max-luma vlaue to
> + that value. No default.
I think all of the docs need to be more explicit that the adjustments
are made to the input pixels. The output pixels might possibly violate
the min/max luma range because of interpolation or loop filtering.
> Bitstream options
> =================
>
> diff -r cbdefdfca877 -r f9c4219faab2 source/CMakeLists.txt
> --- a/source/CMakeLists.txt Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/CMakeLists.txt Sun Aug 09 19:27:25 2015 +0530
> @@ -30,7 +30,7 @@
> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
>
> # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 68)
> +set(X265_BUILD 70)
> configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
> "${PROJECT_BINARY_DIR}/x265.def")
> configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r cbdefdfca877 -r f9c4219faab2 source/common/param.cpp
> --- a/source/common/param.cpp Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/common/param.cpp Sun Aug 09 19:27:25 2015 +0530
> @@ -241,6 +241,8 @@
> param->vui.defDispWinRightOffset = 0;
> param->vui.defDispWinTopOffset = 0;
> param->vui.defDispWinBottomOffset = 0;
> + param->minLuma = 0;
> + param->maxLuma = 0;
> }
>
> int x265_param_default_preset(x265_param* param, const char* preset, const char* tune)
> @@ -855,6 +857,8 @@
> OPT("qg-size") p->rc.qgSize = atoi(value);
> OPT("master-display") p->masteringDisplayColorVolume = strdup(value);
> OPT("max-cll") p->contentLightLevelInfo = strdup(value);
> + OPT("min-luma") p->minLuma = atoi(value);
> + OPT("max-luma") p->maxLuma = atoi(value);
> else
> return X265_PARAM_BAD_NAME;
> #undef OPT
> diff -r cbdefdfca877 -r f9c4219faab2 source/common/picyuv.cpp
> --- a/source/common/picyuv.cpp Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/common/picyuv.cpp Sun Aug 09 19:27:25 2015 +0530
> @@ -121,7 +121,7 @@
>
> /* Copy pixels from an x265_picture into internal PicYuv instance.
> * Shift pixels as necessary, mask off bits above X265_DEPTH for safety. */
> -void PicYuv::copyFromPicture(const x265_picture& pic, int padx, int pady)
> +void PicYuv::copyFromPicture(const x265_picture& pic, int padx, int pady, x265_param *param)
> {
> /* m_picWidth is the width that is being encoded, padx indicates how many
> * of those pixels are padding to reach multiple of MinCU(4) size.
> @@ -237,6 +237,15 @@
>
> for (int r = 0; r < height; r++)
> {
> + /* Clip luma to max and min values before extending edges of picYuv*/
w/s nit
> + if (param->minLuma || param->maxLuma)
> + {
> + for (int c = 0; c < m_stride; c++)
> + {
> + Y[c] = param->minLuma ? (pixel)X265_MAX(Y[c], param->minLuma) : Y[c];
> + Y[c] = param->maxLuma ? (pixel)X265_MIN(Y[c], param->maxLuma) : Y[c];
doing conditionals within the loop is unnecessary. suggest:
pixel min = param->minLuma;
pixel max = param->maxLuma ? param->maxLuma : (1 << X265_DEPTH) - 1;
for (int c = 0; c < m_stride; c++)
Y[c] = x265_clip3(min, max, Y[c]);
longer term, we should merge the clipping into the plane copy
primitives.
> + }
> + }
> for (int x = 0; x < padx; x++)
> Y[width + x] = Y[width - 1];
>
> diff -r cbdefdfca877 -r f9c4219faab2 source/common/picyuv.h
> --- a/source/common/picyuv.h Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/common/picyuv.h Sun Aug 09 19:27:25 2015 +0530
> @@ -66,7 +66,7 @@
> bool createOffsets(const SPS& sps);
> void destroy();
>
> - void copyFromPicture(const x265_picture&, int padx, int pady);
> + void copyFromPicture(const x265_picture&, int padx, int pady, x265_param *param);
nit: pass x265_param as a const ref, befpre padx, pady
>
> intptr_t getChromaAddrOffset(uint32_t ctuAddr, uint32_t absPartIdx) const { return m_cuOffsetC[ctuAddr] + m_buOffsetC[absPartIdx]; }
>
> diff -r cbdefdfca877 -r f9c4219faab2 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/encoder/encoder.cpp Sun Aug 09 19:27:25 2015 +0530
> @@ -458,7 +458,7 @@
> }
>
> /* Copy input picture into a Frame and PicYuv, send to lookahead */
> - inFrame->m_fencPic->copyFromPicture(*pic_in, m_sps.conformanceWindow.rightOffset, m_sps.conformanceWindow.bottomOffset);
> + inFrame->m_fencPic->copyFromPicture(*pic_in, m_sps.conformanceWindow.rightOffset, m_sps.conformanceWindow.bottomOffset, m_param);
>
> inFrame->m_poc = ++m_pocLast;
> inFrame->m_userData = pic_in->userData;
> diff -r cbdefdfca877 -r f9c4219faab2 source/x265.h
> --- a/source/x265.h Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/x265.h Sun Aug 09 19:27:25 2015 +0530
> @@ -1172,6 +1172,16 @@
> * picture average light level (or 0). */
> const char* contentLightLevelInfo;
>
> + /* Maximum luma level, specified as a integer which would automatically
> + * increase any luma values below the specified --min-luma value to that
> + * value. */
> + uint16_t minLuma;
> +
> + /* Minimum luma Level, specified as a integer which would automatically
> + * decrease any luma values above the specified --max-luma value to that
> + * value. */
> + uint16_t maxLuma;
> +
> } x265_param;
>
> /* x265_param_alloc:
> diff -r cbdefdfca877 -r f9c4219faab2 source/x265cli.h
> --- a/source/x265cli.h Thu Aug 06 14:23:43 2015 +0530
> +++ b/source/x265cli.h Sun Aug 09 19:27:25 2015 +0530
> @@ -192,6 +192,8 @@
> { "crop-rect", required_argument, NULL, 0 }, /* DEPRECATED */
> { "master-display", required_argument, NULL, 0 },
> { "max-cll", required_argument, NULL, 0 },
> + { "min-luma", required_argument, NULL, 0 },
> + { "max-luma", required_argument, NULL, 0 },
w/s
> { "no-dither", no_argument, NULL, 0 },
> { "dither", no_argument, NULL, 0 },
> { "no-repeat-headers", no_argument, NULL, 0 },
> @@ -403,6 +405,8 @@
> 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> Emit content light level info SEI as \"cll,fall\" (HDR)\n");
> + H0(" --min-luma <integer> Minimum value of luma plane\n");
> + H0(" --max-luma <integer> Maximum value of luma plane\n");
> H0("\nBitstream options:\n");
> H0(" --[no-]repeat-headers Emit SPS and PPS headers at each keyframe. Default %s\n", OPT(param->bRepeatHeaders));
> H0(" --[no-]info Emit SEI identifying encoder and parameters. Default %s\n", OPT(param->bEmitInfoSEI));
fwiw: we might consider setting min-luma automatically if
--range=limited is specified
--
Steve Borho
More information about the x265-devel
mailing list