[x265] [PATCH] Avoid calling slicetypeDecide() routine when analysis-load is enabled

bhavna at multicorewareinc.com bhavna at multicorewareinc.com
Mon Jul 2 16:07:19 CEST 2018


# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1530094711 -19800
#      Wed Jun 27 15:48:31 2018 +0530
# Node ID 0a629ea6036b24d60d0a1bc8a7b2f6d5cc476a02
# Parent  289b8a3730ae108bbb9e4b295dc915205ba2d0e9
Avoid calling slicetypeDecide() routine when analysis-load is enabled.

This patch does the following:
1) Bypass slicetypeDecide() call for analysis-load
2) Update params that must match between analysis save and load runs

diff -r 289b8a3730ae -r 0a629ea6036b source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Fri Jun 22 11:47:36 2018 +0530
+++ b/source/encoder/encoder.cpp	Wed Jun 27 15:48:31 2018 +0530
@@ -4105,6 +4105,7 @@
     int       readValue = 0;
     int       count = 0;
 
+    X265_PARAM_VALIDATE(saveParam->intraRefresh, sizeof(int), 1, &m_param->bIntraRefresh, intra-refresh);
     X265_PARAM_VALIDATE(saveParam->maxNumReferences, sizeof(int), 1, &m_param->maxNumReferences, ref);
     X265_PARAM_VALIDATE(saveParam->analysisReuseLevel, sizeof(int), 1, &m_param->analysisReuseLevel, analysis-reuse-level);
     X265_PARAM_VALIDATE(saveParam->keyframeMax, sizeof(int), 1, &m_param->keyframeMax, keyint);
@@ -4113,9 +4114,9 @@
     X265_PARAM_VALIDATE(saveParam->bframes, sizeof(int), 1, &m_param->bframes, bframes);
     X265_PARAM_VALIDATE(saveParam->bPyramid, sizeof(int), 1, &m_param->bBPyramid, bPyramid);
     X265_PARAM_VALIDATE(saveParam->minCUSize, sizeof(int), 1, &m_param->minCUSize, min - cu - size);
-    X265_PARAM_VALIDATE(saveParam->radl, sizeof(int), 1, &m_param->radl, radl);
     X265_PARAM_VALIDATE(saveParam->lookaheadDepth, sizeof(int), 1, &m_param->lookaheadDepth, rc - lookahead);
-    X265_PARAM_VALIDATE(saveParam->gopLookahead, sizeof(int), 1, &m_param->gopLookahead, gop - lookahead);
+    X265_PARAM_VALIDATE(saveParam->chunkStart, sizeof(int), 1, &m_param->chunkStart, chunk-start);
+    X265_PARAM_VALIDATE(saveParam->chunkEnd, sizeof(int), 1, &m_param->chunkEnd, chunk-end);
 
     int sourceHeight, sourceWidth;
     if (writeFlag)
@@ -4133,8 +4134,8 @@
         int curSourceHeight = m_param->sourceHeight - m_conformanceWindow.bottomOffset;
         int curSourceWidth = m_param->sourceWidth - m_conformanceWindow.rightOffset;
 
-        X265_FREAD(&sourceWidth, sizeof(int), 1, m_analysisFileIn, &(saveParam->sourceHeight));
-        X265_FREAD(&sourceHeight, sizeof(int), 1, m_analysisFileIn, &(saveParam->sourceWidth));
+        X265_FREAD(&sourceWidth, sizeof(int), 1, m_analysisFileIn, &(saveParam->sourceWidth));
+        X265_FREAD(&sourceHeight, sizeof(int), 1, m_analysisFileIn, &(saveParam->sourceHeight));
         X265_FREAD(&readValue, sizeof(int), 1, m_analysisFileIn, &(saveParam->maxCUSize));
 
         bool isScaledRes = (2 * sourceHeight == curSourceHeight) && (2 * sourceWidth == curSourceWidth);
diff -r 289b8a3730ae -r 0a629ea6036b source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp	Fri Jun 22 11:47:36 2018 +0530
+++ b/source/encoder/slicetype.cpp	Wed Jun 27 15:48:31 2018 +0530
@@ -1088,86 +1088,105 @@
     }
 
     int bframes, brefs;
