summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2014-12-12 12:27:54 -0800
committerLajos Molnar <lajos@google.com>2014-12-12 20:18:35 -0800
commiteee82e44548f17253c2e06b25725f91c7b549ec2 (patch)
treecf936ad01c06be9f7e8fe80cf83f73b630de4db7
parent8ddb02230d02968d471aa41b22433957c38827c0 (diff)
downloadframeworks_av-eee82e44548f17253c2e06b25725f91c7b549ec2.zip
frameworks_av-eee82e44548f17253c2e06b25725f91c7b549ec2.tar.gz
frameworks_av-eee82e44548f17253c2e06b25725f91c7b549ec2.tar.bz2
MediaCodecList: handle binder death
Bug: 18691591 Change-Id: Icc402d6ea9b0de4ac642c3b403fb64e865481b2e
-rw-r--r--include/media/stagefright/MediaCodecList.h6
-rw-r--r--media/libstagefright/MediaCodecList.cpp13
2 files changed, 18 insertions, 1 deletions
diff --git a/include/media/stagefright/MediaCodecList.h b/include/media/stagefright/MediaCodecList.h
index 8605d99..c2bbe4d 100644
--- a/include/media/stagefright/MediaCodecList.h
+++ b/include/media/stagefright/MediaCodecList.h
@@ -52,6 +52,12 @@ struct MediaCodecList : public BnMediaCodecList {
static sp<IMediaCodecList> getLocalInstance();
private:
+ class BinderDeathObserver : public IBinder::DeathRecipient {
+ void binderDied(const wp<IBinder> &the_late_who __unused);
+ };
+
+ static sp<BinderDeathObserver> sBinderDeathObserver;
+
enum Section {
SECTION_TOPLEVEL,
SECTION_DECODERS,
diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp
index 5b8be46..cf6e937 100644
--- a/media/libstagefright/MediaCodecList.cpp
+++ b/media/libstagefright/MediaCodecList.cpp
@@ -62,6 +62,14 @@ static Mutex sRemoteInitMutex;
sp<IMediaCodecList> MediaCodecList::sRemoteList;
+sp<MediaCodecList::BinderDeathObserver> MediaCodecList::sBinderDeathObserver;
+
+void MediaCodecList::BinderDeathObserver::binderDied(const wp<IBinder> &who __unused) {
+ Mutex::Autolock _l(sRemoteInitMutex);
+ sRemoteList.clear();
+ sBinderDeathObserver.clear();
+}
+
// static
sp<IMediaCodecList> MediaCodecList::getInstance() {
Mutex::Autolock _l(sRemoteInitMutex);
@@ -72,8 +80,11 @@ sp<IMediaCodecList> MediaCodecList::getInstance() {
interface_cast<IMediaPlayerService>(binder);
if (service.get() != NULL) {
sRemoteList = service->getCodecList();
+ if (sRemoteList != NULL) {
+ sBinderDeathObserver = new BinderDeathObserver();
+ binder->linkToDeath(sBinderDeathObserver.get());
+ }
}
-
if (sRemoteList == NULL) {
// if failed to get remote list, create local list
sRemoteList = getLocalInstance();