CCodec: fix initial buffer request logic
Bug: 112853750
Test: atest CtsMediaTestCases:EncodeDecodeTest \
CtsMediaTestCases:EncodeVirtualDisplayTest \
CtsMediaTestCases:EncodeVirtualDisplayWithCompositionTest \
CtsMediaTestCases:MediaCasTest \
CtsMediaTestCases:MediaCodecListTest \
CtsMediaTestCases:MediaCodecTest \
CtsMediaTestCases:MediaMetadataRetrieverTest \
CtsMediaTestCases:MediaPlayerDrmTest \
CtsMediaTestCases:MediaPlayerSurfaceTest \
CtsMediaTestCases:MediaScannerTest \
CtsMediaTestCases:ResourceManagerTest \
CtsMediaTestCases:MediaRecorderTest \
CtsMediaTestCases:EncoderTest
Change-Id: I521163fcb01d63c626523d79c0d09fccf20ab4e5
diff --git a/media/sfplugin/CCodecBufferChannel.cpp b/media/sfplugin/CCodecBufferChannel.cpp
index 5c67a8a..eed65bb 100644
--- a/media/sfplugin/CCodecBufferChannel.cpp
+++ b/media/sfplugin/CCodecBufferChannel.cpp
@@ -2112,6 +2112,7 @@
if (err != C2_OK) {
return UNKNOWN_ERROR;
}
+ std::vector<sp<MediaCodecBuffer>> toBeQueued;
// TODO: use proper buffer depth instead of this random value
for (size_t i = 0; i < kMinInputBufferArraySize; ++i) {
size_t index;
@@ -2141,19 +2142,7 @@
buffer->meta()->clear();
buffer->meta()->setInt64("timeUs", 0);
buffer->meta()->setInt32("csd", 1);
- configs.unlock();
- if (queueInputBufferInternal(buffer) == OK) {
- ALOGV("[%s] queued flushed codec config", mName);
- configs.lock();
-
- configs->pop_front();
- post = false;
- } else {
- ALOGD("[%s] failed to queue flushed codec config", mName);
- configs.lock();
-
- buffer->setRange(0, buffer->capacity());
- }
+ post = false;
} else {
ALOGD("[%s] buffer capacity too small for the config (%zu < %zu)",
mName, buffer->capacity(), config->size());
@@ -2164,20 +2153,25 @@
buffer->setRange(0, 0);
buffer->meta()->clear();
buffer->meta()->setInt64("timeUs", 0);
- (void)queueInputBufferInternal(buffer);
+ post = false;
}
- if (post) {
- if (mAvailablePipelineCapacity.allocate(
- "requestInitialInputBuffers")) {
+ if (mAvailablePipelineCapacity.allocate("requestInitialInputBuffers")) {
+ if (post) {
mCallback->onInputBufferAvailable(index, buffer);
} else {
- ALOGD("[%s] pipeline is full while "
- "requesting %zu-th input buffer",
- mName, i);
+ toBeQueued.emplace_back(buffer);
}
+ } else {
+ ALOGD("[%s] pipeline is full while requesting %zu-th input buffer",
+ mName, i);
}
}
}
+ for (const sp<MediaCodecBuffer> &buffer : toBeQueued) {
+ if (queueInputBufferInternal(buffer) != OK) {
+ mAvailablePipelineCapacity.free("requestInitialInputBuffers");
+ }
+ }
return OK;
}