[x265] [PATCH] zone: Fix memory handling for zones
Pradeep Ramachandran
pradeep at multicorewareinc.com
Tue Mar 5 09:55:49 CET 2019
On Fri, Mar 1, 2019 at 5:21 PM <pooja at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Pooja Venkatesan <pooja at multicorewareinc.com>
> # Date 1551424899 -19800
> # Fri Mar 01 12:51:39 2019 +0530
> # Node ID b758e88462f0110207db6e3a3eaf69e7cfd130a3
> # Parent cb3e172a5f51c6a4bf8adb7953fe53277f5a1979
> zone: Fix memory handling for zones
>
> This patch does the following:
> Allocate and free memory for zones
> Copy of zone and zone params
>
Patch missed out on increasing build # due to API change.
Added the fix, and pushed patch to default branch.
> diff -r cb3e172a5f51 -r b758e88462f0 source/common/param.cpp
> --- a/source/common/param.cpp Tue Feb 19 20:20:35 2019 +0530
> +++ b/source/common/param.cpp Fri Mar 01 12:51:39 2019 +0530
> @@ -102,6 +102,7 @@
>
> void x265_param_free(x265_param* p)
> {
> + x265_zone_free(p);
> #ifdef SVT_HEVC
> x265_free(p->svtHevcParam);
> #endif
> @@ -2240,13 +2241,24 @@
> dst->rc.zoneCount = src->rc.zoneCount;
> dst->rc.zonefileCount = src->rc.zonefileCount;
>
> - if (src->rc.zones)
> + if (src->rc.zonefileCount && src->rc.zones)
> {
> - dst->rc.zones->startFrame = src->rc.zones->startFrame;
> - dst->rc.zones->endFrame = src->rc.zones->endFrame;
> - dst->rc.zones->bForceQp = src->rc.zones->bForceQp;
> - dst->rc.zones->qp = src->rc.zones->qp;
> - dst->rc.zones->bitrateFactor = src->rc.zones->bitrateFactor;
> + for (int i = 0; i < src->rc.zonefileCount; i++)
> + {
> + dst->rc.zones[i].startFrame = src->rc.zones[i].startFrame;
> + memcpy(dst->rc.zones[i].zoneParam,
> src->rc.zones[i].zoneParam, sizeof(x265_param));
> + }
> + }
> + else if (src->rc.zoneCount && src->rc.zones)
> + {
> + for (int i = 0; i < src->rc.zoneCount; i++)
> + {
> + dst->rc.zones[i].startFrame = src->rc.zones[i].startFrame;
> + dst->rc.zones[i].endFrame = src->rc.zones[i].endFrame;
> + dst->rc.zones[i].bForceQp = src->rc.zones[i].bForceQp;
> + dst->rc.zones[i].qp = src->rc.zones[i].qp;
> + dst->rc.zones[i].bitrateFactor =
> src->rc.zones[i].bitrateFactor;
> + }
> }
> else
> dst->rc.zones = NULL;
> diff -r cb3e172a5f51 -r b758e88462f0 source/encoder/api.cpp
> --- a/source/encoder/api.cpp Tue Feb 19 20:20:35 2019 +0530
> +++ b/source/encoder/api.cpp Fri Mar 01 12:51:39 2019 +0530
> @@ -98,6 +98,12 @@
> x265_param* zoneParam = PARAM_NS::x265_param_alloc();
> if (!param || !latestParam)
> goto fail;
> + if (p->rc.zoneCount || p->rc.zonefileCount)
> + {
> + int zoneCount = p->rc.zonefileCount ? p->rc.zonefileCount :
> p->rc.zoneCount;
> + param->rc.zones = x265_zone_alloc(zoneCount, p->rc.zonefileCount
> ? true : false);
> + latestParam->rc.zones = x265_zone_alloc(zoneCount,
> p->rc.zonefileCount ? true : false);
> + }
>
> x265_copy_params(param, p);
> x265_log(param, X265_LOG_INFO, "HEVC encoder version %s\n",
> PFX(version_str));
> @@ -287,6 +293,11 @@
> bool isReconfigureRc =
> encoder->isReconfigureRc(encoder->m_latestParam, param_in);
> if ((encoder->m_reconfigure && !isReconfigureRc) ||
> (encoder->m_reconfigureRc && isReconfigureRc)) /* Reconfigure in progress */
> return 1;
> + if (encoder->m_latestParam->rc.zoneCount ||
> encoder->m_latestParam->rc.zonefileCount)
> + {
> + int zoneCount = encoder->m_latestParam->rc.zonefileCount ?
> encoder->m_latestParam->rc.zonefileCount :
> encoder->m_latestParam->rc.zoneCount;
> + save.rc.zones = x265_zone_alloc(zoneCount,
> encoder->m_latestParam->rc.zonefileCount ? true : false);
> + }
> x265_copy_params(&save, encoder->m_latestParam);
> int ret = encoder->reconfigureParam(encoder->m_latestParam, param_in);
> if (ret)
> @@ -922,6 +933,26 @@
> return x265_free(p);
> }
>
> +x265_zone *x265_zone_alloc(int zoneCount, bool isZoneFile)
> +{
> + x265_zone* zone = (x265_zone*)x265_malloc(sizeof(x265_zone) *
> zoneCount);
> + if (isZoneFile) {
> + for (int i = 0; i < zoneCount; i++)
> + zone[i].zoneParam =
> (x265_param*)x265_malloc(sizeof(x265_param));
> + }
> + return zone;
> +}
> +
> +void x265_zone_free(x265_param *param)
> +{
> + if (param->rc.zonefileCount) {
> + for (int i = 0; i < param->rc.zonefileCount; i++)
> + x265_free(param->rc.zones[i].zoneParam);
> + }
> + if (param->rc.zoneCount || param->rc.zonefileCount)
> + x265_free(param->rc.zones);
> +}
> +
> static const x265_api libapi =
> {
> X265_MAJOR_VERSION,
> diff -r cb3e172a5f51 -r b758e88462f0 source/encoder/encoder.cpp
> --- a/source/encoder/encoder.cpp Tue Feb 19 20:20:35 2019 +0530
> +++ b/source/encoder/encoder.cpp Fri Mar 01 12:51:39 2019 +0530
> @@ -3356,6 +3356,12 @@
> if (p->dolbyProfile) // Default disabled.
> configureDolbyVisionParams(p);
>
> + if (p->rc.zonefileCount && p->rc.zoneCount)
> + {
> + p->rc.zoneCount = 0;
> + x265_log(p, X265_LOG_WARNING, "Only zone or zonefile can be used.
> Enabling only zonefile\n");
> + }
> +
> if (m_param->rc.zonefileCount && p->bOpenGOP)
> {
> p->bOpenGOP = 0;
> diff -r cb3e172a5f51 -r b758e88462f0 source/x265.h
> --- a/source/x265.h Tue Feb 19 20:20:35 2019 +0530
> +++ b/source/x265.h Fri Mar 01 12:51:39 2019 +0530
> @@ -1798,6 +1798,10 @@
> #define X265_PARAM_BAD_VALUE (-2)
> int x265_param_parse(x265_param *p, const char *name, const char *value);
>
> +x265_zone *x265_zone_alloc(int zoneCount, bool isZoneFile);
> +
> +void x265_zone_free(x265_param *param);
> +
> int x265_zone_param_parse(x265_param* p, const char* name, const char*
> value);
>
> static const char * const x265_profile_names[] = {
> _______________________________________________
> 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/20190305/3bc2a692/attachment-0001.html>
More information about the x265-devel
mailing list