[x265] [PATCH] entropy: modified last coefficient position encoding in codeCoeffNxN()
Steve Borho
steve at borho.org
Wed Jan 7 06:37:10 CET 2015
On 01/06, ashok at multicorewareinc.com wrote:
> # HG changeset patch
> # User Ashok Kumar Mishra<ashok at multicorewareinc.com>
> # Date 1420538998 -19800
> # Tue Jan 06 15:39:58 2015 +0530
> # Node ID e8bf703fa06148c38f6a9c976563d7c90825d9bd
> # Parent f255e8d06423231cb8c58ab5d3b10de7fb27b424
> entropy: modified last coefficient position encoding in codeCoeffNxN()
>
> diff -r f255e8d06423 -r e8bf703fa061 source/common/constants.cpp
> --- a/source/common/constants.cpp Fri Jan 02 18:22:38 2015 +0530
> +++ b/source/common/constants.cpp Tue Jan 06 15:39:58 2015 +0530
> @@ -412,7 +412,16 @@
> { g_scan4x4[2], g_scan2x2[0], g_scan4x4[0], g_scan8x8diag }
> };
>
> -const uint8_t g_minInGroup[10] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24 };
> +// Table used for encoding the last coefficient position. The index is the position.
> +// The low 4 bits are the number of "1" in the prefix and the high 4 bits are the number
> +// of bits in the suffix.
> +const uint8_t lastCoeffTable[32] =
queued with a g_ prefix to this global symbol
> +{
> + 0x00, 0x01, 0x02, 0x03, 0x14, 0x14, 0x15, 0x15,
> + 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27,
> + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
> + 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39,
> +};
>
> // Rice parameters for absolute transform levels
> const uint8_t g_goRiceRange[5] = { 7, 14, 26, 46, 78 };
> diff -r f255e8d06423 -r e8bf703fa061 source/common/constants.h
> --- a/source/common/constants.h Fri Jan 02 18:22:38 2015 +0530
> +++ b/source/common/constants.h Tue Jan 06 15:39:58 2015 +0530
> @@ -83,7 +83,7 @@
> extern const uint16_t g_scan8x8diag[8 * 8];
> extern const uint16_t g_scan4x4[NUM_SCAN_TYPE][4 * 4];
>
> -extern const uint8_t g_minInGroup[10];
> +extern const uint8_t lastCoeffTable[32];
> extern const uint8_t g_goRiceRange[5]; // maximum value coded with Rice codes
>
> // CABAC tables
> diff -r f255e8d06423 -r e8bf703fa061 source/encoder/entropy.cpp
> --- a/source/encoder/entropy.cpp Fri Jan 02 18:22:38 2015 +0530
> +++ b/source/encoder/entropy.cpp Tue Jan 06 15:39:58 2015 +0530
> @@ -1407,58 +1407,6 @@
> encodeBin(cu.getCbf(absPartIdx, ttype, lowestTUDepth), m_contextState[OFF_QT_CBF_CTX + ctx]);
> }
>
> -/** Encode (X,Y) position of the last significant coefficient
> - * \param posx X component of last coefficient
> - * \param posy Y component of last coefficient
> - * \param log2TrSize
> - * \param bIsLuma
> - * \param scanIdx scan type (zig-zag, hor, ver)
> - * This method encodes the X and Y component within a block of the last significant coefficient.
> - */
> -void Entropy::codeLastSignificantXY(uint32_t posx, uint32_t posy, uint32_t log2TrSize, bool bIsLuma, uint32_t scanIdx)
> -{
> - // swap
> - if (scanIdx == SCAN_VER)
> - std::swap(posx, posy);
> -
> - uint32_t ctxLast;
> - uint32_t groupIdxX = getGroupIdx(posx);
> - uint32_t groupIdxY = getGroupIdx(posy);
> -
> - 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;
> -
> - // posX
> - uint8_t *ctxX = &m_contextState[OFF_CTX_LAST_FLAG_X];
> - for (ctxLast = 0; ctxLast < groupIdxX; ctxLast++)
> - encodeBin(1, *(ctxX + blkSizeOffset + (ctxLast >> ctxShift)));
> -
> - if (groupIdxX < maxGroupIdx)
> - encodeBin(0, *(ctxX + blkSizeOffset + (ctxLast >> ctxShift)));
> -
> - // posY
> - uint8_t *ctxY = &m_contextState[OFF_CTX_LAST_FLAG_Y];
> - for (ctxLast = 0; ctxLast < groupIdxY; ctxLast++)
> - encodeBin(1, *(ctxY + blkSizeOffset + (ctxLast >> ctxShift)));
> -
> - if (groupIdxY < maxGroupIdx)
> - encodeBin(0, *(ctxY + blkSizeOffset + (ctxLast >> ctxShift)));
> -
> - if (groupIdxX > 3)
> - {
> - uint32_t count = (groupIdxX - 2) >> 1;
> - posx = posx - g_minInGroup[groupIdxX];
> - encodeBinsEP(posx, count);
> - }
> - if (groupIdxY > 3)
> - {
> - uint32_t count = (groupIdxY - 2) >> 1;
> - posy = posy - g_minInGroup[groupIdxY];
> - encodeBinsEP(posy, count);
> - }
> -}
> -
> void Entropy::codeCoeffNxN(const CUData& cu, const coeff_t* coeff, uint32_t absPartIdx, uint32_t log2TrSize, TextType ttype)
> {
> uint32_t trSize = 1 << log2TrSize;
> @@ -1506,11 +1454,42 @@
> scanPosLast--;
>
> // Code position of last coefficient
> - int posLastY = posLast >> log2TrSize;
> - int posLastX = posLast & (trSize - 1);
> - codeLastSignificantXY(posLastX, posLastY, log2TrSize, bIsLuma, codingParameters.scanType);
> + {
> + // The last position is composed of a prefix and suffix.
> + // The prefix is context coded truncated unary bins. The suffix is bypass coded fixed length bins.
> + // The bypass coded bins for both the x and y components are grouped together.
> + int packedSuffixBits = 0, packedSuffixLen = 0;
> + int pos[2] = { (posLast & (trSize - 1)), (posLast >> log2TrSize) };
> + // swap
> + if (codingParameters.scanType == SCAN_VER)
> + std::swap(pos[0], pos[1]);
>
> - //===== code significance flag =====
> + int ctxIdx = bIsLuma ? (3 * (log2TrSize - 2) + ((log2TrSize - 1) >> 2)) : NUM_CTX_LAST_FLAG_XY_LUMA;
> + int ctxShift = bIsLuma ? ((log2TrSize + 1) >> 2) : log2TrSize - 2;
> + uint32_t maxGroupIdx = (log2TrSize << 1) - 1;
> +
> + uint8_t *ctx = &m_contextState[OFF_CTX_LAST_FLAG_X];
> + for (uint32_t i = 0; i < 2; i++, ctxIdx += NUM_CTX_LAST_FLAG_XY)
> + {
> + uint32_t temp = lastCoeffTable[pos[i]];
> + uint32_t prefixOnes = temp & 15;
> + uint32_t suffixLen = temp >> 4;
> +
> + for (uint32_t ctxLast = 0; ctxLast < prefixOnes; ctxLast++)
> + encodeBin(1, *(ctx + ctxIdx + (ctxLast >> ctxShift)));
> +
> + if (prefixOnes < maxGroupIdx)
> + encodeBin(0, *(ctx + ctxIdx + (prefixOnes >> ctxShift)));
> +
> + packedSuffixBits <<= suffixLen;
> + packedSuffixBits |= (pos[i] & ((1 << suffixLen) - 1));
> + packedSuffixLen += suffixLen;
> + }
> +
> + encodeBinsEP(packedSuffixBits, packedSuffixLen);
> + }
> +
> + // code significance flag
> uint8_t * const baseCoeffGroupCtx = &m_contextState[OFF_SIG_CG_FLAG_CTX + (bIsLuma ? 0 : NUM_SIG_CG_FLAG_CTX)];
> uint8_t * const baseCtx = bIsLuma ? &m_contextState[OFF_SIG_FLAG_CTX] : &m_contextState[OFF_SIG_FLAG_CTX + NUM_SIG_FLAG_CTX_LUMA];
> const int lastScanSet = scanPosLast >> MLS_CG_SIZE;
> _______________________________________________
> 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