[x265] [PATCH] no-rdo: use bit estimates from ME to calculate RDcost

Deepthi Nandakumar deepthi at multicorewareinc.com
Thu Oct 31 02:14:02 CET 2013


Steve,

This is part of an ongoing change to rd 0/1 where we want to replace cost =
distortion + lambda*(coeff + mv bits), as opposed to that derived from the
RDO process. Here, the coeff bits have not been added, only me bits are
considered.

I believe we'll need an exhaustive set of tests for computer-generated
video like sintel/bigbuckbunny, and at a later stage, we could add in
presets for those (like x264 does).


On Thu, Oct 31, 2013 at 1:23 AM, Steve Borho <steve at borho.org> wrote:

>
>
>
> On Wed, Oct 30, 2013 at 4:47 AM, <deepthidevaki at multicorewareinc.com>wrote:
>
>> # HG changeset patch
>> # User Deepthi Devaki <deepthidevaki at multicorewareinc.com>
>> # Date 1383126419 -19800
>> # Node ID 77db80a67f4e55f22bc02ed02930a269bfac6b50
>> # Parent  74bf8634037ce3e673b21738a5ffaf1c14381414
>> no-rdo: use bit estimates from ME to calculate RDcost.
>>
>> bits estimated in ME stored in CU and used for calculating rdcost along
>> with distortion. This results in better bitrate with no-rdo, with small
>> drop in PSNR.
>>
>
> I see this has been already pushed, but I'm not certain this is an
> unambiguously good trade-off:
>
> x265 sintel_trailer_2k_480p24.y4m out.hevc --rd 0  --b-adapt 2 -b3 --hash 1
>
> before:
> encoded 1253 frames in 262.32s (4.78 fps), 143.50 kb/s, Global PSNR: 48.745
>
> after:
> encoded 1253 frames in 259.50s (4.83 fps), 142.36 kb/s, Global PSNR: 48.655
>
>
>
>> diff -r 74bf8634037c -r 77db80a67f4e source/Lib/TLibEncoder/TEncSearch.cpp
>> --- a/source/Lib/TLibEncoder/TEncSearch.cpp     Wed Oct 30 13:44:16 2013
>> +0530
>> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Wed Oct 30 15:16:59 2013
>> +0530
>> @@ -2115,7 +2115,7 @@
>>   * \param bValid
>>   * \returns void
>>   */
>> -void TEncSearch::xMergeEstimation(TComDataCU* cu, int puIdx, uint32_t&
>> interDir, TComMvField* mvField, uint32_t& mergeIndex, uint32_t& outCost,
>> TComMvField* mvFieldNeighbours, UChar* interDirNeighbours, int&
>> numValidMergeCand)
>> +void TEncSearch::xMergeEstimation(TComDataCU* cu, int puIdx, uint32_t&
>> interDir, TComMvField* mvField, uint32_t& mergeIndex, uint32_t& outCost,
>> uint32_t& outbits, TComMvField* mvFieldNeighbours, UChar*
>> interDirNeighbours, int& numValidMergeCand)
>>  {
>>      uint32_t absPartIdx = 0;
>>      int width = 0;
>> @@ -2144,7 +2144,7 @@
>>      {
>>          uint32_t costCand = MAX_UINT;
>>          uint32_t bitsCand = 0;
>> -
>> +
>>          cu->getCUMvField(REF_PIC_LIST_0)->m_mv[absPartIdx] =
>> mvFieldNeighbours[0 + 2 * mergeCand].mv;
>>          cu->getCUMvField(REF_PIC_LIST_0)->m_refIdx[absPartIdx] =
>> mvFieldNeighbours[0 + 2 * mergeCand].refIdx;
>>          cu->getCUMvField(REF_PIC_LIST_1)->m_mv[absPartIdx] =
>> mvFieldNeighbours[1 + 2 * mergeCand].mv;
>> @@ -2160,6 +2160,7 @@
>>          if (costCand < outCost)
>>          {
>>              outCost = costCand;
>> +            outbits = bitsCand;
>>              mvField[0] = mvFieldNeighbours[0 + 2 * mergeCand];
>>              mvField[1] = mvFieldNeighbours[1 + 2 * mergeCand];
>>              interDir = interDirNeighbours[mergeCand];
>> @@ -2226,6 +2227,8 @@
>>      UChar interDirNeighbours[MRG_MAX_NUM_CANDS];
>>      int numValidMergeCand = 0;
>>
>> +    int totalmebits = 0;
>> +
>>      for (int partIdx = 0; partIdx < numPart; partIdx++)
>>      {
>>          uint32_t listCost[2] = { MAX_UINT, MAX_UINT };
>> @@ -2495,7 +2498,8 @@
>>
>>              // find Merge result
>>              uint32_t mrgCost = MAX_UINT;
>> -            xMergeEstimation(cu, partIdx, mrgInterDir, mrgMvField,
>> mrgIndex, mrgCost, mvFieldNeighbours, interDirNeighbours,
>> numValidMergeCand);
>> +            uint32_t mrgBits = 0;
>> +            xMergeEstimation(cu, partIdx, mrgInterDir, mrgMvField,
>> mrgIndex, mrgCost, mrgBits, mvFieldNeighbours, interDirNeighbours,
>> numValidMergeCand);
>>              if (mrgCost < meCost)
>>              {
>>                  // set Merge result
>> @@ -2517,6 +2521,7 @@
>>  #if CU_STAT_LOGFILE
>>                  meCost += mrgCost;
>>  #endif
>> +                totalmebits += mrgBits;
>>              }
>>              else
>>              {
>> @@ -2530,11 +2535,18 @@
>>  #if CU_STAT_LOGFILE
>>                  meCost += meCost;
>>  #endif
>> +                totalmebits += mebits;
>>              }
>>          }
>> +        else
>> +        {
>> +            totalmebits += mebits;
>> +        }
>>          motionCompensation(cu, predYuv, REF_PIC_LIST_X, partIdx, bLuma,
>> bChroma);
>>      }
>>
>> +    cu->m_totalBits = totalmebits;
>> +
>>      setWpScalingDistParam(cu, -1, REF_PIC_LIST_X);
>>  }
>>
>> diff -r 74bf8634037c -r 77db80a67f4e source/Lib/TLibEncoder/TEncSearch.h
>> --- a/source/Lib/TLibEncoder/TEncSearch.h       Wed Oct 30 13:44:16 2013
>> +0530
>> +++ b/source/Lib/TLibEncoder/TEncSearch.h       Wed Oct 30 15:16:59 2013
>> +0530
>> @@ -211,7 +211,7 @@
>>      void xGetBlkBits(PartSize cuMode, bool bPSlice, int partIdx,
>> uint32_t lastMode, uint32_t blockBit[3]);
>>
>>      void xMergeEstimation(TComDataCU* cu, int partIdx, uint32_t&
>> uiInterDir,
>> -                          TComMvField* pacMvField, uint32_t& mergeIndex,
>> uint32_t& outCost,
>> +                          TComMvField* pacMvField, uint32_t& mergeIndex,
>> uint32_t& outCost, uint32_t& outbits,
>>                            TComMvField* mvFieldNeighbors, UChar*
>> interDirNeighbors, int& numValidMergeCand);
>>
>>      void xRestrictBipredMergeCand(TComDataCU* cu, uint32_t puIdx,
>> TComMvField* mvFieldNeighbours,
>> diff -r 74bf8634037c -r 77db80a67f4e source/encoder/compress.cpp
>> --- a/source/encoder/compress.cpp       Wed Oct 30 13:44:16 2013 +0530
>> +++ b/source/encoder/compress.cpp       Wed Oct 30 15:16:59 2013 +0530
>> @@ -223,10 +223,12 @@
>>      m_tmpResiYuv[depth]->clear();
>>
>>      //do motion compensation only for Luma since luma cost alone is
>> calculated
>> +    outTempCU->m_totalBits = 0;
>>      m_search->predInterSearch(outTempCU, outPredYuv, bUseMRG, true,
>> false);
>>      int part = partitionFromSizes(outTempCU->getWidth(0),
>> outTempCU->getHeight(0));
>> -    outTempCU->m_totalCost =
>> primitives.sse_pp[part](m_origYuv[depth]->getLumaAddr(),
>> m_origYuv[depth]->getStride(),
>> -
>> outPredYuv->getLumaAddr(), outPredYuv->getStride());
>> +    uint32_t distortion =
>> primitives.sse_pp[part](m_origYuv[depth]->getLumaAddr(),
>> m_origYuv[depth]->getStride(),
>> +
>>  outPredYuv->getLumaAddr(), outPredYuv->getStride());
>> +    outTempCU->m_totalCost = m_rdCost->calcRdCost(distortion,
>> outTempCU->m_totalBits);
>>  }
>>
>>  void TEncCu::xComputeCostMerge2Nx2N(TComDataCU*& outBestCU, TComDataCU*&
>> outTempCU, bool* earlyDetectionSkip, TComYuv*& bestPredYuv, TComYuv*&
>> yuvReconBest)
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
>
> --
> Steve Borho
>
> _______________________________________________
> 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/20131031/0df99023/attachment.html>


More information about the x265-devel mailing list