[x265] [PATCH x265] dynamic-refine: restart training at the beginning of each GOP
Ashok Kumar Mishra
ashok at multicorewareinc.com
Mon Apr 2 12:34:51 CEST 2018
On Fri, Mar 30, 2018 at 5:26 PM, <bhavna at multicorewareinc.com> wrote:
> # 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));
>
Is it required to reset the buffer every time? I believe you might be over
writing those buffers periodically. Correct me if i am wrong.
+ }
>
> 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 at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180402/1e218ee7/attachment.html>
More information about the x265-devel
mailing list