Re: [x265] [PATCH x265] dynamic-refine: restart training at the beginning of each GOP

2018-04-02 Thread Ashok Kumar Mishra
On Mon, Apr 2, 2018 at 4:21 PM, Bhavna Hariharan <
bha...@multicorewareinc.com> wrote:

>
> On Mon, Apr 2, 2018 at 4:04 PM, Ashok Kumar Mishra <
> as...@multicorewareinc.com> wrote:
>
>>
>>
>> On Fri, Mar 30, 2018 at 5:26 PM,  wrote:
>>
>>> # HG changeset patch
>>> # User Bhavna Hariharan 
>>> # 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.cppThu Mar 29 14:35:50 2018 +0530
>>> +++ b/source/encoder/encoder.cppFri 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.
>>
>
> We will be incrementally adding to the buffer so the reset is required
> when we want to restart the training.
>
>>
>> +}
>>>
>>>  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
>>>
>>>
>>
>> ___
>> x265-devel mailing list
>> x265-devel@videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>>
>
> ___
> x265-devel mailing list
> x265-devel@videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
Pushed.

Re: [x265] [PATCH x265] dynamic-refine: restart training at the beginning of each GOP

2018-04-02 Thread Bhavna Hariharan
On Mon, Apr 2, 2018 at 4:04 PM, Ashok Kumar Mishra <
as...@multicorewareinc.com> wrote:

>
>
> On Fri, Mar 30, 2018 at 5:26 PM,  wrote:
>
>> # HG changeset patch
>> # User Bhavna Hariharan 
>> # 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.cppThu Mar 29 14:35:50 2018 +0530
>> +++ b/source/encoder/encoder.cppFri 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.
>

We will be incrementally adding to the buffer so the reset is required when
we want to restart the training.

>
> +}
>>
>>  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
>>
>>
>
> ___
> x265-devel mailing list
> x265-devel@videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
___
x265-devel mailing list
x265-devel@videolan.org
https://mailman.videolan.org/listinfo/x265-devel


Re: [x265] [PATCH x265] dynamic-refine: restart training at the beginning of each GOP

2018-04-02 Thread Ashok Kumar Mishra
On Fri, Mar 30, 2018 at 5:26 PM,  wrote:

> # HG changeset patch
> # User Bhavna Hariharan 
> # 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.cppThu Mar 29 14:35:50 2018 +0530
> +++ b/source/encoder/encoder.cppFri 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@videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
___
x265-devel mailing list
x265-devel@videolan.org
https://mailman.videolan.org/listinfo/x265-devel