[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