CCodec: queue empty input for encoders to get CSD out
Bug: 111159723
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
Test: Play music on Android Auto
Change-Id: I49b88cf1806c8b11f3961445a64c759d3e599302
diff --git a/media/sfplugin/CCodecBufferChannel.cpp b/media/sfplugin/CCodecBufferChannel.cpp
index c6720f2..36bc6a4 100644
--- a/media/sfplugin/CCodecBufferChannel.cpp
+++ b/media/sfplugin/CCodecBufferChannel.cpp
@@ -1929,6 +1929,12 @@
if (mInputSurface) {
return OK;
}
+
+ C2StreamFormatConfig::output oStreamFormat(0u);
+ c2_status_t err = mComponent->query({ &oStreamFormat }, {}, C2_DONT_BLOCK, nullptr);
+ if (err != C2_OK) {
+ return UNKNOWN_ERROR;
+ }
// TODO: use proper buffer depth instead of this random value
for (size_t i = 0; i < kMinInputBufferArraySize; ++i) {
size_t index;
@@ -1975,6 +1981,13 @@
ALOGD("[%s] buffer capacity too small for the config (%zu < %zu)",
mName, buffer->capacity(), config->size());
}
+ } else if (oStreamFormat.value == C2FormatCompressed && i == 0) {
+ // WORKAROUND: Some apps expect CSD available without queueing
+ // any input. Queue an empty buffer to get the CSD.
+ buffer->setRange(0, 0);
+ buffer->meta()->clear();
+ buffer->meta()->setInt64("timeUs", 0);
+ (void)queueInputBufferInternal(buffer);
}
if (post) {
mCallback->onInputBufferAvailable(index, buffer);