aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBo Hu <bohu@google.com>2022-07-07 19:59:56 +0000
committerBo Hu <bohu@google.com>2022-07-14 17:28:06 +0000
commite1f0b2c5a691b2a869c804c259eb71d28d1d38b9 (patch)
tree72f3586b297ad5781b6f9ae5f68fc53bc5ccd4df
parent22c26898edd994fb13e29f3fe2cd483d6af22027 (diff)
downloadgoldfish-opengl-e1f0b2c5a691b2a869c804c259eb71d28d1d38b9.tar.gz
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
-rw-r--r--system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp40
-rw-r--r--system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h1
2 files changed, 40 insertions, 1 deletions
diff --git a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.cpp
index 90b56532..963558ee 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 @@ constexpr uint32_t kDefaultOutputDelay = 8;
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(const char *name, c2_node_id_t id,
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 @@ c2_status_t C2GoldfishAvcDec::onStop() {
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::setParams(size_t stride) {
}
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 afa27f56..5b5e760a 100644
--- a/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
+++ b/system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h
@@ -155,6 +155,7 @@ class C2GoldfishAvcDec : public SimpleC2Component {
std::unique_ptr<GoldfishH264Helper> mH264Helper;
+ int mId = -1;
C2_DO_NOT_COPY(C2GoldfishAvcDec);
};