[x265] [PATCH] Quant: modified rate cost calculation of last significant coefficient

Steve Borho steve at borho.org
Wed Jan 7 11:48:46 CET 2015


On 01/07, ashok at multicorewareinc.com wrote:
> # HG changeset patch
> # User Ashok Kumar Mishra<ashok at multicorewareinc.com>
> # Date 1420626307 -19800
> #      Wed Jan 07 15:55:07 2015 +0530
> # Node ID c4c8a11ad6c639927be6cd9239f773937384743c
> # Parent  357ec738fb0ccaa678ab548629666b118f9f938f
> Quant: modified rate cost calculation of last significant coefficient

queued

> diff -r 357ec738fb0c -r c4c8a11ad6c6 source/common/quant.cpp
> --- a/source/common/quant.cpp	Tue Jan 06 15:39:58 2015 +0530
> +++ b/source/common/quant.cpp	Wed Jan 07 15:55:07 2015 +0530
> @@ -838,12 +838,23 @@
>               * cost of signaling it as not-significant */
>              uint32_t blkPos = codeParams.scan[scanPos];
>              if (dstCoeff[blkPos])
> -            {
> -                /* Swap the cost of signaling its significant coeff bit with the cost of
> -                 * signaling its lastNZ pos */
> -                uint32_t posY = blkPos >> log2TrSize;
> -                uint32_t posX = blkPos - (posY << log2TrSize);
> -                uint32_t bitsLastNZ = codeParams.scanType == SCAN_VER ? getRateLast(posY, posX) : getRateLast(posX, posY);
> +            {                
> +                // Calculates the cost of signaling the last significant coefficient in the block 
> +                int pos[2] = { (blkPos & (trSize - 1)), (blkPos >> log2TrSize) };
> +                if (codeParams.scanType == SCAN_VER)
> +                    std::swap(pos[0], pos[1]);
> +                uint32_t bitsLastNZ = 0;
> +
> +                for (int i = 0; i < 2; i++)
> +                {
> +                    int temp = g_lastCoeffTable[pos[i]];
> +                    int prefixOnes = temp & 15;
> +                    int suffixLen = temp >> 4;
> +
> +                    bitsLastNZ += m_entropyCoder->m_estBitsSbac.lastBits[i][prefixOnes];
> +                    bitsLastNZ += IEP_RATE * suffixLen;
> +                }
> +
>                  int64_t costAsLast = totalRdCost - costSig[scanPos] + SIGCOST(bitsLastNZ);
>  
>                  if (costAsLast < bestCost)
> @@ -1092,21 +1103,6 @@
>      return (bIsLuma && (posX | posY) >= 4) ? 3 + offset : offset;
>  }
>  
> -/* Calculates the cost of signaling the last significant coefficient in the block */
> -inline uint32_t Quant::getRateLast(uint32_t posx, uint32_t posy) const
> -{
> -    uint32_t ctxX = getGroupIdx(posx);
> -    uint32_t ctxY = getGroupIdx(posy);
> -    uint32_t cost = m_entropyCoder->m_estBitsSbac.lastXBits[ctxX] + m_entropyCoder->m_estBitsSbac.lastYBits[ctxY];
> -
> -    int32_t maskX = (int32_t)(2 - posx) >> 31;
> -    int32_t maskY = (int32_t)(2 - posy) >> 31;
> -
> -    cost += maskX & (IEP_RATE * ((ctxX - 2) >> 1));
> -    cost += maskY & (IEP_RATE * ((ctxY - 2) >> 1));
> -    return cost;
> -}
> -
>  /* Context derivation process of coeff_abs_significant_flag */
>  uint32_t Quant::getSigCoeffGroupCtxInc(uint64_t cgGroupMask, uint32_t cgPosX, uint32_t cgPosY, uint32_t log2TrSizeCG)
>  {
> diff -r 357ec738fb0c -r c4c8a11ad6c6 source/common/quant.h
> --- a/source/common/quant.h	Tue Jan 06 15:39:58 2015 +0530
> +++ b/source/common/quant.h	Wed Jan 07 15:55:07 2015 +0530
> @@ -122,29 +122,7 @@
>      uint32_t signBitHidingHDQ(int16_t* qcoeff, int32_t* deltaU, uint32_t numSig, const TUEntropyCodingParameters &codingParameters);
>  
>      uint32_t rdoQuant(const CUData& cu, int16_t* dstCoeff, uint32_t log2TrSize, TextType ttype, uint32_t absPartIdx, bool usePsy);
> -    inline uint32_t getRateLast(uint32_t posx, uint32_t posy) const;
>  };
> -
> -static inline uint32_t getGroupIdx(const uint32_t idx)
> -{
> -    // TODO: Why is this not a table lookup?
> -
> -    uint32_t group = (idx >> 3);
> -
> -    if (idx >= 24)
> -        group = 2;
> -    uint32_t groupIdx = ((idx >> (group + 1)) - 2) + 4 + (group << 1);
> -    if (idx <= 3)
> -        groupIdx = idx;
> -
> -#ifdef _DEBUG
> -    static const uint8_t g_groupIdx[32] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9 };
> -    assert(groupIdx == g_groupIdx[idx]);
> -#endif
> -
> -    return groupIdx;
> -}
> -
>  }
>  
>  #endif // ifndef X265_QUANT_H
> diff -r 357ec738fb0c -r c4c8a11ad6c6 source/encoder/entropy.cpp
> --- a/source/encoder/entropy.cpp	Tue Jan 06 15:39:58 2015 +0530
> +++ b/source/encoder/entropy.cpp	Wed Jan 07 15:55:07 2015 +0530
> @@ -1715,32 +1715,26 @@
>              for (uint32_t bin = 0; bin < 2; bin++)
>                  estBitsSbac.significantBits[ctxIdx][bin] = sbacGetEntropyBits(m_contextState[OFF_SIG_FLAG_CTX + (NUM_SIG_FLAG_CTX_LUMA + ctxIdx)], bin);
>      }
> -    int bitsX = 0, bitsY = 0;
>  
>      int blkSizeOffset = bIsLuma ? ((log2TrSize - 2) * 3 + ((log2TrSize - 1) >> 2)) : NUM_CTX_LAST_FLAG_XY_LUMA;
>      int ctxShift = bIsLuma ? ((log2TrSize + 1) >> 2) : log2TrSize - 2;
>      uint32_t maxGroupIdx = log2TrSize * 2 - 1;
>  
>      uint32_t ctx;
> -    const uint8_t *ctxX = &m_contextState[OFF_CTX_LAST_FLAG_X];
> -    for (ctx = 0; ctx < maxGroupIdx; ctx++)
> +    for (int i = 0, ctxIdx = 0; i < 2; i++, ctxIdx += NUM_CTX_LAST_FLAG_XY)
>      {
> -        int ctxOffset = blkSizeOffset + (ctx >> ctxShift);
> -        estBitsSbac.lastXBits[ctx] = bitsX + sbacGetEntropyBits(ctxX[ctxOffset], 0);
> -        bitsX += sbacGetEntropyBits(ctxX[ctxOffset], 1);
> +        int bits = 0;
> +        const uint8_t *ctxState = &m_contextState[OFF_CTX_LAST_FLAG_X + ctxIdx];
> +
> +        for (ctx = 0; ctx < maxGroupIdx; ctx++)
> +        {
> +            int ctxOffset = blkSizeOffset + (ctx >> ctxShift);
> +            estBitsSbac.lastBits[i][ctx] = bits + sbacGetEntropyBits(ctxState[ctxOffset], 0);
> +            bits += sbacGetEntropyBits(ctxState[ctxOffset], 1);
> +        }
> +
> +        estBitsSbac.lastBits[i][ctx] = bits;
>      }
> -
> -    estBitsSbac.lastXBits[ctx] = bitsX;
> -
> -    const uint8_t *ctxY = &m_contextState[OFF_CTX_LAST_FLAG_Y];
> -    for (ctx = 0; ctx < maxGroupIdx; ctx++)
> -    {
> -        int ctxOffset = blkSizeOffset + (ctx >> ctxShift);
> -        estBitsSbac.lastYBits[ctx] = bitsY + sbacGetEntropyBits(ctxY[ctxOffset], 0);
> -        bitsY += sbacGetEntropyBits(ctxY[ctxOffset], 1);
> -    }
> -
> -    estBitsSbac.lastYBits[ctx] = bitsY;
>  }
>  
>  /* estimate bit cost of significant coefficient */
> diff -r 357ec738fb0c -r c4c8a11ad6c6 source/encoder/entropy.h
> --- a/source/encoder/entropy.h	Tue Jan 06 15:39:58 2015 +0530
> +++ b/source/encoder/entropy.h	Wed Jan 07 15:55:07 2015 +0530
> @@ -88,8 +88,7 @@
>  {
>      int significantCoeffGroupBits[NUM_SIG_CG_FLAG_CTX][2];
>      int significantBits[NUM_SIG_FLAG_CTX][2];
> -    int lastXBits[10];
> -    int lastYBits[10];
> +    int lastBits[2][10];
>      int greaterOneBits[NUM_ONE_FLAG_CTX][2];
>      int levelAbsBits[NUM_ABS_FLAG_CTX][2];
>      int blockCbpBits[NUM_QT_CBF_CTX][2];
> _______________________________________________
> 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