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);