-    for (bframes = 0, brefs = 0;; bframes++)
+    if (!m_param->analysisLoad)
     {
-        Lowres& frm = list[bframes]->m_lowres;
-
-        if (frm.sliceType == X265_TYPE_BREF && !m_param->bBPyramid && brefs == m_param->bBPyramid)
+        for (bframes = 0, brefs = 0;; bframes++)
         {
-            frm.sliceType = X265_TYPE_B;
-            x265_log(m_param, X265_LOG_WARNING, "B-ref at frame %d incompatible with B-pyramid\n",
-                     frm.frameNum);
-        }
+            Lowres& frm = list[bframes]->m_lowres;
+
+            if (frm.sliceType == X265_TYPE_BREF && !m_param->bBPyramid && brefs == m_param->bBPyramid)
+            {
+                frm.sliceType = X265_TYPE_B;
+                x265_log(m_param, X265_LOG_WARNING, "B-ref at frame %d incompatible with B-pyramid\n",
+                    frm.frameNum);
+            }
 
-        /* pyramid with multiple B-refs needs a big enough dpb that the preceding P-frame stays available.
-         * smaller dpb could be supported by smart enough use of mmco, but it's easier just to forbid it. */
-        else if (frm.sliceType == X265_TYPE_BREF && m_param->bBPyramid && brefs &&
-                 m_param->maxNumReferences <= (brefs + 3))
-        {
-            frm.sliceType = X265_TYPE_B;
-            x265_log(m_param, X265_LOG_WARNING, "B-ref at frame %d incompatible with B-pyramid and %d reference frames\n",
-                     frm.sliceType, m_param->maxNumReferences);
+            /* pyramid with multiple B-refs needs a big enough dpb that the preceding P-frame stays available.
+             * smaller dpb could be supported by smart enough use of mmco, but it's easier just to forbid it. */
+            else if (frm.sliceType == X265_TYPE_BREF && m_param->bBPyramid && brefs &&
+                m_param->maxNumReferences <= (brefs + 3))
+            {
+                frm.sliceType = X265_TYPE_B;
+                x265_log(m_param, X265_LOG_WARNING, "B-ref at frame %d incompatible with B-pyramid and %d reference frames\n",
+                    frm.sliceType, m_param->maxNumReferences);
+            }
+            if (((!m_param->bIntraRefresh || frm.frameNum == 0) && frm.frameNum - m_lastKeyframe >= m_param->keyframeMax &&
+                (!m_extendGopBoundary || frm.frameNum - m_lastKeyframe >= m_param->keyframeMax + m_param->gopLookahead)) ||
+                (frm.frameNum == (m_param->chunkStart - 1)) || (frm.frameNum == m_param->chunkEnd))
+            {
+                if (frm.sliceType == X265_TYPE_AUTO || frm.sliceType == X265_TYPE_I)
+                    frm.sliceType = m_param->bOpenGOP && m_lastKeyframe >= 0 ? X265_TYPE_I : X265_TYPE_IDR;
+                bool warn = frm.sliceType != X265_TYPE_IDR;
+                if (warn && m_param->bOpenGOP)
+                    warn &= frm.sliceType != X265_TYPE_I;
+                if (warn)
+                {
+                    x265_log(m_param, X265_LOG_WARNING, "specified frame type (%d) at %d is not compatible with keyframe interval\n",
+                        frm.sliceType, frm.frameNum);
+                    frm.sliceType = m_param->bOpenGOP && m_lastKeyframe >= 0 ? X265_TYPE_I : 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)
+                {
+                    m_lastKeyframe = frm.frameNum;
+                    frm.bKeyframe = true;
+                }
+                else
+                    frm.sliceType = X265_TYPE_IDR;
+            }
+            if (frm.sliceType == X265_TYPE_IDR)
+            {
+                /* Closed GOP */
+                m_lastKeyframe = frm.frameNum;
+                frm.bKeyframe = true;
+                if (bframes > 0 && !m_param->radl)
+                {
+                    list[bframes - 1]->m_lowres.sliceType = X265_TYPE_P;
+                    bframes--;
+                }
+            }
+            if (m_param->radl && !m_param->bOpenGOP && list[bframes + 1])
+            {
+                if ((frm.frameNum - m_lastKeyframe) > (m_param->keyframeMax - m_param->radl - 1) && (frm.frameNum - m_lastKeyframe) < m_param->keyframeMax)
+                    frm.sliceType = X265_TYPE_B;
+                if ((frm.frameNum - m_lastKeyframe) == (m_param->keyframeMax - m_param->radl - 1))
+                    frm.sliceType = X265_TYPE_P;
+            }
+
+            if (bframes == m_param->bframes || !list[bframes + 1])
+            {
+                if (IS_X265_TYPE_B(frm.sliceType))
+                    x265_log(m_param, X265_LOG_WARNING, "specified frame type is not compatible with max B-frames\n");
+                if (frm.sliceType == X265_TYPE_AUTO || IS_X265_TYPE_B(frm.sliceType))
+                    frm.sliceType = X265_TYPE_P;
+            }
+            if (frm.sliceType == X265_TYPE_BREF)
+                brefs++;
+            if (frm.sliceType == X265_TYPE_AUTO)
+                frm.sliceType = X265_TYPE_B;
+            else if (!IS_X265_TYPE_B(frm.sliceType))
+                break;
         }
-        if (((!m_param->bIntraRefresh || frm.frameNum == 0) && frm.frameNum - m_lastKeyframe >= m_param->keyframeMax &&
-            (!m_extendGopBoundary || frm.frameNum - m_lastKeyframe >= m_param->keyframeMax + m_param->gopLookahead)) ||
-            (frm.frameNum == (m_param->chunkStart - 1)) || (frm.frameNum == m_param->chunkEnd))
+    }
+    else
+    {
+        for (bframes = 0, brefs = 0;; bframes++)
         {
-            if (frm.sliceType == X265_TYPE_AUTO || frm.sliceType == X265_TYPE_I)
-                frm.sliceType = m_param->bOpenGOP && m_lastKeyframe >= 0 ? X265_TYPE_I : X265_TYPE_IDR;
-            bool warn = frm.sliceType != X265_TYPE_IDR;
-            if (warn && m_param->bOpenGOP)
-                warn &= frm.sliceType != X265_TYPE_I;
-            if (warn)
-            {
-                x265_log(m_param, X265_LOG_WARNING, "specified frame type (%d) at %d is not compatible with keyframe interval\n",
-                         frm.sliceType, frm.frameNum);
-                frm.sliceType = m_param->bOpenGOP && m_lastKeyframe >= 0 ? X265_TYPE_I : 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)
+            Lowres& frm = list[bframes]->m_lowres;
+            if (frm.sliceType == X265_TYPE_BREF)
+                brefs++;
+            if ((IS_X265_TYPE_I(frm.sliceType) && frm.frameNum - m_lastKeyframe >= m_param->keyframeMin)
+                || (frm.frameNum == (m_param->chunkStart - 1)) || (frm.frameNum == m_param->chunkEnd))
             {
                 m_lastKeyframe = frm.frameNum;
                 frm.bKeyframe = true;
             }
-            else
-                frm.sliceType = X265_TYPE_IDR;
-        }
-        if (frm.sliceType == X265_TYPE_IDR)
-        {
-            /* Closed GOP */
-            m_lastKeyframe = frm.frameNum;
-            frm.bKeyframe = true;
-            if (bframes > 0 && !m_param->radl)
-            {
-                list[bframes - 1]->m_lowres.sliceType = X265_TYPE_P;
-                bframes--;
-            }
+            if (!IS_X265_TYPE_B(frm.sliceType))
+                break;
         }
-        if (m_param->radl && !m_param->bOpenGOP && list[bframes + 1])
-        {
-            if ((frm.frameNum - m_lastKeyframe) >  (m_param->keyframeMax - m_param->radl - 1) && (frm.frameNum - m_lastKeyframe) <  m_param->keyframeMax)
-                frm.sliceType = X265_TYPE_B;
-            if ((frm.frameNum - m_lastKeyframe) == (m_param->keyframeMax - m_param->radl - 1))
-                frm.sliceType = X265_TYPE_P;
-        }
-
-        if (bframes == m_param->bframes || !list[bframes + 1])
-        {
-            if (IS_X265_TYPE_B(frm.sliceType))
-                x265_log(m_param, X265_LOG_WARNING, "specified frame type is not compatible with max B-frames\n");
-            if (frm.sliceType == X265_TYPE_AUTO || IS_X265_TYPE_B(frm.sliceType))
-                frm.sliceType = X265_TYPE_P;
-        }
-        if (frm.sliceType == X265_TYPE_BREF)
-            brefs++;
-        if (frm.sliceType == X265_TYPE_AUTO)
-            frm.sliceType = X265_TYPE_B;
-        else if (!IS_X265_TYPE_B(frm.sliceType))
-            break;
     }
-
     if (bframes)
         list[bframes - 1]->m_lowres.bLastMiniGopBFrame = true;
     list[bframes]->m_lowres.leadingBframes = bframes;
diff -r 289b8a3730ae -r 0a629ea6036b source/x265.h
--- a/source/x265.h	Fri Jun 22 11:47:36 2018 +0530
+++ b/source/x265.h	Wed Jun 27 15:48:31 2018 +0530
@@ -121,9 +121,10 @@
     int     bPyramid;
     int     maxCUSize;
     int     minCUSize;
-    int     radl;
+    int     intraRefresh;
     int     lookaheadDepth;
-    int     gopLookahead;
+    int     chunkStart;
+    int     chunkEnd;
 }x265_analysis_validate;
 
 /* Stores all analysis data for a single frame */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-clean.patch
Type: text/x-patch
Size: 12264 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180702/23eff93e/attachment.bin>


More information about the x265-devel mailing list