Showing the changes to test/encoder/EncUT_EncoderMbAux.cpp (1 of 1 file). Show all
Unified · Split
| @@ -3,6 +3,8 @@ · 2 unmodified lines | ||
| 3 | 3 | #include "ls_defines.h" |
| 4 | 4 | #include "encode_mb_aux.h" |
| 5 | 5 | #include "wels_common_basis.h" |
| 6 | +#include <algorithm> | |
| 7 | +#include <cstddef> | |
| 6 | 8 | |
| 7 | 9 | using namespace WelsEnc; |
| 8 | 10 | |
| @@ -293,21 +295,92 @@ TEST (EncodeMbAuxTest, WelsGetNoneZeroCount_sse2) { · 284 unmodified lines | ||
| 293 | 295 | #define NEW_QUANT(pDct, ff, mf) (((ff)+ WELS_ABS_LC(pDct))*(mf)) >>16 |
| 294 | 296 | #define WELS_NEW_QUANT(pDct,ff,mf) WELS_ABS_LC(NEW_QUANT(pDct, ff, mf)) |
| 295 | 297 | namespace { |
| 298 | +int16_t WelsQuant4x4MaxAnchor (int16_t* pDct, int16_t* ff, int16_t* mf) { | |
| 299 | + int16_t max_abs = 0; | |
| 300 | + for (int i = 0; i < 16; i++) { | |
| 301 | + const int j = i & 0x07; | |
| 302 | + const int32_t sign = WELS_SIGN (pDct[i]); | |
| 303 | + pDct[i] = NEW_QUANT (pDct[i], ff[j], mf[j]); | |
| 304 | + max_abs = std::max(max_abs, pDct[i]); | |
| 305 | + pDct[i] = WELS_ABS_LC (pDct[i]); | |
| 306 | + } | |
| 307 | + return max_abs; | |
| 308 | +} | |
| 309 | +void WelsQuant4x4DcAnchor (int16_t* pDct, int16_t iFF, int16_t iMF) { | |
| 310 | + for (int i = 0; i < 16; i++) { | |
| 311 | + const int32_t sign = WELS_SIGN (pDct[i]); | |
| 312 | + pDct[i] = WELS_NEW_QUANT (pDct[i], iFF, iMF); | |
| 313 | + } | |
| 314 | +} | |
| 315 | +void WelsQuantFour4x4Anchor (int16_t* pDct, int16_t* ff, int16_t* mf) { | |
| 316 | + for (int i = 0; i < 4; i++) | |
| 317 | + WelsQuant4x4MaxAnchor (pDct + 16 * i, ff, mf); | |
| 318 | +} | |
| 296 | 319 | void WelsQuantFour4x4MaxAnchor (int16_t* pDct, int16_t* ff, int16_t* mf, int16_t* max) { |
| 297 | − int32_t i, j, k, sign; | |
| 298 | − int16_t max_abs; | |
| 299 | − for (k = 0; k < 4; k++) { | |
| 300 | − max_abs = 0; | |
| 301 | − for (i = 0; i < 16; i++) { | |
| 302 | − j = i & 0x07; | |
| 303 | − sign = WELS_SIGN (pDct[i]); | |
| 304 | − pDct[i] = NEW_QUANT (pDct[i], ff[j], mf[j]); | |
| 305 | − if (max_abs < pDct[i]) max_abs = pDct[i]; | |
| 306 | − pDct[i] = WELS_ABS_LC (pDct[i]); | |
| 307 | − } | |
| 308 | − pDct += 16; | |
| 309 | − max[k] = max_abs; | |
| 320 | + for (int i = 0; i < 4; i++) | |
| 321 | + max[i] = WelsQuant4x4MaxAnchor (pDct + 16 * i, ff, mf); | |
| 322 | +} | |
| 323 | +void TestWelsQuant4x4 (PQuantizationFunc func) { | |
| 324 | + const std::size_t f_size = 8; | |
| 325 | + const std::size_t dct_size = 16; | |
| 326 | + CMemoryAlign cMemoryAlign (0); | |
| 327 | + ALLOC_MEMORY (int16_t, ff, f_size); | |
| 328 | + ALLOC_MEMORY (int16_t, mf, f_size); | |
| 329 | + ALLOC_MEMORY (int16_t, iDctC, dct_size); | |
| 330 | + ALLOC_MEMORY (int16_t, iDctS, dct_size); | |
| 331 | + for (std::size_t i = 0; i < f_size; i++) { | |
| 332 | + ff[i] = rand() & 32767; | |
| 333 | + mf[i] = rand() & 32767; | |
| 310 | 334 | } |
| 335 | + for (std::size_t i = 0; i < dct_size; i++) | |
| 336 | + iDctC[i] = iDctS[i] = (rand() & 65535) - 32768; | |
| 337 | + WelsQuant4x4MaxAnchor (iDctC, ff, mf); | |
| 338 | + func (iDctS, ff, mf); | |
| 339 | + for (std::size_t i = 0; i < dct_size; i++) | |
| 340 | + EXPECT_EQ (iDctC[i], iDctS[i]); | |
| 341 | + FREE_MEMORY (ff); | |
| 342 | + FREE_MEMORY (mf); | |
| 343 | + FREE_MEMORY (iDctC); | |
| 344 | + FREE_MEMORY (iDctS); | |
| 345 | +} | |
| 346 | +void TestWelsQuant4x4Dc (PQuantizationDcFunc func) { | |
| 347 | + const std::size_t dct_size = 16; | |
| 348 | + const int16_t ff = rand() & 32767; | |
| 349 | + const int16_t mf = rand() & 32767; | |
| 350 | + CMemoryAlign cMemoryAlign (0); | |
| 351 | + ALLOC_MEMORY (int16_t, iDctC, dct_size); | |
| 352 | + ALLOC_MEMORY (int16_t, iDctS, dct_size); | |
| 353 | + for (std::size_t i = 0; i < dct_size; i++) | |
| 354 | + iDctC[i] = iDctS[i] = (rand() & 65535) - 32768; | |
| 355 | + WelsQuant4x4DcAnchor (iDctC, ff, mf); | |
| 356 | + func (iDctS, ff, mf); | |
| 357 | + for (std::size_t i = 0; i < dct_size; i++) | |
| 358 | + EXPECT_EQ (iDctC[i], iDctS[i]); | |
| 359 | + FREE_MEMORY (iDctC); | |
| 360 | + FREE_MEMORY (iDctS); | |
| 361 | +} | |
| 362 | +void TestWelsQuantFour4x4 (PQuantizationFunc func) { | |
| 363 | + const std::size_t f_size = 8; | |
| 364 | + const std::size_t dct_size = 4 * 16; | |
| 365 | + CMemoryAlign cMemoryAlign (0); | |
| 366 | + ALLOC_MEMORY (int16_t, ff, f_size); | |
| 367 | + ALLOC_MEMORY (int16_t, mf, f_size); | |
| 368 | + ALLOC_MEMORY (int16_t, iDctC, dct_size); | |
| 369 | + ALLOC_MEMORY (int16_t, iDctS, dct_size); | |
| 370 | + for (std::size_t i = 0; i < f_size; i++) { | |
| 371 | + ff[i] = rand() & 32767; | |
| 372 | + mf[i] = rand() & 32767; | |
| 373 | + } | |
| 374 | + for (std::size_t i = 0; i < dct_size; i++) | |
| 375 | + iDctC[i] = iDctS[i] = (rand() & 65535) - 32768; | |
| 376 | + WelsQuantFour4x4Anchor (iDctC, ff, mf); | |
| 377 | + func (iDctS, ff, mf); | |
| 378 | + for (std::size_t i = 0; i < dct_size; i++) | |
| 379 | + EXPECT_EQ (iDctC[i], iDctS[i]); | |
| 380 | + FREE_MEMORY (ff); | |
| 381 | + FREE_MEMORY (mf); | |
| 382 | + FREE_MEMORY (iDctC); | |
| 383 | + FREE_MEMORY (iDctS); | |
| 311 | 384 | } |
| 312 | 385 | void TestWelsQuantFour4x4Max (PQuantizationMaxFunc func) { |
| 313 | 386 | CMemoryAlign cMemoryAlign (0); |
| @@ -337,10 +410,28 @@ void TestWelsQuantFour4x4Max (PQuantizationMaxFunc func) { · 23 unmodified lines | ||
| 337 | 410 | FREE_MEMORY (iMaxS); |
| 338 | 411 | } |
| 339 | 412 | } // anon ns |
| 413 | +TEST (EncodeMbAuxTest, WelsQuant4x4_c) { | |
| 414 | + TestWelsQuant4x4 (WelsQuant4x4_c); | |
| 415 | +} | |
| 416 | +TEST (EncodeMbAuxTest, WelsQuant4x4Dc_c) { | |
| 417 | + TestWelsQuant4x4Dc (WelsQuant4x4Dc_c); | |
| 418 | +} | |
| 419 | +TEST (EncodeMbAuxTest, WelsQuantFour4x4_c) { | |
| 420 | + TestWelsQuantFour4x4 (WelsQuantFour4x4_c); | |
| 421 | +} | |
| 340 | 422 | TEST (EncodeMbAuxTest, WelsQuantFour4x4Max_c) { |
| 341 | 423 | TestWelsQuantFour4x4Max (WelsQuantFour4x4Max_c); |
| 342 | 424 | } |
| 343 | 425 | #ifdef X86_ASM |
| 426 | +TEST (EncodeMbAuxTest, WelsQuant4x4_sse2) { | |
| 427 | + TestWelsQuant4x4 (WelsQuant4x4_sse2); | |
| 428 | +} | |
| 429 | +TEST (EncodeMbAuxTest, WelsQuant4x4Dc_sse2) { | |
| 430 | + TestWelsQuant4x4Dc (WelsQuant4x4Dc_sse2); | |
| 431 | +} | |
| 432 | +TEST (EncodeMbAuxTest, WelsQuantFour4x4_sse2) { | |
| 433 | + TestWelsQuantFour4x4 (WelsQuantFour4x4_sse2); | |
| 434 | +} | |
| 344 | 435 | TEST (EncodeMbAuxTest, WelsQuantFour4x4Max_sse2) { |
| 345 | 436 | TestWelsQuantFour4x4Max (WelsQuantFour4x4Max_sse2); |
| 346 | 437 | } |