CCodec: consider CSD when setting max-input-size

MediaExtractor does not consider CSD-size when calculating max input
buffer size, so consider it in CCodec (unless neither MediaExtractor
nor the codec provided a max-input-size, in which case we fall back
to the CCodecBufferChannel default. Really, codec should provide this.)

Bug: 79493409
Change-Id: Id73ac98d7e334d8b6b8352d142fa62eb1023a3d4
diff --git a/media/sfplugin/CCodec.cpp b/media/sfplugin/CCodec.cpp
index a5f382e..57f334b 100644
--- a/media/sfplugin/CCodec.cpp
+++ b/media/sfplugin/CCodec.cpp
@@ -29,6 +29,7 @@
 
 #include <android/IOMXBufferSource.h>
 #include <android/IGraphicBufferSource.h>
+#include <android-base/stringprintf.h>
 #include <cutils/properties.h>
 #include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
 #include <gui/IGraphicBufferProducer.h>
@@ -48,6 +49,7 @@
 
 using namespace std::chrono_literals;
 using ::android::hardware::graphics::bufferqueue::V1_0::utils::H2BGraphicBufferProducer;
+using android::base::StringPrintf;
 using BGraphicBufferSource = ::android::IGraphicBufferSource;
 
 namespace {
@@ -764,9 +766,23 @@
         bool clientInputSize = msg->findInt32(KEY_MAX_INPUT_SIZE, (int32_t*)&maxInputSize.value);
 
         // TEMP: enforce minimum buffer size of 1MB for video decoders
-        if (!clientInputSize && maxInputSize.value == 0
-                && !encoder && !(config->mDomain & Config::IS_AUDIO)) {
-            maxInputSize.value = 1048576u;
+        // and 16K / 4K for audio encoders/decoders
+        if (!clientInputSize && maxInputSize.value == 0) {
+            if (config->mDomain & Config::IS_AUDIO) {
+                maxInputSize.value = encoder ? 16384 : 4096;
+            } else if (!encoder) {
+                maxInputSize.value = 1048576u;
+            }
+        }
+
+        // verify that CSD fits into this size (if defined)
+        if ((config->mDomain & Config::IS_DECODER) && maxInputSize.value > 0) {
+            sp<ABuffer> csd;
+            for (size_t ix = 0; msg->findBuffer(StringPrintf("csd-%zu", ix).c_str(), &csd); ++ix) {
+                if (csd && csd->size() > maxInputSize.value) {
+                    maxInputSize.value = csd->size();
+                }
+            }
         }
 
         // TODO: do this based on component requiring linear allocator for input