Loading include/media/stagefright/ACodec.h +1 −0 Original line number Diff line number Diff line Loading @@ -120,6 +120,7 @@ private: kWhatSetParameters = 'setP', kWhatSubmitOutputMetaDataBufferIfEOS = 'subm', kWhatOMXDied = 'OMXd', kWhatReleaseCodecInstance = 'relC', }; enum { Loading media/libstagefright/ACodec.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -498,6 +498,10 @@ void ACodec::initiateShutdown(bool keepComponentAllocated) { sp<AMessage> msg = new AMessage(kWhatShutdown, id()); msg->setInt32("keepComponentAllocated", keepComponentAllocated); msg->post(); if (!keepComponentAllocated) { // ensure shutdown completes in 3 seconds (new AMessage(kWhatReleaseCodecInstance, id()))->post(3000000); } } void ACodec::signalRequestIDRFrame() { Loading Loading @@ -3797,6 +3801,19 @@ bool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { break; } case ACodec::kWhatReleaseCodecInstance: { ALOGI("[%s] forcing the release of codec", mCodec->mComponentName.c_str()); status_t err = mCodec->mOMX->freeNode(mCodec->mNode); ALOGE_IF("[%s] failed to release codec instance: err=%d", mCodec->mComponentName.c_str(), err); sp<AMessage> notify = mCodec->mNotify->dup(); notify->setInt32("what", CodecBase::kWhatShutdownCompleted); notify->post(); break; } default: return false; } Loading Loading @@ -4456,6 +4473,13 @@ bool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { break; } case ACodec::kWhatReleaseCodecInstance: { // nothing to do, as we have already signaled shutdown handled = true; break; } default: return BaseState::onMessageReceived(msg); } Loading media/libstagefright/omx/OMXNodeInstance.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,11 @@ static status_t StatusFromOMXError(OMX_ERRORTYPE err) { status_t OMXNodeInstance::freeNode(OMXMaster *master) { static int32_t kMaxNumIterations = 10; // exit if we have already freed the node if (mHandle == NULL) { return OK; } // Transition the node from its current state all the way down // to "Loaded". // This ensures that all active buffers are properly freed even Loading Loading
include/media/stagefright/ACodec.h +1 −0 Original line number Diff line number Diff line Loading @@ -120,6 +120,7 @@ private: kWhatSetParameters = 'setP', kWhatSubmitOutputMetaDataBufferIfEOS = 'subm', kWhatOMXDied = 'OMXd', kWhatReleaseCodecInstance = 'relC', }; enum { Loading
media/libstagefright/ACodec.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -498,6 +498,10 @@ void ACodec::initiateShutdown(bool keepComponentAllocated) { sp<AMessage> msg = new AMessage(kWhatShutdown, id()); msg->setInt32("keepComponentAllocated", keepComponentAllocated); msg->post(); if (!keepComponentAllocated) { // ensure shutdown completes in 3 seconds (new AMessage(kWhatReleaseCodecInstance, id()))->post(3000000); } } void ACodec::signalRequestIDRFrame() { Loading Loading @@ -3797,6 +3801,19 @@ bool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { break; } case ACodec::kWhatReleaseCodecInstance: { ALOGI("[%s] forcing the release of codec", mCodec->mComponentName.c_str()); status_t err = mCodec->mOMX->freeNode(mCodec->mNode); ALOGE_IF("[%s] failed to release codec instance: err=%d", mCodec->mComponentName.c_str(), err); sp<AMessage> notify = mCodec->mNotify->dup(); notify->setInt32("what", CodecBase::kWhatShutdownCompleted); notify->post(); break; } default: return false; } Loading Loading @@ -4456,6 +4473,13 @@ bool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { break; } case ACodec::kWhatReleaseCodecInstance: { // nothing to do, as we have already signaled shutdown handled = true; break; } default: return BaseState::onMessageReceived(msg); } Loading
media/libstagefright/omx/OMXNodeInstance.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,11 @@ static status_t StatusFromOMXError(OMX_ERRORTYPE err) { status_t OMXNodeInstance::freeNode(OMXMaster *master) { static int32_t kMaxNumIterations = 10; // exit if we have already freed the node if (mHandle == NULL) { return OK; } // Transition the node from its current state all the way down // to "Loaded". // This ensures that all active buffers are properly freed even Loading