[x265] [PATCH 2 of 2] zone: reconfigure params for FEs in round robin fashion

bhavna at multicorewareinc.com bhavna at multicorewareinc.com
Thu Dec 20 12:03:39 CET 2018


# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1544770049 -19800
#      Fri Dec 14 12:17:29 2018 +0530
# Node ID 228dd85f3bdbb955481c06a79eddc5cf2fbbeaa1
# Parent  592b83c9068d7f402c85394fcf113b767b58f08d
zone: reconfigure params for FEs in round robin fashion

diff -r 592b83c9068d -r 228dd85f3bdb source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp	Fri Dec 14 12:04:35 2018 +0530
+++ b/source/encoder/analysis.cpp	Fri Dec 14 12:17:29 2018 +0530
@@ -140,6 +140,7 @@
     m_slice = ctu.m_slice;
     m_frame = &frame;
     m_bChromaSa8d = m_param->rdLevel >= 3;
+    m_param = m_frame->m_param;
 
 #if _DEBUG || CHECKED_BUILD
     invalidateContexts(0);
diff -r 592b83c9068d -r 228dd85f3bdb source/encoder/api.cpp
--- a/source/encoder/api.cpp	Fri Dec 14 12:04:35 2018 +0530
+++ b/source/encoder/api.cpp	Fri Dec 14 12:17:29 2018 +0530
@@ -94,6 +94,7 @@
     Encoder* encoder = NULL;
     x265_param* param = PARAM_NS::x265_param_alloc();
     x265_param* latestParam = PARAM_NS::x265_param_alloc();
+    x265_param* zoneParam = PARAM_NS::x265_param_alloc();
     if (!param || !latestParam)
         goto fail;
 
@@ -126,6 +127,13 @@
     }
 
     encoder->create();
+
+    memcpy(zoneParam, param, sizeof(x265_param));
+    for (int i = 0; i < param->rc.zonefileCount; i++)
+    {
+        encoder->configureZone(zoneParam, param->rc.zones[i].zoneParam);
+    }
+
     /* Try to open CSV file handle */
     if (encoder->m_param->csvfn)
     {
diff -r 592b83c9068d -r 228dd85f3bdb source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Fri Dec 14 12:04:35 2018 +0530
+++ b/source/encoder/encoder.cpp	Fri Dec 14 12:17:29 2018 +0530
@@ -1000,11 +1000,11 @@
         }
 
         Frame *inFrame;
