[x265] [PATCH 3 of 4] limitTU : use neighbouring CUs' TU depth to limit 1st subTU's depth

Bhavna Hariharan bhavna at multicorewareinc.com
Fri Nov 18 05:22:36 CET 2016


There is a mistake in the first patch, please apply the latest patch.


Regards,

Bhavna Hariharan

On Fri, Nov 18, 2016 at 9:49 AM, Bhavna Hariharan <
bhavna at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Bhavna Hariharan <bhavna at multicorewareinc.com>
> # Date 1479380469 -19800
> #      Thu Nov 17 16:31:09 2016 +0530
> # Node ID d4425aa677c63b8486dde5bb716f9a191da6bdaa
> # Parent  07a4e4d785a69f719922129ca5997b12552bb4ab
> limitTU : use neighbouring CUs' TU depth to limit 1st subTU's depth
>
> diff -r 07a4e4d785a6 -r d4425aa677c6 source/encoder/analysis.cpp
> --- a/source/encoder/analysis.cpp Thu Nov 17 12:19:38 2016 +0530
> +++ b/source/encoder/analysis.cpp Thu Nov 17 16:31:09 2016 +0530
> @@ -377,7 +377,7 @@
>              checkBestMode(md.pred[PRED_INTRA_NxN], depth);
>          }
>
> -        if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
> +        if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>          {
>              CUData* ctu = md.bestMode->cu.m_encData->
> getPicCTU(parentCTU.m_cuAddr);
>              int8_t maxTUDepth = -1;
> @@ -954,7 +954,7 @@
>      bool skipRectAmp = false;
>      bool chooseMerge = false;
>
> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>          m_maxTUDepth = loadTUDepth(cuGeom, parentCTU);
>
>      SplitData splitData[4];
> @@ -1463,7 +1463,7 @@
>      if (m_param->rdLevel)
>          md.bestMode->reconYuv.copyToPicYuv(reconPic, cuAddr,
> cuGeom.absPartIdx);
>
> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>      {
>          if (mightNotSplit)
>          {
> @@ -1498,7 +1498,7 @@
>          md.pred[PRED_2Nx2N].rdCost = 0;
>      }
>
> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>          m_maxTUDepth =  loadTUDepth(cuGeom, parentCTU);
>
>      SplitData splitData[4];
> @@ -1827,7 +1827,7 @@
>          if (mightSplit)
>              addSplitFlagCost(*md.bestMode, cuGeom.depth);
>      }
> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>      {
>          if (mightNotSplit)
>          {
> diff -r 07a4e4d785a6 -r d4425aa677c6 source/encoder/search.cpp
> --- a/source/encoder/search.cpp Thu Nov 17 12:19:38 2016 +0530
> +++ b/source/encoder/search.cpp Thu Nov 17 16:31:09 2016 +0530
> @@ -2625,7 +2625,7 @@
>
>      uint32_t tuDepthRange[2];
>      cu.getInterTUQtDepthRange(tuDepthRange, 0);
> -    if (limitTU == X265_TU_LIMIT_NEIGH)
> +    if (limitTU & X265_TU_LIMIT_NEIGH)
>      {
>          int maxLog2CUSize = (int)g_log2Size[m_param->maxCUSize];
>          m_maxTUDepth = x265_clip3(maxLog2CUSize -
> (int32_t)tuDepthRange[1], maxLog2CUSize - (int32_t)tuDepthRange[0],
> m_maxTUDepth);
> @@ -2639,7 +2639,14 @@
>          memset(&m_cacheTU, 0, sizeof(TUInfoCache));
>
>      Cost costs;
> -    estimateResidualQT(interMode, cuGeom, 0, 0, *resiYuv, costs,
> tuDepthRange);
> +    if (limitTU == X265_TU_LIMIT_DFS_NEIGH)
> +    {
> +        int32_t tempDepth = m_maxTUDepth;
> +        estimateResidualQT(interMode, cuGeom, 0, 0, *resiYuv, costs,
> tuDepthRange);
> +        m_maxTUDepth = tempDepth;
> +    }
> +    else
> +        estimateResidualQT(interMode, cuGeom, 0, 0, *resiYuv, costs,
> tuDepthRange);
>
>      uint32_t tqBypass = cu.m_tqBypass[0];
>      if (!tqBypass)
> @@ -2898,10 +2905,11 @@
>      uint32_t ycbf = 0, ucbf = 0, vcbf = 0;
>      for (uint32_t qIdx = 0, qPartIdx = absPartIdx; qIdx < 4; ++qIdx,
> qPartIdx += qNumParts)
>      {
> -        if (limitTU == X265_TU_LIMIT_DFS && tuDepth == 0 && qIdx == 1)
> +        if (limitTU & X265_TU_LIMIT_DFS && tuDepth == 0 && qIdx == 1)
>          {
> +            m_maxTUDepth = cu.m_tuDepth[0];
>              // Fetch maximum TU depth of first sub partition to limit
> recursion of others
> -            for (uint32_t i = 0; i < cuGeom.numPartitions / 4; i++)
> +            for (uint32_t i = 1; i < cuGeom.numPartitions / 4; i++)
>                  m_maxTUDepth = X265_MAX(m_maxTUDepth, cu.m_tuDepth[i]);
>          }
>          estimateResidualQT(mode, cuGeom, qPartIdx, tuDepth + 1, resiYuv,
> splitCost, depthRange, splitMore);
> @@ -2968,7 +2976,7 @@
>              }
>          }
>      }
> -    else if (limitTU == X265_TU_LIMIT_DFS || limitTU ==
> X265_TU_LIMIT_NEIGH)
> +    else if (limitTU & X265_TU_LIMIT_DFS_NEIGH)
>      {
>          if (bCheckSplit && m_maxTUDepth >= 0)
>          {
>
>
>
> Regards,
>
> Bhavna Hariharan
>
> On Thu, Nov 17, 2016 at 5:06 PM, <bhavna at multicorewareinc.com> wrote:
>
>> # HG changeset patch
>> # User Bhavna Hariharan <bhavna at multicorewareinc.com>
>> # Date 1479380469 -19800
>> #      Thu Nov 17 16:31:09 2016 +0530
>> # Node ID f5d3a5aedcdf20235ec76dbf9aba516da83e8dd1
>> # Parent  07a4e4d785a69f719922129ca5997b12552bb4ab
>> limitTU : use neighbouring CUs' TU depth to limit 1st subTU's depth
>>
>> diff -r 07a4e4d785a6 -r f5d3a5aedcdf source/encoder/analysis.cpp
>> --- a/source/encoder/analysis.cpp       Thu Nov 17 12:19:38 2016 +0530
>> +++ b/source/encoder/analysis.cpp       Thu Nov 17 16:31:09 2016 +0530
>> @@ -377,7 +377,7 @@
>>              checkBestMode(md.pred[PRED_INTRA_NxN], depth);
>>          }
>>
>> -        if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
>> +        if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>>          {
>>              CUData* ctu = md.bestMode->cu.m_encData->get
>> PicCTU(parentCTU.m_cuAddr);
>>              int8_t maxTUDepth = -1;
>> @@ -954,7 +954,7 @@
>>      bool skipRectAmp = false;
>>      bool chooseMerge = false;
>>
>> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
>> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>>          m_maxTUDepth = loadTUDepth(cuGeom, parentCTU);
>>
>>      SplitData splitData[4];
>> @@ -1463,7 +1463,7 @@
>>      if (m_param->rdLevel)
>>          md.bestMode->reconYuv.copyToPicYuv(reconPic, cuAddr,
>> cuGeom.absPartIdx);
>>
>> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
>> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>>      {
>>          if (mightNotSplit)
>>          {
>> @@ -1498,7 +1498,7 @@
>>          md.pred[PRED_2Nx2N].rdCost = 0;
>>      }
>>
>> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
>> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>>          m_maxTUDepth =  loadTUDepth(cuGeom, parentCTU);
>>
>>      SplitData splitData[4];
>> @@ -1827,7 +1827,7 @@
>>          if (mightSplit)
>>              addSplitFlagCost(*md.bestMode, cuGeom.depth);
>>      }
>> -    if (limitTU == X265_TU_LIMIT_NEIGH && cuGeom.log2CUSize >= 4)
>> +    if ((limitTU & X265_TU_LIMIT_NEIGH) && cuGeom.log2CUSize >= 4)
>>      {
>>          if (mightNotSplit)
>>          {
>> diff -r 07a4e4d785a6 -r f5d3a5aedcdf source/encoder/search.cpp
>> --- a/source/encoder/search.cpp Thu Nov 17 12:19:38 2016 +0530
>> +++ b/source/encoder/search.cpp Thu Nov 17 16:31:09 2016 +0530
>> @@ -2625,7 +2625,7 @@
>>
>>      uint32_t tuDepthRange[2];
>>      cu.getInterTUQtDepthRange(tuDepthRange, 0);
>> -    if (limitTU == X265_TU_LIMIT_NEIGH)
>> +    if (limitTU & X265_TU_LIMIT_NEIGH)
>>      {
>>          int maxLog2CUSize = (int)g_log2Size[m_param->maxCUSize];
>>          m_maxTUDepth = x265_clip3(maxLog2CUSize -
>> (int32_t)tuDepthRange[1], maxLog2CUSize - (int32_t)tuDepthRange[0],
>> m_maxTUDepth);
>> @@ -2639,7 +2639,12 @@
>>          memset(&m_cacheTU, 0, sizeof(TUInfoCache));
>>
>>      Cost costs;
>> -    estimateResidualQT(interMode, cuGeom, 0, 0, *resiYuv, costs,
>> tuDepthRange);
>> +    if (limitTU == X265_TU_LIMIT_DFS_NEIGH)
>> +    {
>> +        int32_t tempDepth = m_maxTUDepth;
>> +        m_maxTUDepth = tempDepth;
>> +    }
>> +        estimateResidualQT(interMode, cuGeom, 0, 0, *resiYuv, costs,
>> tuDepthRange);
>>
>>      uint32_t tqBypass = cu.m_tqBypass[0];
>>      if (!tqBypass)
>> @@ -2898,10 +2903,11 @@
>>      uint32_t ycbf = 0, ucbf = 0, vcbf = 0;
>>      for (uint32_t qIdx = 0, qPartIdx = absPartIdx; qIdx < 4; ++qIdx,
>> qPartIdx += qNumParts)
>>      {
>> -        if (limitTU == X265_TU_LIMIT_DFS && tuDepth == 0 && qIdx == 1)
>> +        if (limitTU & X265_TU_LIMIT_DFS && tuDepth == 0 && qIdx == 1)
>>          {
>> +            m_maxTUDepth = cu.m_tuDepth[0];
>>              // Fetch maximum TU depth of first sub partition to limit
>> recursion of others
>> -            for (uint32_t i = 0; i < cuGeom.numPartitions / 4; i++)
>> +            for (uint32_t i = 1; i < cuGeom.numPartitions / 4; i++)
>>                  m_maxTUDepth = X265_MAX(m_maxTUDepth, cu.m_tuDepth[i]);
>>          }
>>          estimateResidualQT(mode, cuGeom, qPartIdx, tuDepth + 1, resiYuv,
>> splitCost, depthRange, splitMore);
>> @@ -2968,7 +2974,7 @@
>>              }
>>          }
>>      }
>> -    else if (limitTU == X265_TU_LIMIT_DFS || limitTU ==
>> X265_TU_LIMIT_NEIGH)
>> +    else if (limitTU & X265_TU_LIMIT_DFS_NEIGH)
>>      {
>>          if (bCheckSplit && m_maxTUDepth >= 0)
>>          {
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20161118/79cb693b/attachment-0001.html>


More information about the x265-devel mailing list