diff options
author | Gu, Wangyi <wangyi.gu@intel.com> | 2015-06-17 10:56:05 +0800 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2015-06-30 22:42:52 -0700 |
commit | 94dc18063f6f0f60d99feaa0ffb1fc103d49c2c8 (patch) | |
tree | 5b7a8937a8b5db0a0aa95b4f57462cc9512bf38f /videocodec/OMXVideoDecoderVP9Hybrid.cpp | |
parent | b673023ba30b7526d71576b55f46d036533408cb (diff) | |
download | android_hardware_intel_common_omx-components-94dc18063f6f0f60d99feaa0ffb1fc103d49c2c8.tar.gz android_hardware_intel_common_omx-components-94dc18063f6f0f60d99feaa0ffb1fc103d49c2c8.tar.bz2 android_hardware_intel_common_omx-components-94dc18063f6f0f60d99feaa0ffb1fc103d49c2c8.zip |
enable meta data for VP9 hybrid
Bug: 19197299
Change-Id: I5ee078332ae04f847ef6d8858aaf4faff12de3b9
Signed-off-by: Gu, Wangyi <wangyi.gu@intel.com>
Diffstat (limited to 'videocodec/OMXVideoDecoderVP9Hybrid.cpp')
-rw-r--r-- | videocodec/OMXVideoDecoderVP9Hybrid.cpp | 152 |
1 files changed, 120 insertions, 32 deletions
diff --git a/videocodec/OMXVideoDecoderVP9Hybrid.cpp b/videocodec/OMXVideoDecoderVP9Hybrid.cpp index db400ca..b717e66 100644 --- a/videocodec/OMXVideoDecoderVP9Hybrid.cpp +++ b/videocodec/OMXVideoDecoderVP9Hybrid.cpp @@ -82,19 +82,35 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorInit(void) { bufferHeight = 1088; bufferCount = 12; } else { + if (mAPMode == METADATA_MODE) { + const OMX_PARAM_PORTDEFINITIONTYPE *def_output = this->ports[OUTPORT_INDEX]->GetPortDefinition(); + if (def_output == NULL) { + return OMX_ErrorBadParameter; + } + bufferCount = mMetaDataBuffersNum = def_output->nBufferCountActual; + mOMXBufferHeaderTypePtrNum = 0; + + mGraphicBufferParam.graphicBufferColorFormat = def_output->format.video.eColorFormat; + mGraphicBufferParam.graphicBufferStride = (def_output->format.video.nFrameWidth + 0x7f) & ~0x7f; + mGraphicBufferParam.graphicBufferWidth = def_output->format.video.nFrameWidth; + mGraphicBufferParam.graphicBufferHeight = (def_output->format.video.nFrameHeight + 0x1f) & ~0x1f; + mDecodedImageWidth = def_output->format.video.nFrameWidth; + mDecodedImageHeight = def_output->format.video.nFrameHeight; + } else{ + bufferCount = mOMXBufferHeaderTypePtrNum; + + for (i = 0; i < bufferCount; i++ ) { + OMX_BUFFERHEADERTYPE *buf_hdr = mOMXBufferHeaderTypePtrArray[i]; + buff[i] = (uint32_t)(buf_hdr->pBuffer); + } + } + bufferSize = mGraphicBufferParam.graphicBufferStride * mGraphicBufferParam.graphicBufferHeight * 1.5; bufferStride = mGraphicBufferParam.graphicBufferStride; - bufferCount = mOMXBufferHeaderTypePtrNum; bufferHeight = mGraphicBufferParam.graphicBufferHeight; bufferWidth = mGraphicBufferParam.graphicBufferWidth; - - for (i = 0; i < bufferCount; i++ ) { - OMX_BUFFERHEADERTYPE *buf_hdr = mOMXBufferHeaderTypePtrArray[i]; - buff[i] = (uint32_t)(buf_hdr->pBuffer); - } } - mLibHandle = dlopen("libDecoderVP9Hybrid.so", RTLD_NOW); if (mLibHandle == NULL) { LOGE("dlopen libDecoderVP9Hybrid.so fail\n"); @@ -125,7 +141,7 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorInit(void) { return OMX_ErrorBadParameter; } - mInitDecoder(mHybridCtx,bufferSize,bufferStride,bufferWidth, bufferHeight,bufferCount,gralloc_mode, buff); + mInitDecoder(mHybridCtx,bufferSize,bufferStride,bufferWidth, bufferHeight,bufferCount,gralloc_mode, buff, (uint32_t)mAPMode); return OMX_ErrorNone; } @@ -142,20 +158,35 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorReset(void) bufferHeight = mDecodedImageHeight; bufferCount = 12; } else { + if (mAPMode == METADATA_MODE) { + const OMX_PARAM_PORTDEFINITIONTYPE *def_output = this->ports[OUTPORT_INDEX]->GetPortDefinition(); + if (def_output == NULL) { + return OMX_ErrorBadParameter; + } + bufferCount = mMetaDataBuffersNum = def_output->nBufferCountActual; + mOMXBufferHeaderTypePtrNum = 0; + + mGraphicBufferParam.graphicBufferColorFormat = def_output->format.video.eColorFormat; + mGraphicBufferParam.graphicBufferStride = (def_output->format.video.nFrameWidth + 0x7f) & ~0x7f; + mGraphicBufferParam.graphicBufferWidth = def_output->format.video.nFrameWidth; + mGraphicBufferParam.graphicBufferHeight = (def_output->format.video.nFrameHeight + 0x1f) & ~0x1f; + } else{ + bufferCount = mOMXBufferHeaderTypePtrNum; + + for (i = 0; i < bufferCount; i++ ) { + OMX_BUFFERHEADERTYPE *buf_hdr = mOMXBufferHeaderTypePtrArray[i]; + buff[i] = (uint32_t)(buf_hdr->pBuffer); + } + } bufferSize = mGraphicBufferParam.graphicBufferStride * mGraphicBufferParam.graphicBufferHeight * 1.5; bufferStride = mGraphicBufferParam.graphicBufferStride; - bufferWidth = mGraphicBufferParam.graphicBufferWidth; - bufferCount = mOMXBufferHeaderTypePtrNum; bufferHeight = mGraphicBufferParam.graphicBufferHeight; - - for (i = 0; i < bufferCount; i++ ) { - OMX_BUFFERHEADERTYPE *buf_hdr = mOMXBufferHeaderTypePtrArray[i]; - buff[i] = (uint32_t)(buf_hdr->pBuffer); - } + bufferWidth = mGraphicBufferParam.graphicBufferWidth; } - mInitDecoder(mHybridCtx,bufferSize,bufferStride,bufferWidth,bufferHeight,bufferCount,gralloc_mode, buff); + mInitDecoder(mHybridCtx,bufferSize,bufferStride,bufferWidth,bufferHeight,bufferCount,gralloc_mode, buff, (uint32_t)mAPMode); + mFormatChanged = false; return OMX_ErrorNone; } @@ -167,8 +198,13 @@ bool OMXVideoDecoderVP9Hybrid::isReallocateNeeded(const uint8_t * data,uint32_t if (gralloc_mode) { ret = mGetFrameResolution(data,data_sz, &width, &height); if (ret) { - ret = width > mGraphicBufferParam.graphicBufferWidth - || height > mGraphicBufferParam.graphicBufferHeight; + if (mAPMode == METADATA_MODE) { + ret = (width != mDecodedImageWidth) + || (height != mDecodedImageHeight); + } else { + ret = width > mGraphicBufferParam.graphicBufferWidth + || height > mGraphicBufferParam.graphicBufferHeight; + } if (ret) { mDecodedImageNewWidth = width; mDecodedImageNewHeight = height; @@ -176,6 +212,7 @@ bool OMXVideoDecoderVP9Hybrid::isReallocateNeeded(const uint8_t * data,uint32_t } } } + return ret; } @@ -205,10 +242,32 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorFlush(OMX_U32 portIndex) { } OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE* buffer) { - unsigned int handle = (unsigned int)buffer->pBuffer; - if (buffer->nOutputPortIndex == OUTPORT_INDEX){ - mSingalRenderDone(mHybridCtx,handle); + unsigned int handle; + if (mAPMode == METADATA_MODE) { + bool found = false; + if (mOMXBufferHeaderTypePtrNum < mMetaDataBuffersNum) { + for (uint32_t i = 0; i < mOMXBufferHeaderTypePtrNum; i++) { + if (mOMXBufferHeaderTypePtrArray[i] == buffer) { + found = true; + break; + } + } + if (!found) { + mOMXBufferHeaderTypePtrArray[mOMXBufferHeaderTypePtrNum] = buffer; + mOMXBufferHeaderTypePtrNum++; + } + } else { + found = true; + } + + android::VideoGrallocMetadata *metadata = (android::VideoGrallocMetadata *)(buffer->pBuffer); + handle = (unsigned int)metadata->pHandle; + mSingalRenderDone(mHybridCtx, handle, !found); + } else { + handle = (unsigned int)buffer->pBuffer; + mSingalRenderDone(mHybridCtx, handle, false); + } } return OMX_ErrorNone; } @@ -223,7 +282,7 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorProcess( OMX_BUFFERHEADERTYPE *outBuffer = *pBuffers[OUTPORT_INDEX]; bool eos = (inBuffer->nFlags & OMX_BUFFERFLAG_EOS)? true:false; OMX_BOOL isResolutionChange = OMX_FALSE; - + bool formatChange = false; eos = eos && (inBuffer->nFilledLen == 0); if (inBuffer->pBuffer == NULL) { @@ -248,9 +307,13 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::ProcessorProcess( if (res != 0) { if (res == -2) { if (isReallocateNeeded(inBuffer->pBuffer + inBuffer->nOffset,inBuffer->nFilledLen)) { - retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - HandleFormatChange(); - return OMX_ErrorNone; + if (mAPMode == METADATA_MODE) { + mFormatChanged = true; + } else { + retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; + HandleFormatChange(); + return OMX_ErrorNone; + } } // drain the last frame, keep the current input buffer res = mDecoderDecode(mCtx,mHybridCtx,NULL,0,true); @@ -337,8 +400,17 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::FillRenderBuffer(OMX_BUFFERHEADERTYPE ** return OMX_ErrorNone; } - fb_index = mGetOutput(mCtx,mHybridCtx, &mDecodedImageNewWidth, &mDecodedImageNewHeight); + if (mFormatChanged && mAPMode == METADATA_MODE) { + fb_index = mGetOutput(mCtx,mHybridCtx, &mDecodedImageWidth, &mDecodedImageHeight); + } else { + fb_index = mGetOutput(mCtx,mHybridCtx, &mDecodedImageNewWidth, &mDecodedImageNewHeight); + } if (fb_index == -1) { + if (mFormatChanged && mAPMode == METADATA_MODE) { + *isResolutionChange = OMX_TRUE; + return OMX_ErrorNone; + } + if (inportBufferFlags & OMX_BUFFERFLAG_EOS) { // eos frame is no-shown frame buffer->nFlags = OMX_BUFFERFLAG_EOS; @@ -352,13 +424,19 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::FillRenderBuffer(OMX_BUFFERHEADERTYPE ** if (mDecodedImageHeight == 0 && mDecodedImageWidth == 0) { mDecodedImageWidth = mDecodedImageNewWidth; mDecodedImageHeight = mDecodedImageNewHeight; - *isResolutionChange = OMX_TRUE; + if (mAPMode == LEGACY_MODE) + *isResolutionChange = OMX_TRUE; } + + if (mAPMode == LEGACY_MODE) { if ((mDecodedImageNewWidth != mDecodedImageWidth) - || (mDecodedImageNewHeight!= mDecodedImageHeight)) { + || (mDecodedImageNewHeight!= mDecodedImageHeight)) *isResolutionChange = OMX_TRUE; + } else { + if (mFormatChanged && ((mDecodedImageNewWidth != mDecodedImageWidth) + || (mDecodedImageNewHeight!= mDecodedImageHeight))) + *isResolutionChange = OMX_TRUE; } - buffer = *pBuffer = mOMXBufferHeaderTypePtrArray[fb_index]; buffer->nOffset = 0; buffer->nFilledLen = sizeof(OMX_U8*); @@ -434,6 +512,10 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::HandleFormatChange(void) } } + if (mAPMode == METADATA_MODE) { + paramPortDefinitionOutput.nBufferCountActual = mNativeBufferCount; + paramPortDefinitionOutput.nBufferCountMin = mNativeBufferCount - 4; + } paramPortDefinitionInput.format.video.nFrameWidth = width; paramPortDefinitionInput.format.video.nFrameHeight = height; paramPortDefinitionInput.format.video.nStride = stride; @@ -447,20 +529,25 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::HandleFormatChange(void) } else if (mWorkingMode == GRAPHICBUFFER_MODE) { // when the width and height ES parse are not larger than allocated graphic buffer in outport, // there is no need to reallocate graphic buffer,just report the crop info to omx client - if (width <= mGraphicBufferParam.graphicBufferWidth && + if (mAPMode == LEGACY_MODE && + width <= mGraphicBufferParam.graphicBufferWidth && height <= mGraphicBufferParam.graphicBufferHeight) { this->ports[INPORT_INDEX]->SetPortDefinition(¶mPortDefinitionInput, true); this->ports[OUTPORT_INDEX]->ReportOutputCrop(); return OMX_ErrorNone; } - if (width > mGraphicBufferParam.graphicBufferWidth || + if (mAPMode == METADATA_MODE || + width > mGraphicBufferParam.graphicBufferWidth || height > mGraphicBufferParam.graphicBufferHeight) { // update the real decoded resolution to outport instead of display resolution // for graphic buffer reallocation // when the width and height parsed from ES are larger than allocated graphic buffer in outport, paramPortDefinitionOutput.format.video.nFrameWidth = width; - paramPortDefinitionOutput.format.video.nFrameHeight = (height + 0x1f) & ~0x1f; + if (mAPMode == METADATA_MODE) + paramPortDefinitionOutput.format.video.nFrameHeight = (height + 0x1f) & ~0x1f; + else + paramPortDefinitionOutput.format.video.nFrameHeight = (height + 0x1f) & ~0x1f; paramPortDefinitionOutput.format.video.eColorFormat = GetOutputColorFormat( paramPortDefinitionOutput.format.video.nFrameWidth); paramPortDefinitionOutput.format.video.nStride = stride; @@ -470,6 +557,7 @@ OMX_ERRORTYPE OMXVideoDecoderVP9Hybrid::HandleFormatChange(void) paramPortDefinitionOutput.bEnabled = (OMX_BOOL)false; mOMXBufferHeaderTypePtrNum = 0; + mMetaDataBuffersNum = 0; memset(&mGraphicBufferParam, 0, sizeof(mGraphicBufferParam)); mDeinitDecoder(mHybridCtx); |