04ca4ba488
Since this is on by default now, we don't need a separate test that has it enabled. Thus we can now remove one of the encoder tests. By not overriding the deblocking setting at all, the hash changes for the other tests that use SEncParamExt.
104 lines
3.2 KiB
C++
104 lines
3.2 KiB
C++
#include <fstream>
|
|
#include <gtest/gtest.h>
|
|
#include "codec_def.h"
|
|
#include "utils/BufferedData.h"
|
|
#include "utils/FileInputStream.h"
|
|
#include "BaseEncoderTest.h"
|
|
|
|
static int InitWithParam(ISVCEncoder* encoder, int width,
|
|
int height, float frameRate, SliceModeEnum sliceMode, bool denoise, int layers) {
|
|
if (SM_SINGLE_SLICE == sliceMode && !denoise && layers == 1) {
|
|
SEncParamBase param;
|
|
memset (¶m, 0, sizeof(SEncParamBase));
|
|
|
|
param.fMaxFrameRate = frameRate;
|
|
param.iPicWidth = width;
|
|
param.iPicHeight = height;
|
|
param.iTargetBitrate = 5000000;
|
|
param.iInputCsp = videoFormatI420;
|
|
|
|
return encoder->Initialize(¶m);
|
|
} else {
|
|
SEncParamExt param;
|
|
encoder->GetDefaultParams(¶m);
|
|
|
|
param.fMaxFrameRate = frameRate;
|
|
param.iPicWidth = width;
|
|
param.iPicHeight = height;
|
|
param.iTargetBitrate = 5000000;
|
|
param.iInputCsp = videoFormatI420;
|
|
param.bEnableDenoise = denoise;
|
|
param.iSpatialLayerNum = layers;
|
|
|
|
if (sliceMode != SM_SINGLE_SLICE)
|
|
param.iMultipleThreadIdc = 2;
|
|
|
|
for (int i = 0; i < param.iSpatialLayerNum; i++) {
|
|
param.sSpatialLayers[i].iVideoWidth = width >> (param.iSpatialLayerNum - 1 - i);
|
|
param.sSpatialLayers[i].iVideoHeight = height >> (param.iSpatialLayerNum - 1 - i);
|
|
param.sSpatialLayers[i].fFrameRate = frameRate;
|
|
param.sSpatialLayers[i].iSpatialBitrate = param.iTargetBitrate;
|
|
|
|
param.sSpatialLayers[i].sSliceCfg.uiSliceMode = sliceMode;
|
|
}
|
|
|
|
return encoder->InitializeExt(¶m);
|
|
}
|
|
}
|
|
|
|
BaseEncoderTest::BaseEncoderTest() : encoder_(NULL) {}
|
|
|
|
void BaseEncoderTest::SetUp() {
|
|
int rv = WelsCreateSVCEncoder(&encoder_);
|
|
ASSERT_EQ(0, rv);
|
|
ASSERT_TRUE(encoder_ != NULL);
|
|
}
|
|
|
|
void BaseEncoderTest::TearDown() {
|
|
if (encoder_) {
|
|
encoder_->Uninitialize();
|
|
WelsDestroySVCEncoder(encoder_);
|
|
}
|
|
}
|
|
|
|
void BaseEncoderTest::EncodeStream(InputStream* in, int width, int height,
|
|
float frameRate, SliceModeEnum slices, bool denoise, int layers, Callback* cbk) {
|
|
int rv = InitWithParam(encoder_, width, height, frameRate, slices, denoise, layers);
|
|
ASSERT_TRUE(rv == cmResultSuccess);
|
|
|
|
// I420: 1(Y) + 1/4(U) + 1/4(V)
|
|
int frameSize = width * height * 3 / 2;
|
|
|
|
BufferedData buf;
|
|
buf.SetLength(frameSize);
|
|
ASSERT_TRUE(buf.Length() == frameSize);
|
|
|
|
SFrameBSInfo info;
|
|
memset(&info, 0, sizeof(SFrameBSInfo));
|
|
|
|
SSourcePicture pic;
|
|
memset(&pic,0,sizeof(SSourcePicture));
|
|
pic.iPicWidth = width;
|
|
pic.iPicHeight = height;
|
|
pic.iColorFormat = videoFormatI420;
|
|
pic.iStride[0] = pic.iPicWidth;
|
|
pic.iStride[1] = pic.iStride[2] = pic.iPicWidth>>1;
|
|
pic.pData[0] = buf.data();
|
|
pic.pData[1] = pic.pData[0] + width *height;
|
|
pic.pData[2] = pic.pData[1] + (width*height>>2);
|
|
while (in->read(buf.data(), frameSize) == frameSize) {
|
|
rv = encoder_->EncodeFrame(&pic, &info);
|
|
ASSERT_TRUE(rv == cmResultSuccess);
|
|
if (info.eOutputFrameType != videoFrameTypeSkip && cbk != NULL) {
|
|
cbk->onEncodeFrame(info);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BaseEncoderTest::EncodeFile(const char* fileName, int width, int height,
|
|
float frameRate, SliceModeEnum slices, bool denoise, int layers, Callback* cbk) {
|
|
FileInputStream fileStream;
|
|
ASSERT_TRUE(fileStream.Open(fileName));
|
|
EncodeStream(&fileStream, width, height, frameRate, slices, denoise, layers, cbk);
|
|
}
|