[x265] [PATCH x265] dynamic-refine: restart training at the beginning of each GOP
bhavna at multicorewareinc.com
bhavna at multicorewareinc.com
Fri Mar 30 13:56:25 CEST 2018
# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1522408210 -19800
# Fri Mar 30 16:40:10 2018 +0530
# Node ID ae72210ad6e846062572ef8a02970b74052c2f1c
# Parent 3440a56acc7865dcdea725b8ce7755450209a8ee
dynamic-refine: restart training at the beginning of each GOP
Earlier, the training restarted at scenecuts. Now, the algorithm restarts at
the beginning of each GOP in addition to the scenecuts.
diff -r 3440a56acc78 -r ae72210ad6e8 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Thu Mar 29 14:35:50 2018 +0530
+++ b/source/encoder/encoder.cpp Fri Mar 30 16:40:10 2018 +0530
@@ -416,7 +416,8 @@
if (m_param->bDynamicRefine)
{
- int size = m_param->totalFrames * m_param->maxCUDepth * X265_REFINE_INTER_LEVELS;
+ /* Allocate memory for 1 GOP and reuse it for the subsequent GOPs */
+ int size = (m_param->keyframeMax + m_param->lookaheadDepth) * m_param->maxCUDepth * X265_REFINE_INTER_LEVELS;
CHECKED_MALLOC_ZERO(m_variance, uint64_t, size);
CHECKED_MALLOC_ZERO(m_rdCost, uint64_t, size);
CHECKED_MALLOC_ZERO(m_trainingCount, uint32_t, size);
diff -r 3440a56acc78 -r ae72210ad6e8 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Thu Mar 29 14:35:50 2018 +0530
+++ b/source/encoder/frameencoder.cpp Fri Mar 30 16:40:10 2018 +0530
@@ -1463,6 +1463,7 @@
if (m_param->bDynamicRefine)
{
+ if (m_top->m_startPoint <= m_frame->m_encodeOrder) // Avoid collecting data that will not be used by future frames.
{
ScopedLock dynLock(m_top->m_dynamicRefineLock);
for (uint32_t i = 0; i < X265_REFINE_INTER_LEVELS; i++)
@@ -1470,7 +1471,8 @@
for (uint32_t depth = 0; depth < m_param->maxCUDepth; depth++)
{
int offset = (depth * X265_REFINE_INTER_LEVELS) + i;
- int index = (m_frame->m_encodeOrder * X265_REFINE_INTER_LEVELS * m_param->maxCUDepth) + offset;
+ int curFrameIndex = m_frame->m_encodeOrder - m_top->m_startPoint;
+ int index = (curFrameIndex * X265_REFINE_INTER_LEVELS * m_param->maxCUDepth) + offset;
if (ctu->m_collectCUCount[offset])
{
m_top->m_variance[index] += ctu->m_collectCUVariance[offset];
@@ -1869,8 +1871,14 @@
void FrameEncoder::computeAvgTrainingData()
{
- if (m_frame->m_lowres.bScenecut)
+ if (m_frame->m_lowres.bScenecut || m_frame->m_lowres.bKeyframe)
+ {
m_top->m_startPoint = m_frame->m_encodeOrder;
+ int size = (m_param->keyframeMax + m_param->lookaheadDepth) * m_param->maxCUDepth * X265_REFINE_INTER_LEVELS;
+ memset(m_top->m_variance, 0, size * sizeof(uint64_t));
+ memset(m_top->m_rdCost, 0, size * sizeof(uint64_t));
+ memset(m_top->m_trainingCount, 0, size * sizeof(uint32_t));
+ }
if (m_frame->m_encodeOrder - m_top->m_startPoint < 2 * m_param->frameNumThreads)
m_frame->m_classifyFrame = false;
@@ -1884,8 +1892,8 @@
if (m_frame->m_classifyFrame)
{
- uint32_t limit = m_frame->m_encodeOrder - m_param->frameNumThreads - 1;
- for (uint32_t i = m_top->m_startPoint + 1; i < limit; i++)
+ uint32_t limit = m_frame->m_encodeOrder - m_top->m_startPoint - m_param->frameNumThreads;
+ for (uint32_t i = 1; i < limit; i++)
{
for (uint32_t j = 0; j < X265_REFINE_INTER_LEVELS; j++)
{
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-clone.patch
Type: text/x-patch
Size: 3577 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180330/62380772/attachment.bin>
More information about the x265-devel
mailing list