diff options
| author | ywan171 <yi.a.wang@intel.com> | 2014-01-05 21:25:07 +0800 |
|---|---|---|
| committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:02:57 -0700 |
| commit | 8322da9a537082721d683070959eb3d2625529c0 (patch) | |
| tree | fe2c8e118f54e94b433f5b25a07bdb0ef6b3dad5 | |
| parent | 10ec5f6421a756a47d3b129051661e79ffed524f (diff) | |
| download | android_hardware_intel_common_omx-components-8322da9a537082721d683070959eb3d2625529c0.tar.gz android_hardware_intel_common_omx-components-8322da9a537082721d683070959eb3d2625529c0.tar.bz2 android_hardware_intel_common_omx-components-8322da9a537082721d683070959eb3d2625529c0.zip | |
omx-component: performance optimization for dynamic resolution change
BZ: 162482
When there is no need of buffer reallocation during dynamic resolution change
do not flush output surface queue; just attach a DRC tag to the buffer of difference resolution,
and send FormatChange to omx client when the buffer with DRC tag is output.
Change-Id: I1ea2288b113e51645dcb75c4ca28ca9d132c2800
Signed-off-by: ywan171 <yi.a.wang@intel.com>
| -rw-r--r-- | videocodec/OMXVideoDecoderBase.cpp | 17 | ||||
| -rw-r--r-- | videocodec/OMXVideoDecoderBase.h | 3 |
2 files changed, 16 insertions, 4 deletions
diff --git a/videocodec/OMXVideoDecoderBase.cpp b/videocodec/OMXVideoDecoderBase.cpp index cfe1026..692ba33 100644 --- a/videocodec/OMXVideoDecoderBase.cpp +++ b/videocodec/OMXVideoDecoderBase.cpp @@ -314,10 +314,14 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorProcess( OMX_ERRORTYPE ret; Decode_Status status; + OMX_BOOL isResolutionChange = OMX_FALSE; // fill render buffer without draining decoder output queue - ret = FillRenderBuffer(pBuffers[OUTPORT_INDEX], &retains[OUTPORT_INDEX], 0); + ret = FillRenderBuffer(pBuffers[OUTPORT_INDEX], &retains[OUTPORT_INDEX], 0, &isResolutionChange); if (ret == OMX_ErrorNone) { retains[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; + if (isResolutionChange) { + HandleFormatChange(); + } // TODO: continue decoding return ret; } else if (ret != OMX_ErrorNotReady) { @@ -383,7 +387,12 @@ OMX_ERRORTYPE OMXVideoDecoderBase::ProcessorProcess( } } // drain the decoder output queue when in EOS state and fill the render buffer - ret = FillRenderBuffer(pBuffers[OUTPORT_INDEX], &retains[OUTPORT_INDEX], ((*pBuffers[INPORT_INDEX]))->nFlags); + ret = FillRenderBuffer(pBuffers[OUTPORT_INDEX], &retains[OUTPORT_INDEX], + ((*pBuffers[INPORT_INDEX]))->nFlags,&isResolutionChange); + + if (isResolutionChange) { + HandleFormatChange(); + } bool inputEoS = ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS); bool outputEoS = ((*pBuffers[OUTPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS); @@ -519,7 +528,8 @@ OMX_ERRORTYPE OMXVideoDecoderBase::PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buf return OMX_ErrorNone; } -OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, buffer_retain_t *retain, OMX_U32 inportBufferFlags) { +OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, buffer_retain_t *retain, + OMX_U32 inportBufferFlags, OMX_BOOL *isResolutionChange) { OMX_BUFFERHEADERTYPE *buffer = *pBuffer; OMX_BUFFERHEADERTYPE *buffer_orign = buffer; @@ -566,6 +576,7 @@ OMX_ERRORTYPE OMXVideoDecoderBase::FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuff if (renderBuffer->flag & IS_EOS) { buffer->nFlags |= OMX_BUFFERFLAG_EOS; } + *isResolutionChange = (renderBuffer->flag & IS_RESOLUTION_CHANGE)? OMX_TRUE: OMX_FALSE; if (mWorkingMode == GRAPHICBUFFER_MODE) { if (buffer_orign != buffer) { diff --git a/videocodec/OMXVideoDecoderBase.h b/videocodec/OMXVideoDecoderBase.h index c1afc4a..b63ac33 100644 --- a/videocodec/OMXVideoDecoderBase.h +++ b/videocodec/OMXVideoDecoderBase.h @@ -59,7 +59,8 @@ protected: virtual OMX_ERRORTYPE ProcessorPreFreeBuffer(OMX_U32 nPortIndex,OMX_BUFFERHEADERTYPE * pBuffer); virtual OMX_ERRORTYPE PrepareConfigBuffer(VideoConfigBuffer *p); virtual OMX_ERRORTYPE PrepareDecodeBuffer(OMX_BUFFERHEADERTYPE *buffer, buffer_retain_t *retain, VideoDecodeBuffer *p); - virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, buffer_retain_t *retain, OMX_U32 inportBufferFlags); + virtual OMX_ERRORTYPE FillRenderBuffer(OMX_BUFFERHEADERTYPE **pBuffer, buffer_retain_t *retain, + OMX_U32 inportBufferFlags, OMX_BOOL *isResolutionChange); virtual OMX_ERRORTYPE HandleFormatChange(void); virtual OMX_ERRORTYPE TranslateDecodeStatus(Decode_Status status); virtual OMX_COLOR_FORMATTYPE GetOutputColorFormat(int width, int height); |
