Files
third_party_openh264/test/encoder/EncUT_GetIntraPredictor.cpp
T
Martin Storsjö d84d739ec8 Hardwire functions set up in WelsInitFillingPredFuncs
These are never overridden by any assembler optimized versions.
(The assembler optimized intra predictor functions may use such
optimized code internally anyway.)

This avoids global writable data.
2014-07-01 12:00:32 +03:00

557 lines
17 KiB
C++

#include<gtest/gtest.h>
#include<stdlib.h>
#include "get_intra_predictor.h"
#include "ls_defines.h"
#include "macros.h"
using namespace WelsSVCEnc;
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredV) {
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[64];
for (int i = 0; i < 64; i++)
pRef[i] = rand() % 256;
const int32_t kkiStride = 0;
WelsI4x4LumaPredV_c (pPred, pRef, kkiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&pRef[-kkiStride]));
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredH) {
const int32_t kiStride = rand() % 256 + 16;
const uint32_t kiStride2 = (kiStride << 1) - 1;
const uint32_t kiStride3 = kiStride + kiStride2;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[kiStride3 + 2];
for (int i = 0; i < (static_cast<int32_t> (kiStride3 + 2)); i++)
pRef[i] = rand() % 256;
pRef++;
const uint8_t kuiH1 = pRef[-1];
const uint8_t kuiH2 = pRef[kiStride - 1];
const uint8_t kuiH3 = pRef[kiStride2];
const uint8_t kuiH4 = pRef[kiStride3];
const uint8_t kuiV1[4] = {kuiH1, kuiH1, kuiH1, kuiH1};
const uint8_t kuiV2[4] = {kuiH2, kuiH2, kuiH2, kuiH2};
const uint8_t kuiV3[4] = {kuiH3, kuiH3, kuiH3, kuiH3};
const uint8_t kuiV4[4] = {kuiH4, kuiH4, kuiH4, kuiH4};
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
ST32 (&uiV[0], LD32 (kuiV1));
ST32 (&uiV[4], LD32 (kuiV2));
ST32 (&uiV[8], LD32 (kuiV3));
ST32 (&uiV[12], LD32 (kuiV4));
WelsI4x4LumaPredH_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
pRef--;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredDDL) {
const int32_t kiStride = 0;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[64];
for (int i = 0; i < 64; i++)
pRef[i] = rand() % 256;
const uint8_t kuiT0 = pRef[-kiStride];
const uint8_t kuiT1 = pRef[1 - kiStride];
const uint8_t kuiT2 = pRef[2 - kiStride];
const uint8_t kuiT3 = pRef[3 - kiStride];
const uint8_t kuiT4 = pRef[4 - kiStride];
const uint8_t kuiT5 = pRef[5 - kiStride];
const uint8_t kuiT6 = pRef[6 - kiStride];
const uint8_t kuiT7 = pRef[7 - kiStride];
const uint8_t kuiDDL0 = (2 + kuiT0 + kuiT2 + (kuiT1 << 1)) >> 2;
const uint8_t kuiDDL1 = (2 + kuiT1 + kuiT3 + (kuiT2 << 1)) >> 2;
const uint8_t kuiDDL2 = (2 + kuiT2 + kuiT4 + (kuiT3 << 1)) >> 2;
const uint8_t kuiDDL3 = (2 + kuiT3 + kuiT5 + (kuiT4 << 1)) >> 2;
const uint8_t kuiDDL4 = (2 + kuiT4 + kuiT6 + (kuiT5 << 1)) >> 2;
const uint8_t kuiDDL5 = (2 + kuiT5 + kuiT7 + (kuiT6 << 1)) >> 2;
const uint8_t kuiDDL6 = (2 + kuiT6 + kuiT7 + (kuiT7 << 1)) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = kuiDDL0;
uiV[1] = uiV[4] = kuiDDL1;
uiV[2] = uiV[5] = uiV[8] = kuiDDL2;
uiV[3] = uiV[6] = uiV[9] = uiV[12] = kuiDDL3;
uiV[7] = uiV[10] = uiV[13] = kuiDDL4;
uiV[11] = uiV[14] = kuiDDL5;
uiV[15] = kuiDDL6;
WelsI4x4LumaPredDDL_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredDDLTop) {
const int32_t kiStride = 0;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[64];
for (int i = 0; i < 64; i++)
pRef[i] = rand() % 256;
const uint8_t kuiT0 = pRef[-kiStride];
const uint8_t kuiT1 = pRef[1 - kiStride];
const uint8_t kuiT2 = pRef[2 - kiStride];
const uint8_t kuiT3 = pRef[3 - kiStride];
const uint8_t kuiDLT0 = (2 + kuiT0 + kuiT2 + (kuiT1 << 1)) >> 2;
const uint8_t kuiDLT1 = (2 + kuiT1 + kuiT3 + (kuiT2 << 1)) >> 2;
const uint8_t kuiDLT2 = (2 + kuiT2 + kuiT3 + (kuiT3 << 1)) >> 2;
const uint8_t kuiDLT3 = (2 + (kuiT3 << 2)) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
memset (&uiV[6], kuiDLT3, 10 * sizeof (uint8_t));
uiV[0] = kuiDLT0;
uiV[1] = uiV[4] = kuiDLT1;
uiV[2] = uiV[5] = uiV[8] = kuiDLT2;
uiV[3] = kuiDLT3;
WelsI4x4LumaPredDDLTop_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredDDR) {
const int32_t kiStride = rand() % 256 + 16;
const int32_t kiStride2 = kiStride << 1;
const int32_t kiStride3 = kiStride + kiStride2;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[kiStride3 + kiStride + 1];
for (int i = 0; i < kiStride3 + kiStride + 1; i++)
pRef[i] = rand() % 256;
pRef += kiStride + 1;
const uint8_t kuiLT = pRef[-kiStride - 1];
const uint8_t kuiL0 = pRef[-1];
const uint8_t kuiL1 = pRef[kiStride - 1];
const uint8_t kuiL2 = pRef[kiStride2 - 1];
const uint8_t kuiL3 = pRef[kiStride3 - 1];
const uint8_t kuiT0 = pRef[-kiStride];
const uint8_t kuiT1 = pRef[1 - kiStride];
const uint8_t kuiT2 = pRef[2 - kiStride];
const uint8_t kuiT3 = pRef[3 - kiStride];
const uint16_t kuiTL0 = 1 + kuiLT + kuiL0;
const uint16_t kuiLT0 = 1 + kuiLT + kuiT0;
const uint16_t kuiT01 = 1 + kuiT0 + kuiT1;
const uint16_t kuiT12 = 1 + kuiT1 + kuiT2;
const uint16_t kuiT23 = 1 + kuiT2 + kuiT3;
const uint16_t kuiL01 = 1 + kuiL0 + kuiL1;
const uint16_t kuiL12 = 1 + kuiL1 + kuiL2;
const uint16_t kuiL23 = 1 + kuiL2 + kuiL3;
const uint8_t kuiDDR0 = (kuiTL0 + kuiLT0) >> 2;
const uint8_t kuiDDR1 = (kuiLT0 + kuiT01) >> 2;
const uint8_t kuiDDR2 = (kuiT01 + kuiT12) >> 2;
const uint8_t kuiDDR3 = (kuiT12 + kuiT23) >> 2;
const uint8_t kuiDDR4 = (kuiTL0 + kuiL01) >> 2;
const uint8_t kuiDDR5 = (kuiL01 + kuiL12) >> 2;
const uint8_t kuiDDR6 = (kuiL12 + kuiL23) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = uiV[5] = uiV[10] = uiV[15] = kuiDDR0;
uiV[1] = uiV[6] = uiV[11] = kuiDDR1;
uiV[2] = uiV[7] = kuiDDR2;
uiV[3] = kuiDDR3;
uiV[4] = uiV[9] = uiV[14] = kuiDDR4;
uiV[8] = uiV[13] = kuiDDR5;
uiV[12] = kuiDDR6;
WelsI4x4LumaPredDDR_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
pRef -= kiStride + 1;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredVL) {
const int32_t kiStride = 0;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[64];
for (int i = 0; i < 64; i++)
pRef[i] = rand() % 256;
const uint8_t kuiT0 = pRef[-kiStride];
const uint8_t kuiT1 = pRef[1 - kiStride];
const uint8_t kuiT2 = pRef[2 - kiStride];
const uint8_t kuiT3 = pRef[3 - kiStride];
const uint8_t kuiT4 = pRef[4 - kiStride];
const uint8_t kuiT5 = pRef[5 - kiStride];
const uint8_t kuiT6 = pRef[6 - kiStride];
const uint8_t kuiVL0 = (1 + kuiT0 + kuiT1) >> 1;
const uint8_t kuiVL1 = (1 + kuiT1 + kuiT2) >> 1;
const uint8_t kuiVL2 = (1 + kuiT2 + kuiT3) >> 1;
const uint8_t kuiVL3 = (1 + kuiT3 + kuiT4) >> 1;
const uint8_t kuiVL4 = (1 + kuiT4 + kuiT5) >> 1;
const uint8_t kuiVL5 = (2 + kuiT0 + (kuiT1 << 1) + kuiT2) >> 2;
const uint8_t kuiVL6 = (2 + kuiT1 + (kuiT2 << 1) + kuiT3) >> 2;
const uint8_t kuiVL7 = (2 + kuiT2 + (kuiT3 << 1) + kuiT4) >> 2;
const uint8_t kuiVL8 = (2 + kuiT3 + (kuiT4 << 1) + kuiT5) >> 2;
const uint8_t kuiVL9 = (2 + kuiT4 + (kuiT5 << 1) + kuiT6) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = kuiVL0;
uiV[1] = uiV[8] = kuiVL1;
uiV[2] = uiV[9] = kuiVL2;
uiV[3] = uiV[10] = kuiVL3;
uiV[4] = kuiVL5;
uiV[5] = uiV[12] = kuiVL6;
uiV[6] = uiV[13] = kuiVL7;
uiV[7] = uiV[14] = kuiVL8;
uiV[11] = kuiVL4;
uiV[15] = kuiVL9;
WelsI4x4LumaPredVL_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredVLTop) {
const int32_t kiStride = 0;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[64];
for (int i = 0; i < 64; i++)
pRef[i] = rand() % 256;
pRef++;
uint8_t* pTopLeft = &pRef[-kiStride - 1]; // top-left
const uint8_t kuiT0 = * (pTopLeft + 1);
const uint8_t kuiT1 = * (pTopLeft + 2);
const uint8_t kuiT2 = * (pTopLeft + 3);
const uint8_t kuiT3 = * (pTopLeft + 4);
const uint8_t kuiVLT0 = (1 + kuiT0 + kuiT1) >> 1;
const uint8_t kuiVLT1 = (1 + kuiT1 + kuiT2) >> 1;
const uint8_t kuiVLT2 = (1 + kuiT2 + kuiT3) >> 1;
const uint8_t kuiVLT3 = (1 + (kuiT3 << 1)) >> 1;
const uint8_t kuiVLT4 = (2 + kuiT0 + (kuiT1 << 1) + kuiT2) >> 2;
const uint8_t kuiVLT5 = (2 + kuiT1 + (kuiT2 << 1) + kuiT3) >> 2;
const uint8_t kuiVLT6 = (2 + kuiT2 + (kuiT3 << 1) + kuiT3) >> 2;
const uint8_t kuiVLT7 = (2 + (kuiT3 << 2)) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = kuiVLT0;
uiV[1] = uiV[8] = kuiVLT1;
uiV[2] = uiV[9] = kuiVLT2;
uiV[3] = uiV[10] = uiV[11] = kuiVLT3;
uiV[4] = kuiVLT4;
uiV[5] = uiV[12] = kuiVLT5;
uiV[6] = uiV[13] = kuiVLT6;
uiV[7] = uiV[14] = uiV[15] = kuiVLT7;
WelsI4x4LumaPredVLTop_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
pRef--;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredVR) {
const int32_t kiStride = rand() % 256 + 16;
const int32_t kiStride2 = kiStride << 1;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[kiStride2 + kiStride + 1];
for (int i = 0; i < kiStride2 + kiStride + 1; i++)
pRef[i] = rand() % 256;
pRef += kiStride + 1;
const uint8_t kuiLT = pRef[-kiStride - 1]; // top-left
const uint8_t kuiL0 = pRef[-1];
const uint8_t kuiL1 = pRef[kiStride - 1];
const uint8_t kuiL2 = pRef[kiStride2 - 1];
const uint8_t kuiT0 = pRef[-kiStride];
const uint8_t kuiT1 = pRef[1 - kiStride];
const uint8_t kuiT2 = pRef[2 - kiStride];
const uint8_t kuiT3 = pRef[3 - kiStride];
const uint8_t kuiVR0 = (1 + kuiLT + kuiT0) >> 1;
const uint8_t kuiVR1 = (1 + kuiT0 + kuiT1) >> 1;
const uint8_t kuiVR2 = (1 + kuiT1 + kuiT2) >> 1;
const uint8_t kuiVR3 = (1 + kuiT2 + kuiT3) >> 1;
const uint8_t kuiVR4 = (2 + kuiL0 + (kuiLT << 1) + kuiT0) >> 2;
const uint8_t kuiVR5 = (2 + kuiLT + (kuiT0 << 1) + kuiT1) >> 2;
const uint8_t kuiVR6 = (2 + kuiT0 + (kuiT1 << 1) + kuiT2) >> 2;
const uint8_t kuiVR7 = (2 + kuiT1 + (kuiT2 << 1) + kuiT3) >> 2;
const uint8_t kuiVR8 = (2 + kuiLT + (kuiL0 << 1) + kuiL1) >> 2;
const uint8_t kuiVR9 = (2 + kuiL0 + (kuiL1 << 1) + kuiL2) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = uiV[9] = kuiVR0;
uiV[1] = uiV[10] = kuiVR1;
uiV[2] = uiV[11] = kuiVR2;
uiV[3] = kuiVR3;
uiV[4] = uiV[13] = kuiVR4;
uiV[5] = uiV[14] = kuiVR5;
uiV[6] = uiV[15] = kuiVR6;
uiV[7] = kuiVR7;
uiV[8] = kuiVR8;
uiV[12] = kuiVR9;
WelsI4x4LumaPredVR_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
pRef -= kiStride + 1;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredHU) {
const int32_t kiStride = rand() % 256 + 16;
const int32_t kiStride2 = kiStride << 1;
const int32_t kiStride3 = kiStride + kiStride2;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[kiStride3 + 1];
for (int i = 0; i < kiStride3 + 1; i++)
pRef[i] = rand() % 256;
pRef++;
const uint8_t kuiL0 = pRef[-1];
const uint8_t kuiL1 = pRef[kiStride - 1];
const uint8_t kuiL2 = pRef[kiStride2 - 1];
const uint8_t kuiL3 = pRef[kiStride3 - 1];
const uint16_t kuiL01 = (1 + kuiL0 + kuiL1);
const uint16_t kuiL12 = (1 + kuiL1 + kuiL2);
const uint16_t kuiL23 = (1 + kuiL2 + kuiL3);
const uint8_t kuiHU0 = kuiL01 >> 1;
const uint8_t kuiHU1 = (kuiL01 + kuiL12) >> 2;
const uint8_t kuiHU2 = kuiL12 >> 1;
const uint8_t kuiHU3 = (kuiL12 + kuiL23) >> 2;
const uint8_t kuiHU4 = kuiL23 >> 1;
const uint8_t kuiHU5 = (1 + kuiL23 + (kuiL3 << 1)) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = kuiHU0;
uiV[1] = kuiHU1;
uiV[2] = uiV[4] = kuiHU2;
uiV[3] = uiV[5] = kuiHU3;
uiV[6] = uiV[8] = kuiHU4;
uiV[7] = uiV[9] = kuiHU5;
memset (&uiV[10], kuiL3, 6 * sizeof (uint8_t));
WelsI4x4LumaPredHU_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
pRef--;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI4x4LumaPredHD) {
const int32_t kiStride = rand() % 256 + 16;
const int32_t kiStride2 = kiStride << 1;
const int32_t kiStride3 = kiStride + kiStride2;
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[kiStride3 + kiStride + 1];
for (int i = 0; i < kiStride3 + kiStride + 1; i++)
pRef[i] = rand() % 256;
pRef += kiStride + 1;
const uint8_t kuiLT = pRef[-kiStride - 1]; // top-left
const uint8_t kuiL0 = pRef[-1];
const uint8_t kuiL1 = pRef[kiStride - 1];
const uint8_t kuiL2 = pRef[kiStride2 - 1];
const uint8_t kuiL3 = pRef[kiStride3 - 1];
const uint8_t kuiT0 = pRef[-kiStride];
const uint8_t kuiT1 = pRef[1 - kiStride];
const uint8_t kuiT2 = pRef[2 - kiStride];
const uint8_t kuiHD0 = (1 + kuiLT + kuiL0) >> 1;
const uint8_t kuiHD1 = (2 + kuiL0 + (kuiLT << 1) + kuiT0) >> 2;
const uint8_t kuiHD2 = (2 + kuiLT + (kuiT0 << 1) + kuiT1) >> 2;
const uint8_t kuiHD3 = (2 + kuiT0 + (kuiT1 << 1) + kuiT2) >> 2;
const uint8_t kuiHD4 = (1 + kuiL0 + kuiL1) >> 1;
const uint8_t kuiHD5 = (2 + kuiLT + (kuiL0 << 1) + kuiL1) >> 2;
const uint8_t kuiHD6 = (1 + kuiL1 + kuiL2) >> 1;
const uint8_t kuiHD7 = (2 + kuiL0 + (kuiL1 << 1) + kuiL2) >> 2;
const uint8_t kuiHD8 = (1 + kuiL2 + kuiL3) >> 1;
const uint8_t kuiHD9 = (2 + kuiL1 + (kuiL2 << 1) + kuiL3) >> 2;
ENFORCE_STACK_ALIGN_1D (uint8_t, uiV, 16, 16) // TobeCont'd about assign opt as follows
uiV[0] = uiV[6] = kuiHD0;
uiV[1] = uiV[7] = kuiHD1;
uiV[2] = kuiHD2;
uiV[3] = kuiHD3;
uiV[4] = uiV[10] = kuiHD4;
uiV[5] = uiV[11] = kuiHD5;
uiV[8] = uiV[14] = kuiHD6;
uiV[9] = uiV[15] = kuiHD7;
uiV[12] = kuiHD8;
uiV[13] = kuiHD9;
WelsI4x4LumaPredHD_c (pPred, pRef, kiStride);
for (int i = 0; i < 4; i++)
EXPECT_EQ (LD32 (&pPred[4 * i]), LD32 (&uiV[4 * i]));
pRef -= kiStride + 1;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetIChromaPredV) {
uint8_t* pPred = new uint8_t[64];
uint8_t* pRef = new uint8_t[64];
for (int i = 0; i < 64; i++)
pRef[i] = rand() % 256 + 1;
const int32_t kiStride = 0;
WelsIChromaPredV_c (pPred, pRef, kiStride);
for (int i = 0; i < 8; i++)
EXPECT_EQ (LD32 (&pPred[8 * i]), LD32 (&pRef[-kiStride]));
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI16x16LumaPredPlane) {
const int32_t kiStride = rand() % 16 + 16;
int32_t i, j;
uint8_t* pPred = new uint8_t[16 * kiStride];
uint8_t* pRef = new uint8_t[16 * kiStride + 1];
for (i = 0; i < 16 * kiStride + 1; i++)
pRef[i] = rand() % 256 + 1;
pRef += kiStride + 1;
int32_t iA = 0, iB = 0, iC = 0, iH = 0, iV = 0;
uint8_t* pTop = &pRef[-kiStride];
uint8_t* pLeft = &pRef[-1];
int32_t iPredStride = 16;
for (i = 0; i < 8; i++) {
iH += (i + 1) * (pTop[8 + i] - pTop[6 - i]);
iV += (i + 1) * (pLeft[ (8 + i) * kiStride] - pLeft[ (6 - i) * kiStride]);
}
iA = (pLeft[15 * kiStride] + pTop[15]) << 4;
iB = (5 * iH + 32) >> 6;
iC = (5 * iV + 32) >> 6;
WelsI16x16LumaPredPlane_c (pPred, pRef, kiStride);
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
EXPECT_EQ (pPred[j], (uint8_t)WelsClip1 ((iA + iB * (j - 7) + iC * (i - 7) + 16) >> 5));
}
pPred += iPredStride;
}
pRef -= kiStride + 1;
pPred -= (iPredStride * 16);
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI16x16LumaPredDc) {
const int32_t kiStride = rand() % 16 + 16;
int i;
uint8_t* pPred = new uint8_t[256];
uint8_t* pRef = new uint8_t[16 * kiStride];
for (i = 0; i < 16 * kiStride; i++)
pRef[i] = rand() % 256 + 1;
pRef += kiStride;
int32_t iTmp = (kiStride << 4) - kiStride;
int32_t iSum = 0;
i = 15;
uint8_t uiMean = 0;
do {
iSum += pRef[-1 + iTmp] + pRef[-kiStride + i];
iTmp -= kiStride;
} while (i-- > 0);
uiMean = (16 + iSum) >> 5;
WelsI16x16LumaPredDc_c (pPred, pRef, kiStride);
for (i = 0; i < 256; i++)
EXPECT_EQ (pPred[i], uiMean);
pRef -= kiStride;
delete []pRef;
delete []pPred;
}
TEST (GetIntraPredictorTest, TestGetI16x16LumaPredDcTop) {
const int32_t kiStride = rand() % 16 + 16;
int i;
uint8_t* pPred = new uint8_t[256];
uint8_t* pRef = new uint8_t[16 * kiStride];
for (i = 0; i < 16 * kiStride; i++)
pRef[i] = rand() % 256 + 1;
pRef += kiStride;
int32_t iSum = 0;
i = 15;
uint8_t uiMean = 0;
do {
iSum += pRef[-kiStride + i];
} while (i-- > 0);
uiMean = (8 + iSum) >> 4;
WelsI16x16LumaPredDcTop_c (pPred, pRef, kiStride);
for (i = 0; i < 256; i++)
EXPECT_EQ (pPred[i], uiMean);
pRef -= kiStride;
delete []pRef;
delete []pPred;
}