[x265] [PATCH RFC] analysis: use macro and for-loop to simplify fast-intra
dave
dtyx265 at gmail.com
Thu Aug 14 23:46:57 CEST 2014
On 08/14/2014 01:42 PM, Steve Borho wrote:
> # HG changeset patch
> # User Steve Borho <steve at borho.org>
> # Date 1408048681 18000
> # Thu Aug 14 15:38:01 2014 -0500
> # Node ID 07138e6ac952c96d1e31f5490c44f4cfaf6ac12a
> # Parent 213f17c1492c5bf96c3f382e7beffe0c871a563c
> analysis: use macro and for-loop to simplify fast-intra
>
> this changes behavior a bit; it's trying both +/-1 offsets instead of just
> one. and it has to do one extra check at the end since mode 34 isn't reached
> by the other previous loops
>
> diff -r 213f17c1492c -r 07138e6ac952 source/encoder/analysis.cpp
> --- a/source/encoder/analysis.cpp Thu Aug 14 09:43:39 2014 -0700
> +++ b/source/encoder/analysis.cpp Thu Aug 14 15:38:01 2014 -0500
> @@ -1693,68 +1693,56 @@
> bool modeHor;
> pixel *cmp;
> intptr_t srcStride;
> +
> +#define TRY_ANGLE(angle) \
> + modeHor = angle < 18; \
> + cmp = modeHor ? buf_trans : fenc; \
> + srcStride = modeHor ? scaleTuSize : scaleStride; \
> + sad = sa8d(cmp, srcStride, &tmp[(angle - 2) * predsize], scaleTuSize) << costShift; \
> + bits = (mpms & ((uint64_t)1 << angle)) ? xModeBitsIntra(cu, angle, partOffset, depth) : rbits; \
> + cost = m_rdCost.calcRdSADCost(sad, bits)
> +
> if (m_param->bEnableFastIntra)
> {
> - int lowsad, highsad, asad = 0;
> - uint32_t lowbits, highbits, amode, lowmode, highmode, abits = 0;
> - uint64_t lowcost, highcost = MAX_INT64, acost = MAX_INT64;
> + int asad = 0;
> + uint32_t lowmode, highmode, amode, abits = 0;
> + uint64_t acost = MAX_INT64;
>
> - for (mode = 4;mode < 35; mode += 5)
> + /* pick the best angle, sampling at distance of 5 */
> + for (mode = 5; mode < 35; mode += 5)
By starting with mode = 5, won't this miss mode 2 since only +/-2 is
checked? By starting from 4 the loop should end at 34.
> {
> - modeHor = (mode < 18);
> - cmp = (modeHor ? buf_trans : fenc);
> - srcStride = (modeHor ? scaleTuSize : scaleStride);
> - sad = sa8d(cmp, srcStride, &tmp[(mode - 2) * predsize], scaleTuSize) << costShift;
> - bits = !(mpms & ((uint64_t)1 << mode)) ? rbits : xModeBitsIntra(cu, mode, partOffset, depth);
> - cost = m_rdCost.calcRdSADCost(sad, bits);
> + TRY_ANGLE(mode);
> COPY4_IF_LT(acost, cost, amode, mode, asad, sad, abits, bits);
> }
> - lowmode = amode - 2;
> - modeHor = (lowmode < 18);
> - cmp = (modeHor ? buf_trans : fenc);
> - srcStride = (modeHor ? scaleTuSize : scaleStride);
> - lowsad = sa8d(cmp, srcStride, &tmp[(lowmode - 2) * predsize], scaleTuSize) << costShift;
> - lowbits = !(mpms & ((uint64_t)1 << lowmode)) ? rbits : xModeBitsIntra(cu, lowmode, partOffset, depth);
> - lowcost = m_rdCost.calcRdSADCost(lowsad, lowbits);
> - if (amode < 34)
> +
> + /* refine best angle at distance 2, then distance 1 */
> + for (uint32_t dist = 2; dist >= 1; dist--)
> {
> - highmode = amode + 2;
> - modeHor = (highmode < 18);
> - cmp = (modeHor ? buf_trans : fenc);
> - srcStride = (modeHor ? scaleTuSize : scaleStride);
> - highsad = sa8d(cmp, srcStride, &tmp[(highmode - 2) * predsize], scaleTuSize) << costShift;
> - highbits = !(mpms & ((uint64_t)1 << highmode)) ? rbits : xModeBitsIntra(cu, highmode, partOffset, depth);
> - highcost = m_rdCost.calcRdSADCost(highsad, highbits);
> + lowmode = amode - dist;
> + highmode = amode + dist;
> +
> + X265_CHECK(lowmode >= 2 && lowmode <= 34, "low intra mode out of range\n");
> + TRY_ANGLE(lowmode);
> + COPY4_IF_LT(acost, cost, amode, lowmode, asad, sad, abits, bits);
> +
> + X265_CHECK(highmode >= 2 && highmode <= 34, "high intra mode out of range\n");
> + TRY_ANGLE(highmode);
> + COPY4_IF_LT(acost, cost, amode, highmode, asad, sad, abits, bits);
> }
> - if (lowcost <= highcost)
> +
> + if (amode == 33)
> {
> - mode = amode - 1;
> - COPY4_IF_LT(acost, lowcost, amode, lowmode, asad, lowsad, abits, lowbits);
> + TRY_ANGLE(34);
> + COPY4_IF_LT(acost, cost, amode, 34, asad, sad, abits, bits);
> }
> - else
> - {
> - mode = amode + 1;
> - COPY4_IF_LT(acost, highcost, amode, highmode, asad, highsad, abits, highbits);
> - }
> - modeHor = (mode < 18);
> - cmp = (modeHor ? buf_trans : fenc);
> - srcStride = (modeHor ? scaleTuSize : scaleStride);
> - sad = sa8d(cmp, srcStride, &tmp[(mode - 2) * predsize], scaleTuSize) << costShift;
> - bits = !(mpms & ((uint64_t)1 << mode)) ? rbits : xModeBitsIntra(cu, mode, partOffset, depth);
> - cost = m_rdCost.calcRdSADCost(sad, bits);
> - COPY4_IF_LT(acost, cost, amode, mode, asad, sad, abits, bits);
> +
> COPY4_IF_LT(bcost, acost, bmode, amode, bsad, asad, bbits, abits);
> }
> else // calculate and search all intra prediction angles for lowest cost
> {
> for (mode = 2; mode < 35; mode++)
> {
> - modeHor = (mode < 18);
> - cmp = (modeHor ? buf_trans : fenc);
> - srcStride = (modeHor ? scaleTuSize : scaleStride);
> - sad = sa8d(cmp, srcStride, &tmp[(mode - 2) * predsize], scaleTuSize) << costShift;
> - bits = !(mpms & ((uint64_t)1 << mode)) ? rbits : xModeBitsIntra(cu, mode, partOffset, depth);
> - cost = m_rdCost.calcRdSADCost(sad, bits);
> + TRY_ANGLE(mode);
> COPY4_IF_LT(bcost, cost, bmode, mode, bsad, sad, bbits, bits);
> }
> }
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
More information about the x265-devel
mailing list