Showing the changes to test/decoder/DecUT_IntraPrediction.cpp (1 of 23 files). Show all
Unified · Split
| @@ -0,0 +1,611 @@ | |||
| 1 | #include<gtest/gtest.h> | ||
| 2 | #include <time.h> | ||
| 3 | #include "../codec/decoder/core/inc/get_intra_predictor.h" | ||
| 4 | #include "typedefs.h" | ||
| 5 | #include "ls_defines.h" | ||
| 6 | using namespace WelsDec; | ||
| 7 | #define GENERATE_4x4_UT(pred, ref) \ | ||
| 8 | TEST(DecoderIntraPredictionTest, pred) { \ | ||
| 9 | const int32_t kiStride = 32; \ | ||
| 10 | int32_t iRunTimes = 1000; \ | ||
| 11 | uint8_t pPredBuffer[9 * kiStride]; \ | ||
| 12 | uint8_t pRefBuffer[9 * kiStride]; \ | ||
| 13 | srand((unsigned int)time(NULL)); \ | ||
| 14 | while(iRunTimes--) {\ | ||
| 15 | for (int i = 0; i < 9; i++) {\ | ||
| 16 | pRefBuffer[i] = pPredBuffer[i] = rand() & 255; \ | ||
| 17 | pRefBuffer[i * kiStride] = pPredBuffer[i * kiStride] = rand() & 255; \ | ||
| 18 | } \ | ||
| 19 | pred (&pPredBuffer[kiStride + 1], kiStride); \ | ||
| 20 | ref (&pRefBuffer[kiStride + 1], kiStride); \ | ||
| 21 | bool ok = true; \ | ||
| 22 | for (int i = 0; i < 4; i++) \ | ||
| 23 | for (int j = 0; j < 4; j++) \ | ||
| 24 | if (pPredBuffer[(i+1) * kiStride + j + 1] != pRefBuffer[(i+1) * kiStride + j + 1]) { \ | ||
| 25 | ok = false; \ | ||
| 26 | break; \ | ||
| 27 | } \ | ||
| 28 | EXPECT_EQ(ok, true);\ | ||
| 29 | } \ | ||
| 30 | } | ||
| 31 | |||
| 32 | #define PREDV(size) \ | ||
| 33 | void LumaI##size##x##size##PredV(uint8_t *pPred, const int32_t kiStride) {\ | ||
| 34 | int i; \ | ||
| 35 | for (i = 0; i < size; i++) {\ | ||
| 36 | memcpy(pPred + i * kiStride, pPred - kiStride, size * sizeof(uint8_t)); \ | ||
| 37 | } \ | ||
| 38 | } | ||
| 39 | |||
| 40 | #define PREDH(size) \ | ||
| 41 | void LumaI##size##x##size##PredH(uint8_t *pPred, const int32_t kiStride) {\ | ||
| 42 | for (int i = 0; i < size; i++) { \ | ||
| 43 | memset(pPred + i * kiStride, pPred[i * kiStride - 1], size * sizeof(uint8_t));\ | ||
| 44 | }\ | ||
| 45 | } | ||
| 46 | |||
| 47 | #define PREDDC(size, log) \ | ||
| 48 | void LumaI##size##x##size##PredDC(uint8_t *pPred, const int32_t kiStride) {\ | ||
| 49 | int iSum = size; \ | ||
| 50 | for (int i = 0; i < size; i ++) \ | ||
| 51 | iSum += pPred[-1 + i * kiStride] + pPred[i - kiStride]; \ | ||
| 52 | uint8_t uiMean = iSum >>(log+1);\ | ||
| 53 | for (int i = 0; i < size; i ++) \ | ||
| 54 | memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \ | ||
| 55 | } | ||
| 56 | |||
| 57 | #define PREDDCLeft(size, log) \ | ||
| 58 | void LumaI##size##x##size##PredDCLeft(uint8_t *pPred, const int32_t kiStride) {\ | ||
| 59 | int iSum = size/2; \ | ||
| 60 | for (int i = 0; i < size; i ++) \ | ||
| 61 | iSum += pPred[-1 + i * kiStride]; \ | ||
| 62 | uint8_t uiMean = iSum >>(log);\ | ||
| 63 | for (int i = 0; i < size; i ++) \ | ||
| 64 | memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \ | ||
| 65 | } | ||
| 66 | |||
| 67 | #define PREDDCTop(size, log) \ | ||
| 68 | void LumaI##size##x##size##PredDCTop(uint8_t *pPred, const int32_t kiStride) {\ | ||
| 69 | int iSum = size/2; \ | ||
| 70 | for (int i = 0; i < size; i ++) \ | ||
| 71 | iSum += pPred[i - kiStride]; \ | ||
| 72 | uint8_t uiMean = iSum >>(log);\ | ||
| 73 | for (int i = 0; i < size; i ++) \ | ||
| 74 | memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \ | ||
| 75 | } | ||
| 76 | |||
| 77 | #define PREDDCNone(size, log) \ | ||
| 78 | void LumaI##size##x##size##PredDCNone(uint8_t *pPred, const int32_t kiStride) {\ | ||
| 79 | uint8_t uiMean = 128;\ | ||
| 80 | for (int i = 0; i < size; i ++) \ | ||
| 81 | memset(pPred + i * kiStride, uiMean, size * sizeof(uint8_t)); \ | ||
| 82 | } | ||
| 83 | |||
| 84 | |||
| 85 | /*down pLeft*/ | ||
| 86 | void WelsI4x4LumaPredDDL_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 87 | const int32_t kiStride2 = kiStride << 1; | ||
| 88 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 89 | /*get pTop*/ | ||
| 90 | uint8_t* ptop = &pPred[-kiStride]; | ||
| 91 | const uint8_t kuiT0 = *ptop; | ||
| 92 | const uint8_t kuiT1 = * (ptop + 1); | ||
| 93 | const uint8_t kuiT2 = * (ptop + 2); | ||
| 94 | const uint8_t kuiT3 = * (ptop + 3); | ||
| 95 | const uint8_t kuiT4 = * (ptop + 4); | ||
| 96 | const uint8_t kuiT5 = * (ptop + 5); | ||
| 97 | const uint8_t kuiT6 = * (ptop + 6); | ||
| 98 | const uint8_t kuiT7 = * (ptop + 7); | ||
| 99 | const uint8_t kuiDDL0 = (2 + kuiT0 + kuiT2 + (kuiT1 << 1)) >> 2; // kDDL0 | ||
| 100 | const uint8_t kuiDDL1 = (2 + kuiT1 + kuiT3 + (kuiT2 << 1)) >> 2; // kDDL1 | ||
| 101 | const uint8_t kuiDDL2 = (2 + kuiT2 + kuiT4 + (kuiT3 << 1)) >> 2; // kDDL2 | ||
| 102 | const uint8_t kuiDDL3 = (2 + kuiT3 + kuiT5 + (kuiT4 << 1)) >> 2; // kDDL3 | ||
| 103 | const uint8_t kuiDDL4 = (2 + kuiT4 + kuiT6 + (kuiT5 << 1)) >> 2; // kDDL4 | ||
| 104 | const uint8_t kuiDDL5 = (2 + kuiT5 + kuiT7 + (kuiT6 << 1)) >> 2; // kDDL5 | ||
| 105 | const uint8_t kuiDDL6 = (2 + kuiT6 + kuiT7 + (kuiT7 << 1)) >> 2; // kDDL6 | ||
| 106 | const uint8_t kuiList[8] = { kuiDDL0, kuiDDL1, kuiDDL2, kuiDDL3, kuiDDL4, kuiDDL5, kuiDDL6, 0 }; | ||
| 107 | |||
| 108 | ST32 (pPred , LD32 (kuiList)); | ||
| 109 | ST32 (pPred + kiStride , LD32 (kuiList + 1)); | ||
| 110 | ST32 (pPred + kiStride2, LD32 (kuiList + 2)); | ||
| 111 | ST32 (pPred + kiStride3, LD32 (kuiList + 3)); | ||
| 112 | } | ||
| 113 | |||
| 114 | /*down pLeft*/ | ||
| 115 | void WelsI4x4LumaPredDDLTop_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 116 | const int32_t kiStride2 = kiStride << 1; | ||
| 117 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 118 | /*get pTop*/ | ||
| 119 | uint8_t* ptop = &pPred[-kiStride]; | ||
| 120 | const uint8_t kuiT0 = *ptop; | ||
| 121 | const uint8_t kuiT1 = * (ptop + 1); | ||
| 122 | const uint8_t kuiT2 = * (ptop + 2); | ||
| 123 | const uint8_t kuiT3 = * (ptop + 3); | ||
| 124 | const uint16_t kuiT01 = 1 + kuiT0 + kuiT1; | ||
| 125 | const uint16_t kuiT12 = 1 + kuiT1 + kuiT2; | ||
| 126 | const uint16_t kuiT23 = 1 + kuiT2 + kuiT3; | ||
| 127 | const uint16_t kuiT33 = 1 + (kuiT3 << 1); | ||
| 128 | const uint8_t kuiDLT0 = (kuiT01 + kuiT12) >> 2; // kDLT0 | ||
| 129 | const uint8_t kuiDLT1 = (kuiT12 + kuiT23) >> 2; // kDLT1 | ||
| 130 | const uint8_t kuiDLT2 = (kuiT23 + kuiT33) >> 2; // kDLT2 | ||
| 131 | const uint8_t kuiDLT3 = kuiT33 >> 1; // kDLT3 | ||
| 132 | const uint8_t kuiList[8] = { kuiDLT0, kuiDLT1, kuiDLT2, kuiDLT3, kuiDLT3, kuiDLT3, kuiDLT3 , kuiDLT3 }; | ||
| 133 | |||
| 134 | ST32 (pPred, LD32 (kuiList)); | ||
| 135 | ST32 (pPred + kiStride, LD32 (kuiList + 1)); | ||
| 136 | ST32 (pPred + kiStride2, LD32 (kuiList + 2)); | ||
| 137 | ST32 (pPred + kiStride3, LD32 (kuiList + 3)); | ||
| 138 | } | ||
| 139 | |||
| 140 | |||
| 141 | /*down right*/ | ||
| 142 | void WelsI4x4LumaPredDDR_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 143 | const int32_t kiStride2 = kiStride << 1; | ||
| 144 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 145 | uint8_t* ptopleft = &pPred[- (kiStride + 1)]; | ||
| 146 | uint8_t* pleft = &pPred[-1]; | ||
| 147 | const uint8_t kuiLT = *ptopleft; | ||
| 148 | /*get pLeft and pTop*/ | ||
| 149 | const uint8_t kuiL0 = *pleft; | ||
| 150 | const uint8_t kuiL1 = * (pleft + kiStride); | ||
| 151 | const uint8_t kuiL2 = * (pleft + kiStride2); | ||
| 152 | const uint8_t kuiL3 = * (pleft + kiStride3); | ||
| 153 | const uint8_t kuiT0 = * (ptopleft + 1); | ||
| 154 | const uint8_t kuiT1 = * (ptopleft + 2); | ||
| 155 | const uint8_t kuiT2 = * (ptopleft + 3); | ||
| 156 | const uint8_t kuiT3 = * (ptopleft + 4); | ||
| 157 | const uint16_t kuiTL0 = 1 + kuiLT + kuiL0; | ||
| 158 | const uint16_t kuiLT0 = 1 + kuiLT + kuiT0; | ||
| 159 | const uint16_t kuiT01 = 1 + kuiT0 + kuiT1; | ||
| 160 | const uint16_t kuiT12 = 1 + kuiT1 + kuiT2; | ||
| 161 | const uint16_t kuiT23 = 1 + kuiT2 + kuiT3; | ||
| 162 | const uint16_t kuiL01 = 1 + kuiL0 + kuiL1; | ||
| 163 | const uint16_t kuiL12 = 1 + kuiL1 + kuiL2; | ||
| 164 | const uint16_t kuiL23 = 1 + kuiL2 + kuiL3; | ||
| 165 | const uint8_t kuiDDR0 = (kuiTL0 + kuiLT0) >> 2; // kuiDDR0 | ||
| 166 | const uint8_t kuiDDR1 = (kuiLT0 + kuiT01) >> 2; // kuiDDR1 | ||
| 167 | const uint8_t kuiDDR2 = (kuiT01 + kuiT12) >> 2; // kuiDDR2 | ||
| 168 | const uint8_t kuiDDR3 = (kuiT12 + kuiT23) >> 2; // kuiDDR3 | ||
| 169 | const uint8_t kuiDDR4 = (kuiTL0 + kuiL01) >> 2; // kuiDDR4 | ||
| 170 | const uint8_t kuiDDR5 = (kuiL01 + kuiL12) >> 2; // kuiDDR5 | ||
| 171 | const uint8_t kuiDDR6 = (kuiL12 + kuiL23) >> 2; // kuiDDR6 | ||
| 172 | const uint8_t kuiList[8] = { kuiDDR6, kuiDDR5, kuiDDR4, kuiDDR0, kuiDDR1, kuiDDR2, kuiDDR3, 0 }; | ||
| 173 | |||
| 174 | ST32 (pPred , LD32 (kuiList + 3)); | ||
| 175 | ST32 (pPred + kiStride , LD32 (kuiList + 2)); | ||
| 176 | ST32 (pPred + kiStride2, LD32 (kuiList + 1)); | ||
| 177 | ST32 (pPred + kiStride3, LD32 (kuiList)); | ||
| 178 | } | ||
| 179 | |||
| 180 | |||
| 181 | /*vertical pLeft*/ | ||
| 182 | void WelsI4x4LumaPredVL_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 183 | const int32_t kiStride2 = kiStride << 1; | ||
| 184 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 185 | uint8_t* ptopleft = &pPred[- (kiStride + 1)]; | ||
| 186 | /*get pTop*/ | ||
| 187 | const uint8_t kuiT0 = * (ptopleft + 1); | ||
| 188 | const uint8_t kuiT1 = * (ptopleft + 2); | ||
| 189 | const uint8_t kuiT2 = * (ptopleft + 3); | ||
| 190 | const uint8_t kuiT3 = * (ptopleft + 4); | ||
| 191 | const uint8_t kuiT4 = * (ptopleft + 5); | ||
| 192 | const uint8_t kuiT5 = * (ptopleft + 6); | ||
| 193 | const uint8_t kuiT6 = * (ptopleft + 7); | ||
| 194 | const uint16_t kuiT01 = 1 + kuiT0 + kuiT1; | ||
| 195 | const uint16_t kuiT12 = 1 + kuiT1 + kuiT2; | ||
| 196 | const uint16_t kuiT23 = 1 + kuiT2 + kuiT3; | ||
| 197 | const uint16_t kuiT34 = 1 + kuiT3 + kuiT4; | ||
| 198 | const uint16_t kuiT45 = 1 + kuiT4 + kuiT5; | ||
| 199 | const uint16_t kuiT56 = 1 + kuiT5 + kuiT6; | ||
| 200 | const uint8_t kuiVL0 = kuiT01 >> 1; // kuiVL0 | ||
| 201 | const uint8_t kuiVL1 = kuiT12 >> 1; // kuiVL1 | ||
| 202 | const uint8_t kuiVL2 = kuiT23 >> 1; // kuiVL2 | ||
| 203 | const uint8_t kuiVL3 = kuiT34 >> 1; // kuiVL3 | ||
| 204 | const uint8_t kuiVL4 = kuiT45 >> 1; // kuiVL4 | ||
| 205 | const uint8_t kuiVL5 = (kuiT01 + kuiT12) >> 2; // kuiVL5 | ||
| 206 | const uint8_t kuiVL6 = (kuiT12 + kuiT23) >> 2; // kuiVL6 | ||
| 207 | const uint8_t kuiVL7 = (kuiT23 + kuiT34) >> 2; // kuiVL7 | ||
| 208 | const uint8_t kuiVL8 = (kuiT34 + kuiT45) >> 2; // kuiVL8 | ||
| 209 | const uint8_t kuiVL9 = (kuiT45 + kuiT56) >> 2; // kuiVL9 | ||
| 210 | const uint8_t kuiList[10] = { kuiVL0, kuiVL1, kuiVL2, kuiVL3, kuiVL4, kuiVL5, kuiVL6, kuiVL7, kuiVL8, kuiVL9 }; | ||
| 211 | |||
| 212 | ST32 (pPred, LD32 (kuiList)); | ||
| 213 | ST32 (pPred + kiStride, LD32 (kuiList + 5)); | ||
| 214 | ST32 (pPred + kiStride2, LD32 (kuiList + 1)); | ||
| 215 | ST32 (pPred + kiStride3, LD32 (kuiList + 6)); | ||
| 216 | } | ||
| 217 | |||
| 218 | /*vertical pLeft*/ | ||
| 219 | void WelsI4x4LumaPredVLTop_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 220 | const int32_t kiStride2 = kiStride << 1; | ||
| 221 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 222 | uint8_t* ptopleft = &pPred[- (kiStride + 1)]; | ||
| 223 | /*get pTop*/ | ||
| 224 | const uint8_t kuiT0 = * (ptopleft + 1); | ||
| 225 | const uint8_t kuiT1 = * (ptopleft + 2); | ||
| 226 | const uint8_t kuiT2 = * (ptopleft + 3); | ||
| 227 | const uint8_t kuiT3 = * (ptopleft + 4); | ||
| 228 | const uint16_t kuiT01 = 1 + kuiT0 + kuiT1; | ||
| 229 | const uint16_t kuiT12 = 1 + kuiT1 + kuiT2; | ||
| 230 | const uint16_t kuiT23 = 1 + kuiT2 + kuiT3; | ||
| 231 | const uint16_t kuiT33 = 1 + (kuiT3 << 1); | ||
| 232 | const uint8_t kuiVL0 = kuiT01 >> 1; | ||
| 233 | const uint8_t kuiVL1 = kuiT12 >> 1; | ||
| 234 | const uint8_t kuiVL2 = kuiT23 >> 1; | ||
| 235 | const uint8_t kuiVL3 = kuiT33 >> 1; | ||
| 236 | const uint8_t kuiVL4 = (kuiT01 + kuiT12) >> 2; | ||
| 237 | const uint8_t kuiVL5 = (kuiT12 + kuiT23) >> 2; | ||
| 238 | const uint8_t kuiVL6 = (kuiT23 + kuiT33) >> 2; | ||
| 239 | const uint8_t kuiVL7 = kuiVL3; | ||
| 240 | const uint8_t kuiList[10] = { kuiVL0, kuiVL1, kuiVL2, kuiVL3, kuiVL3, kuiVL4, kuiVL5, kuiVL6, kuiVL7, kuiVL7 }; | ||
| 241 | |||
| 242 | ST32 (pPred , LD32 (kuiList)); | ||
| 243 | ST32 (pPred + kiStride , LD32 (kuiList + 5)); | ||
| 244 | ST32 (pPred + kiStride2, LD32 (kuiList + 1)); | ||
| 245 | ST32 (pPred + kiStride3, LD32 (kuiList + 6)); | ||
| 246 | } | ||
| 247 | |||
| 248 | |||
| 249 | /*vertical right*/ | ||
| 250 | void WelsI4x4LumaPredVR_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 251 | const int32_t kiStride2 = kiStride << 1; | ||
| 252 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 253 | const uint8_t kuiLT = pPred[-kiStride - 1]; | ||
| 254 | /*get pLeft and pTop*/ | ||
| 255 | const uint8_t kuiL0 = pPred[ -1]; | ||
| 256 | const uint8_t kuiL1 = pPred[kiStride - 1]; | ||
| 257 | const uint8_t kuiL2 = pPred[kiStride2 - 1]; | ||
| 258 | const uint8_t kuiT0 = pPred[ -kiStride]; | ||
| 259 | const uint8_t kuiT1 = pPred[1 - kiStride]; | ||
| 260 | const uint8_t kuiT2 = pPred[2 - kiStride]; | ||
| 261 | const uint8_t kuiT3 = pPred[3 - kiStride]; | ||
| 262 | const uint8_t kuiVR0 = (1 + kuiLT + kuiT0) >> 1; // kuiVR0 | ||
| 263 | const uint8_t kuiVR1 = (1 + kuiT0 + kuiT1) >> 1; // kuiVR1 | ||
| 264 | const uint8_t kuiVR2 = (1 + kuiT1 + kuiT2) >> 1; // kuiVR2 | ||
| 265 | const uint8_t kuiVR3 = (1 + kuiT2 + kuiT3) >> 1; // kuiVR3 | ||
| 266 | const uint8_t kuiVR4 = (2 + kuiL0 + (kuiLT << 1) + kuiT0) >> 2; // kuiVR4 | ||
| 267 | const uint8_t kuiVR5 = (2 + kuiLT + (kuiT0 << 1) + kuiT1) >> 2; // kuiVR5 | ||
| 268 | const uint8_t kuiVR6 = (2 + kuiT0 + (kuiT1 << 1) + kuiT2) >> 2; // kuiVR6 | ||
| 269 | const uint8_t kuiVR7 = (2 + kuiT1 + (kuiT2 << 1) + kuiT3) >> 2; // kuiVR7 | ||
| 270 | const uint8_t kuiVR8 = (2 + kuiLT + (kuiL0 << 1) + kuiL1) >> 2; // kuiVR8 | ||
| 271 | const uint8_t kuiVR9 = (2 + kuiL0 + (kuiL1 << 1) + kuiL2) >> 2; // kuiVR9 | ||
| 272 | const uint8_t kuiList[10] = { kuiVR8, kuiVR0, kuiVR1, kuiVR2, kuiVR3, kuiVR9, kuiVR4, kuiVR5, kuiVR6, kuiVR7 }; | ||
| 273 | |||
| 274 | ST32 (pPred , LD32 (kuiList + 1)); | ||
| 275 | ST32 (pPred + kiStride , LD32 (kuiList + 6)); | ||
| 276 | ST32 (pPred + kiStride2, LD32 (kuiList)); | ||
| 277 | ST32 (pPred + kiStride3, LD32 (kuiList + 5)); | ||
| 278 | } | ||
| 279 | |||
| 280 | /*horizontal up*/ | ||
| 281 | void WelsI4x4LumaPredHU_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 282 | const int32_t kiStride2 = kiStride << 1; | ||
| 283 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 284 | /*get pLeft*/ | ||
| 285 | const uint8_t kuiL0 = pPred[ -1]; | ||
| 286 | const uint8_t kuiL1 = pPred[kiStride - 1]; | ||
| 287 | const uint8_t kuiL2 = pPred[kiStride2 - 1]; | ||
| 288 | const uint8_t kuiL3 = pPred[kiStride3 - 1]; | ||
| 289 | const uint16_t kuiL01 = 1 + kuiL0 + kuiL1; | ||
| 290 | const uint16_t kuiL12 = 1 + kuiL1 + kuiL2; | ||
| 291 | const uint16_t kuiL23 = 1 + kuiL2 + kuiL3; | ||
| 292 | const uint8_t kuiHU0 = kuiL01 >> 1; | ||
| 293 | const uint8_t kuiHU1 = (kuiL01 + kuiL12) >> 2; | ||
| 294 | const uint8_t kuiHU2 = kuiL12 >> 1; | ||
| 295 | const uint8_t kuiHU3 = (kuiL12 + kuiL23) >> 2; | ||
| 296 | const uint8_t kuiHU4 = kuiL23 >> 1; | ||
| 297 | const uint8_t kuiHU5 = (1 + kuiL23 + (kuiL3 << 1)) >> 2; | ||
| 298 | const uint8_t kuiList[10] = { kuiHU0, kuiHU1, kuiHU2, kuiHU3, kuiHU4, kuiHU5, kuiL3, kuiL3, kuiL3, kuiL3 }; | ||
| 299 | |||
| 300 | ST32 (pPred , LD32 (kuiList)); | ||
| 301 | ST32 (pPred + kiStride , LD32 (kuiList + 2)); | ||
| 302 | ST32 (pPred + kiStride2, LD32 (kuiList + 4)); | ||
| 303 | ST32 (pPred + kiStride3, LD32 (kuiList + 6)); | ||
| 304 | } | ||
| 305 | |||
| 306 | /*horizontal down*/ | ||
| 307 | void WelsI4x4LumaPredHD_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 308 | const int32_t kiStride2 = kiStride << 1; | ||
| 309 | const int32_t kiStride3 = kiStride + kiStride2; | ||
| 310 | const uint8_t kuiLT = pPred[- (kiStride + 1)]; | ||
| 311 | /*get pLeft and pTop*/ | ||
| 312 | const uint8_t kuiL0 = pPred[-1 ]; | ||
| 313 | const uint8_t kuiL1 = pPred[-1 + kiStride ]; | ||
| 314 | const uint8_t kuiL2 = pPred[-1 + kiStride2]; | ||
| 315 | const uint8_t kuiL3 = pPred[-1 + kiStride3]; | ||
| 316 | const uint8_t kuiT0 = pPred[-kiStride ]; | ||
| 317 | const uint8_t kuiT1 = pPred[-kiStride + 1 ]; | ||
| 318 | const uint8_t kuiT2 = pPred[-kiStride + 2 ]; | ||
| 319 | const uint16_t kuiTL0 = 1 + kuiLT + kuiL0; | ||
| 320 | const uint16_t kuiLT0 = 1 + kuiLT + kuiT0; | ||
| 321 | const uint16_t kuiT01 = 1 + kuiT0 + kuiT1; | ||
| 322 | const uint16_t kuiT12 = 1 + kuiT1 + kuiT2; | ||
| 323 | const uint16_t kuiL01 = 1 + kuiL0 + kuiL1; | ||
| 324 | const uint16_t kuiL12 = 1 + kuiL1 + kuiL2; | ||
| 325 | const uint16_t kuiL23 = 1 + kuiL2 + kuiL3; | ||
| 326 | const uint8_t kuiHD0 = kuiTL0 >> 1; | ||
| 327 | const uint8_t kuiHD1 = (kuiTL0 + kuiLT0) >> 2; | ||
| 328 | const uint8_t kuiHD2 = (kuiLT0 + kuiT01) >> 2; | ||
| 329 | const uint8_t kuiHD3 = (kuiT01 + kuiT12) >> 2; | ||
| 330 | const uint8_t kuiHD4 = kuiL01 >> 1; | ||
| 331 | const uint8_t kuiHD5 = (kuiTL0 + kuiL01) >> 2; | ||
| 332 | const uint8_t kuiHD6 = kuiL12 >> 1; | ||
| 333 | const uint8_t kuiHD7 = (kuiL01 + kuiL12) >> 2; | ||
| 334 | const uint8_t kuiHD8 = kuiL23 >> 1; | ||
| 335 | const uint8_t kuiHD9 = (kuiL12 + kuiL23) >> 2; | ||
| 336 | const uint8_t kuiList[10] = { kuiHD8, kuiHD9, kuiHD6, kuiHD7, kuiHD4, kuiHD5, kuiHD0, kuiHD1, kuiHD2, kuiHD3 }; | ||
| 337 | |||
| 338 | ST32 (pPred , LD32 (kuiList + 6)); | ||
| 339 | ST32 (pPred + kiStride , LD32 (kuiList + 4)); | ||
| 340 | ST32 (pPred + kiStride2, LD32 (kuiList + 2)); | ||
| 341 | ST32 (pPred + kiStride3, LD32 (kuiList)); | ||
| 342 | } | ||
| 343 | // Unit test for Luma 4x4 cases | ||
| 344 | PREDV (4) | ||
| 345 | GENERATE_4x4_UT (WelsI4x4LumaPredV_c, LumaI4x4PredV) | ||
| 346 | |||
| 347 | PREDH (4) | ||
| 348 | GENERATE_4x4_UT (WelsI4x4LumaPredH_c, LumaI4x4PredH) | ||
| 349 | |||
| 350 | PREDDC (4, 2) | ||
| 351 | GENERATE_4x4_UT (WelsI4x4LumaPredDc_c, LumaI4x4PredDC) | ||
| 352 | |||
| 353 | PREDDCLeft (4, 2) | ||
| 354 | GENERATE_4x4_UT (WelsI4x4LumaPredDcLeft_c, LumaI4x4PredDCLeft) | ||
| 355 | |||
| 356 | PREDDCTop (4, 2) | ||
| 357 | GENERATE_4x4_UT (WelsI4x4LumaPredDcTop_c, LumaI4x4PredDCTop) | ||
| 358 | |||
| 359 | PREDDCNone (4, 2) | ||
| 360 | GENERATE_4x4_UT (WelsI4x4LumaPredDcNA_c, LumaI4x4PredDCNone) | ||
| 361 | GENERATE_4x4_UT (WelsI4x4LumaPredDDL_c, WelsI4x4LumaPredDDL_ref) | ||
| 362 | GENERATE_4x4_UT (WelsI4x4LumaPredDDLTop_c, WelsI4x4LumaPredDDLTop_ref) | ||
| 363 | GENERATE_4x4_UT (WelsI4x4LumaPredDDR_c, WelsI4x4LumaPredDDR_ref) | ||
| 364 | GENERATE_4x4_UT (WelsI4x4LumaPredVR_c, WelsI4x4LumaPredVR_ref) | ||
| 365 | GENERATE_4x4_UT (WelsI4x4LumaPredVL_c, WelsI4x4LumaPredVL_ref) | ||
| 366 | GENERATE_4x4_UT (WelsI4x4LumaPredVLTop_c, WelsI4x4LumaPredVLTop_ref) | ||
| 367 | GENERATE_4x4_UT (WelsI4x4LumaPredHU_c, WelsI4x4LumaPredHU_ref) | ||
| 368 | GENERATE_4x4_UT (WelsI4x4LumaPredHD_c, WelsI4x4LumaPredHD_ref) | ||
| 369 | |||
| 370 | #define GENERATE_8x8_UT(pred, ref) \ | ||
| 371 | TEST(DecoderIntraPredictionTest, pred) {\ | ||
| 372 | const int32_t kiStride = 32; \ | ||
| 373 | int iRunTimes = 1000; \ | ||
| 374 | uint8_t _pRefBuffer[18 * kiStride + 64]; \ | ||
| 375 | uint8_t _pPredBuffer[18 * kiStride + 64]; \ | ||
| 376 | uint8_t *pRefBuffer, *pPredBuffer; \ | ||
| 377 | pRefBuffer = (uint8_t*)((((intptr_t)(&_pRefBuffer[31])) >> 4) << 4); \ | ||
| 378 | pPredBuffer = (uint8_t*)((((intptr_t)(&_pPredBuffer[31])) >> 4) << 4); \ | ||
| 379 | srand((unsigned int)time(NULL)); \ | ||
| 380 | while(iRunTimes--) {\ | ||
| 381 | for (int i = 0; i < 17; i ++) {\ | ||
| 382 | pRefBuffer[i] = pPredBuffer[i] = rand() & 255; \ | ||
| 383 | pRefBuffer[i * kiStride - 1] = pPredBuffer[i * kiStride - 1] = rand() & 255; \ | ||
| 384 | }\ | ||
| 385 | pred(&pPredBuffer[kiStride], kiStride); \ | ||
| 386 | ref(&pRefBuffer[kiStride], kiStride); \ | ||
| 387 | bool ok = true; \ | ||
| 388 | for (int i = 0; i < 8; i ++)\ | ||
| 389 | for(int j = 0; j < 8; j ++)\ | ||
| 390 | if (pPredBuffer[(i+1) * kiStride + j] != pRefBuffer[(i+1) * kiStride + j]) {\ | ||
| 391 | ok = false; \ | ||
| 392 | break; \ | ||
| 393 | } \ | ||
| 394 | EXPECT_EQ(ok, true); \ | ||
| 395 | } \ | ||
| 396 | } | ||
| 397 | |||
| 398 | void WelsIChromaPredPlane_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 399 | int32_t a = 0, b = 0, c = 0, H = 0, V = 0; | ||
| 400 | int32_t i, j; | ||
| 401 | uint8_t* pTop = &pPred[-kiStride]; | ||
| 402 | uint8_t* pLeft = &pPred[-1]; | ||
| 403 | |||
| 404 | for (i = 0 ; i < 4 ; i ++) { | ||
| 405 | H += (i + 1) * (pTop[4 + i] - pTop[2 - i]); | ||
| 406 | V += (i + 1) * (pLeft[ (4 + i) * kiStride] - pLeft[ (2 - i) * kiStride]); | ||
| 407 | } | ||
| 408 | |||
| 409 | a = (pLeft[7 * kiStride] + pTop[7]) << 4; | ||
| 410 | b = (17 * H + 16) >> 5; | ||
| 411 | c = (17 * V + 16) >> 5; | ||
| 412 | |||
| 413 | for (i = 0 ; i < 8 ; i ++) { | ||
| 414 | for (j = 0 ; j < 8 ; j ++) { | ||
| 415 | int32_t iTmp = (a + b * (j - 3) + c * (i - 3) + 16) >> 5; | ||
| 416 | pPred[j] = (iTmp < 0) ? 0 : ((iTmp > 255) ? 255 : iTmp); | ||
| 417 | } | ||
| 418 | pPred += kiStride; | ||
| 419 | } | ||
| 420 | } | ||
| 421 | |||
| 422 | |||
| 423 | void WelsIChromaPredDc_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 424 | const int32_t kiL1 = kiStride - 1; | ||
| 425 | const int32_t kiL2 = kiL1 + kiStride; | ||
| 426 | const int32_t kiL3 = kiL2 + kiStride; | ||
| 427 | const int32_t kiL4 = kiL3 + kiStride; | ||
| 428 | const int32_t kiL5 = kiL4 + kiStride; | ||
| 429 | const int32_t kiL6 = kiL5 + kiStride; | ||
| 430 | const int32_t kiL7 = kiL6 + kiStride; | ||
| 431 | /*caculate the kMean value*/ | ||
| 432 | const uint8_t kuiM1 = (pPred[-kiStride] + pPred[1 - kiStride] + pPred[2 - kiStride] + pPred[3 - kiStride] + | ||
| 433 | pPred[-1] + pPred[kiL1] + pPred[kiL2] + pPred[kiL3] + 4) >> 3 ; | ||
| 434 | const uint32_t kuiSum2 = pPred[4 - kiStride] + pPred[5 - kiStride] + pPred[6 - kiStride] + pPred[7 - kiStride]; | ||
| 435 | const uint32_t kuiSum3 = pPred[kiL4] + pPred[kiL5] + pPred[kiL6] + pPred[kiL7]; | ||
| 436 | const uint8_t kuiM2 = (kuiSum2 + 2) >> 2; | ||
| 437 | const uint8_t kuiM3 = (kuiSum3 + 2) >> 2; | ||
| 438 | const uint8_t kuiM4 = (kuiSum2 + kuiSum3 + 4) >> 3; | ||
| 439 | const uint8_t kuiMUP[8] = {kuiM1, kuiM1, kuiM1, kuiM1, kuiM2, kuiM2, kuiM2, kuiM2}; | ||
| 440 | const uint8_t kuiMDown[8] = {kuiM3, kuiM3, kuiM3, kuiM3, kuiM4, kuiM4, kuiM4, kuiM4}; | ||
| 441 | const uint64_t kuiUP64 = LD64 (kuiMUP); | ||
| 442 | const uint64_t kuiDN64 = LD64 (kuiMDown); | ||
| 443 | |||
| 444 | ST64 (pPred , kuiUP64); | ||
| 445 | ST64 (pPred + kiL1 + 1, kuiUP64); | ||
| 446 | ST64 (pPred + kiL2 + 1, kuiUP64); | ||
| 447 | ST64 (pPred + kiL3 + 1, kuiUP64); | ||
| 448 | ST64 (pPred + kiL4 + 1, kuiDN64); | ||
| 449 | ST64 (pPred + kiL5 + 1, kuiDN64); | ||
| 450 | ST64 (pPred + kiL6 + 1, kuiDN64); | ||
| 451 | ST64 (pPred + kiL7 + 1, kuiDN64); | ||
| 452 | } | ||
| 453 | |||
| 454 | void WelsIChromaPredDcLeft_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 455 | const int32_t kiL1 = -1 + kiStride; | ||
| 456 | const int32_t kiL2 = kiL1 + kiStride; | ||
| 457 | const int32_t kiL3 = kiL2 + kiStride; | ||
| 458 | const int32_t kiL4 = kiL3 + kiStride; | ||
| 459 | const int32_t kiL5 = kiL4 + kiStride; | ||
| 460 | const int32_t kiL6 = kiL5 + kiStride; | ||
| 461 | const int32_t kiL7 = kiL6 + kiStride; | ||
| 462 | /*caculate the kMean value*/ | ||
| 463 | const uint8_t kuiMUP = (pPred[-1] + pPred[kiL1] + pPred[kiL2] + pPred[kiL3] + 2) >> 2 ; | ||
| 464 | const uint8_t kuiMDown = (pPred[kiL4] + pPred[kiL5] + pPred[kiL6] + pPred[kiL7] + 2) >> 2; | ||
| 465 | const uint64_t kuiUP64 = 0x0101010101010101ULL * kuiMUP; | ||
| 466 | const uint64_t kuiDN64 = 0x0101010101010101ULL * kuiMDown; | ||
| 467 | |||
| 468 | ST64 (pPred , kuiUP64); | ||
| 469 | ST64 (pPred + kiL1 + 1, kuiUP64); | ||
| 470 | ST64 (pPred + kiL2 + 1, kuiUP64); | ||
| 471 | ST64 (pPred + kiL3 + 1, kuiUP64); | ||
| 472 | ST64 (pPred + kiL4 + 1, kuiDN64); | ||
| 473 | ST64 (pPred + kiL5 + 1, kuiDN64); | ||
| 474 | ST64 (pPred + kiL6 + 1, kuiDN64); | ||
| 475 | ST64 (pPred + kiL7 + 1, kuiDN64); | ||
| 476 | } | ||
| 477 | |||
| 478 | void WelsIChromaPredDcTop_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 479 | int32_t iTmp = (kiStride << 3) - kiStride; | ||
| 480 | /*caculate the kMean value*/ | ||
| 481 | const uint8_t kuiM1 = (pPred[-kiStride] + pPred[1 - kiStride] + pPred[2 - kiStride] + pPred[3 - kiStride] + 2) >> 2; | ||
| 482 | const uint8_t kuiM2 = (pPred[4 - kiStride] + pPred[5 - kiStride] + pPred[6 - kiStride] + pPred[7 - kiStride] + 2) >> | ||
| 483 | 2; | ||
| 484 | const uint8_t kuiM[8] = {kuiM1, kuiM1, kuiM1, kuiM1, kuiM2, kuiM2, kuiM2, kuiM2}; | ||
| 485 | |||
| 486 | uint8_t i = 7; | ||
| 487 | |||
| 488 | do { | ||
| 489 | ST64 (pPred + iTmp, LD64 (kuiM)); | ||
| 490 | |||
| 491 | iTmp -= kiStride; | ||
| 492 | } while (i-- > 0); | ||
| 493 | } | ||
| 494 | PREDV (8) | ||
| 495 | PREDH (8) | ||
| 496 | PREDDCNone (8, 3) | ||
| 497 | GENERATE_8x8_UT (WelsIChromaPredDcNA_c, LumaI8x8PredDCNone) | ||
| 498 | GENERATE_8x8_UT (WelsIChromaPredPlane_c, WelsIChromaPredPlane_ref) | ||
| 499 | GENERATE_8x8_UT (WelsIChromaPredDc_c, WelsIChromaPredDc_ref) | ||
| 500 | GENERATE_8x8_UT (WelsIChromaPredDcTop_c, WelsIChromaPredDcTop_ref) | ||
| 501 | GENERATE_8x8_UT (WelsIChromaPredDcLeft_c, WelsIChromaPredDcLeft_ref) | ||
| 502 | GENERATE_8x8_UT (WelsIChromaPredH_c, LumaI8x8PredH) | ||
| 503 | GENERATE_8x8_UT (WelsIChromaPredV_c, LumaI8x8PredV) | ||
| 504 | #define GENERATE_16x16_UT(pred, ref) \ | ||
| 505 | TEST(DecoderIntraPredictionTest, pred) {\ | ||
| 506 | const int32_t kiStride = 32; \ | ||
| 507 | int32_t iRunTimes = 1000; \ | ||
| 508 | uint8_t _pRefBuffer[18 * kiStride + 64]; \ | ||
| 509 | uint8_t _pPredBuffer[18 * kiStride + 64]; \ | ||
| 510 | uint8_t *pRefBuffer, *pPredBuffer; \ | ||
| 511 | pRefBuffer = (uint8_t*)((((intptr_t)(&_pRefBuffer[31])) >> 4) << 4); \ | ||
| 512 | pPredBuffer = (uint8_t*)((((intptr_t)(&_pPredBuffer[31])) >> 4) << 4); \ | ||
| 513 | srand((unsigned int)time(NULL)); \ | ||
| 514 | while(iRunTimes--) {\ | ||
| 515 | for (int i = 0; i < 17; i ++) {\ | ||
| 516 | pRefBuffer[i] = pPredBuffer[i] = rand() & 255; \ | ||
| 517 | pRefBuffer[i * kiStride - 1] = pPredBuffer[i * kiStride - 1] = rand() & 255; \ | ||
| 518 | }\ | ||
| 519 | pred(&pPredBuffer[kiStride], kiStride); \ | ||
| 520 | ref(&pRefBuffer[kiStride], kiStride); \ | ||
| 521 | bool ok = true; \ | ||
| 522 | for (int i = 0; i < 16; i ++)\ | ||
| 523 | for(int j = 0; j < 16; j ++)\ | ||
| 524 | if (pPredBuffer[(i+1) * kiStride + j] != pRefBuffer[(i+1) * kiStride + j]) {\ | ||
| 525 | ok = false; \ | ||
| 526 | break; \ | ||
| 527 | } \ | ||
| 528 | EXPECT_EQ(ok, true); \ | ||
| 529 | } \ | ||
| 530 | } | ||
| 531 | void WelsI16x16LumaPredPlane_ref (uint8_t* pPred, const int32_t kiStride) { | ||
| 532 | int32_t a = 0, b = 0, c = 0, H = 0, V = 0; | ||
| 533 | int32_t i, j; | ||
| 534 | uint8_t* pTop = &pPred[-kiStride]; | ||
| 535 | uint8_t* pLeft = &pPred[-1]; | ||
| 536 | |||
| 537 | for (i = 0 ; i < 8 ; i ++) { | ||
| 538 | H += (i + 1) * (pTop[8 + i] - pTop[6 - i]); | ||
| 539 | V += (i + 1) * (pLeft[ (8 + i) * kiStride] - pLeft[ (6 - i) * kiStride]); | ||
| 540 | } | ||
| 541 | |||
| 542 | a = (pLeft[15 * kiStride] + pTop[15]) << 4; | ||
| 543 | b = (5 * H + 32) >> 6; | ||
| 544 | c = (5 * V + 32) >> 6; | ||
| 545 | |||
| 546 | for (i = 0 ; i < 16 ; i ++) { | ||
| 547 | for (j = 0 ; j < 16 ; j ++) { | ||
| 548 | int32_t iTmp = (a + b * (j - 7) + c * (i - 7) + 16) >> 5; | ||
| 549 | pPred[j] = (iTmp < 0) ? 0 : ((iTmp > 255) ? 255 : iTmp); | ||
| 550 | } | ||
| 551 | pPred += kiStride; | ||
| 552 | } | ||
| 553 | } | ||
| 554 | |||
| 555 | PREDV (16) | ||
| 556 | PREDH (16) | ||
| 557 | PREDDC (16, 4) | ||
| 558 | PREDDCTop (16, 4) | ||
| 559 | PREDDCLeft (16, 4) | ||
| 560 | PREDDCNone (16, 4) | ||
| 561 | |||
| 562 | GENERATE_16x16_UT (WelsI16x16LumaPredDcNA_c, LumaI16x16PredDCNone) | ||
| 563 | GENERATE_16x16_UT (WelsI16x16LumaPredPlane_c, WelsI16x16LumaPredPlane_ref) | ||
| 564 | GENERATE_16x16_UT (WelsI16x16LumaPredDcLeft_c, LumaI16x16PredDCLeft) | ||
| 565 | GENERATE_16x16_UT (WelsI16x16LumaPredDcTop_c, LumaI16x16PredDCTop) | ||
| 566 | GENERATE_16x16_UT (WelsI16x16LumaPredDc_c, LumaI16x16PredDC) | ||
| 567 | GENERATE_16x16_UT (WelsI16x16LumaPredH_c, LumaI16x16PredH) | ||
| 568 | GENERATE_16x16_UT (WelsI16x16LumaPredV_c, LumaI16x16PredV) | ||
| 569 | #if defined(X86_ASM) | ||
| 570 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredH_sse2, LumaI4x4PredH) | ||
| 571 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDR_mmx, WelsI4x4LumaPredDDR_ref) | ||
| 572 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHD_mmx, WelsI4x4LumaPredHD_ref) | ||
| 573 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHU_mmx, WelsI4x4LumaPredHU_ref) | ||
| 574 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVR_mmx, WelsI4x4LumaPredVR_ref) | ||
| 575 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDL_mmx, WelsI4x4LumaPredDDL_ref) | ||
| 576 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVL_mmx, WelsI4x4LumaPredVL_ref) | ||
| 577 | GENERATE_8x8_UT (WelsDecoderIChromaPredDcTop_sse2, WelsIChromaPredDcTop_ref) | ||
| 578 | GENERATE_8x8_UT (WelsDecoderIChromaPredDc_sse2, WelsIChromaPredDc_ref) | ||
| 579 | GENERATE_8x8_UT (WelsDecoderIChromaPredPlane_sse2, WelsIChromaPredPlane_ref) | ||
| 580 | GENERATE_8x8_UT (WelsDecoderIChromaPredH_mmx, LumaI8x8PredH) | ||
| 581 | GENERATE_8x8_UT (WelsDecoderIChromaPredV_mmx, LumaI8x8PredV) | ||
| 582 | GENERATE_8x8_UT (WelsDecoderIChromaPredDcLeft_mmx, WelsIChromaPredDcLeft_ref) | ||
| 583 | GENERATE_8x8_UT (WelsDecoderIChromaPredDcNA_mmx, LumaI8x8PredDCNone) | ||
| 584 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredPlane_sse2, WelsI16x16LumaPredPlane_ref) | ||
| 585 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredH_sse2, LumaI16x16PredH) | ||
| 586 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredV_sse2, LumaI16x16PredV) | ||
| 587 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDc_sse2, LumaI16x16PredDC) | ||
| 588 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDcTop_sse2, LumaI16x16PredDCTop) | ||
| 589 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDcNA_sse2, LumaI16x16PredDCNone) | ||
| 590 | #endif | ||
| 591 | |||
| 592 | #if defined(HAVE_NEON) | ||
| 593 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredV_neon, LumaI16x16PredV) | ||
| 594 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredH_neon, LumaI16x16PredH) | ||
| 595 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredDc_neon, LumaI16x16PredDC) | ||
| 596 | GENERATE_16x16_UT (WelsDecoderI16x16LumaPredPlane_neon, WelsI16x16LumaPredPlane_ref) | ||
| 597 | |||
| 598 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredV_neon, LumaI4x4PredV) | ||
| 599 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredH_neon, LumaI4x4PredH) | ||
| 600 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDL_neon, WelsI4x4LumaPredDDL_ref) | ||
| 601 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredDDR_neon, WelsI4x4LumaPredDDR_ref) | ||
| 602 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVL_neon, WelsI4x4LumaPredVL_ref) | ||
| 603 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredVR_neon, WelsI4x4LumaPredVR_ref) | ||
| 604 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHU_neon, WelsI4x4LumaPredHU_ref) | ||
| 605 | GENERATE_4x4_UT (WelsDecoderI4x4LumaPredHD_neon, WelsI4x4LumaPredHD_ref) | ||
| 606 | |||
| 607 | GENERATE_8x8_UT (WelsDecoderIChromaPredV_neon, LumaI8x8PredV) | ||
| 608 | GENERATE_8x8_UT (WelsDecoderIChromaPredH_neon, LumaI8x8PredH) | ||
| 609 | GENERATE_8x8_UT (WelsDecoderIChromaPredDc_neon, WelsIChromaPredDc_ref) | ||
| 610 | GENERATE_8x8_UT (WelsDecoderIChromaPredPlane_neon, WelsIChromaPredPlane_ref) | ||
| 611 | #endif | ||