diff options
author | Bo Hu <bohu@google.com> | 2022-07-07 19:59:56 +0000 |
---|---|---|
committer | Bo Hu <bohu@google.com> | 2022-07-14 17:28:06 +0000 |
commit | e1f0b2c5a691b2a869c804c259eb71d28d1d38b9 (patch) | |
tree | 72f3586b297ad5781b6f9ae5f68fc53bc5ccd4df | |
parent | 22c26898edd994fb13e29f3fe2cd483d6af22027 (diff) | |
download | goldfish-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.cpp | 40 | ||||
-rw-r--r-- | system/codecs/c2/decoders/avcdec/C2GoldfishAvcDec.h | 1 |
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); }; |