Loading media/libstagefright/MediaCodec.cpp +40 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #define LOG_TAG "MediaCodec" #include <utils/Log.h> #include <set> #include <inttypes.h> #include <stdlib.h> Loading Loading @@ -202,6 +204,10 @@ struct MediaCodec::ResourceManagerServiceProxy : public RefBase { // implements DeathRecipient static void BinderDiedCallback(void* cookie); void binderDied(); static Mutex sLockCookies; static std::set<void*> sCookies; static void addCookie(void* cookie); static void removeCookie(void* cookie); void addResource(const MediaResourceParcel &resource); void removeResource(const MediaResourceParcel &resource); Loading @@ -228,8 +234,15 @@ MediaCodec::ResourceManagerServiceProxy::ResourceManagerServiceProxy( } MediaCodec::ResourceManagerServiceProxy::~ResourceManagerServiceProxy() { // remove the cookie, so any in-flight death notification will get dropped // by our handler. removeCookie(this); Mutex::Autolock _l(mLock); if (mService != nullptr) { AIBinder_unlinkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); mService = nullptr; } } Loading @@ -241,17 +254,40 @@ void MediaCodec::ResourceManagerServiceProxy::init() { return; } AIBinder_linkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); // Kill clients pending removal. mService->reclaimResourcesFromClientsPendingRemoval(mPid); // so our handler will process the death notifications addCookie(this); // after this, require mLock whenever using mService AIBinder_linkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); } //static Mutex MediaCodec::ResourceManagerServiceProxy::sLockCookies; std::set<void*> MediaCodec::ResourceManagerServiceProxy::sCookies; //static void MediaCodec::ResourceManagerServiceProxy::addCookie(void* cookie) { Mutex::Autolock _l(sLockCookies); sCookies.insert(cookie); } //static void MediaCodec::ResourceManagerServiceProxy::removeCookie(void* cookie) { Mutex::Autolock _l(sLockCookies); sCookies.erase(cookie); } //static void MediaCodec::ResourceManagerServiceProxy::BinderDiedCallback(void* cookie) { Mutex::Autolock _l(sLockCookies); if (sCookies.find(cookie) != sCookies.end()) { auto thiz = static_cast<ResourceManagerServiceProxy*>(cookie); thiz->binderDied(); } } void MediaCodec::ResourceManagerServiceProxy::binderDied() { ALOGW("ResourceManagerService died."); Loading Loading
media/libstagefright/MediaCodec.cpp +40 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #define LOG_TAG "MediaCodec" #include <utils/Log.h> #include <set> #include <inttypes.h> #include <stdlib.h> Loading Loading @@ -202,6 +204,10 @@ struct MediaCodec::ResourceManagerServiceProxy : public RefBase { // implements DeathRecipient static void BinderDiedCallback(void* cookie); void binderDied(); static Mutex sLockCookies; static std::set<void*> sCookies; static void addCookie(void* cookie); static void removeCookie(void* cookie); void addResource(const MediaResourceParcel &resource); void removeResource(const MediaResourceParcel &resource); Loading @@ -228,8 +234,15 @@ MediaCodec::ResourceManagerServiceProxy::ResourceManagerServiceProxy( } MediaCodec::ResourceManagerServiceProxy::~ResourceManagerServiceProxy() { // remove the cookie, so any in-flight death notification will get dropped // by our handler. removeCookie(this); Mutex::Autolock _l(mLock); if (mService != nullptr) { AIBinder_unlinkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); mService = nullptr; } } Loading @@ -241,17 +254,40 @@ void MediaCodec::ResourceManagerServiceProxy::init() { return; } AIBinder_linkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); // Kill clients pending removal. mService->reclaimResourcesFromClientsPendingRemoval(mPid); // so our handler will process the death notifications addCookie(this); // after this, require mLock whenever using mService AIBinder_linkToDeath(mService->asBinder().get(), mDeathRecipient.get(), this); } //static Mutex MediaCodec::ResourceManagerServiceProxy::sLockCookies; std::set<void*> MediaCodec::ResourceManagerServiceProxy::sCookies; //static void MediaCodec::ResourceManagerServiceProxy::addCookie(void* cookie) { Mutex::Autolock _l(sLockCookies); sCookies.insert(cookie); } //static void MediaCodec::ResourceManagerServiceProxy::removeCookie(void* cookie) { Mutex::Autolock _l(sLockCookies); sCookies.erase(cookie); } //static void MediaCodec::ResourceManagerServiceProxy::BinderDiedCallback(void* cookie) { Mutex::Autolock _l(sLockCookies); if (sCookies.find(cookie) != sCookies.end()) { auto thiz = static_cast<ResourceManagerServiceProxy*>(cookie); thiz->binderDied(); } } void MediaCodec::ResourceManagerServiceProxy::binderDied() { ALOGW("ResourceManagerService died."); Loading