+        x265_param* p = (m_reconfigure || m_reconfigureRc) ? m_latestParam : m_param;
         if (m_dpb->m_freeList.empty())
         {
             inFrame = new Frame;
             inFrame->m_encodeStartTime = x265_mdate();
-            x265_param* p = (m_reconfigure || m_reconfigureRc) ? m_latestParam : m_param;
             if (inFrame->create(p, pic_in->quantOffsets))
             {
                 /* the first PicYuv created is asked to generate the CU and block unit offset
@@ -1437,6 +1437,12 @@
                     readAnalysisFile(&frameEnc->m_analysisData, frameEnc->m_poc, frameEnc->m_lowres.sliceType);
              }
 
+            for (int i = 0; i < m_param->rc.zonefileCount; i++)
+            {
+                if (m_param->rc.zones[i].startFrame == frameEnc->m_poc)
+                    x265_encoder_reconfig(this, m_param->rc.zones[i].zoneParam);
+            }
+
             if (frameEnc->m_reconfigureRc && m_reconfigureRc)
             {
                 memcpy(m_param, m_latestParam, sizeof(x265_param));
@@ -1641,6 +1647,22 @@
         encParam->bIntraInBFrames = param->bIntraInBFrames;
         if (param->scalingLists && !encParam->scalingLists)
             encParam->scalingLists = strdup(param->scalingLists);
+
+        encParam->rc.aqMode = param->rc.aqMode;
+        encParam->rc.aqStrength = param->rc.aqStrength;
+        encParam->noiseReductionInter = param->noiseReductionInter;
+        encParam->noiseReductionIntra = param->noiseReductionIntra;
+
+        encParam->limitModes = param->limitModes;
+        encParam->bEnableSplitRdSkip = param->bEnableSplitRdSkip;
+        encParam->bCULossless = param->bCULossless;
+        encParam->bEnableRdRefine = param->bEnableRdRefine;
+        encParam->limitTU = param->limitTU;
+        encParam->bEnableTSkipFast = param->bEnableTSkipFast;
+        encParam->rdPenalty = param->rdPenalty;
+        encParam->dynamicRd = param->dynamicRd;
+        encParam->bEnableTransformSkip = param->bEnableTransformSkip;
+        encParam->bEnableAMP = param->bEnableAMP;
     }
     encParam->forceFlush = param->forceFlush;
     /* To add: Loop Filter/deblocking controls, transform skip, signhide require PPS to be resent */
@@ -2584,6 +2606,41 @@
     pps->numRefIdxDefault[1] = 1;
 }
 
+void Encoder::configureZone(x265_param *p, x265_param *zone)
+{
+    p->maxNumReferences = zone->maxNumReferences;
+    p->bEnableFastIntra = zone->bEnableFastIntra;
+    p->bEnableEarlySkip = zone->bEnableEarlySkip;
+    p->bEnableRecursionSkip = zone->bEnableRecursionSkip;
+    p->searchMethod = zone->searchMethod;
+    p->searchRange = zone->searchRange;
+    p->subpelRefine = zone->subpelRefine;
+    p->rdoqLevel = zone->rdoqLevel;
+    p->rdLevel = zone->rdLevel;
+    p->bEnableRectInter = zone->bEnableRectInter;
+    p->maxNumMergeCand = zone->maxNumMergeCand;
+    p->bIntraInBFrames = zone->bIntraInBFrames;
+    p->scalingLists = strdup(zone->scalingLists);
+
+    p->rc.aqMode = zone->rc.aqMode;
+    p->rc.aqStrength = zone->rc.aqStrength;
+    p->noiseReductionInter = zone->noiseReductionInter;
+    p->noiseReductionIntra = zone->noiseReductionIntra;
+
+    p->limitModes = zone->limitModes;
+    p->bEnableSplitRdSkip = zone->bEnableSplitRdSkip;
+    p->bCULossless = zone->bCULossless;
+    p->bEnableRdRefine = zone->bEnableRdRefine;
+    p->limitTU = zone->limitTU;
+    p->bEnableTSkipFast = zone->bEnableTSkipFast;
+    p->rdPenalty = zone->rdPenalty;
+    p->dynamicRd = zone->dynamicRd;
+    p->bEnableTransformSkip = zone->bEnableTransformSkip;
+    p->bEnableAMP = zone->bEnableAMP;
+
+    memcpy(zone, p, sizeof(x265_param));
+}
+
 void Encoder::configure(x265_param *p)
 {
     this->m_param = p;
@@ -3226,6 +3283,12 @@
                 p->crQpOffset = 4;
         }
     }
+
+    if (m_param->rc.zonefileCount && p->bOpenGOP)
+    {
+        p->bOpenGOP = 0;
+        x265_log(p, X265_LOG_WARNING, "Zone encoding requires closed gop structure. Enabling closed GOP.\n");
+    }
 }
 
 void Encoder::readAnalysisFile(x265_analysis_data* analysis, int curPoc, const x265_picture* picIn, int paramBytes)
diff -r 592b83c9068d -r 228dd85f3bdb source/encoder/encoder.h
--- a/source/encoder/encoder.h	Fri Dec 14 12:04:35 2018 +0530
+++ b/source/encoder/encoder.h	Fri Dec 14 12:17:29 2018 +0530
@@ -193,6 +193,7 @@
     bool               m_aborted;          // fatal error detected
     bool               m_reconfigure;      // Encoder reconfigure in progress
     bool               m_reconfigureRc;
+    bool               m_reconfigureZone;
 
     int               m_saveCtuDistortionLevel;
 
@@ -275,6 +276,8 @@
 
     void configure(x265_param *param);
 
+    void configureZone(x265_param *p, x265_param *zone);
+
     void updateVbvPlan(RateControl* rc);
 
     void readAnalysisFile(x265_analysis_data* analysis, int poc, int sliceType);
diff -r 592b83c9068d -r 228dd85f3bdb source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp	Fri Dec 14 12:04:35 2018 +0530
+++ b/source/encoder/slicetype.cpp	Fri Dec 14 12:17:29 2018 +0530
@@ -1115,6 +1115,11 @@
                     frm.sliceType = m_param->bOpenGOP && m_lastKeyframe >= 0 ? X265_TYPE_I : X265_TYPE_IDR;
                 }
             }
+            for (int i = 0; i < m_param->rc.zonefileCount; i++)
+            {
+                if (m_param->rc.zones[i].startFrame == frm.frameNum)
+                    frm.sliceType = X265_TYPE_IDR;
+            }
             if ((frm.sliceType == X265_TYPE_I && frm.frameNum - m_lastKeyframe >= m_param->keyframeMin) || (frm.frameNum == (m_param->chunkStart - 1)) || (frm.frameNum == m_param->chunkEnd))
             {
                 if (m_param->bOpenGOP)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-clean-2.patch
Type: text/x-patch
Size: 7424 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20181220/ac232a18/attachment.bin>


More information about the x265-devel mailing list