bool YUVPixelDataGenerator (uint8_t* pPointer, int32_t iWidth, int32_t iHeight, int32_t iStride) { #define SRC_FRAME_WIDTH (160) #define SRC_FRAME_HEIGHT (96) if (SRC_FRAME_WIDTH - iWidth <= 0 || SRC_FRAME_HEIGHT - iHeight <= 0) { return false; } const int32_t kiFrameSize = SRC_FRAME_WIDTH * SRC_FRAME_HEIGHT; BufferedData sBuf; sBuf.SetLength (kiFrameSize); if (sBuf.Length() != (size_t)kiFrameSize) { return false; } FileInputStream fileStream; if (!fileStream.Open ("res/CiscoVT2people_160x96_6fps.yuv")) { return false; } if (fileStream.read (sBuf.data(), kiFrameSize) == kiFrameSize) { int32_t iStartPosX = rand() % (SRC_FRAME_WIDTH - iWidth); int32_t iStartPosY = rand() % (SRC_FRAME_HEIGHT - iHeight); uint8_t* pSrcPointer = sBuf.data() + iStartPosX + iStartPosY * SRC_FRAME_WIDTH; uint8_t* pLocalPointer = pPointer; for (int j = 0; j < iHeight; j++) { memcpy (pLocalPointer, pSrcPointer, iWidth * sizeof (uint8_t)); pLocalPointer += iStride; pSrcPointer += SRC_FRAME_WIDTH; } return true; } return false; }
void BaseDecoderTest::DecodeFile(const char* fileName, Callback* cbk) { std::ifstream file(fileName, std::ios::in | std::ios::binary); ASSERT_TRUE(file.is_open()); BufferedData buf; while (true) { 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); }
bool BaseDecoderTest::DecodeFile (const char* fileName, Callback* cbk) { std::ifstream file (fileName, std::ios::in | std::ios::binary); if (!file.is_open()) return false; BufferedData buf; while (true) { if (false == ReadFrame(&file, &buf)) return false; if (::testing::Test::HasFatalFailure()) { return false; } if (buf.Length() == 0) { break; } DecodeFrame (buf.data(), buf.Length(), cbk); if (::testing::Test::HasFatalFailure()) { return false; } } int32_t iEndOfStreamFlag = 1; decoder_->SetOption (DECODER_OPTION_END_OF_STREAM, &iEndOfStreamFlag); // Get pending last frame DecodeFrame (NULL, 0, cbk); // Flush out last frames in decoder buffer int32_t num_of_frames_in_buffer = 0; decoder_->GetOption (DECODER_OPTION_NUM_OF_FRAMES_REMAINING_IN_BUFFER, &num_of_frames_in_buffer); for (int32_t i = 0; i < num_of_frames_in_buffer; ++i) { FlushFrame (cbk); } return true; }
static void CompareFileToHash(ISVCEncoder* encoder, const char* fileName, const char* hashStr, int width, int height, float frameRate) { std::ifstream file(fileName, std::ios::in | std::ios::binary); ASSERT_TRUE(file.is_open()); int rv = InitWithParam(encoder, width, height, frameRate); 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); char* data = reinterpret_cast<char*>(buf.data()); SFrameBSInfo info; memset(&info, 0, sizeof(SFrameBSInfo)); unsigned char digest[SHA_DIGEST_LENGTH]; SHA_CTX ctx; SHA1_Init(&ctx); while (file.read(data, frameSize), file.gcount() == frameSize) { rv = encoder->EncodeFrame(buf.data(), &info); if (rv == videoFrameTypeInvalid) { SHA1_Final(digest, &ctx); FAIL() << "unable to encode frame"; } if (rv != videoFrameTypeSkip) { UpdateHashFromFrame(info, &ctx); } } SHA1_Final(digest, &ctx); ASSERT_TRUE(CompareHash(digest, hashStr)); }