[x265] [PATCH] Included merge mode for FMD = ON. Changed the xComputeCostMerge2Nx2N() to calculate the SATD cost and decide the mode based on that

Steve Borho steve at borho.org
Wed Jun 26 08:14:04 CEST 2013


On Wed, Jun 26, 2013 at 12:09 AM, <sumalatha at multicorewareinc.com> wrote:

> # HG changeset patch
> # User sumalatha
> # Date 1372161004 -19800
> # Node ID 6340ea9b1119e28fe467e895ccc1c02b035c9b8b
> # Parent  e11febad302c5b4c1e183b8cf945b25a00e9b726
> Included merge mode for FMD = ON. Changed the xComputeCostMerge2Nx2N() to
> calculate the SATD cost and decide the mode based on that.
>

I pushed this patch earlier today


> diff -r e11febad302c -r 6340ea9b1119 source/Lib/TLibEncoder/TEncCu.h
> --- a/source/Lib/TLibEncoder/TEncCu.h   Tue Jun 25 16:47:14 2013 +0530
> +++ b/source/Lib/TLibEncoder/TEncCu.h   Tue Jun 25 17:20:04 2013 +0530
> @@ -149,7 +149,7 @@
>      Void  xCheckBestMode(TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU,
> UInt uiDepth);
>
>      Void  xCheckRDCostMerge2Nx2N(TComDataCU*& rpcBestCU, TComDataCU*&
> rpcTempCU, Bool *earlyDetectionSkipMode);
> -    Void  xComputeCostMerge2Nx2N(TComDataCU*& rpcBestCU, TComDataCU*&
> rpcTempCU,  Bool *earlyDetectionSkipMode);
> +    Void  xComputeCostMerge2Nx2N(TComDataCU*& rpcBestCU, TComDataCU*&
> rpcTempCU);
>      Void  xComputeCostIntrainInter(TComDataCU*& rpcTempCU, PartSize
> eSize,UInt index);
>      Void  xCheckRDCostInter(TComDataCU*& rpcBestCU, TComDataCU*&
> rpcTempCU, PartSize ePartSize, Bool bUseMRG = false);
>      Void  xComputeCostInter(TComDataCU*& rpcTempCU, PartSize ePartSize,
> UInt Index, Bool bUseMRG = false);
> diff -r e11febad302c -r 6340ea9b1119 source/encoder/compress.cpp
> --- a/source/encoder/compress.cpp       Tue Jun 25 16:47:14 2013 +0530
> +++ b/source/encoder/compress.cpp       Tue Jun 25 17:20:04 2013 +0530
> @@ -23,7 +23,7 @@
>
>  #include "TLibEncoder/TEncCu.h"
>  #include <math.h>
> -
> +#include <common.h>
>  #if _MSC_VER
>  #pragma warning (disable: 4244)
>  #pragma warning (disable: 4018)
> @@ -87,7 +87,7 @@
>   * \param rpcTempCU
>   * \returns Void
>   */
> -Void TEncCu::xComputeCostMerge2Nx2N(TComDataCU*& rpcBestCU, TComDataCU*&
> rpcTempCU, Bool *earlyDetectionSkipMode)
> +Void TEncCu::xComputeCostMerge2Nx2N(TComDataCU*& rpcBestCU, TComDataCU*&
> rpcTempCU)
>  {
>      assert(rpcTempCU->getSlice()->getSliceType() != I_SLICE);
>      TComMvField  cMvFieldNeighbours[MRG_MAX_NUM_CANDS << 1]; // double
> length for mv of both lists
> @@ -114,7 +114,6 @@
>          mergeCandBuffer[ui] = 0;
>      }
>
> -    Bool bestIsSkip = false;
>
>      UInt iteration;
>      if (rpcTempCU->isLosslessCoded(0))
> @@ -126,14 +125,8 @@
>          iteration = 2;
>      }
>
> -    for (UInt uiNoResidual = 0; uiNoResidual < iteration; ++uiNoResidual)
> -    {
>          for (UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand;
> ++uiMergeCand)
>          {
> -            if (!(uiNoResidual == 1 && mergeCandBuffer[uiMergeCand] == 1))
> -            {
> -                if (!(bestIsSkip && uiNoResidual == 0))
> -                {
>                      // set MC parameters
>                      rpcTempCU->setPredModeSubParts(MODE_INTER, 0,
> uhDepth); // interprets depth relative to LCU level
>
>  rpcTempCU->setCUTransquantBypassSubParts(m_pcEncCfg->getCUTransquantBypassFlagValue(),
>     0, uhDepth);
> @@ -146,28 +139,19 @@
>
>                      // do MC
>                      m_pcPredSearch->motionCompensation(rpcTempCU,
> m_ppcPredYuvMode[4][uhDepth]);
> -
> +
>                      /*Todo: Fix the satd cost estimates. Why is merge
> being chosen in high motion areas: estimated distortion is too low?*/
>
> -
>  me_merge.setSourcePU(0,rpcTempCU->getWidth(0),rpcTempCU->getHeight(0));
> -                    rpcTempCU->getTotalDistortion() =
> me_merge.bufSATD((pixel*)m_ppcPredYuvTemp[uhDepth]->getLumaAddr(),
> -
>  m_ppcPredYuvTemp[uhDepth]->getStride());
> -                    rpcTempCU->getTotalCost() =
> rpcTempCU->getTotalDistortion();
> -                    x265_emms();
> -
> -
> -                    if (uiNoResidual == 0)
> -                    {
> -                        if (rpcTempCU->getQtRootCbf(0) == 0)
> -                        {
> -                            mergeCandBuffer[uiMergeCand] = 1;
> -                        }
> -                    }
> -
> -
>  rpcTempCU->setSkipFlagSubParts(rpcTempCU->getQtRootCbf(0) == 0, 0,
> uhDepth);
> +                    m_pcPredSearch->encodeResAndCalcRdInterCU(rpcTempCU,
> +
>  m_ppcOrigYuv[uhDepth],
> +
>  m_ppcPredYuvMode[4][uhDepth],
> +
>  m_ppcResiYuvTemp[uhDepth],
> +
>  m_ppcResiYuvBest[uhDepth],
> +
>  m_ppcRecoYuvTemp[uhDepth],
> +                                                              (true));
> +
>                      Int orgQP = rpcTempCU->getQP(0);
>
> -                    //xCheckBestMode(rpcBestCU, rpcTempCU, uhDepth);
>                      if (rpcTempCU->getTotalCost() <
> rpcBestCU->getTotalCost())
>                      {
>                          TComDataCU* tmp = rpcTempCU;
> @@ -181,45 +165,19 @@
>                      }
>
>                      rpcTempCU->initEstData(uhDepth, orgQP);
> +                }
> +
> +
> +
> +
> +
>  me_merge.setSourcePU(0,rpcBestCU->getWidth(0),rpcBestCU->getHeight(0));
> +                    rpcBestCU->getTotalDistortion() =
> me_merge.bufSATD((pixel*) m_ppcPredYuvMode[3][uhDepth]->getLumaAddr(),
> +
> m_ppcPredYuvMode[3][uhDepth]->getStride());
> +                    rpcBestCU->getTotalCost() =
> rpcBestCU->getTotalDistortion();
> +                    x265_emms();
>
> -                    if (m_pcEncCfg->getUseFastDecisionForMerge() &&
> !bestIsSkip)
> -                    {
> -                        bestIsSkip = rpcTempCU->getQtRootCbf(0) == 0;
> -                    }
> -                }
> -            }
> -        }
> +
>
> -        if (uiNoResidual == 0 && m_pcEncCfg->getUseEarlySkipDetection())
> -        {
> -            if (rpcTempCU->getQtRootCbf(0) == 0)
> -            {
> -                if (rpcTempCU->getMergeFlag(0))
> -                {
> -                    *earlyDetectionSkipMode = true;
> -                }
> -                else
> -                {
> -                    Int absoulte_MV = 0;
> -                    for (UInt uiRefListIdx = 0; uiRefListIdx < 2;
> uiRefListIdx++)
> -                    {
> -                        if
> (rpcTempCU->getSlice()->getNumRefIdx(RefPicList(uiRefListIdx)) > 0)
> -                        {
> -                            TComCUMvField* pcCUMvField =
> rpcTempCU->getCUMvField(RefPicList(uiRefListIdx));
> -                            Int iHor = abs(pcCUMvField->getMvd(0).x);
> -                            Int iVer = abs(pcCUMvField->getMvd(0).y);
> -                            absoulte_MV += iHor + iVer;
> -                        }
> -                    }
> -
> -                    if (absoulte_MV == 0)
> -                    {
> -                        *earlyDetectionSkipMode = true;
> -                    }
> -                }
> -            }
> -        }
> -    }
>  }
>
>  Void TEncCu::xComputeCostInter(TComDataCU*& rpcTempCU, PartSize
> ePartSize, UInt Index, Bool bUseMRG)
> @@ -301,9 +259,9 @@
>          }
>
>          /*Compute  Merge Cost  */
> -#if 0
> -        Bool earlyDetectionSkipMode = false;
> -        xComputeCostMerge2Nx2N(m_MergeBestCU[uiDepth],
> m_MergeCU[uiDepth], &earlyDetectionSkipMode);
> +#if 1
> +
> +        xComputeCostMerge2Nx2N(m_MergeBestCU[uiDepth],
> m_MergeCU[uiDepth]);
>          rpcBestCU = m_MergeBestCU[uiDepth];
>          YuvTemp = m_ppcPredYuvMode[3][uiDepth];
>          m_ppcPredYuvMode[3][uiDepth] = m_ppcPredYuvBest[uiDepth];
> @@ -328,12 +286,13 @@
>          }
>
>          /*Choose best mode; initialise rpcBestCU to 2Nx2N*/
> -
> +
>  if(m_InterCU_2Nx2N[uiDepth]->getTotalCost()<rpcBestCU->getTotalCost()) {
>          rpcBestCU = m_InterCU_2Nx2N[uiDepth];
>
>          YuvTemp = m_ppcPredYuvMode[0][uiDepth];
>          m_ppcPredYuvMode[0][uiDepth] = m_ppcPredYuvBest[uiDepth];
>          m_ppcPredYuvBest[uiDepth] = YuvTemp;
> +        }
>
>          if (m_InterCU_Nx2N[uiDepth]->getTotalCost() <
> rpcBestCU->getTotalCost())
>          {
> @@ -353,6 +312,7 @@
>          }
>
>          /* Perform encode residual for the best mode chosen only*/
> +
>          m_pcPredSearch->encodeResAndCalcRdInterCU(rpcBestCU,
> m_ppcOrigYuv[uiDepth], m_ppcPredYuvBest[uiDepth],
> m_ppcResiYuvTemp[uiDepth], m_ppcResiYuvBest[uiDepth],
> m_ppcRecoYuvBest[uiDepth], false);
>
>          /* Disable recursive analysis for whole CUs temporarily*/
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> http://mailman.videolan.org/listinfo/x265-devel
>
>


-- 
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20130626/9de73631/attachment.html>


More information about the x265-devel mailing list