diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-06-18 03:29:23 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2024-06-18 03:29:23 +0000 |
commit | badda58f04f1f37f88cb3ba828e9d32c5d399bd3 (patch) | |
tree | 5d7d032ec729e316b0cd1617e063d6f78c9e6655 | |
parent | e44274899b207cd2b339e0bf8f8b6128dc3642b1 (diff) | |
parent | 1fa7363d764c94a0f5c963678a9c7fd90181e4d7 (diff) |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/27161253', 'googleplex-android-review.googlesource.com/27603872'] into udc-platform-release.
Change-Id: I426e7e7fb382572ebc77d75cd5fc86cdcd92308f
3 files changed, 61 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index 036508507b..e0449ffc0d 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -2099,6 +2099,11 @@ status_t StagefrightRecorder::setupVideoEncoder( if (tsLayers > 1) { uint32_t bLayers = std::min(2u, tsLayers - 1); // use up-to 2 B-layers + // TODO(b/341121900): Remove this once B frames are handled correctly in screen recorder + // use case in case of mic only + if (mAudioSource == AUDIO_SOURCE_MIC && mVideoSource == VIDEO_SOURCE_SURFACE) { + bLayers = 0; + } uint32_t pLayers = tsLayers - bLayers; format->setString( "ts-schema", AStringPrintf("android.generic.%u+%u", pLayers, bLayers)); diff --git a/media/module/libmediatranscoding/TranscodingResourcePolicy.cpp b/media/module/libmediatranscoding/TranscodingResourcePolicy.cpp index af53f64671..6a0c09a20a 100644 --- a/media/module/libmediatranscoding/TranscodingResourcePolicy.cpp +++ b/media/module/libmediatranscoding/TranscodingResourcePolicy.cpp @@ -21,6 +21,7 @@ #include <aidl/android/media/IResourceObserverService.h> #include <android/binder_manager.h> #include <android/binder_process.h> +#include <map> #include <media/TranscodingResourcePolicy.h> #include <utils/Log.h> @@ -66,11 +67,31 @@ struct TranscodingResourcePolicy::ResourceObserver : public BnResourceObserver { TranscodingResourcePolicy* mOwner; }; +// cookie used for death recipients. The TranscodingResourcePolicy +// that this cookie is associated with must outlive this cookie. It is +// either deleted by binderDied, or in unregisterSelf which is also called +// in the destructor of TranscodingResourcePolicy +class TranscodingResourcePolicyCookie { + public: + TranscodingResourcePolicyCookie(TranscodingResourcePolicy* policy) : mPolicy(policy) {} + TranscodingResourcePolicyCookie() = delete; + TranscodingResourcePolicy* mPolicy; +}; + +static std::map<uintptr_t, std::unique_ptr<TranscodingResourcePolicyCookie>> sCookies; +static uintptr_t sCookieKeyCounter; +static std::mutex sCookiesMutex; + // static void TranscodingResourcePolicy::BinderDiedCallback(void* cookie) { - TranscodingResourcePolicy* owner = reinterpret_cast<TranscodingResourcePolicy*>(cookie); - if (owner != nullptr) { - owner->unregisterSelf(); + std::lock_guard<std::mutex> guard(sCookiesMutex); + if (auto it = sCookies.find(reinterpret_cast<uintptr_t>(cookie)); it != sCookies.end()) { + ALOGI("BinderDiedCallback unregistering TranscodingResourcePolicy"); + auto policy = reinterpret_cast<TranscodingResourcePolicy*>(it->second->mPolicy); + if (policy) { + policy->unregisterSelf(); + } + sCookies.erase(it); } // TODO(chz): retry to connecting to IResourceObserverService after failure. // Also need to have back-up logic if IResourceObserverService is offline for @@ -88,6 +109,24 @@ TranscodingResourcePolicy::TranscodingResourcePolicy() } TranscodingResourcePolicy::~TranscodingResourcePolicy() { + { + std::lock_guard<std::mutex> guard(sCookiesMutex); + + // delete all of the cookies associated with this TranscodingResourcePolicy + // instance since they are holding pointers to this object that will no + // longer be valid. + for (auto it = sCookies.begin(); it != sCookies.end();) { + const uintptr_t key = it->first; + std::lock_guard guard(mCookieKeysLock); + if (mCookieKeys.find(key) != mCookieKeys.end()) { + // No longer need to track this cookie + mCookieKeys.erase(key); + it = sCookies.erase(it); + } else { + it++; + } + } + } unregisterSelf(); } @@ -123,7 +162,16 @@ void TranscodingResourcePolicy::registerSelf() { return; } - AIBinder_linkToDeath(binder.get(), mDeathRecipient.get(), reinterpret_cast<void*>(this)); + std::unique_ptr<TranscodingResourcePolicyCookie> cookie = + std::make_unique<TranscodingResourcePolicyCookie>(this); + uintptr_t cookieKey = sCookieKeyCounter++; + sCookies.emplace(cookieKey, std::move(cookie)); + { + std::lock_guard guard(mCookieKeysLock); + mCookieKeys.insert(cookieKey); + } + + AIBinder_linkToDeath(binder.get(), mDeathRecipient.get(), reinterpret_cast<void*>(cookieKey)); ALOGD("@@@ registered observer"); mRegistered = true; @@ -141,7 +189,6 @@ void TranscodingResourcePolicy::unregisterSelf() { ::ndk::SpAIBinder binder = mService->asBinder(); if (binder.get() != nullptr) { Status status = mService->unregisterObserver(mObserver); - AIBinder_unlinkToDeath(binder.get(), mDeathRecipient.get(), reinterpret_cast<void*>(this)); } mService = nullptr; diff --git a/media/module/libmediatranscoding/include/media/TranscodingResourcePolicy.h b/media/module/libmediatranscoding/include/media/TranscodingResourcePolicy.h index ee232e7551..4d762b5832 100644 --- a/media/module/libmediatranscoding/include/media/TranscodingResourcePolicy.h +++ b/media/module/libmediatranscoding/include/media/TranscodingResourcePolicy.h @@ -22,6 +22,7 @@ #include <utils/Condition.h> #include <mutex> +#include <set> namespace aidl { namespace android { namespace media { @@ -48,6 +49,8 @@ private: bool mRegistered GUARDED_BY(mRegisteredLock); std::shared_ptr<IResourceObserverService> mService GUARDED_BY(mRegisteredLock); std::shared_ptr<ResourceObserver> mObserver; + mutable std::mutex mCookieKeysLock; + std::set<uintptr_t> mCookieKeys; mutable std::mutex mCallbackLock; std::weak_ptr<ResourcePolicyCallbackInterface> mResourcePolicyCallback @@ -59,6 +62,7 @@ private: static void BinderDiedCallback(void* cookie); void registerSelf(); + // must delete the associated TranscodingResourcePolicyCookie any time this is called void unregisterSelf(); void onResourceAvailable(pid_t pid); }; // class TranscodingUidPolicy |