diff options
author | Bo Hu <bohu@google.com> | 2022-07-14 17:49:06 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-07-14 17:49:06 +0000 |
commit | 08d1cd4be4a0519e3708502e4bb1e197485a1b16 (patch) | |
tree | 72f3586b297ad5781b6f9ae5f68fc53bc5ccd4df | |
parent | 5d4c81a2b81d761edcd39fb3184c924cf54534c0 (diff) | |
parent | e1f0b2c5a691b2a869c804c259eb71d28d1d38b9 (diff) | |
download | goldfish-opengl-08d1cd4be4a0519e3708502e4bb1e197485a1b16.tar.gz |
codecs: h264 limit the max number of decoders am: e1f0b2c5a6
Original change: https://googleplex-android-review.googlesource.com/c/device/generic/goldfish-opengl/+/19285139
Change-Id: I5250289ac80968aecf6270a08414a749627ecdec
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-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); }; |