[x265] [PATCH] no-rdo: giving weightage to the cost of all CU's and neighbour CU's for early exit

Sumalatha Polureddy sumalatha at multicorewareinc.com
Fri Nov 8 05:02:01 CET 2013


On Fri, Nov 8, 2013 at 8:03 AM, Deepthi Nandakumar <
deepthi at multicorewareinc.com> wrote:

> I have a few questions.
>
> 1. Do we need so many local variables?
>
As Steve suggested,  totalCostNeigh  and totalCountNeigh  can be added
inside each if () and will try to remove costCU, costCUAbove ,
costCUAboveLeft, costCUAboveRight, costCULeft , costCUColocated0 ,
costCUColocated1 and their corresponding count variables also

>
> 2. Why are we adding outTempCU->cost to totalCost and then comparing
> against outBestCU->cost? That doesnt make much sense to me. AFAIk,
> outTempCU does not contain any valid data - we should remove this.
>
Actually we are taking outTempCU->getPic()->m_avgCost[depth] to total cost
and comparing with outBestCU->cost.
outTempCU->getPic()->m_avgCost[depth]  will have avg cost of all the CU's
so far encoded in the frame.


>
> 3. Should we be adding costCUColocated0 and costCUColocated1 also? Adding
> up spatial and temporal costs, and then comparing against a threshold
> derived from spatial costs - umm, no. Lets leave these out.
>
will remove both colocated0 and colocated1


