# 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

Reply via email to