diff options
author | Andreas Huber <andih@google.com> | 2013-04-11 16:06:14 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2013-04-11 16:13:48 -0700 |
commit | ac0230da14a3d223c2144b165a3a163e8519d239 (patch) | |
tree | d791aa2505b920e0b146f89bab9c36a1f3f171d7 | |
parent | da0dc0af0effe9fbfb3ce3187c8472fca2baf3c6 (diff) | |
download | frameworks_av-ac0230da14a3d223c2144b165a3a163e8519d239.zip frameworks_av-ac0230da14a3d223c2144b165a3a163e8519d239.tar.gz frameworks_av-ac0230da14a3d223c2144b165a3a163e8519d239.tar.bz2 |
ACodec now signals an error if the mediaserver died while it is in
anything other than "uninitialized" state.
Change-Id: Id133d897ac65b455b34e5de17ff9c39b47285630
related-to-bug: 8397711
-rw-r--r-- | include/media/stagefright/ACodec.h | 2 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 57 | ||||
-rw-r--r-- | media/libstagefright/OMXClient.cpp | 2 |
3 files changed, 52 insertions, 9 deletions
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index 96baf34..5cfe5bc 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -46,6 +46,7 @@ struct ACodec : public AHierarchicalStateMachine { kWhatInputSurfaceCreated = 'isfc', kWhatSignaledInputEOS = 'seos', kWhatBuffersAllocated = 'allc', + kWhatOMXDied = 'OMXd', }; ACodec(); @@ -97,6 +98,7 @@ private: struct ExecutingToIdleState; struct IdleToLoadedState; struct FlushingState; + struct DeathNotifier; enum { kWhatSetup = 'setu', diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index ff72b71..01ff07e 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -166,6 +166,24 @@ private: //////////////////////////////////////////////////////////////////////////////// +struct ACodec::DeathNotifier : public IBinder::DeathRecipient { + DeathNotifier(const sp<AMessage> ¬ify) + : mNotify(notify) { + } + + virtual void binderDied(const wp<IBinder> &) { + mNotify->post(); + } + +protected: + virtual ~DeathNotifier() {} + +private: + sp<AMessage> mNotify; + + DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); +}; + struct ACodec::UninitializedState : public ACodec::BaseState { UninitializedState(ACodec *codec); @@ -177,6 +195,8 @@ private: void onSetup(const sp<AMessage> &msg); bool onAllocateComponent(const sp<AMessage> &msg); + sp<DeathNotifier> mDeathNotifier; + DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); }; @@ -2487,6 +2507,13 @@ bool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { return true; } + case ACodec::kWhatOMXDied: + { + ALOGE("OMX/mediaserver died, signalling error!"); + mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); + break; + } + default: return false; } @@ -3035,6 +3062,18 @@ ACodec::UninitializedState::UninitializedState(ACodec *codec) void ACodec::UninitializedState::stateEntered() { ALOGV("Now uninitialized"); + + if (mDeathNotifier != NULL) { + mCodec->mOMX->asBinder()->unlinkToDeath(mDeathNotifier); + mDeathNotifier.clear(); + } + + mCodec->mNativeWindow.clear(); + mCodec->mNode = NULL; + mCodec->mOMX.clear(); + mCodec->mQuirks = 0; + mCodec->mFlags = 0; + mCodec->mComponentName.clear(); } bool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { @@ -3106,6 +3145,15 @@ bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { sp<IOMX> omx = client.interface(); + sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec->id()); + + mDeathNotifier = new DeathNotifier(notify); + if (omx->asBinder()->linkToDeath(mDeathNotifier) != OK) { + // This was a local binder, if it dies so do we, we won't care + // about any notifications in the afterlife. + mDeathNotifier.clear(); + } + Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; AString mime; @@ -3170,7 +3218,7 @@ bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { return false; } - sp<AMessage> notify = new AMessage(kWhatOMXMessage, mCodec->id()); + notify = new AMessage(kWhatOMXMessage, mCodec->id()); observer->setNotificationMessage(notify); mCodec->mComponentName = componentName; @@ -3224,13 +3272,6 @@ void ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { if (!keepComponentAllocated) { CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); - mCodec->mNativeWindow.clear(); - mCodec->mNode = NULL; - mCodec->mOMX.clear(); - mCodec->mQuirks = 0; - mCodec->mFlags = 0; - mCodec->mComponentName.clear(); - mCodec->changeState(mCodec->mUninitializedState); } diff --git a/media/libstagefright/OMXClient.cpp b/media/libstagefright/OMXClient.cpp index ff72e0e..1822f07 100644 --- a/media/libstagefright/OMXClient.cpp +++ b/media/libstagefright/OMXClient.cpp @@ -32,7 +32,7 @@ struct MuxOMX : public IOMX { MuxOMX(const sp<IOMX> &remoteOMX); virtual ~MuxOMX(); - virtual IBinder *onAsBinder() { return NULL; } + virtual IBinder *onAsBinder() { return mRemoteOMX->asBinder().get(); } virtual bool livesLocally(node_id node, pid_t pid); |