openh264/test/encoder/EncUT_ExpandPic.cpp
2014-04-03 10:38:46 +08:00

151 lines
3.9 KiB
C++

#include<gtest/gtest.h>
#include<stdlib.h>
#include "wels_func_ptr_def.h"
#include "expand_pic.h"
using namespace WelsSVCEnc;
TEST(ExpandPicTest, TestExpandPictureLuma_c) {
SWelsFuncPtrList sFuncList;
InitExpandPictureFunc( &sFuncList, 0 );
int32_t iPicW = rand()%256 + 1;
int32_t iPicH = rand()%256 + 1;
int32_t iStride = iPicW + rand()%16 + 1 + PADDING_LENGTH * 2;
const int32_t kiPaddingLen = PADDING_LENGTH;
const int32_t kiMemSize = (iStride+kiPaddingLen*2) * (iPicH+kiPaddingLen*2);
uint8_t *pRef = new uint8_t[kiMemSize];
for(int i=0; i<kiMemSize; i++)
pRef[i] = rand()%256 + 1;
uint8_t *pDst = pRef + kiPaddingLen * iStride + kiPaddingLen;
sFuncList.pfExpandLumaPicture(pDst, iStride, iPicW, iPicH);
int k = 0;
//top and top corner
for (int i=0; i<kiPaddingLen; i++) {
for (int j=0; j<iPicW+2*kiPaddingLen; j++) {
if (j < kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[0]);
} else if (j >= iPicW+kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[iPicW-1]);
} else
EXPECT_EQ(pRef[k+j],pDst[j-kiPaddingLen]);
}
k += iStride;
}
k = (iPicH + kiPaddingLen - 1) * iStride;
//bottom and bottom corner
for (int i=iPicH+kiPaddingLen; i<iPicH+2*kiPaddingLen; i++) {
for (int j=0; j<iPicW+2*kiPaddingLen; j++) {
if (j < kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[(iPicH-1) * iStride]);
} else if (j >= iPicW+kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[(iPicH-1) * iStride+iPicW-1]);
} else
EXPECT_EQ(pRef[k+j],pDst[(iPicH-1) * iStride+j-kiPaddingLen]);
}
k += iStride;
}
k = kiPaddingLen * iStride;
int l = 0;
for (int i=0; i<iPicH-1; i++) { //left
for (int j=0; j<kiPaddingLen; j++) {
EXPECT_EQ(pRef[k+j],pDst[l]);
}
k += iStride;
l += iStride;
}
k = kiPaddingLen * iStride;
l = 0;
for (int i=0; i<iPicH-1; i++) { //right
for (int j=iPicW+kiPaddingLen; j<iPicW+2*kiPaddingLen; j++) {
EXPECT_EQ(pRef[k+j],pDst[l+iPicW-1]);
}
k += iStride;
l += iStride;
}
delete []pRef;
}
TEST(ExpandPicTest, TestExpandPictureChroma_c) {
SWelsFuncPtrList sFuncList;
InitExpandPictureFunc( &sFuncList, 0 );
int32_t iPicW = rand()%256 + 1;
int32_t iPicH = rand()%256 + 1;
const int32_t kiPaddingLen = (PADDING_LENGTH>>1);
int32_t iStride = iPicW + rand()%16 + 1 + kiPaddingLen*2;
const int32_t kiMemSize = (iStride+kiPaddingLen*2) * (iPicH+kiPaddingLen*2);
uint8_t *pRef = new uint8_t[kiMemSize];
for (int i=0; i<kiMemSize; i++)
pRef[i] = rand()%256 + 1;
uint8_t *pDst = pRef + kiPaddingLen * iStride + kiPaddingLen;
sFuncList.pfExpandChromaPicture[0](pDst,iStride, iPicW, iPicH);
int k = 0;
//top and top corner
for (int i=0; i<kiPaddingLen; i++) {
for (int j=0; j<iPicW+2*kiPaddingLen; j++) {
if (j < kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[0]);
} else if (j >= iPicW+kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[iPicW-1]);
} else
EXPECT_EQ(pRef[k+j],pDst[j-kiPaddingLen]);
}
k += iStride;
}
k = (iPicH + kiPaddingLen - 1) * iStride;
//bottom and bottom corner
for (int i=iPicH+kiPaddingLen; i<iPicH+2*kiPaddingLen; i++) {
for (int j=0; j<iPicW+2*kiPaddingLen; j++) {
if (j < kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[(iPicH-1) * iStride]);
} else if (j >= iPicW+kiPaddingLen) {
EXPECT_EQ(pRef[k+j],pDst[(iPicH-1) * iStride + iPicW - 1]);
} else
EXPECT_EQ(pRef[k+j],pDst[(iPicH-1) * iStride + j - kiPaddingLen]);
}
k += iStride;
}
k = kiPaddingLen * iStride;
int l=0;
for (int i=0; i<iPicH-1; i++) { //left
for (int j=0; j<kiPaddingLen; j++) {
EXPECT_EQ(pRef[k+j],pDst[l]);
}
k += iStride;
l += iStride;
}
k = kiPaddingLen * iStride;
l = 0;
for (int i=0; i<iPicH-1; i++) { //right
for (int j=iPicW+kiPaddingLen; j<iPicW+2*kiPaddingLen; j++) {
EXPECT_EQ(pRef[k+j],pDst[l+iPicW-1]);
}
k += iStride;
l += iStride;
}
delete []pRef;
}