diff options
Diffstat (limited to 'media/libstagefright/omx/OMXNodeInstance.cpp')
-rw-r--r-- | media/libstagefright/omx/OMXNodeInstance.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 1e76e01..c09064f 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -133,7 +133,8 @@ struct BufferMeta { } // check component returns proper range - sp<ABuffer> codec = getBuffer(header, false /* backup */, true /* limit */); + sp<ABuffer> codec = getBuffer(header, false /* backup */, + !(header->nFlags & OMX_BUFFERFLAG_EXTRADATA)); memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, codec->data(), codec->size()); } @@ -143,9 +144,11 @@ struct BufferMeta { return; } + size_t bytesToCopy = header->nFlags & OMX_BUFFERFLAG_EXTRADATA ? + header->nAllocLen - header->nOffset : header->nFilledLen; memcpy(header->pBuffer + header->nOffset, (const OMX_U8 *)mMem->pointer() + header->nOffset, - header->nFilledLen); + bytesToCopy); } // return either the codec or the backup buffer @@ -216,7 +219,6 @@ OMXNodeInstance::OMXNodeInstance( mNodeID(0), mHandle(NULL), mObserver(observer), - mDying(false), mSailed(false), mQueriedProhibitedExtensions(false), mBufferIDCount(0) @@ -232,6 +234,7 @@ OMXNodeInstance::OMXNodeInstance( mMetadataType[0] = kMetadataBufferTypeInvalid; mMetadataType[1] = kMetadataBufferTypeInvalid; mIsSecure = AString(name).endsWith(".secure"); + atomic_store(&mDying, false); } OMXNodeInstance::~OMXNodeInstance() { @@ -302,11 +305,12 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) { // The code below may trigger some more events to be dispatched // by the OMX component - we want to ignore them as our client // does not expect them. - mDying = true; + atomic_store(&mDying, true); OMX_STATETYPE state; CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); switch (state) { + case OMX_StatePause: case OMX_StateExecuting: { ALOGV("forcing Executing->Idle"); @@ -1631,6 +1635,9 @@ void OMXNodeInstance::onObserverDied(OMXMaster *master) { ALOGE("!!! Observer died. Quickly, do something, ... anything..."); // Try to force shutdown of the node and hope for the best. + // But allow the component to observe mDying = true first + atomic_store(&mDying, true); + sleep(2); freeNode(master); } @@ -1705,7 +1712,7 @@ OMX_ERRORTYPE OMXNodeInstance::OnEvent( OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData) { OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); - if (instance->mDying) { + if (atomic_load(&instance->mDying)) { return OMX_ErrorNone; } return instance->owner()->OnEvent( @@ -1718,7 +1725,7 @@ OMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); - if (instance->mDying) { + if (atomic_load(&instance->mDying)) { return OMX_ErrorNone; } int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); @@ -1732,7 +1739,7 @@ OMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); - if (instance->mDying) { + if (atomic_load(&instance->mDying)) { return OMX_ErrorNone; } int fenceFd = instance->retrieveFenceFromMeta_l(pBuffer, kPortIndexOutput); @@ -1771,7 +1778,8 @@ void OMXNodeInstance::removeActiveBuffer( void OMXNodeInstance::freeActiveBuffers() { // Make sure to count down here, as freeBuffer will in turn remove // the active buffer from the vector... - for (size_t i = mActiveBuffers.size(); i--;) { + for (size_t i = mActiveBuffers.size(); i;) { + i--; freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); } } |