OMX_ERRORTYPE ISVProcThreadObserver::releaseBuffer(PORT_INDEX index, OMX_BUFFERHEADERTYPE* pBuffer, bool bFLush) { if (!mBaseComponent || !mComponent || !mpCallBacks) return OMX_ErrorUndefined; OMX_ERRORTYPE err = OMX_ErrorNone; if (bFLush) { pBuffer->nFilledLen = 0; pBuffer->nOffset = 0; err = mpCallBacks->FillBufferDone(&mBaseComponent, mBaseComponent->pApplicationPrivate, pBuffer); ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: flush pBuffer %p", __func__, pBuffer); return err; } if (index == kPortIndexInput) { pBuffer->nFilledLen = 0; pBuffer->nOffset = 0; pBuffer->nFlags = 0; if (mISVBufferManager != NULL) { ISVBuffer* isvBuffer = mISVBufferManager->mapBuffer(reinterpret_cast<unsigned long>(pBuffer->pBuffer)); if (isvBuffer != NULL) isvBuffer->clearIfNeed(); } err = OMX_FillThisBuffer(mComponent, pBuffer); ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: FillBuffer pBuffer %p", __func__, pBuffer); } else { err = mpCallBacks->FillBufferDone(&mBaseComponent, mBaseComponent->pApplicationPrivate, pBuffer); ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: FillBufferDone pBuffer %p, timeStamp %.2f ms", __func__, pBuffer, pBuffer->nTimeStamp/1E3); } return err; }
OMX_ERRORTYPE ISVComponent::ISV_FillThisBuffer( OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { if(!mVPPEnabled || !mVPPOn) return OMX_FillThisBuffer(mComponent, pBuffer); ISVBuffer* isvBuffer = NULL; if (mISVBufferManager != NULL) { isvBuffer = mISVBufferManager->mapBuffer(reinterpret_cast<unsigned long>(pBuffer->pBuffer)); if (isvBuffer == NULL) { ALOGE("%s: failed to map ISVBuffer, set mVPPEnabled -->false", __func__); mVPPEnabled = false; return OMX_FillThisBuffer(mComponent, pBuffer); } if (OK != isvBuffer->initBufferInfo(mHackFormat)) { ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: isvBuffer %p failed to initBufferInfo", __func__, isvBuffer); mVPPEnabled = false; return OMX_FillThisBuffer(mComponent, pBuffer); } } if (mNumDecoderBuffers > 0) { mNumDecoderBuffers--; ALOGD_IF(ISV_COMPONENT_DEBUG, "%s: fill pBuffer %p to the decoder, decoder still need extra %d buffers", __func__, pBuffer, mNumDecoderBuffers); if (isvBuffer != NULL) isvBuffer->clearIfNeed(); return OMX_FillThisBuffer(mComponent, pBuffer); } mProcThread->addOutput(pBuffer); return OMX_ErrorNone; }