int32_t WelsSampleSatd4x4_c (uint8_t* pSample1, int32_t iStride1, uint8_t* pSample2, int32_t iStride2) { int32_t iSatdSum = 0; int32_t pSampleMix[4][4] = { 0 }; int32_t iSample0, iSample1, iSample2, iSample3; int32_t i = 0; uint8_t* pSrc1 = pSample1; uint8_t* pSrc2 = pSample2; //step 1: get the difference for (i = 0; i < 4; i++) { pSampleMix[i][0] = pSrc1[0] - pSrc2[0]; pSampleMix[i][1] = pSrc1[1] - pSrc2[1]; pSampleMix[i][2] = pSrc1[2] - pSrc2[2]; pSampleMix[i][3] = pSrc1[3] - pSrc2[3]; pSrc1 += iStride1; pSrc2 += iStride2; } //step 2: horizontal transform for (i = 0; i < 4; i++) { iSample0 = pSampleMix[i][0] + pSampleMix[i][2]; iSample1 = pSampleMix[i][1] + pSampleMix[i][3]; iSample2 = pSampleMix[i][0] - pSampleMix[i][2]; iSample3 = pSampleMix[i][1] - pSampleMix[i][3]; pSampleMix[i][0] = iSample0 + iSample1; pSampleMix[i][1] = iSample2 + iSample3; pSampleMix[i][2] = iSample2 - iSample3; pSampleMix[i][3] = iSample0 - iSample1; } //step 3: vertical transform and get the sum of SATD for (i = 0; i < 4; i++) { iSample0 = pSampleMix[0][i] + pSampleMix[2][i]; iSample1 = pSampleMix[1][i] + pSampleMix[3][i]; iSample2 = pSampleMix[0][i] - pSampleMix[2][i]; iSample3 = pSampleMix[1][i] - pSampleMix[3][i]; pSampleMix[0][i] = iSample0 + iSample1; pSampleMix[1][i] = iSample2 + iSample3; pSampleMix[2][i] = iSample2 - iSample3; pSampleMix[3][i] = iSample0 - iSample1; iSatdSum += (WELS_ABS (pSampleMix[0][i]) + WELS_ABS (pSampleMix[1][i]) + WELS_ABS (pSampleMix[2][i]) + WELS_ABS ( pSampleMix[3][i])); } return ((iSatdSum + 1) >> 1); }
int32_t WelsSampleSad4x4_c (uint8_t* pSample1, int32_t iStride1, uint8_t* pSample2, int32_t iStride2) { int32_t iSadSum = 0; int32_t i = 0; uint8_t* pSrc1 = pSample1; uint8_t* pSrc2 = pSample2; for (i = 0; i < 4; i++) { iSadSum += WELS_ABS ((pSrc1[0] - pSrc2[0])); iSadSum += WELS_ABS ((pSrc1[1] - pSrc2[1])); iSadSum += WELS_ABS ((pSrc1[2] - pSrc2[2])); iSadSum += WELS_ABS ((pSrc1[3] - pSrc2[3])); pSrc1 += iStride1; pSrc2 += iStride2; } return iSadSum; }
WELSVP_NAMESPACE_BEGIN int32_t WelsSampleSad8x8_c (uint8_t* pSrcY, int32_t iSrcStrideY, uint8_t* pRefY, int32_t iRefStrideY) { int32_t iSadSum = 0; uint8_t* pSrcA = pSrcY; uint8_t* pSrcB = pRefY; for (int32_t i = 0; i < 8; i++) { iSadSum += WELS_ABS ((pSrcA[0] - pSrcB[0])); iSadSum += WELS_ABS ((pSrcA[1] - pSrcB[1])); iSadSum += WELS_ABS ((pSrcA[2] - pSrcB[2])); iSadSum += WELS_ABS ((pSrcA[3] - pSrcB[3])); iSadSum += WELS_ABS ((pSrcA[4] - pSrcB[4])); iSadSum += WELS_ABS ((pSrcA[5] - pSrcB[5])); iSadSum += WELS_ABS ((pSrcA[6] - pSrcB[6])); iSadSum += WELS_ABS ((pSrcA[7] - pSrcB[7])); pSrcA += iSrcStrideY; pSrcB += iRefStrideY; } return iSadSum; }