#include <fstream>#include <gtest/gtest.h>#include "codec_def.h"#include "codec_app_def.h"#include "utils/BufferedData.h"#include "BaseDecoderTest.h" static void ReadFrame(std::ifstream* file, BufferedData* buf) { // start code of a frame is {0, 0, 0, 1} int zeroCount = 0; char b; buf->Clear(); for (;;) { file->read(&b, 1); if (file->gcount() != 1) { // end of file return; } if (!buf->Push(b)) { FAIL() << "unable to allocate memory"; } if (buf->Length() <= 4) { continue; } if (zeroCount < 3) { zeroCount = b != 0 ? 0 : zeroCount + 1; } else { if (b == 1) { if (file->seekg(-4, file->cur).good()) { buf->SetLength(buf->Length() - 4); return; } else { FAIL() << "unable to seek file"; } } else if (b == 0) { zeroCount = 3; } else { zeroCount = 0; } } }} BaseDecoderTest::BaseDecoderTest() : decoder_(NULL) {} void BaseDecoderTest::SetUp() { long rv = CreateDecoder(&decoder_); ASSERT_EQ(0, rv); ASSERT_TRUE(decoder_ != NULL); SDecodingParam decParam; memset(&decParam, 0, sizeof(SDecodingParam)); decParam.iOutputColorFormat = videoFormatI420; decParam.uiTargetDqLayer = UCHAR_MAX; decParam.uiEcActiveFlag = 1; decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT; rv = decoder_->Initialize(&decParam, INIT_TYPE_PARAMETER_BASED); ASSERT_EQ(0, rv);} void BaseDecoderTest::TearDown() { if (decoder_ != NULL) { decoder_->Uninitialize(); DestroyDecoder(decoder_); }} void BaseDecoderTest::DecodeFrame(const uint8_t* src, int sliceSize, Callback* cbk) { void* data[3]; SBufferInfo bufInfo; memset(data, 0, sizeof(data)); memset(&bufInfo, 0, sizeof(SBufferInfo)); DECODING_STATE rv = decoder_->DecodeFrame(src, sliceSize, data, &bufInfo); ASSERT_TRUE(rv == dsErrorFree); if (bufInfo.iBufferStatus == 1 && cbk != NULL) { const Frame frame = { { // y plane static_cast<uint8_t*>(data[0]), bufInfo.UsrData.sSystemBuffer.iWidth, bufInfo.UsrData.sSystemBuffer.iHeight, bufInfo.UsrData.sSystemBuffer.iStride[0] }, { // u plane static_cast<uint8_t*>(data[1]), bufInfo.UsrData.sSystemBuffer.iWidth / 2, bufInfo.UsrData.sSystemBuffer.iHeight / 2, bufInfo.UsrData.sSystemBuffer.iStride[1] }, { // v plane static_cast<uint8_t*>(data[2]), bufInfo.UsrData.sSystemBuffer.iWidth / 2, bufInfo.UsrData.sSystemBuffer.iHeight / 2, bufInfo.UsrData.sSystemBuffer.iStride[1] }, }; cbk->onDecodeFrame(frame); }}void BaseDecoderTest::DecodeFile(const char* fileName, Callback* cbk) { std::ifstream file(fileName, std::ios::in | std::ios::binary); ASSERT_TRUE(file.is_open()); for (BufferedData buf;;) { ReadFrame(&file, &buf); if (::testing::Test::HasFatalFailure()) { return; } if (buf.Length() == 0) { break; } DecodeFrame(buf.data(), buf.Length(), cbk); if (::testing::Test::HasFatalFailure()) { return; } } int32_t iEndOfStreamFlag = 1; decoder_->SetOption(DECODER_OPTION_END_OF_STREAM, &iEndOfStreamFlag); // Get pending last frame DecodeFrame(NULL, 0, cbk);}
#include <fstream>
#include <gtest/gtest.h>
#include "codec_def.h"
#include "codec_app_def.h"
#include "utils/BufferedData.h"
#include "BaseDecoderTest.h"
static void ReadFrame(std::ifstream* file, BufferedData* buf) {
// start code of a frame is {0, 0, 0, 1}
int zeroCount = 0;
char b;
buf->Clear();
for (;;) {
file->read(&b, 1);
if (file->gcount() != 1) { // end of file
return;
}
if (!buf->Push(b)) {
FAIL() << "unable to allocate memory";
}
if (buf->Length() <= 4) {
continue;
}
if (zeroCount < 3) {
zeroCount = b != 0 ? 0 : zeroCount + 1;
} else {
if (b == 1) {
if (file->seekg(-4, file->cur).good()) {
buf->SetLength(buf->Length() - 4);
return;
} else {
FAIL() << "unable to seek file";
}
} else if (b == 0) {
zeroCount = 3;
} else {
zeroCount = 0;
}
}
}
}
BaseDecoderTest::BaseDecoderTest() : decoder_(NULL) {}
void BaseDecoderTest::SetUp() {
long rv = CreateDecoder(&decoder_);
ASSERT_EQ(0, rv);
ASSERT_TRUE(decoder_ != NULL);
SDecodingParam decParam;
memset(&decParam, 0, sizeof(SDecodingParam));
decParam.iOutputColorFormat = videoFormatI420;
decParam.uiTargetDqLayer = UCHAR_MAX;
decParam.uiEcActiveFlag = 1;
decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
rv = decoder_->Initialize(&decParam, INIT_TYPE_PARAMETER_BASED);
ASSERT_EQ(0, rv);
}
void BaseDecoderTest::TearDown() {
if (decoder_ != NULL) {
decoder_->Uninitialize();
DestroyDecoder(decoder_);
}
}
void BaseDecoderTest::DecodeFrame(const uint8_t* src, int sliceSize, Callback* cbk) {
void* data[3];
SBufferInfo bufInfo;
memset(data, 0, sizeof(data));
memset(&bufInfo, 0, sizeof(SBufferInfo));
DECODING_STATE rv = decoder_->DecodeFrame(src, sliceSize, data, &bufInfo);
ASSERT_TRUE(rv == dsErrorFree);
if (bufInfo.iBufferStatus == 1 && cbk != NULL) {
const Frame frame = {
{ // y plane
static_cast<uint8_t*>(data[0]),
bufInfo.UsrData.sSystemBuffer.iWidth,
bufInfo.UsrData.sSystemBuffer.iHeight,
bufInfo.UsrData.sSystemBuffer.iStride[0]
},
{ // u plane
static_cast<uint8_t*>(data[1]),
bufInfo.UsrData.sSystemBuffer.iWidth / 2,
bufInfo.UsrData.sSystemBuffer.iHeight / 2,
bufInfo.UsrData.sSystemBuffer.iStride[1]
},
{ // v plane
static_cast<uint8_t*>(data[2]),
bufInfo.UsrData.sSystemBuffer.iWidth / 2,
bufInfo.UsrData.sSystemBuffer.iHeight / 2,
bufInfo.UsrData.sSystemBuffer.iStride[1]
},
};
cbk->onDecodeFrame(frame);
}
}
void BaseDecoderTest::DecodeFile(const char* fileName, Callback* cbk) {
std::ifstream file(fileName, std::ios::in | std::ios::binary);
ASSERT_TRUE(file.is_open());
for (BufferedData buf;;) {
ReadFrame(&file, &buf);
if (::testing::Test::HasFatalFailure()) {
return;
}
if (buf.Length() == 0) {
break;
}
DecodeFrame(buf.data(), buf.Length(), cbk);
if (::testing::Test::HasFatalFailure()) {
return;
}
}
int32_t iEndOfStreamFlag = 1;
decoder_->SetOption(DECODER_OPTION_END_OF_STREAM, &iEndOfStreamFlag);
// Get pending last frame
DecodeFrame(NULL, 0, cbk);
}