[x265] [PATCH 4 of 4] Enabling weight prediction for half and full pel
Shazeb Khan
shazeb at multicorewareinc.com
Wed Oct 9 07:55:55 CEST 2013
On Wed, Oct 9, 2013 at 12:55 AM, Steve Borho <steve at borho.org> wrote:
>
>
>
> On Tue, Oct 8, 2013 at 6:41 AM, <shazeb at multicorewareinc.com> wrote:
>
>> # HG changeset patch
>> # User Shazeb Nawaz Khan <shazeb at multicorewareinc.com>
>> # Date 1381232285 -19800
>> # Tue Oct 08 17:08:05 2013 +0530
>> # Node ID ad8608b0a64869c3b8bbc32e0bb418f7b1dde4bb
>> # Parent 18a5d7c3464d1a3fa98afa95a0fe7a8894bcd3d2
>> Enabling weight prediction for half and full pel
>>
>> diff -r 18a5d7c3464d -r ad8608b0a648 source/common/reference.cpp
>> --- a/source/common/reference.cpp Tue Oct 08 16:56:39 2013 +0530
>> +++ b/source/common/reference.cpp Tue Oct 08 17:08:05 2013 +0530
>> @@ -58,6 +58,7 @@
>> int MotionReference::init(TComPicYuv* pic, wpScalingParam *w)
>> {
>> m_reconPic = pic;
>> + unweightedFPelPlane = pic->getLumaAddr();
>>
>
> the motion reference object has m_reconPic, so it can call
> m_reconPic->getLumaAddr() at any time. I don't see the need for another
> pointer
>
Its not possible to refer m_reconPic in subpelInterpolate(), since the
parameter is catched in ReferencePlanes type pointer rather than
MotionReference pointer. Its required to have/use a pointer in superclass.
Can there be another way?
>
>
>> lumaStride = pic->getStride();
>> m_startPad = pic->m_lumaMarginY * lumaStride + pic->m_lumaMarginX;
>> m_next = NULL;
>> diff -r 18a5d7c3464d -r ad8608b0a648 source/common/reference.h
>> --- a/source/common/reference.h Tue Oct 08 16:56:39 2013 +0530
>> +++ b/source/common/reference.h Tue Oct 08 17:08:05 2013 +0530
>> @@ -43,6 +43,7 @@
>>
>> pixel* fpelPlane;
>> pixel* lowresPlane[4];
>> + pixel* unweightedFPelPlane;
>>
>> bool isWeighted;
>> bool isLowres;
>> diff -r 18a5d7c3464d -r ad8608b0a648 source/encoder/frameencoder.cpp
>> --- a/source/encoder/frameencoder.cpp Tue Oct 08 16:56:39 2013 +0530
>> +++ b/source/encoder/frameencoder.cpp Tue Oct 08 17:08:05 2013 +0530
>> @@ -909,6 +909,10 @@
>> {
>> refpic->m_reconRowWait.wait();
>> }
>> + if(slice->getPPS()->getUseWP() &&
>> (slice->getSliceType() == P_SLICE))
>>
>
> white-space
>
>
>> + {
>> + slice->m_mref[list][ref]->applyWeight(refpic,
>> row + refLagRows, m_numRows);
>> + }
>> }
>> }
>>
>> @@ -941,6 +945,10 @@
>> {
>> refpic->m_reconRowWait.wait();
>> }
>> + if(slice->getPPS()->getUseWP() &&
>> (slice->getSliceType() == P_SLICE))
>>
>
> white-space
>
>
>> + {
>> +
>> slice->m_mref[list][ref]->applyWeight(refpic, i + refLagRows, m_numRows);
>> + }
>> }
>> }
>>
>> diff -r 18a5d7c3464d -r ad8608b0a648 source/encoder/motion.cpp
>> --- a/source/encoder/motion.cpp Tue Oct 08 16:56:39 2013 +0530
>> +++ b/source/encoder/motion.cpp Tue Oct 08 17:08:05 2013 +0530
>> @@ -89,6 +89,7 @@
>> fenc = (pixel*)X265_MALLOC(pixel, MAX_CU_SIZE * MAX_CU_SIZE);
>> subpelbuf = (pixel*)X265_MALLOC(pixel, (MAX_CU_SIZE + 1) *
>> (MAX_CU_SIZE + 1));
>> immedVal = (short*)X265_MALLOC(short, (MAX_CU_SIZE + 1) *
>> (MAX_CU_SIZE + 1 + NTAPS_LUMA - 1));
>> + immedVal2 = (int16_t*)X265_MALLOC(int16_t, (MAX_CU_SIZE + 1) *
>> (MAX_CU_SIZE + 1 + NTAPS_LUMA - 1));
>>
>
> this is the same as immedVal (short==int16_t most everywhere). It would
> be better to change immedVal's type to int16_t* and to cast it as short
> everywhere necessary in the short term until we can fix all the
> interpolation primitives to use int16_t instead of short.
>
In subpelInterpolate
pixel -----------[interpolatePS]------> immedVal
-------[interpolateSS]-------> immedVal2
---------[weightp]---------> subpellbuf
immedVal2 serves as intermediate buffer.
>
>
>> }
>>
>> MotionEstimate::~MotionEstimate()
>> @@ -96,6 +97,7 @@
>> X265_FREE(fenc);
>> X265_FREE(subpelbuf);
>> X265_FREE(immedVal);
>> + X265_FREE(immedVal2);
>> }
>>
>> void MotionEstimate::setSourcePU(int offset, int width, int height)
>> @@ -831,7 +833,7 @@
>> }
>> else
>> {
>> - subpelInterpolate(fqref, ref->lumaStride, xFrac,
>> yFrac, dir);
>> + subpelInterpolate(ref, qmv0, dir);
>> cost0 = hpelcomp(fenc, FENC_STRIDE, subpelbuf,
>> FENC_STRIDE + (dir == 2)) + mvcost0;
>> cost1 = hpelcomp(fenc, FENC_STRIDE, subpelbuf + (dir
>> == 2) + (dir == 1 ? FENC_STRIDE : 0), FENC_STRIDE + (dir == 2)) + mvcost1;
>> }
>> @@ -1140,47 +1142,61 @@
>> {
>> return cmp(fenc, FENC_STRIDE, fref, ref->lumaStride);
>> }
>> - else if (yFrac == 0)
>> + else
>> {
>> - primitives.ipfilter_pp[FILTER_H_P_P_8](fref,
>> ref->lumaStride, subpelbuf, FENC_STRIDE, blockwidth, blockheight,
>> g_lumaFilter[xFrac]);
>> + subpelInterpolate(ref, qmv, 0);
>>
>
> as a post-step; we should try to declare subpelInterpolate as inline
>
>
>> + }
>> + return cmp(fenc, FENC_STRIDE, subpelbuf, FENC_STRIDE);
>> + }
>> +}
>> +
>> +void MotionEstimate::subpelInterpolate(ReferencePlanes *ref, MV qmv, int
>> dir)
>> +{
>> + int xFrac = qmv.x & 0x3;
>> + int yFrac = qmv.y & 0x3;
>> + assert(yFrac | xFrac);
>> + int realWidth = blockwidth + (dir == 2);
>> + int realHeight = blockheight + (dir == 1);
>> + intptr_t realStride = FENC_STRIDE + (dir == 2);
>> + pixel *fref = ref->unweightedFPelPlane + blockOffset + (qmv.x >> 2)
>> + (qmv.y >> 2) * ref->lumaStride;
>> +
>> + if (ref->isWeighted)
>> + {
>> + if (yFrac == 0)
>> + {
>> + primitives.ipfilter_ps[FILTER_H_P_S_8](fref,
>> ref->lumaStride, immedVal, realStride, realWidth, realHeight,
>> g_lumaFilter[xFrac]);
>> + primitives.weightpUni(immedVal, subpelbuf, realStride,
>> realStride, realWidth, realHeight, ref->weight, ref->round, ref->shift,
>> ref->offset);
>> }
>> else if (xFrac == 0)
>> {
>> - primitives.ipfilter_pp[FILTER_V_P_P_8](fref,
>> ref->lumaStride, subpelbuf, FENC_STRIDE, blockwidth, blockheight,
>> g_lumaFilter[yFrac]);
>> + primitives.ipfilter_ps[FILTER_V_P_S_8](fref,
>> ref->lumaStride, immedVal, realStride, realWidth, realHeight,
>> g_lumaFilter[yFrac]);
>> + primitives.weightpUni(immedVal, subpelbuf, realStride,
>> realStride, realWidth, realHeight, ref->weight, ref->round, ref->shift,
>> ref->offset);
>> }
>> else
>> {
>> int filterSize = NTAPS_LUMA;
>> int halfFilterSize = (filterSize >> 1);
>> - primitives.ipfilter_ps[FILTER_H_P_S_8](fref -
>> (halfFilterSize - 1) * ref->lumaStride, ref->lumaStride, immedVal,
>> blockwidth, blockwidth, blockheight + filterSize - 1, g_lumaFilter[xFrac]);
>> - primitives.ipfilter_sp[FILTER_V_S_P_8](immedVal +
>> (halfFilterSize - 1) * blockwidth, blockwidth, subpelbuf, FENC_STRIDE,
>> blockwidth, blockheight, g_lumaFilter[yFrac]);
>> + primitives.ipfilter_ps[FILTER_H_P_S_8](fref -
>> (halfFilterSize - 1) * ref->lumaStride, ref->lumaStride, immedVal,
>> realWidth, realWidth, realHeight + filterSize - 1, g_lumaFilter[xFrac]);
>> + primitives.ipfilter_ss[FILTER_V_S_S_8](immedVal +
>> (halfFilterSize - 1) * realWidth, realWidth, immedVal2, realStride,
>> realWidth, realHeight, g_lumaFilter[yFrac]);
>> + primitives.weightpUni(immedVal2, subpelbuf, realStride,
>> realStride, realWidth, realHeight, ref->weight, ref->round, ref->shift,
>> ref->offset);
>> }
>> -
>> - return cmp(fenc, FENC_STRIDE, subpelbuf, FENC_STRIDE);
>> - }
>> -}
>> -
>> -void MotionEstimate::subpelInterpolate(pixel *fref, intptr_t lumaStride,
>> int xFrac, int yFrac, int dir)
>> -{
>> - assert(yFrac | xFrac);
>> -
>> - int realWidth = blockwidth + (dir == 2);
>> - int realHeight = blockheight + (dir == 1);
>> - intptr_t realStride = FENC_STRIDE + (dir == 2);
>> -
>> - if (yFrac == 0)
>> - {
>> - primitives.ipfilter_pp[FILTER_H_P_P_8](fref, lumaStride,
>> subpelbuf, realStride, realWidth, realHeight, g_lumaFilter[xFrac]);
>> - }
>> - else if (xFrac == 0)
>> - {
>> - primitives.ipfilter_pp[FILTER_V_P_P_8](fref, lumaStride,
>> subpelbuf, realStride, realWidth, realHeight, g_lumaFilter[yFrac]);
>> }
>> else
>> {
>> - int filterSize = NTAPS_LUMA;
>> - int halfFilterSize = (filterSize >> 1);
>> - primitives.ipfilter_ps[FILTER_H_P_S_8](fref - (halfFilterSize -
>> 1) * lumaStride, lumaStride, immedVal, realWidth, realWidth, realHeight +
>> filterSize - 1, g_lumaFilter[xFrac]);
>> - primitives.ipfilter_sp[FILTER_V_S_P_8](immedVal +
>> (halfFilterSize - 1) * realWidth, realWidth, subpelbuf, realStride,
>> realWidth, realHeight, g_lumaFilter[yFrac]);
>> + if (yFrac == 0)
>> + {
>> + primitives.ipfilter_pp[FILTER_H_P_P_8](fref,
>> ref->lumaStride, subpelbuf, realStride, realWidth, realHeight,
>> g_lumaFilter[xFrac]);
>> + }
>> + else if (xFrac == 0)
>> + {
>> + primitives.ipfilter_pp[FILTER_V_P_P_8](fref,
>> ref->lumaStride, subpelbuf, realStride, realWidth, realHeight,
>> g_lumaFilter[yFrac]);
>> + }
>> + else
>> + {
>> + int filterSize = NTAPS_LUMA;
>> + int halfFilterSize = (filterSize >> 1);
>> + primitives.ipfilter_ps[FILTER_H_P_S_8](fref -
>> (halfFilterSize - 1) * ref->lumaStride, ref->lumaStride, immedVal,
>> realWidth, realWidth, realHeight + filterSize - 1, g_lumaFilter[xFrac]);
>> + primitives.ipfilter_sp[FILTER_V_S_P_8](immedVal +
>> (halfFilterSize - 1) * realWidth, realWidth, subpelbuf, realStride,
>> realWidth, realHeight, g_lumaFilter[yFrac]);
>> + }
>> }
>> }
>> diff -r 18a5d7c3464d -r ad8608b0a648 source/encoder/motion.h
>> --- a/source/encoder/motion.h Tue Oct 08 16:56:39 2013 +0530
>> +++ b/source/encoder/motion.h Tue Oct 08 17:08:05 2013 +0530
>> @@ -54,6 +54,7 @@
>> /* subpel generation buffers */
>> pixel *subpelbuf;
>> short *immedVal;
>> + int16_t *immedVal2;
>> int blockwidth;
>> int blockheight;
>>
>> @@ -96,7 +97,7 @@
>>
>> int subpelCompare(ReferencePlanes *ref, const MV & qmv, pixelcmp_t);
>>
>> - void subpelInterpolate(pixel *fref, intptr_t lumaStride, int xFrac,
>> int yFrac, int dir);
>> + void subpelInterpolate(ReferencePlanes *ref, MV qmv, int dir);
>>
>> protected:
>>
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
>
> --
> Steve Borho
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20131009/fac89be2/attachment-0001.html>
More information about the x265-devel
mailing list