|
|
|
@ -284,15 +284,16 @@ void encodeNFrames(const std::shared_ptr<android::Codec2Client::Component>& comp
|
|
|
|
|
std::list<std::unique_ptr<C2Work>>& workQueue,
|
|
|
|
|
std::list<uint64_t>& flushedIndices,
|
|
|
|
|
std::shared_ptr<C2BlockPool>& graphicPool,
|
|
|
|
|
std::ifstream& eleStream, uint32_t frameID,
|
|
|
|
|
uint32_t nFrames, uint32_t nWidth, int32_t nHeight,
|
|
|
|
|
bool flushed = false,bool signalEOS = true) {
|
|
|
|
|
std::ifstream& eleStream, bool& disableTest,
|
|
|
|
|
uint32_t frameID, uint32_t nFrames, uint32_t nWidth,
|
|
|
|
|
int32_t nHeight, bool flushed = false, bool signalEOS = true) {
|
|
|
|
|
typedef std::unique_lock<std::mutex> ULock;
|
|
|
|
|
|
|
|
|
|
uint32_t maxRetry = 0;
|
|
|
|
|
int bytesCount = nWidth * nHeight * 3 >> 1;
|
|
|
|
|
int32_t timestampIncr = ENCODER_TIMESTAMP_INCREMENT;
|
|
|
|
|
uint64_t timestamp = 0;
|
|
|
|
|
c2_status_t err = C2_OK;
|
|
|
|
|
while (1) {
|
|
|
|
|
if (nFrames == 0) break;
|
|
|
|
|
uint32_t flags = 0;
|
|
|
|
@ -333,16 +334,21 @@ void encodeNFrames(const std::shared_ptr<android::Codec2Client::Component>& comp
|
|
|
|
|
ASSERT_EQ(eleStream.gcount(), bytesCount);
|
|
|
|
|
}
|
|
|
|
|
std::shared_ptr<C2GraphicBlock> block;
|
|
|
|
|
ASSERT_EQ(
|
|
|
|
|
C2_OK,
|
|
|
|
|
graphicPool->fetchGraphicBlock(
|
|
|
|
|
err = graphicPool->fetchGraphicBlock(
|
|
|
|
|
nWidth, nHeight, HAL_PIXEL_FORMAT_YV12,
|
|
|
|
|
{C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}, &block));
|
|
|
|
|
{C2MemoryUsage::CPU_READ, C2MemoryUsage::CPU_WRITE}, &block);
|
|
|
|
|
if (err != C2_OK) {
|
|
|
|
|
fprintf(stderr, "fetchGraphicBlock failed : %d\n", err);
|
|
|
|
|
disableTest = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ASSERT_TRUE(block);
|
|
|
|
|
// Graphic View
|
|
|
|
|
C2GraphicView view = block->map().get();
|
|
|
|
|
if (view.error() != C2_OK) {
|
|
|
|
|
fprintf(stderr, "C2GraphicBlock::map() failed : %d", view.error());
|
|
|
|
|
disableTest = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -420,8 +426,16 @@ TEST_P(Codec2VideoEncEncodeTest, EncodeTest) {
|
|
|
|
|
ASSERT_EQ(mComponent->start(), C2_OK);
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
0, ENC_NUM_FRAMES, nWidth, nHeight, false, signalEOS));
|
|
|
|
|
// mDisableTest will be set if buffer was not fetched properly.
|
|
|
|
|
// This may happen when resolution is not proper but config suceeded
|
|
|
|
|
// In this cases, we skip encoding the input stream
|
|
|
|
|
if (mDisableTest) {
|
|
|
|
|
std::cout << "[ WARN ] Test Disabled \n";
|
|
|
|
|
ASSERT_EQ(mComponent->stop(), C2_OK);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If EOS is not sent, sending empty input with EOS flag
|
|
|
|
|
inputFrames = ENC_NUM_FRAMES;
|
|
|
|
@ -531,8 +545,17 @@ TEST_F(Codec2VideoEncHidlTest, FlushTest) {
|
|
|
|
|
ALOGV("mURL : %s", mURL);
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
0, numFramesFlushed, nWidth, nHeight));
|
|
|
|
|
// mDisableTest will be set if buffer was not fetched properly.
|
|
|
|
|
// This may happen when resolution is not proper but config suceeded
|
|
|
|
|
// In this cases, we skip encoding the input stream
|
|
|
|
|
if (mDisableTest) {
|
|
|
|
|
std::cout << "[ WARN ] Test Disabled \n";
|
|
|
|
|
ASSERT_EQ(mComponent->stop(), C2_OK);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::list<std::unique_ptr<C2Work>> flushedWork;
|
|
|
|
|
c2_status_t err =
|
|
|
|
|
mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
|
|
|
|
@ -561,10 +584,19 @@ TEST_F(Codec2VideoEncHidlTest, FlushTest) {
|
|
|
|
|
mFlushedIndices.clear();
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
numFramesFlushed, numFrames - numFramesFlushed,
|
|
|
|
|
nWidth, nHeight, true));
|
|
|
|
|
eleStream.close();
|
|
|
|
|
// mDisableTest will be set if buffer was not fetched properly.
|
|
|
|
|
// This may happen when resolution is not proper but config suceeded
|
|
|
|
|
// In this cases, we skip encoding the input stream
|
|
|
|
|
if (mDisableTest) {
|
|
|
|
|
std::cout << "[ WARN ] Test Disabled \n";
|
|
|
|
|
ASSERT_EQ(mComponent->stop(), C2_OK);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
|
|
|
|
|
ASSERT_EQ(err, C2_OK);
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
@ -607,19 +639,19 @@ TEST_F(Codec2VideoEncHidlTest, InvalidBufferTest) {
|
|
|
|
|
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
0, 1, nWidth, nHeight, false, false));
|
|
|
|
|
|
|
|
|
|
// Feed larger input buffer.
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
1, 1, nWidth*2, nHeight*2, false, false));
|
|
|
|
|
|
|
|
|
|
// Feed smaller input buffer.
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
2, 1, nWidth/2, nHeight/2, false, true));
|
|
|
|
|
|
|
|
|
|
// blocking call to ensures application to Wait till all the inputs are
|
|
|
|
@ -629,15 +661,13 @@ TEST_F(Codec2VideoEncHidlTest, InvalidBufferTest) {
|
|
|
|
|
waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue));
|
|
|
|
|
|
|
|
|
|
if (mFramesReceived != 3) {
|
|
|
|
|
ALOGE("Input buffer count and Output buffer count mismatch");
|
|
|
|
|
ALOGE("framesReceived : %d inputFrames : 3", mFramesReceived);
|
|
|
|
|
ASSERT_TRUE(false);
|
|
|
|
|
std::cout << "[ WARN ] Component didn't receive all buffers back \n";
|
|
|
|
|
ALOGW("framesReceived : %d inputFrames : 3", mFramesReceived);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mFailedWorkReceived == 0) {
|
|
|
|
|
ALOGE("Expected failed frame count mismatch");
|
|
|
|
|
ALOGE("failedFramesReceived : %d", mFailedWorkReceived);
|
|
|
|
|
ASSERT_TRUE(false);
|
|
|
|
|
std::cout << "[ WARN ] Expected failed frame count mismatch \n";
|
|
|
|
|
ALOGW("failedFramesReceived : %d", mFailedWorkReceived);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(mComponent->stop(), C2_OK);
|
|
|
|
@ -665,8 +695,17 @@ TEST_P(Codec2VideoEncResolutionTest, ResolutionTest) {
|
|
|
|
|
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
|
encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, 0,
|
|
|
|
|
MAX_INPUT_BUFFERS, nWidth, nHeight));
|
|
|
|
|
mFlushedIndices, mGraphicPool, eleStream, mDisableTest,
|
|
|
|
|
0, MAX_INPUT_BUFFERS, nWidth, nHeight, false, true));
|
|
|
|
|
|
|
|
|
|
// mDisableTest will be set if buffer was not fetched properly.
|
|
|
|
|
// This may happen when resolution is not proper but config suceeded
|
|
|
|
|
// In this cases, we skip encoding the input stream
|
|
|
|
|
if (mDisableTest) {
|
|
|
|
|
std::cout << "[ WARN ] Test Disabled \n";
|
|
|
|
|
ASSERT_EQ(mComponent->stop(), C2_OK);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ALOGD("Waiting for input consumption");
|
|
|
|
|
ASSERT_NO_FATAL_FAILURE(
|
|
|
|
@ -676,6 +715,7 @@ TEST_P(Codec2VideoEncResolutionTest, ResolutionTest) {
|
|
|
|
|
ASSERT_EQ(mComponent->stop(), C2_OK);
|
|
|
|
|
ASSERT_EQ(mComponent->reset(), C2_OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(NonStdSizes, Codec2VideoEncResolutionTest, ::testing::Values(
|
|
|
|
|
std::make_pair(52, 18),
|
|
|
|
|
std::make_pair(365, 365),
|
|
|
|
|