# HG changeset patch # User Bhavna Hariharan <bha...@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++) {
# HG changeset patch # User Bhavna Hariharan <bha...@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++) {
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel