X-Git-Url: https://git.piment-noir.org/?p=deb_x265.git;a=blobdiff_plain;f=source%2Fcommon%2Flowres.h;h=a206c9640e063d65750efc15b82a2c2827beee64;hp=b88ad3e07af18a9d547f525aca1cbd6344c6f424;hb=b53f7c52d8280ab63876efd6eb292c21430ac607;hpb=5c9b45285dd64723ad1dac380b98a7b1f3095674 diff --git a/source/common/lowres.h b/source/common/lowres.h index b88ad3e..a206c96 100644 --- a/source/common/lowres.h +++ b/source/common/lowres.h @@ -26,27 +26,36 @@ #include "primitives.h" #include "common.h" +#include "picyuv.h" #include "mv.h" namespace x265 { // private namespace -class PicYuv; - struct ReferencePlanes { ReferencePlanes() { memset(this, 0, sizeof(ReferencePlanes)); } - pixel* fpelPlane; + pixel* fpelPlane[3]; pixel* lowresPlane[4]; + PicYuv* reconPic; bool isWeighted; bool isLowres; + intptr_t lumaStride; - int weight; - int offset; - int shift; - int round; + intptr_t chromaStride; + + struct { + int weight; + int offset; + int shift; + int round; + } w[3]; + + pixel* getLumaAddr(uint32_t ctuAddr, uint32_t absPartIdx) { return fpelPlane[0] + reconPic->m_cuOffsetY[ctuAddr] + reconPic->m_buOffsetY[absPartIdx]; } + pixel* getCbAddr(uint32_t ctuAddr, uint32_t absPartIdx) { return fpelPlane[1] + reconPic->m_cuOffsetC[ctuAddr] + reconPic->m_buOffsetC[absPartIdx]; } + pixel* getCrAddr(uint32_t ctuAddr, uint32_t absPartIdx) { return fpelPlane[2] + reconPic->m_cuOffsetC[ctuAddr] + reconPic->m_buOffsetC[absPartIdx]; } /* lowres motion compensation, you must provide a buffer and stride for QPEL averaged pixels * in case QPEL is required. Else it returns a pointer to the HPEL pixels */ @@ -56,11 +65,10 @@ struct ReferencePlanes { int hpelA = (qmv.y & 2) | ((qmv.x & 2) >> 1); pixel *frefA = lowresPlane[hpelA] + blockOffset + (qmv.x >> 2) + (qmv.y >> 2) * lumaStride; - - MV qmvB = qmv + MV((qmv.x & 1) * 2, (qmv.y & 1) * 2); - int hpelB = (qmvB.y & 2) | ((qmvB.x & 2) >> 1); - - pixel *frefB = lowresPlane[hpelB] + blockOffset + (qmvB.x >> 2) + (qmvB.y >> 2) * lumaStride; + int qmvx = qmv.x + (qmv.x & 1); + int qmvy = qmv.y + (qmv.y & 1); + int hpelB = (qmvy & 2) | ((qmvx & 2) >> 1); + pixel *frefB = lowresPlane[hpelB] + blockOffset + (qmvx >> 2) + (qmvy >> 2) * lumaStride; primitives.pixelavg_pp[LUMA_8x8](buf, outstride, frefA, lumaStride, frefB, lumaStride, 32); return buf; } @@ -79,9 +87,10 @@ struct ReferencePlanes ALIGN_VAR_16(pixel, subpelbuf[8 * 8]); int hpelA = (qmv.y & 2) | ((qmv.x & 2) >> 1); pixel *frefA = lowresPlane[hpelA] + blockOffset + (qmv.x >> 2) + (qmv.y >> 2) * lumaStride; - MV qmvB = qmv + MV((qmv.x & 1) * 2, (qmv.y & 1) * 2); - int hpelB = (qmvB.y & 2) | ((qmvB.x & 2) >> 1); - pixel *frefB = lowresPlane[hpelB] + blockOffset + (qmvB.x >> 2) + (qmvB.y >> 2) * lumaStride; + int qmvx = qmv.x + (qmv.x & 1); + int qmvy = qmv.y + (qmv.y & 1); + int hpelB = (qmvy & 2) | ((qmvx & 2) >> 1); + pixel *frefB = lowresPlane[hpelB] + blockOffset + (qmvx >> 2) + (qmvy >> 2) * lumaStride; primitives.pixelavg_pp[LUMA_8x8](subpelbuf, 8, frefA, lumaStride, frefB, lumaStride, 32); return comp(fenc, FENC_STRIDE, subpelbuf, 8); } @@ -116,6 +125,7 @@ struct Lowres : public ReferencePlanes int32_t* rowSatds[X265_BFRAME_MAX + 2][X265_BFRAME_MAX + 2]; int intraMbs[X265_BFRAME_MAX + 2]; int32_t* intraCost; + uint8_t* intraMode; int64_t satdCost; uint16_t* lowresCostForRc; uint16_t(*lowresCosts[X265_BFRAME_MAX + 2][X265_BFRAME_MAX + 2]);