#include <gtest/gtest.h>#include <math.h>#include <string.h>#include "cpu.h"#include "cpu_core.h"#include "util.h"#include "macros.h"#include "IWelsVP.h"#include "AdaptiveQuantization.h" using namespace nsWelsVP; static void FillWithRandomData (uint8_t* p, int32_t Len) { for (int32_t i = 0; i < Len; i++) { p[i] = rand() % 256; }} void SampleVariance16x16_ref (uint8_t* pRefY, int32_t iRefStride, uint8_t* pSrcY, int32_t iSrcStride, SMotionTextureUnit* pMotionTexture) { uint32_t uiCurSquare = 0, uiSquare = 0; uint16_t uiCurSum = 0, uiSum = 0; for (int32_t y = 0; y < MB_WIDTH_LUMA; y++) { for (int32_t x = 0; x < MB_WIDTH_LUMA; x++) { uint32_t uiDiff = WELS_ABS (pRefY[x] - pSrcY[x]); uiSum += uiDiff; uiSquare += uiDiff * uiDiff; uiCurSum += pSrcY[x]; uiCurSquare += pSrcY[x] * pSrcY[x]; } pRefY += iRefStride; pSrcY += iSrcStride; } uiSum = uiSum >> 8; pMotionTexture->uiMotionIndex = (uiSquare >> 8) - (uiSum * uiSum); uiCurSum = uiCurSum >> 8; pMotionTexture->uiTextureIndex = (uiCurSquare >> 8) - (uiCurSum * uiCurSum);} #define GENERATE_AQTEST(method) \TEST (AdaptiveQuantization, method) {\ ENFORCE_STACK_ALIGN_1D (uint8_t, pRefY,32*16,16)\ ENFORCE_STACK_ALIGN_1D (uint8_t, pSrcY,48*16,16)\ SMotionTextureUnit pMotionTexture[2];\ FillWithRandomData (pRefY,32*16);\ FillWithRandomData (pSrcY,48*16);\ SampleVariance16x16_ref (pRefY,32,pSrcY,48,&pMotionTexture[0]);\ method(pRefY,32,pSrcY,48,&pMotionTexture[1]);\ ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\ ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\ memset (pRefY,0,32*16);\ memset (pSrcY,255,48*16);\ SampleVariance16x16_ref (pRefY,32,pSrcY,48,&pMotionTexture[0]);\ method(pRefY,32,pSrcY,48,&pMotionTexture[1]);\ ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\ ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\} GENERATE_AQTEST (SampleVariance16x16_c)#if defined(X86_ASM)GENERATE_AQTEST (SampleVariance16x16_sse2)#endif #if defined(HAVE_NEON)GENERATE_AQTEST (SampleVariance16x16_neon)#endif #if defined(HAVE_NEON_AARCH64)GENERATE_AQTEST (SampleVariance16x16_AArch64_neon)#endif
#include <gtest/gtest.h>
#include <math.h>
#include <string.h>
#include "cpu.h"
#include "cpu_core.h"
#include "util.h"
#include "macros.h"
#include "IWelsVP.h"
#include "AdaptiveQuantization.h"
using namespace nsWelsVP;
static void FillWithRandomData (uint8_t* p, int32_t Len) {
for (int32_t i = 0; i < Len; i++) {
p[i] = rand() % 256;
}
}
void SampleVariance16x16_ref (uint8_t* pRefY, int32_t iRefStride, uint8_t* pSrcY, int32_t iSrcStride,
SMotionTextureUnit* pMotionTexture) {
uint32_t uiCurSquare = 0, uiSquare = 0;
uint16_t uiCurSum = 0, uiSum = 0;
for (int32_t y = 0; y < MB_WIDTH_LUMA; y++) {
for (int32_t x = 0; x < MB_WIDTH_LUMA; x++) {
uint32_t uiDiff = WELS_ABS (pRefY[x] - pSrcY[x]);
uiSum += uiDiff;
uiSquare += uiDiff * uiDiff;
uiCurSum += pSrcY[x];
uiCurSquare += pSrcY[x] * pSrcY[x];
}
pRefY += iRefStride;
pSrcY += iSrcStride;
}
uiSum = uiSum >> 8;
pMotionTexture->uiMotionIndex = (uiSquare >> 8) - (uiSum * uiSum);
uiCurSum = uiCurSum >> 8;
pMotionTexture->uiTextureIndex = (uiCurSquare >> 8) - (uiCurSum * uiCurSum);
}
#define GENERATE_AQTEST(method) \
TEST (AdaptiveQuantization, method) {\
ENFORCE_STACK_ALIGN_1D (uint8_t, pRefY,32*16,16)\
ENFORCE_STACK_ALIGN_1D (uint8_t, pSrcY,48*16,16)\
SMotionTextureUnit pMotionTexture[2];\
FillWithRandomData (pRefY,32*16);\
FillWithRandomData (pSrcY,48*16);\
SampleVariance16x16_ref (pRefY,32,pSrcY,48,&pMotionTexture[0]);\
method(pRefY,32,pSrcY,48,&pMotionTexture[1]);\
ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\
ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\
memset (pRefY,0,32*16);\
memset (pSrcY,255,48*16);\
SampleVariance16x16_ref (pRefY,32,pSrcY,48,&pMotionTexture[0]);\
method(pRefY,32,pSrcY,48,&pMotionTexture[1]);\
ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\
ASSERT_EQ(pMotionTexture[0].uiMotionIndex,pMotionTexture[1].uiMotionIndex);\
}
GENERATE_AQTEST (SampleVariance16x16_c)
#if defined(X86_ASM)
GENERATE_AQTEST (SampleVariance16x16_sse2)
#endif
#if defined(HAVE_NEON)
GENERATE_AQTEST (SampleVariance16x16_neon)
#endif
#if defined(HAVE_NEON_AARCH64)
GENERATE_AQTEST (SampleVariance16x16_AArch64_neon)
#endif