diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2024-08-12 00:31:38 -0700 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2024-08-12 00:31:38 -0700 |
commit | ba0f55423259510b82104aa80dcea2b6d035f340 (patch) | |
tree | 28c23e18f772e7680cb7d7e7bf591936bebf6d5a | |
parent | b9e67ec068de9590d1eaccb6f5b2f02bb7f238d4 (diff) | |
parent | 7b9a1e11d8565f70177ffdb2f7fd8056f1e47436 (diff) |
Merge 7b9a1e11d8565f70177ffdb2f7fd8056f1e47436 on remote branch
Change-Id: I612b4a4da07cf696b890828791158afb31a12168
3 files changed, 61 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index f83e10b289..48be983685 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -2146,6 +2146,11 @@ status_t StagefrightRecorder::setupVideoEncoder( // mIFramesIntervalSec == 0 means all Intra frame, can't support P/B layers if (tsLayers > 1 && mIFramesIntervalSec != 0) { 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 |