[x265] simplify AMVPInfo to MV[2]

Steve Borho steve at borho.org
Thu Aug 21 18:43:53 CEST 2014


On 08/21, Satoshi Nakagawa wrote:
> # HG changeset patch
> # User Satoshi Nakagawa <nakagawa424 at oki.com>
> # Date 1408613693 -32400
> #      Thu Aug 21 18:34:53 2014 +0900
> # Node ID de7b359fd9339231d6cdb02f9957cf8ef032ac87
> # Parent  9461fc801cd2c339d6fee8eba0c00e6973e36125
> simplify AMVPInfo to MV[2]

Queued, thanks

> diff -r 9461fc801cd2 -r de7b359fd933 source/Lib/TLibCommon/CommonDef.h
> --- a/source/Lib/TLibCommon/CommonDef.h	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/Lib/TLibCommon/CommonDef.h	Thu Aug 21 18:34:53 2014 +0900
> @@ -101,7 +101,7 @@
>  #define MIN_QPSCALE                 0.21249999999999999
>  #define MAX_MAX_QPSCALE             615.46574234477100
>  
> -#define AMVP_MAX_NUM_CANDS          2 // max number of final AMVP candidates
> +#define AMVP_NUM_CANDS              2 // number of AMVP candidates
>  #define MRG_MAX_NUM_CANDS           5 // max number of final merge candidates
>  
>  #define MAX_CHROMA_FORMAT_IDC       3 //  TODO: Remove me
> diff -r 9461fc801cd2 -r de7b359fd933 source/Lib/TLibCommon/TComDataCU.cpp
> --- a/source/Lib/TLibCommon/TComDataCU.cpp	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/Lib/TLibCommon/TComDataCU.cpp	Thu Aug 21 18:34:53 2014 +0900
> @@ -2000,9 +2000,9 @@
>   * \param info
>   * \param mvc
>   */
> -int TComDataCU::fillMvpCand(uint32_t partIdx, uint32_t partAddr, int picList, int refIdx, AMVPInfo* info, MV *mvc)
> +int TComDataCU::fillMvpCand(uint32_t partIdx, uint32_t partAddr, int picList, int refIdx, MV* amvpCand, MV* mvc)
>  {
> -    info->m_num = 0;
> +    int num = 0;
>  
>      //-- Get Spatial MV
>      uint32_t partIdxLT, partIdxRT, partIdxLB;
> @@ -2010,16 +2010,6 @@
>      deriveLeftRightTopIdx(partIdx, partIdxLT, partIdxRT);
>      deriveLeftBottomIdx(partIdx, partIdxLB);
>  
> -    uint32_t idx;
> -    TComDataCU* tmpCU = getPUBelowLeft(idx, partIdxLB);
> -    bool bAddedSmvp = (tmpCU != NULL) && (tmpCU->getPredictionMode(idx) != MODE_INTRA);
> -
> -    if (!bAddedSmvp)
> -    {
> -        tmpCU = getPULeft(idx, partIdxLB);
> -        bAddedSmvp = (tmpCU != NULL) && (tmpCU->getPredictionMode(idx) != MODE_INTRA);
> -    }
> -
>      MV mv[MD_ABOVE_LEFT + 1];
>      MV mvOrder[MD_ABOVE_LEFT + 1];
>      bool valid[MD_ABOVE_LEFT + 1];
> @@ -2039,30 +2029,32 @@
>  
>      // Left predictor search
>      if (valid[MD_BELOW_LEFT])
> -        info->m_mvCand[info->m_num++] = mv[MD_BELOW_LEFT];
> +        amvpCand[num++] = mv[MD_BELOW_LEFT];
>      else if (valid[MD_LEFT])
> -        info->m_mvCand[info->m_num++] = mv[MD_LEFT];
> +        amvpCand[num++] = mv[MD_LEFT];
>      else if (validOrder[MD_BELOW_LEFT])
> -        info->m_mvCand[info->m_num++] = mvOrder[MD_BELOW_LEFT];
> +        amvpCand[num++] = mvOrder[MD_BELOW_LEFT];
>      else if (validOrder[MD_LEFT])
> -        info->m_mvCand[info->m_num++] = mvOrder[MD_LEFT];
> +        amvpCand[num++] = mvOrder[MD_LEFT];
> +
> +    bool bAddedSmvp = num > 0;
>  
>      // Above predictor search
>      if (valid[MD_ABOVE_RIGHT])
> -        info->m_mvCand[info->m_num++] = mv[MD_ABOVE_RIGHT];
> +        amvpCand[num++] = mv[MD_ABOVE_RIGHT];
>      else if (valid[MD_ABOVE])
> -        info->m_mvCand[info->m_num++] = mv[MD_ABOVE];
> +        amvpCand[num++] = mv[MD_ABOVE];
>      else if (valid[MD_ABOVE_LEFT])
> -        info->m_mvCand[info->m_num++] = mv[MD_ABOVE_LEFT];
> +        amvpCand[num++] = mv[MD_ABOVE_LEFT];
>  
>      if (!bAddedSmvp)
>      {
>          if (validOrder[MD_ABOVE_RIGHT])
> -            info->m_mvCand[info->m_num++] = mvOrder[MD_ABOVE_RIGHT];
> +            amvpCand[num++] = mvOrder[MD_ABOVE_RIGHT];
>          else if (validOrder[MD_ABOVE])
> -            info->m_mvCand[info->m_num++] = mvOrder[MD_ABOVE];
> +            amvpCand[num++] = mvOrder[MD_ABOVE];
>          else if (validOrder[MD_ABOVE_LEFT])
> -            info->m_mvCand[info->m_num++] = mvOrder[MD_ABOVE_LEFT];
> +            amvpCand[num++] = mvOrder[MD_ABOVE_LEFT];
>      }
>  
>      int numMvc = 0;
> @@ -2075,12 +2067,12 @@
>              mvc[numMvc++] = mvOrder[dir];
>      }
>  
> -    if (info->m_num == 2)
> +    if (num == 2)
>      {
> -        if (info->m_mvCand[0] == info->m_mvCand[1])
> -            info->m_num = 1;
> +        if (amvpCand[0] == amvpCand[1])
> +            num = 1;
>          else
> -            /* AMVP_MAX_NUM_CANDS = 2 */
> +            /* AMVP_NUM_CANDS = 2 */
>              return numMvc;
>      }
>  
> @@ -2126,7 +2118,7 @@
>          }
>          if (lcuIdx >= 0 && xGetColMVP(picList, lcuIdx, absPartAddr, colmv, refIdxCol))
>          {
> -            info->m_mvCand[info->m_num++] = colmv;
> +            amvpCand[num++] = colmv;
>              mvc[numMvc++] = colmv;
>          }
>          else
> @@ -2136,17 +2128,16 @@
>              xDeriveCenterIdx(partIdx, partIdxCenter);
>              if (xGetColMVP(picList, curLCUIdx, partIdxCenter, colmv, refIdxCol))
>              {
> -                info->m_mvCand[info->m_num++] = colmv;
> +                amvpCand[num++] = colmv;
>                  mvc[numMvc++] = colmv;
>              }
>          }
>          //----  co-located RightBottom Temporal Predictor  ---//
>      }
>  
> -    while (info->m_num < AMVP_MAX_NUM_CANDS)
> +    while (num < AMVP_NUM_CANDS)
>      {
> -        info->m_mvCand[info->m_num] = 0;
> -        info->m_num++;
> +        amvpCand[num++] = 0;
>      }
>  
>      return numMvc;
> diff -r 9461fc801cd2 -r de7b359fd933 source/Lib/TLibCommon/TComDataCU.h
> --- a/source/Lib/TLibCommon/TComDataCU.h	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/Lib/TLibCommon/TComDataCU.h	Thu Aug 21 18:34:53 2014 +0900
> @@ -422,7 +422,7 @@
>  
>      void          getMvField(TComDataCU* cu, uint32_t absPartIdx, int picList, TComMvField& rcMvField);
>  
> -    int           fillMvpCand(uint32_t partIdx, uint32_t partAddr, int picList, int refIdx, AMVPInfo* info, MV *mvc);
> +    int           fillMvpCand(uint32_t partIdx, uint32_t partAddr, int picList, int refIdx, MV* amvpCand, MV* mvc);
>      bool          isDiffMER(int xN, int yN, int xP, int yP);
>      void          getPartPosition(uint32_t partIdx, int& xP, int& yP, int& nPSW, int& nPSH);
>      void          setMVPIdx(int picList, uint32_t idx, int mvpIdx) { m_mvpIdx[picList][idx] = (uint8_t)mvpIdx; }
> diff -r 9461fc801cd2 -r de7b359fd933 source/Lib/TLibCommon/TComMotionInfo.h
> --- a/source/Lib/TLibCommon/TComMotionInfo.h	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/Lib/TLibCommon/TComMotionInfo.h	Thu Aug 21 18:34:53 2014 +0900
> @@ -52,13 +52,6 @@
>  // Type definition
>  // ====================================================================================================================
>  
> -/// parameters for AMVP
> -struct AMVPInfo
> -{
> -    MV  m_mvCand[AMVP_MAX_NUM_CANDS +1];   ///< array of motion vector predictor candidates
> -    int m_num;                             ///< number of motion vector predictor candidates
> -};
> -
>  typedef struct
>  {
>      MV*   m_mvMemBlock;
> diff -r 9461fc801cd2 -r de7b359fd933 source/Lib/TLibEncoder/TEncSearch.cpp
> --- a/source/Lib/TLibEncoder/TEncSearch.cpp	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp	Thu Aug 21 18:34:53 2014 +0900
> @@ -1851,7 +1851,8 @@
>   */
>  bool TEncSearch::predInterSearch(TComDataCU* cu, TComYuv* predYuv, bool bMergeOnly, bool bChroma)
>  {
> -    AMVPInfo amvpInfo[2][MAX_NUM_REF];
> +    MV amvpCand[2][MAX_NUM_REF][AMVP_NUM_CANDS];
> +    MV mvc[(MD_ABOVE_LEFT + 1) * 2 + 1];
>  
>      Slice *slice        = cu->m_slice;
>      TComPicYuv *fenc    = slice->m_pic->getPicYuvOrg();
> @@ -1931,17 +1932,16 @@
>                  uint32_t bits = listSelBits[l] + MVP_IDX_BITS;
>                  bits += getTUBits(ref, numRefIdx[l]);
>  
> -                MV mvc[(MD_ABOVE_LEFT + 1) * 2 + 1];
> -                int numMvc = cu->fillMvpCand(partIdx, partAddr, l, ref, &amvpInfo[l][ref], mvc);
> +                int numMvc = cu->fillMvpCand(partIdx, partAddr, l, ref, amvpCand[l][ref], mvc);
>  
>                  // Pick the best possible MVP from AMVP candidates based on least residual
>                  uint32_t bestCost = MAX_INT;
>                  int mvpIdx = 0;
>                  int merange = m_param->searchRange;
>  
> -                for (int i = 0; i < amvpInfo[l][ref].m_num; i++)
> +                for (int i = 0; i < AMVP_NUM_CANDS; i++)
>                  {
> -                    MV mvCand = amvpInfo[l][ref].m_mvCand[i];
> +                    MV mvCand = amvpCand[l][ref][i];
>  
>                      // NOTE: skip mvCand if Y is > merange and -FN>1
>                      if (m_bFrameParallel && (mvCand.y >= (merange + 1) * 4))
> @@ -1961,7 +1961,7 @@
>                      }
>                  }
>  
> -                MV mvmin, mvmax, outmv, mvp = amvpInfo[l][ref].m_mvCand[mvpIdx];
> +                MV mvmin, mvmax, outmv, mvp = amvpCand[l][ref][mvpIdx];
>  
>                  xSetSearchRange(cu, mvp, merange, mvmin, mvmax);
>                  int satdCost = m_me.motionEstimate(&slice->m_mref[l][ref], mvmin, mvmax, mvp, numMvc, mvc, merange, outmv);
> @@ -1971,7 +1971,7 @@
>                  uint32_t cost = (satdCost - m_me.mvcost(outmv)) + m_rdCost.getCost(bits);
>  
>                  /* Refine MVP selection, updates: mvp, mvpIdx, bits, cost */
> -                xCheckBestMVP(&amvpInfo[l][ref], outmv, mvp, mvpIdx, bits, cost);
> +                xCheckBestMVP(amvpCand[l][ref], outmv, mvp, mvpIdx, bits, cost);
>  
>                  if (cost < list[l].cost)
>                  {
> @@ -2039,19 +2039,17 @@
>  
>                  MV mvp0 = list[0].mvp;
>                  int mvpIdx0 = list[0].mvpIdx;
> -                m_me.setMVP(mvp0);
> -                uint32_t bits0 = list[0].bits - m_me.bitcost(list[0].mv) + m_me.bitcost(mvzero);
> +                uint32_t bits0 = list[0].bits - m_me.bitcost(list[0].mv, mvp0) + m_me.bitcost(mvzero, mvp0);
>  
>                  MV mvp1 = list[1].mvp;
>                  int mvpIdx1 = list[1].mvpIdx;
> -                m_me.setMVP(mvp1);
> -                uint32_t bits1 = list[1].bits - m_me.bitcost(list[1].mv) + m_me.bitcost(mvzero);
> +                uint32_t bits1 = list[1].bits - m_me.bitcost(list[1].mv, mvp1) + m_me.bitcost(mvzero, mvp1);
>  
>                  uint32_t cost = satdCost + m_rdCost.getCost(bits0) + m_rdCost.getCost(bits1);
>  
>                  /* refine MVP selection for zero mv, updates: mvp, mvpidx, bits, cost */
> -                xCheckBestMVP(&amvpInfo[0][list[0].ref], mvzero, mvp0, mvpIdx0, bits0, cost);
> -                xCheckBestMVP(&amvpInfo[1][list[1].ref], mvzero, mvp1, mvpIdx1, bits1, cost);
> +                xCheckBestMVP(amvpCand[0][list[0].ref], mvzero, mvp0, mvpIdx0, bits0, cost);
> +                xCheckBestMVP(amvpCand[1][list[1].ref], mvzero, mvp1, mvpIdx1, bits1, cost);
>  
>                  if (cost < bidirCost)
>                  {
> @@ -2190,37 +2188,19 @@
>  }
>  
>  /* Check if using an alternative MVP would result in a smaller MVD + signal bits */
> -void TEncSearch::xCheckBestMVP(AMVPInfo* amvpInfo, MV mv, MV& mvPred, int& outMvpIdx, uint32_t& outBits, uint32_t& outCost)
> +void TEncSearch::xCheckBestMVP(MV* amvpCand, MV mv, MV& mvPred, int& outMvpIdx, uint32_t& outBits, uint32_t& outCost)
>  {
> -    X265_CHECK(amvpInfo->m_mvCand[outMvpIdx] == mvPred, "xCheckBestMVP: unexpected mvPred\n");
> -
> -    m_me.setMVP(mvPred);
> -    int bestMvpIdx = outMvpIdx;
> -    int mvBitsOrig = m_me.bitcost(mv) + MVP_IDX_BITS;
> -    int bestMvBits = mvBitsOrig;
> -
> -    for (int mvpIdx = 0; mvpIdx < amvpInfo->m_num; mvpIdx++)
> +    X265_CHECK(amvpCand[outMvpIdx] == mvPred, "xCheckBestMVP: unexpected mvPred\n");
> +
> +    int mvpIdx = !outMvpIdx;
> +    MV mvp = amvpCand[mvpIdx];
> +    int diffBits = m_me.bitcost(mv, mvp) - m_me.bitcost(mv, mvPred);
> +    if (diffBits < 0)
>      {
> -        if (mvpIdx == outMvpIdx)
> -            continue;
> -
> -        m_me.setMVP(amvpInfo->m_mvCand[mvpIdx]);
> -        int mvbits = m_me.bitcost(mv) + MVP_IDX_BITS;
> -
> -        if (mvbits < bestMvBits)
> -        {
> -            bestMvBits = mvbits;
> -            bestMvpIdx = mvpIdx;
> -        }
> -    }
> -
> -    if (bestMvpIdx != outMvpIdx) // if changed
> -    {
> -        mvPred = amvpInfo->m_mvCand[bestMvpIdx];
> -
> -        outMvpIdx = bestMvpIdx;
> +        outMvpIdx = mvpIdx;
> +        mvPred = mvp;
>          uint32_t origOutBits = outBits;
> -        outBits = origOutBits - mvBitsOrig + bestMvBits;
> +        outBits = origOutBits + diffBits;
>          outCost = (outCost - m_rdCost.getCost(origOutBits)) + m_rdCost.getCost(outBits);
>      }
>  }
> diff -r 9461fc801cd2 -r de7b359fd933 source/Lib/TLibEncoder/TEncSearch.h
> --- a/source/Lib/TLibEncoder/TEncSearch.h	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSearch.h	Thu Aug 21 18:34:53 2014 +0900
> @@ -216,7 +216,7 @@
>      // Inter search (AMP)
>      // --------------------------------------------------------------------------------------------
>  
> -    void xCheckBestMVP(AMVPInfo* amvpInfo, MV cMv, MV& mvPred, int& mvpIdx,
> +    void xCheckBestMVP(MV* amvpCand, MV cMv, MV& mvPred, int& mvpIdx,
>                         uint32_t& outBits, uint32_t& outCost);
>  
>      void xGetBlkBits(PartSize cuMode, bool bPSlice, int partIdx, uint32_t lastMode, uint32_t blockBit[3]);
> diff -r 9461fc801cd2 -r de7b359fd933 source/encoder/bitcost.h
> --- a/source/encoder/bitcost.h	Wed Aug 20 14:57:41 2014 -0500
> +++ b/source/encoder/bitcost.h	Thu Aug 21 18:34:53 2014 +0900
> @@ -45,12 +45,18 @@
>      inline uint16_t mvcost(const MV& mv) const      { return m_cost_mvx[mv.x] + m_cost_mvy[mv.y]; }
>  
>      // return bit cost of motion vector difference, without lambda
> -    inline uint16_t bitcost(const MV& mv) const
> +    inline uint32_t bitcost(const MV& mv) const
>      {
> -        return (uint16_t)(s_bitsizes[abs(mv.x - m_mvp.x)] +
> +        return (uint32_t)(s_bitsizes[abs(mv.x - m_mvp.x)] +
>                            s_bitsizes[abs(mv.y - m_mvp.y)] + 0.5f);
>      }
>  
> +    static inline uint32_t bitcost(const MV& mv, const MV& mvp)
> +    {
> +        return (uint32_t)(s_bitsizes[abs(mv.x - mvp.x)] +
> +                          s_bitsizes[abs(mv.y - mvp.y)] + 0.5f);
> +    }
> +
>      static void destroy();
>  
>  protected:
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel

-- 
Steve Borho


More information about the x265-devel mailing list