# HG changeset patch
# User Pooja Venkatesan <po...@multicorewareinc.com>
# Date 1544770885 -19800
#      Fri Dec 14 12:31:25 2018 +0530
# Node ID d5d79e22bfddda8c103da2182a68137757340425
# Parent  1a62483c0b7549ef677ce2f343e9c7f1fcd45c44
zone: Add support for RADL pictures

diff -r 1a62483c0b75 -r d5d79e22bfdd source/common/param.cpp
--- a/source/common/param.cpp Fri Dec 14 12:28:56 2018 +0530
+++ b/source/common/param.cpp Fri Dec 14 12:31:25 2018 +0530
@@ -624,6 +624,7 @@
     OPT("amp") p->bEnableAMP = atobool(value);
     OPT("max-merge") p->maxNumMergeCand = (uint32_t)atoi(value);
     OPT("rd") p->rdLevel = atoi(value);
+    OPT("radl") p->radl = atoi(value);
     OPT2("rdoq", "rdoq-level")
     {
         int bval = atobool(value);
diff -r 1a62483c0b75 -r d5d79e22bfdd source/encoder/dpb.h
--- a/source/encoder/dpb.h Fri Dec 14 12:28:56 2018 +0530
+++ b/source/encoder/dpb.h Fri Dec 14 12:31:25 2018 +0530
@@ -52,6 +52,14 @@
         m_lastIDR = 0;
         m_pocCRA = 0;
         m_bhasLeadingPicture = param->radl;
+        for (int i = 0; i < param->rc.zonefileCount; i++)
+        {
+            if (param->rc.zones[i].zoneParam->radl)
+            {
+                m_bhasLeadingPicture = param->rc.zones[i].zoneParam->radl;
+                break;
+            }
+        }
         m_bRefreshPending = false;
         m_frameDataFreeList = NULL;
         m_bOpenGOP = param->bOpenGOP;
diff -r 1a62483c0b75 -r d5d79e22bfdd source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Fri Dec 14 12:28:56 2018 +0530
+++ b/source/encoder/encoder.cpp Fri Dec 14 12:31:25 2018 +0530
@@ -2652,6 +2652,7 @@
         p->rc.qp = zone->rc.qp;
         p->rc.aqMode = X265_AQ_NONE;
     }
+    p->radl = zone->radl;

     memcpy(zone, p, sizeof(x265_param));
 }
diff -r 1a62483c0b75 -r d5d79e22bfdd source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp Fri Dec 14 12:28:56 2018 +0530
+++ b/source/encoder/slicetype.cpp Fri Dec 14 12:31:25 2018 +0530
@@ -1117,7 +1117,9 @@
             }
             for (int i = 0; i < m_param->rc.zonefileCount; i++)
             {
-                if (m_param->rc.zones[i].startFrame == frm.frameNum)
+                int curZoneStart = m_param->rc.zones[i].startFrame;
+                curZoneStart += curZoneStart ?
m_param->rc.zones[i].zoneParam->radl : 0;
+                if (curZoneStart == 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))
@@ -1135,7 +1137,20 @@
                 /* Closed GOP */
                 m_lastKeyframe = frm.frameNum;
                 frm.bKeyframe = true;
-                if (bframes > 0 && !m_param->radl)
+                int zoneRadl = 0;
+                for (int i = 0; i < m_param->rc.zonefileCount; i++)
+                {
+                    int zoneStart = m_param->rc.zones[i].startFrame;
+                    zoneStart += zoneStart ?
m_param->rc.zones[i].zoneParam->radl : 0;
+                    if (zoneStart == frm.frameNum)
+                    {
+                        zoneRadl = m_param->rc.zones[i].zoneParam->radl;
+                        m_param->radl = 0;
+                        m_param->rc.zones->zoneParam->radl = i <
m_param->rc.zonefileCount - 1? m_param->rc.zones[i + 1].zoneParam->radl : 0;
+                        break;
+                    }
+                }
+                if (bframes > 0 && !m_param->radl && !zoneRadl)
                 {
                     list[bframes - 1]->m_lowres.sliceType = X265_TYPE_P;
                     bframes--;
@@ -1423,6 +1438,14 @@
     }
     frames[framecnt + 1] = NULL;

+    for (int i = 0; i < m_param->rc.zonefileCount; i++)
+    {
+        int curZoneStart = m_param->rc.zones[i].startFrame, nextZoneStart
= 0;
+        curZoneStart += curZoneStart ?
m_param->rc.zones[i].zoneParam->radl : 0;
+        nextZoneStart += (i + 1 < m_param->rc.zonefileCount) ?
m_param->rc.zones[i + 1].startFrame + m_param->rc.zones[i +
1].zoneParam->radl : m_param->totalFrames;
+        if (curZoneStart <= frames[0]->frameNum && nextZoneStart >
frames[0]->frameNum)
+            m_param->keyframeMax = nextZoneStart - curZoneStart;
+    }
     int keylimit = m_param->keyframeMax;
     if (frames[0]->frameNum < m_param->chunkEnd)
     {
@@ -1632,14 +1655,16 @@
             frames[numFrames]->sliceType = X265_TYPE_P;
         }

-        bool bForceRADL = m_param->radl && !m_param->bOpenGOP;
+        int zoneRadl = m_param->rc.zonefileCount ?
m_param->rc.zones->zoneParam->radl : 0;
+        bool bForceRADL = (m_param->radl || zoneRadl) &&
!m_param->bOpenGOP;
         bool bLastMiniGop = (framecnt >= m_param->bframes + 1) ? false :
true;
-        int preRADL = m_lastKeyframe + m_param->keyframeMax -
m_param->radl - 1; /*Frame preceeding RADL in POC order*/
+        int radl = m_param->radl ? m_param->radl : zoneRadl;
+        int preRADL = m_lastKeyframe + m_param->keyframeMax - radl - 1;
/*Frame preceeding RADL in POC order*/
         if (bForceRADL && (frames[0]->frameNum == preRADL) &&
!bLastMiniGop)
         {
             int j = 1;
-            numBFrames = m_param->radl;
-            for (; j <= m_param->radl; j++)
+            numBFrames = m_param->radl ? m_param->radl : zoneRadl;
+            for (; j <= numBFrames; j++)
                 frames[j]->sliceType = X265_TYPE_B;
             frames[j]->sliceType = X265_TYPE_I;
         }

Attachment: x265-clean-5 (1).patch
Description: Binary data

_______________________________________________
x265-devel mailing list
x265-devel@videolan.org
https://mailman.videolan.org/listinfo/x265-devel

Reply via email to