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