openh264/test/processing/ProcessUT_AdaptiveQuantization.cpp
2014-07-22 15:07:25 +08:00

77 lines
2.3 KiB
C++

#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