38cc9acdd3
Previously, this test used whatever size was set in m_iWidth and m_iHeight before, which depended on the order that the tests were executed. When this test was the first one executed in the EncoderInterfaceTest, the width and height were set to the max. Instead of having the test behaviour depend on the test order, set a specific size, just as InitializeParamExt and MemoryCheckTest do. This reduces the runtime of TemporalLayerSettingTest from 86 seconds to 26 seconds, when run in valgrind.
551 lines
19 KiB
C++
551 lines
19 KiB
C++
#include <gtest/gtest.h>
|
|
#include <stdlib.h>
|
|
#include "codec_api.h"
|
|
#include "codec_app_def.h"
|
|
#include "test_stdint.h"
|
|
//TODO: consider using BaseEncoderTest class from #include "../BaseEncoderTest.h"
|
|
|
|
class EncoderInterfaceTest : public ::testing::Test {
|
|
#define MB_SIZE (16)
|
|
#define MAX_WIDTH (3840)
|
|
#define MAX_HEIGHT (2160)
|
|
#define VALID_SIZE(iSize) (((iSize)>1)?(iSize):1)
|
|
#define MEM_VARY_SIZE (512)
|
|
#define IMAGE_VARY_SIZE (512)
|
|
#define TEST_FRAMES (30)
|
|
|
|
#define NAL_HEADER_BYTES (4)
|
|
#define NAL_TYPE (0x0F)
|
|
#define SPS_NAL_TYPE (7)
|
|
#define PPS_NAL_TYPE (8)
|
|
#define SUBSETSPS_NAL_TYPE (15)
|
|
#define GET_NAL_TYPE(pNalStart) (*(pNalStart+NAL_HEADER_BYTES) & NAL_TYPE)
|
|
#define IS_PARASET(iNalType) ((iNalType==SPS_NAL_TYPE) || (iNalType==PPS_NAL_TYPE) || (iNalType==SUBSETSPS_NAL_TYPE))
|
|
|
|
public:
|
|
virtual void SetUp() {
|
|
int rv = WelsCreateSVCEncoder (&pPtrEnc);
|
|
ASSERT_EQ (0, rv);
|
|
ASSERT_TRUE (pPtrEnc != NULL);
|
|
|
|
pParamExt = new SEncParamExt();
|
|
ASSERT_TRUE (pParamExt != NULL);
|
|
|
|
pSrcPic = new SSourcePicture;
|
|
ASSERT_TRUE (pSrcPic != NULL);
|
|
|
|
pOption = new SEncParamExt();
|
|
ASSERT_TRUE (pOption != NULL);
|
|
|
|
pYUV = NULL;
|
|
m_iWidth = MAX_WIDTH;
|
|
m_iHeight = MAX_HEIGHT;
|
|
m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
|
|
pYUV = new unsigned char [m_iPicResSize];
|
|
ASSERT_TRUE (pYUV != NULL);
|
|
}
|
|
|
|
virtual void TearDown() {
|
|
delete pParamExt;
|
|
delete pOption;
|
|
delete pSrcPic;
|
|
delete []pYUV;
|
|
if (pPtrEnc) {
|
|
WelsDestroySVCEncoder (pPtrEnc);
|
|
pPtrEnc = NULL;
|
|
}
|
|
}
|
|
|
|
void InitializeParamExt();
|
|
void TemporalLayerSettingTest();
|
|
void MemoryCheckTest();
|
|
void EncodeOneFrame (SEncParamBase* pEncParamBase);
|
|
void PrepareOneSrcFrame();
|
|
void EncodeOneIDRandP (ISVCEncoder* pPtrEnc);
|
|
|
|
public:
|
|
ISVCEncoder* pPtrEnc;
|
|
|
|
SEncParamExt* pParamExt;
|
|
SSourcePicture* pSrcPic;
|
|
SEncParamExt* pOption;
|
|
unsigned char* pYUV;
|
|
|
|
SFrameBSInfo sFbi;
|
|
|
|
int m_iWidth;
|
|
int m_iHeight;
|
|
int m_iPicResSize;
|
|
};
|
|
|
|
void EncoderInterfaceTest::PrepareOneSrcFrame() {
|
|
pSrcPic->iColorFormat = videoFormatI420;
|
|
pSrcPic->uiTimeStamp = 0;
|
|
pSrcPic->iPicWidth = pParamExt->iPicWidth;
|
|
pSrcPic->iPicHeight = pParamExt->iPicHeight;
|
|
|
|
for (int i = 0; i < m_iPicResSize; i++)
|
|
pYUV[i] = rand() % 256;
|
|
|
|
pSrcPic->iStride[0] = m_iWidth;
|
|
pSrcPic->iStride[1] = pSrcPic->iStride[2] = pSrcPic->iStride[0] >> 1;
|
|
|
|
pSrcPic->pData[0] = pYUV;
|
|
pSrcPic->pData[1] = pSrcPic->pData[0] + (m_iWidth * m_iHeight);
|
|
pSrcPic->pData[2] = pSrcPic->pData[1] + (m_iWidth * m_iHeight >> 2);
|
|
|
|
//clean the output
|
|
memset (&sFbi, 0, sizeof (SFrameBSInfo));
|
|
}
|
|
|
|
void EncoderInterfaceTest::EncodeOneFrame (SEncParamBase* pEncParamBase) {
|
|
int iResult;
|
|
iResult = pPtrEnc->Initialize (pEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
PrepareOneSrcFrame();
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
|
|
iResult = pPtrEnc->GetOption (ENCODER_OPTION_SVC_ENCODE_PARAM_BASE, pEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
|
|
pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
void EncoderInterfaceTest::EncodeOneIDRandP (ISVCEncoder* pPtrEnc) {
|
|
int iResult;
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_NE (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
}
|
|
|
|
void EncoderInterfaceTest::InitializeParamExt() {
|
|
pParamExt->iPicWidth = 1280;
|
|
pParamExt->iPicHeight = 720;
|
|
pParamExt->iTargetBitrate = 50000;
|
|
pParamExt->iTemporalLayerNum = 3;
|
|
pParamExt->iSpatialLayerNum = 1;
|
|
pParamExt->sSpatialLayers[0].iVideoHeight = pParamExt->iPicHeight;
|
|
pParamExt->sSpatialLayers[0].iVideoWidth = pParamExt->iPicWidth;
|
|
pParamExt->sSpatialLayers[0].iSpatialBitrate = 50000;
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, TemporalLayerSettingTest) {
|
|
|
|
pParamExt->iPicWidth = 1280;
|
|
pParamExt->iPicHeight = 720;
|
|
m_iWidth = pParamExt->iPicWidth;
|
|
m_iHeight = pParamExt->iPicHeight;
|
|
pParamExt->iTargetBitrate = 60000;
|
|
pParamExt->sSpatialLayers[0].iVideoHeight = pParamExt->iPicHeight;
|
|
pParamExt->sSpatialLayers[0].iVideoWidth = pParamExt->iPicWidth;
|
|
pParamExt->sSpatialLayers[0].iSpatialBitrate = 50000;
|
|
pParamExt->iTemporalLayerNum = 1;
|
|
pParamExt->iSpatialLayerNum = 1;
|
|
|
|
for(int i = 0; i < 2; i++){
|
|
pParamExt->iUsageType = (( i == 0 ) ? SCREEN_CONTENT_REAL_TIME : CAMERA_VIDEO_REAL_TIME);
|
|
int iResult = pPtrEnc->InitializeExt (pParamExt);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
|
|
PrepareOneSrcFrame();
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
|
|
pSrcPic->uiTimeStamp = 30;
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeP));
|
|
|
|
memcpy (pOption, pParamExt, sizeof (SEncParamExt));
|
|
pOption ->iTemporalLayerNum = 4;
|
|
|
|
ENCODER_OPTION eOptionId = ENCODER_OPTION_SVC_ENCODE_PARAM_EXT;
|
|
iResult = pPtrEnc->SetOption (eOptionId, pOption);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
|
|
pSrcPic->uiTimeStamp = 60;
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
|
|
pOption ->iTemporalLayerNum = 2;
|
|
iResult = pPtrEnc->SetOption (eOptionId, pOption);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp = 90;
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeP));
|
|
|
|
pOption ->iTemporalLayerNum = 4;
|
|
iResult = pPtrEnc->SetOption (eOptionId, pOption);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp = 120;
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeP));
|
|
|
|
iResult = pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
InitializeParamExt();
|
|
pParamExt->iUsageType = (rand() % 2) ? SCREEN_CONTENT_REAL_TIME : CAMERA_VIDEO_REAL_TIME;
|
|
pParamExt->iRCMode = (rand() % 2) ? RC_BITRATE_MODE : RC_QUALITY_MODE;
|
|
|
|
int iResult = pPtrEnc->InitializeExt (pParamExt);
|
|
const int kiFrameNumber = TEST_FRAMES;
|
|
|
|
m_iWidth = pParamExt->iPicWidth;
|
|
m_iHeight = pParamExt->iPicHeight;
|
|
m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
|
|
delete []pYUV;
|
|
pYUV = new unsigned char [m_iPicResSize];
|
|
ASSERT_TRUE (pYUV != NULL);
|
|
PrepareOneSrcFrame();
|
|
|
|
ENCODER_OPTION eOptionId = ENCODER_OPTION_SVC_ENCODE_PARAM_EXT;
|
|
memcpy (pOption, pParamExt, sizeof (SEncParamExt));
|
|
|
|
for(int i = 0; i < kiFrameNumber; i ++){
|
|
if ((i%7) == 0){
|
|
if (pOption->iTemporalLayerNum<4){
|
|
pOption->iTemporalLayerNum++;
|
|
} else {
|
|
pOption->iTemporalLayerNum--;
|
|
}
|
|
iResult = pPtrEnc->SetOption (eOptionId, pOption);
|
|
EXPECT_EQ (iResult, static_cast<int32_t> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp += 30;
|
|
}
|
|
|
|
int iStartX = rand() % (m_iPicResSize >> 1);
|
|
int iEndX = (iStartX + (rand() % MEM_VARY_SIZE)) % m_iPicResSize;
|
|
for (int j = iStartX; j < iEndX; j++)
|
|
pYUV[j] = rand() % 256;
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int32_t> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp += 30;
|
|
}
|
|
|
|
iResult = pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, MemoryCheckTest) {
|
|
|
|
InitializeParamExt();
|
|
pParamExt->iPicWidth = 1280;
|
|
pParamExt->iPicHeight = 720;
|
|
|
|
int iResult = pPtrEnc->InitializeExt (pParamExt);
|
|
const int kiFrameNumber = TEST_FRAMES;
|
|
|
|
m_iWidth = pParamExt->iPicWidth;
|
|
m_iHeight = pParamExt->iPicHeight;
|
|
m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
|
|
delete []pYUV;
|
|
pYUV = new unsigned char [m_iPicResSize];
|
|
PrepareOneSrcFrame();
|
|
|
|
for(int i = 0; i < kiFrameNumber; i ++){
|
|
int iStartX = rand() % (m_iPicResSize >> 1);
|
|
int iEndX = (iStartX + (rand() % MEM_VARY_SIZE)) % m_iPicResSize;
|
|
for (int j = iStartX; j < iEndX; j++)
|
|
pYUV[j] = rand() % 256;
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp += 30;
|
|
}
|
|
|
|
pParamExt->iPicWidth += (rand() << 1) % IMAGE_VARY_SIZE;
|
|
pParamExt->iPicHeight += (rand() << 1) % IMAGE_VARY_SIZE;
|
|
m_iWidth = pParamExt->iPicWidth;
|
|
m_iHeight = pParamExt->iPicHeight;
|
|
m_iPicResSize = m_iWidth * m_iHeight * 3 >> 1;
|
|
delete []pYUV;
|
|
pYUV = new unsigned char [m_iPicResSize];
|
|
|
|
iResult = pPtrEnc->InitializeExt (pParamExt);
|
|
PrepareOneSrcFrame();
|
|
|
|
ENCODER_OPTION eOptionId = ENCODER_OPTION_SVC_ENCODE_PARAM_EXT;
|
|
memcpy (pOption, pParamExt, sizeof (SEncParamExt));
|
|
pOption ->iPicWidth = m_iWidth;
|
|
pOption ->iPicHeight = m_iHeight;
|
|
iResult = pPtrEnc->SetOption (eOptionId, pOption);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
|
|
for(int i = 0; i < kiFrameNumber; i ++){
|
|
int iStartX = rand() % (m_iPicResSize >> 1);
|
|
int iEndX = (iStartX + (rand() % MEM_VARY_SIZE)) % m_iPicResSize;
|
|
for (int j = iStartX; j < iEndX; j++)
|
|
pYUV[j] = rand() % 256;
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp += 30;
|
|
}
|
|
|
|
pOption ->iLTRRefNum += rand() % 8 + 1;
|
|
iResult = pPtrEnc->SetOption (eOptionId, pOption);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
|
|
for(int i = 0; i < kiFrameNumber; i ++){
|
|
int iStartX = rand() % (m_iPicResSize >> 1);
|
|
int iEndX = (iStartX + (rand() % MEM_VARY_SIZE)) % m_iPicResSize;
|
|
for (int j = iStartX; j < iEndX; j++)
|
|
pYUV[j] = rand() % 256;
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
pSrcPic->uiTimeStamp += 30;
|
|
}
|
|
|
|
iResult = pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
void GetValidEncParamBase (SEncParamBase* pEncParamBase) {
|
|
pEncParamBase->iUsageType = CAMERA_VIDEO_REAL_TIME;
|
|
pEncParamBase->iPicWidth = 2 + ((rand() % ((MAX_WIDTH >> 1) - 1)) << 1);
|
|
pEncParamBase->iPicHeight = 2 + ((rand() % ((MAX_HEIGHT >> 1) - 1)) << 1);
|
|
pEncParamBase->iPicWidth = VALID_SIZE(pEncParamBase->iPicWidth);
|
|
pEncParamBase->iPicHeight = VALID_SIZE(pEncParamBase->iPicHeight);
|
|
pEncParamBase->iTargetBitrate = rand() + 1; //!=0
|
|
pEncParamBase->iRCMode = RC_BITRATE_MODE; //-1, 0, 1, 2
|
|
pEncParamBase->fMaxFrameRate = rand() + 0.5f; //!=0
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, BasicInitializeTest) {
|
|
SEncParamBase sEncParamBase;
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
|
|
int iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
if (iResult != cmResultSuccess) {
|
|
fprintf (stderr, "Unexpected ParamBase? \
|
|
iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n",
|
|
sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight,
|
|
sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate);
|
|
}
|
|
|
|
PrepareOneSrcFrame();
|
|
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
|
|
iResult = pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, BasicInitializeTestFalse) {
|
|
int iResult;
|
|
SEncParamBase sEncParamBase;
|
|
int uiTraceLevel = WELS_LOG_QUIET;
|
|
|
|
pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
|
|
//iUsageType
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iUsageType = static_cast<EUsageType> (2);
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
//iPicWidth
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iPicWidth = 0;
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iPicWidth = -1;
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
//TODO: add checking max in interface and then enable this checking
|
|
//GetValidEncParamBase(&sEncParamBase);
|
|
//sEncParamBase.iPicWidth = rand()+(MAX_WIDTH+1);
|
|
//iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
//EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
//iPicHeight
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iPicHeight = 0;
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iPicHeight = -1;
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
//TODO: add checking max in interface and then enable this checking
|
|
//GetValidEncParamBase(&sEncParamBase);
|
|
//sEncParamBase.iPicWidth = rand()+(MAX_HEIGHT+1);
|
|
//iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
//EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
//iTargetBitrate
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iTargetBitrate = 0;
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.iTargetBitrate = -1;
|
|
iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmInitParaError));
|
|
|
|
uiTraceLevel = WELS_LOG_ERROR;
|
|
pPtrEnc->SetOption (ENCODER_OPTION_TRACE_LEVEL, &uiTraceLevel);
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, BasicInitializeTestAutoAdjustment) {
|
|
SEncParamBase sEncParamBase;
|
|
|
|
// large fMaxFrameRate
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.fMaxFrameRate = 50000;
|
|
EncodeOneFrame (&sEncParamBase);
|
|
EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0);
|
|
EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0);
|
|
|
|
// fMaxFrameRate = 0
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.fMaxFrameRate = 0;
|
|
EncodeOneFrame (&sEncParamBase);
|
|
EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0);
|
|
EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0);
|
|
|
|
// fMaxFrameRate = -1
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
sEncParamBase.fMaxFrameRate = -1;
|
|
EncodeOneFrame (&sEncParamBase);
|
|
EXPECT_LE (sEncParamBase.fMaxFrameRate, 30.0);
|
|
EXPECT_GE (sEncParamBase.fMaxFrameRate, 1.0);
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, ForceIntraFrame) {
|
|
SEncParamBase sEncParamBase;
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
|
|
int iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
if (iResult != cmResultSuccess) {
|
|
fprintf (stderr, "Unexpected ParamBase? \
|
|
iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n",
|
|
sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight,
|
|
sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate);
|
|
}
|
|
|
|
PrepareOneSrcFrame();
|
|
|
|
bool bIDR = true;
|
|
pPtrEnc->ForceIntraFrame (bIDR);
|
|
EncodeOneIDRandP (pPtrEnc);
|
|
|
|
//call next frame to be IDR
|
|
pPtrEnc->ForceIntraFrame (bIDR);
|
|
EncodeOneIDRandP (pPtrEnc);
|
|
|
|
pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, ForceIntraFrameWithTemporal) {
|
|
SEncParamExt sEncParamExt;
|
|
pPtrEnc->GetDefaultParams (&sEncParamExt);
|
|
sEncParamExt.iUsageType = CAMERA_VIDEO_REAL_TIME;
|
|
sEncParamExt.iPicWidth = MB_SIZE + abs ((rand() * 2) % (MAX_WIDTH - MB_SIZE));
|
|
sEncParamExt.iPicHeight = MB_SIZE + abs ((rand() * 2) % (MAX_HEIGHT - MB_SIZE));
|
|
sEncParamExt.iTargetBitrate = rand() + 1; //!=0
|
|
sEncParamExt.iRCMode = RC_BITRATE_MODE; //-1, 0, 1, 2
|
|
sEncParamExt.fMaxFrameRate = rand() + 0.5f; //!=0
|
|
sEncParamExt.sSpatialLayers[0].iVideoWidth = sEncParamExt.iPicWidth;
|
|
sEncParamExt.sSpatialLayers[0].iVideoHeight = sEncParamExt.iPicHeight;
|
|
sEncParamExt.sSpatialLayers[0].iSpatialBitrate = sEncParamExt.iTargetBitrate;
|
|
|
|
int iTargetTemporalLayerNum = rand() % MAX_TEMPORAL_LAYER_NUM;
|
|
sEncParamExt.iTemporalLayerNum = (iTargetTemporalLayerNum > 2) ? iTargetTemporalLayerNum : 2;
|
|
|
|
int iResult = pPtrEnc->InitializeExt (&sEncParamExt);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
if (iResult != cmResultSuccess) {
|
|
fprintf (stderr, "Unexpected ParamBase? \
|
|
iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n",
|
|
sEncParamExt.iUsageType, sEncParamExt.iPicWidth, sEncParamExt.iPicHeight,
|
|
sEncParamExt.iTargetBitrate, sEncParamExt.iRCMode, sEncParamExt.fMaxFrameRate);
|
|
}
|
|
|
|
PrepareOneSrcFrame();
|
|
|
|
bool bIDR = true;
|
|
EncodeOneIDRandP (pPtrEnc);
|
|
|
|
//call next frame to be IDR
|
|
pPtrEnc->ForceIntraFrame (bIDR);
|
|
EncodeOneIDRandP (pPtrEnc);
|
|
|
|
pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, EncodeParameterSets) {
|
|
SEncParamBase sEncParamBase;
|
|
GetValidEncParamBase (&sEncParamBase);
|
|
|
|
int iResult = pPtrEnc->Initialize (&sEncParamBase);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
if (iResult != cmResultSuccess) {
|
|
fprintf (stderr, "Unexpected ParamBase? \
|
|
iUsageType=%d, Pic=%dx%d, TargetBitrate=%d, iRCMode=%d, fMaxFrameRate=%.1f\n",
|
|
sEncParamBase.iUsageType, sEncParamBase.iPicWidth, sEncParamBase.iPicHeight,
|
|
sEncParamBase.iTargetBitrate, sEncParamBase.iRCMode, sEncParamBase.fMaxFrameRate);
|
|
}
|
|
PrepareOneSrcFrame();
|
|
EncodeOneIDRandP (pPtrEnc);
|
|
|
|
//try EncodeParameterSets
|
|
pPtrEnc->EncodeParameterSets (&sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_EQ (sFbi.eFrameType, static_cast<int> (videoFrameTypeInvalid));
|
|
|
|
//check the result
|
|
int iNalType = 0;
|
|
SLayerBSInfo* pLayerBsInfo;
|
|
for (int i = 0; i < sFbi.iLayerNum; i++) {
|
|
pLayerBsInfo = & (sFbi.sLayerInfo[i]);
|
|
EXPECT_EQ (pLayerBsInfo->uiLayerType , static_cast<int> (NON_VIDEO_CODING_LAYER));
|
|
|
|
iNalType = GET_NAL_TYPE (pLayerBsInfo->pBsBuf);
|
|
EXPECT_EQ (true, IS_PARASET (iNalType));
|
|
for (int j = 0; j < (pLayerBsInfo->iNalCount - 1); j++) {
|
|
iNalType = GET_NAL_TYPE (pLayerBsInfo->pBsBuf + pLayerBsInfo->pNalLengthInByte[j]);
|
|
EXPECT_EQ (true, IS_PARASET (iNalType));
|
|
}
|
|
}
|
|
|
|
//try another P to make sure no impact on succeeding frames
|
|
iResult = pPtrEnc->EncodeFrame (pSrcPic, &sFbi);
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
EXPECT_NE (sFbi.eFrameType, static_cast<int> (videoFrameTypeIDR));
|
|
|
|
iResult = pPtrEnc->Uninitialize();
|
|
EXPECT_EQ (iResult, static_cast<int> (cmResultSuccess));
|
|
}
|
|
|
|
TEST_F (EncoderInterfaceTest, BasicReturnTypeTest) {
|
|
//TODO
|
|
}
|