Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c840b6e authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/26623958',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/26623958', 'googleplex-android-review.googlesource.com/26350308', 'googleplex-android-review.googlesource.com/27596965'] into 24Q2-release.

Change-Id: Ie94ff616b03664caeacf4934f0b0814928951199
parents abc118d1 45e0897d
Loading
Loading
Loading
Loading
+38 −4
Original line number Diff line number Diff line
@@ -17,11 +17,18 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "MediaPlayerService-DeathNotifier"
#include <android-base/logging.h>
#include <map>

#include "DeathNotifier.h"

namespace android {

// Only dereference the cookie if it's valid (if it's in this set)
// Only used with ndk
static uintptr_t sCookieKeyCounter = 0;
static std::map<uintptr_t, wp<DeathNotifier::DeathRecipient>> sCookies;
static std::mutex sCookiesMutex;

class DeathNotifier::DeathRecipient :
        public IBinder::DeathRecipient,
        public hardware::hidl_death_recipient {
@@ -44,13 +51,32 @@ public:
    }

    static void OnBinderDied(void *cookie) {
        DeathRecipient *thiz = (DeathRecipient *)cookie;
        thiz->mNotify();
        std::unique_lock<std::mutex> guard(sCookiesMutex);
        if (auto it = sCookies.find(reinterpret_cast<uintptr_t>(cookie)); it != sCookies.end()) {
            sp<DeathRecipient> recipient = it->second.promote();
            sCookies.erase(it);
            guard.unlock();

            if (recipient) {
                LOG(INFO) << "Notifying DeathRecipient from OnBinderDied.";
                recipient->mNotify();
            } else {
                LOG(INFO) <<
                    "Tried to notify DeathRecipient from OnBinderDied but could not promote.";
            }
        }
    }

    AIBinder_DeathRecipient *getNdkRecipient() {
        return mNdkRecipient.get();;
    }
    ~DeathRecipient() {
        // lock must be taken so object is not used in OnBinderDied"
        std::lock_guard<std::mutex> guard(sCookiesMutex);
        sCookies.erase(mCookieKey);
    }

    uintptr_t mCookieKey;

private:
    Notify mNotify;
@@ -73,8 +99,15 @@ DeathNotifier::DeathNotifier(::ndk::SpAIBinder const& service, Notify const& not
      : mService{std::in_place_index<3>, service},
        mDeathRecipient{new DeathRecipient(notify)} {
    mDeathRecipient->initNdk();
    {
        std::lock_guard<std::mutex> guard(sCookiesMutex);
        mDeathRecipient->mCookieKey = sCookieKeyCounter++;
        sCookies[mDeathRecipient->mCookieKey] = mDeathRecipient;
    }
    AIBinder_linkToDeath(
            service.get(), mDeathRecipient->getNdkRecipient(), mDeathRecipient.get());
            service.get(),
            mDeathRecipient->getNdkRecipient(),
            reinterpret_cast<void*>(mDeathRecipient->mCookieKey));
}

DeathNotifier::DeathNotifier(DeathNotifier&& other)
@@ -94,10 +127,11 @@ DeathNotifier::~DeathNotifier() {
        std::get<2>(mService)->unlinkToDeath(mDeathRecipient);
        break;
    case 3:

        AIBinder_unlinkToDeath(
                std::get<3>(mService).get(),
                mDeathRecipient->getNdkRecipient(),
                mDeathRecipient.get());
                reinterpret_cast<void*>(mDeathRecipient->mCookieKey));
        break;
    default:
        CHECK(false) << "Corrupted service type during destruction.";
+2 −1
Original line number Diff line number Diff line
@@ -37,10 +37,11 @@ public:
    DeathNotifier(DeathNotifier&& other);
    ~DeathNotifier();

    class DeathRecipient;

private:
    std::variant<std::monostate, sp<IBinder>, sp<HBase>, ::ndk::SpAIBinder> mService;

    class DeathRecipient;
    sp<DeathRecipient> mDeathRecipient;
};

+5 −0
Original line number Diff line number Diff line
@@ -2119,6 +2119,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));
+52 −5
Original line number Diff line number Diff line
@@ -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,23 @@ 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.
        std::erase_if(sCookies, [this](const auto& cookieEntry) {
            auto const& [key, cookie] = cookieEntry;
            std::lock_guard guard(mCookieKeysLock);
            if (const auto& it = mCookieKeys.find(key); it != mCookieKeys.end()) {
                // No longer need to track this cookie
                mCookieKeys.erase(key);
                return true;
            }
            return false;
        });
    }
    unregisterSelf();
}

@@ -123,7 +161,17 @@ void TranscodingResourcePolicy::registerSelf() {
        return;
    }

    AIBinder_linkToDeath(binder.get(), mDeathRecipient.get(), reinterpret_cast<void*>(this));
    std::unique_ptr<TranscodingResourcePolicyCookie> cookie =
            std::make_unique<TranscodingResourcePolicyCookie>(this);
    void* cookiePtr = static_cast<void*>(cookie.get());
    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;
+4 −0
Original line number Diff line number Diff line
@@ -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