codecs: h264 limit the max number of decoders

Bug: 238321873

Test:
set avd memory to be at least 4G
android.media.codec.cts.MediaCodecResourceTest

Change-Id: I66d3c3f4a8004a5c09702da6c4cf307a3daa3265
diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
index 90b5653..963558e 100644
--- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
+++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
@@ -42,6 +42,8 @@
 
 #include "C2GoldfishAvcDec.h"
 
+#include <mutex>
+
 #define DEBUG 0
 #if DEBUG
 #define DDD(...) ALOGD(__VA_ARGS__)
@@ -64,6 +66,35 @@
    So total maximum output delay is 34 */
 constexpr uint32_t kMaxOutputDelay = 34;
 constexpr uint32_t kMinInputBytes = 4;
+
+static std::mutex s_decoder_count_mutex;
+static int s_decoder_count = 0;
+
+int allocateDecoderId() {
+  DDD("calling %s", __func__);
+  std::lock_guard<std::mutex> lock(s_decoder_count_mutex);
+  if (s_decoder_count >= 32 || s_decoder_count < 0) {
+    ALOGE("calling %s failed", __func__);
+    return -1;
+  }
+  ++ s_decoder_count;
+  DDD("calling %s success total decoder %d", __func__, s_decoder_count);
+  return s_decoder_count;;
+}
+
+bool deAllocateDecoderId() {
+  DDD("calling %s", __func__);
+  std::lock_guard<std::mutex> lock(s_decoder_count_mutex);
+  if (s_decoder_count < 1) {
+    ALOGE("calling %s failed ", __func__);
+    return false;
+  }
+  -- s_decoder_count;
+  DDD("calling %s success total decoder %d", __func__, s_decoder_count);
+  return true;
+}
+
+
 } // namespace
 
 class C2GoldfishAvcDec::IntfImpl : public SimpleInterface<void>::BaseParams {
@@ -393,6 +424,9 @@
 C2GoldfishAvcDec::~C2GoldfishAvcDec() { onRelease(); }
 
 c2_status_t C2GoldfishAvcDec::onInit() {
+    ALOGD("calling onInit");
+    mId = allocateDecoderId();
+    if (mId <= 0) return C2_NO_MEMORY;
     status_t err = initDecoder();
     return err == OK ? C2_OK : C2_CORRUPTED;
 }
@@ -407,6 +441,11 @@
 void C2GoldfishAvcDec::onReset() { (void)onStop(); }
 
 void C2GoldfishAvcDec::onRelease() {
+    DDD("calling onRelease");
+    if (mId > 0) {
+      deAllocateDecoderId();
+      mId = -1;
+    }
     deleteContext();
     if (mOutBlock) {
         mOutBlock.reset();
@@ -476,7 +515,6 @@
 }
 
 status_t C2GoldfishAvcDec::initDecoder() {
-    //    if (OK != createDecoder()) return UNKNOWN_ERROR;
     mStride = ALIGN2(mWidth);
     mSignalledError = false;
     resetPlugin();
diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
index afa27f5..5b5e760 100644
--- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
+++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
@@ -155,6 +155,7 @@
 
     std::unique_ptr<GoldfishH264Helper> mH264Helper;
 
+    int mId = -1;
     C2_DO_NOT_COPY(C2GoldfishAvcDec);
 };