aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorywan171 <yi.a.wang@intel.com>2014-01-05 21:25:07 +0800
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:02:57 -0700
commit8322da9a537082721d683070959eb3d2625529c0 (patch)
treefe2c8e118f54e94b433f5b25a07bdb0ef6b3dad5
parent10ec5f6421a756a47d3b129051661e79ffed524f (diff)
downloadandroid_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.cpp17
-rw-r--r--videocodec/OMXVideoDecoderBase.h3
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);