# HG changeset patch
# User Pooja Venkatesan <[email protected]>
# 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
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[] = {
# HG changeset patch
# User Pooja Venkatesan <[email protected]>
# 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
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
[email protected]
https://mailman.videolan.org/listinfo/x265-devel