>
> 4. The rest of it looks ok, logically. But now you may need to re-tune
> this with different weights.
>
> Best,
> Deepthi
>
>
>
>
>
>
>
>
>
> On Thu, Nov 7, 2013 at 4:59 PM, <sumalatha at multicorewareinc.com> wrote:
>
>> # HG changeset patch
>> # User Sumalatha Polureddy
>> # Date 1383823751 -19800
>> # Node ID a54b30b16e83048a7a2ef5584e1e1c9682216075
>> # Parent  0a1b379be359cbcf76140ac392104c856a037c78
>> no-rdo: giving weightage to the cost of all CU's and neighbour CU's for
>> early exit
>>
>> Early exit is done when CU cost at depth "n" is lessthan sum of 60% of
>> avgcost of all CU's
>> and 40% of avgcost of neighbour CU's at same depth.
>>
>> diff -r 0a1b379be359 -r a54b30b16e83 source/Lib/TLibCommon/TComPic.cpp
>> --- a/source/Lib/TLibCommon/TComPic.cpp Thu Nov 07 18:17:52 2013 +0800
>> +++ b/source/Lib/TLibCommon/TComPic.cpp Thu Nov 07 16:59:11 2013 +0530
>> @@ -69,6 +69,14 @@
>>      m_ssimCnt = 0;
>>      m_frameTime = 0.0;
>>      m_elapsedCompressTime = 0.0;
>> +    m_avgCost[0] = 0;
>> +    m_avgCost[1] = 0;
>> +    m_avgCost[2] = 0;
>> +    m_avgCost[3] = 0;
>> +    m_count[0] = 0;
>> +    m_count[1] = 0;
>> +    m_count[2] = 0;
>> +    m_count[3] = 0;
>>  }
>>
>>  TComPic::~TComPic()
>> diff -r 0a1b379be359 -r a54b30b16e83 source/Lib/TLibCommon/TComPic.h
>> --- a/source/Lib/TLibCommon/TComPic.h   Thu Nov 07 18:17:52 2013 +0800
>> +++ b/source/Lib/TLibCommon/TComPic.h   Thu Nov 07 16:59:11 2013 +0530
>> @@ -95,6 +95,8 @@
>>      MD5Context            m_state[3];
>>      uint32_t              m_crc[3];
>>      uint32_t              m_checksum[3];
>> +    UInt64                m_avgCost[4];
>> +    uint32_t              m_count[4];
>>
>>      /* SSIM values per frame */
>>      double                m_ssim;
>> diff -r 0a1b379be359 -r a54b30b16e83 source/encoder/compress.cpp
>> --- a/source/encoder/compress.cpp       Thu Nov 07 18:17:52 2013 +0800
>> +++ b/source/encoder/compress.cpp       Thu Nov 07 16:59:11 2013 +0530
>> @@ -567,13 +567,14 @@
>>      if (bSubBranch && bTrySplitDQP && depth < g_maxCUDepth -
>> g_addCUDepth)
>>      {
>>  #if EARLY_EXIT // turn ON this to enable early exit
>> -        // early exit when the RD cost of best mode at depth n is less
>> than the avgerage of RD cost of the
>> -        // CU's(above, aboveleft, aboveright, left, colocated) at depth
>> "n" of previosuly coded CU's
>> +        // early exit when the RD cost of best mode at depth n is less
>> than the sum of avgerage of RD cost of the neighbour
>> +        // CU's(above, aboveleft, aboveright, left, colocated) and all
>> CU's at depth "n"  with weightage for each quantity
>>          if (outBestCU != 0)
>>          {
>> -            UInt64 costCU = 0, costCUAbove = 0, costCUAboveLeft = 0,
>> costCUAboveRight = 0, costCULeft = 0, costCUColocated0 = 0,
>> costCUColocated1 = 0, totalCost = 0, avgCost = 0;
>> +            UInt64 costCU = 0, costCUAbove = 0, costCUAboveLeft = 0,
>> costCUAboveRight = 0, costCULeft = 0, costCUColocated0 = 0,
>> costCUColocated1 = 0, totalCostNeigh = 0, totalCostAll = 0;
>> +            double avgCost = 0;
>>              UInt64 countCU = 0, countCUAbove = 0, countCUAboveLeft = 0,
>> countCUAboveRight = 0, countCULeft = 0, countCUColocated0 = 0,
>> countCUColocated1 = 0;
>> -            UInt64 totalCount = 0;
>> +            UInt64 totalCountNeigh = 0, totalCountAll = 0;
>>              TComDataCU* above = outTempCU->getCUAbove();
>>              TComDataCU* aboveLeft = outTempCU->getCUAboveLeft();
>>              TComDataCU* aboveRight = outTempCU->getCUAboveRight();
>> @@ -614,10 +615,15 @@
>>                  countCUColocated1 = colocated1->m_count[depth];
>>              }
>>
>> -            totalCost = costCU + costCUAbove + costCUAboveLeft +
>> costCUAboveRight + costCULeft + costCUColocated0 + costCUColocated1;
>> -            totalCount = countCU + countCUAbove + countCUAboveLeft +
>> countCUAboveRight + countCULeft + countCUColocated0 + countCUColocated1;
>> -            if (totalCount != 0)
>> -                avgCost = totalCost / totalCount;
>> +            totalCostNeigh = costCU + costCUAbove + costCUAboveLeft +
>> costCUAboveRight + costCULeft + costCUColocated0 + costCUColocated1;
>> +            totalCountNeigh = countCU + countCUAbove + countCUAboveLeft
>> + countCUAboveRight + countCULeft + countCUColocated0 + countCUColocated1;
>> +
>> +            totalCostAll = (outTempCU->getPic()->m_avgCost[depth] *
>> outTempCU->getPic()->m_count[depth]) - totalCostNeigh;
>> +            totalCountAll = outTempCU->getPic()->m_count[depth] -
>> totalCountNeigh;
>> +
>> +            //giving 60% weight to all CU's and 40% weight to neighbour
>> CU's
>> +            if (totalCountAll)
>> +                avgCost = ((0.6 * totalCostAll) + (0.4 *
>> totalCostNeigh)) / ((0.6 * totalCountAll) + (0.4 * totalCountNeigh));
>>
>>              float lambda = 1.0f;
>>
>> @@ -672,6 +678,9 @@
>>
>>  outTempCU->getPic()->getPicSym()->getCU(outTempCU->getAddr())->m_count[depth
>> + 1] += 1;
>>                      outTempCU->m_avgCost[depth + 1] = (temp +
>> tempavgCost) / outTempCU->m_count[depth + 1];
>>
>>  outTempCU->getPic()->getPicSym()->getCU(outTempCU->getAddr())->m_avgCost[depth
>> + 1] = outTempCU->m_avgCost[depth + 1];
>> +                    temp = outTempCU->getPic()->m_avgCost[depth+1] *
>> outTempCU->getPic()->m_count[depth+1];
>> +                    outTempCU->getPic()->m_count[depth+1] += 1;
>> +                    outTempCU->getPic()->m_avgCost[depth+1] = (temp +
>> tempavgCost) / outTempCU->getPic()->m_count[depth+1];
>>                  }
>>  #endif // if EARLY_EXIT
>>                  /* Adding costs from best SUbCUs */
>> @@ -775,9 +784,12 @@
>>                  UInt64 temp = outTempCU->m_avgCost[depth] *
>> outTempCU->m_count[depth];
>>                  outTempCU->m_count[depth] += 1;
>>
>>  outTempCU->getPic()->getPicSym()->getCU(outTempCU->getAddr())->m_count[depth]
>> += 1;
>> -
>>                  outTempCU->m_avgCost[depth] = (temp + tempavgCost) /
>> outTempCU->m_count[depth];
>>
>>  outTempCU->getPic()->getPicSym()->getCU(outTempCU->getAddr())->m_avgCost[depth]
>> = outTempCU->m_avgCost[depth];
>> +
>> +                temp = outTempCU->getPic()->m_avgCost[depth] *
>> outTempCU->getPic()->m_count[depth];
>> +                outTempCU->getPic()->m_count[depth] += 1;
>> +                outTempCU->getPic()->m_avgCost[depth] = (temp +
>> tempavgCost) / outTempCU->getPic()->m_count[depth];
>>              }
>>              if (outTempCU->m_totalCost < outBestCU->m_totalCost)
>>              {
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> _______________________________________________
> 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/20131108/bf5dc408/attachment.html>


More information about the x265-devel mailing list