diff options
| author | Praveen Chavan <pchavan@codeaurora.org> | 2013-10-04 01:25:34 -0700 |
|---|---|---|
| committer | The Android Automerger <android-build@google.com> | 2013-10-04 16:19:37 -0700 |
| commit | c7c814157b326ed6501ecd64a10dd325fd961bdd (patch) | |
| tree | 08e59ae1d8993dd6e547219d3fb7db29c5e6297f | |
| parent | 7710bfb160a14d79118f68ede730c6f26147f63e (diff) | |
| download | android_hardware_qcom_media-c7c814157b326ed6501ecd64a10dd325fd961bdd.tar.gz android_hardware_qcom_media-c7c814157b326ed6501ecd64a10dd325fd961bdd.tar.bz2 android_hardware_qcom_media-c7c814157b326ed6501ecd64a10dd325fd961bdd.zip | |
mm-video: venc: fix corner case with 'handle zero-length invalid EOS buffers'
When queueing a color-conversion buffer in place of an invalid EOS buffer,
we may have run out of conversion buffers.
Wait for a color-conversion buffer to be returned by the encoder
Bug: 11070246
Change-Id: I99f963b342b98b44a78f38705e2bfc449b2cbc4e
| -rwxr-xr-x | mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 5b9757ce..12906725 100755 --- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -3796,6 +3796,7 @@ OMX_ERRORTYPE omx_video::empty_buffer_done(OMX_HANDLETYPE hComp, } // return color-conversion buffer back to the pool DEBUG_PRINT_LOW("\n empty_buffer_done insert address is %p",buffer); + if (!m_opq_pmem_q.insert_entry((unsigned int)buffer, 0, 0)) { DEBUG_PRINT_ERROR("\n empty_buffer_done: pmem queue is full"); return OMX_ErrorBadParameter; @@ -4277,9 +4278,6 @@ OMX_ERRORTYPE omx_video::empty_this_buffer_opaque(OMX_IN OMX_HANDLETYPE hComp, media_buffer = (encoder_media_buffer_type *)buffer->pBuffer; private_handle_t *handle = (private_handle_t *)media_buffer->meta_handle; - if (buffer->nFilledLen == 0 && (buffer->nFlags & OMX_BUFFERFLAG_EOS)) { - return push_empty_eos_buffer(hComp, buffer); - } /*Enable following code once private handle color format is updated correctly*/ @@ -4472,6 +4470,14 @@ OMX_ERRORTYPE omx_video::push_input_buffer(OMX_HANDLETYPE hComp) index,m_sInPortDef.nBufferCountActual); return OMX_ErrorBadParameter; } + + //Meta-Buffer with empty filled-length can contain garbage handle + //Some clients queue such buffers to signal EOS. Handle this case + // separately by queueing an intermediate color-conversion buffer + // and propagate the EOS. + if (psource_frame->nFilledLen == 0 && (psource_frame->nFlags & OMX_BUFFERFLAG_EOS)) { + return push_empty_eos_buffer(hComp, psource_frame); + } media_buffer = (encoder_media_buffer_type *)psource_frame->pBuffer; /*Will enable to verify camcorder in current TIPS can be removed*/ if (media_buffer->buffer_type == kMetadataBufferTypeCameraSource) { @@ -4505,7 +4511,12 @@ OMX_ERRORTYPE omx_video::push_empty_eos_buffer(OMX_HANDLETYPE hComp, OMX_BUFFERHEADERTYPE* opqBuf = NULL; OMX_ERRORTYPE retVal = OMX_ErrorNone; do { - if (m_opq_pmem_q.m_size) { + if (pdest_frame) { + //[1] use a checked out conversion buffer, if one is available + opqBuf = pdest_frame; + pdest_frame = NULL; + } else if (m_opq_pmem_q.m_size) { + //[2] else pop out one from the queue, if available unsigned address = 0, p2, id; m_opq_pmem_q.pop_entry(&address,&p2,&id); opqBuf = (OMX_BUFFERHEADERTYPE* ) address; @@ -4513,9 +4524,11 @@ OMX_ERRORTYPE omx_video::push_empty_eos_buffer(OMX_HANDLETYPE hComp, unsigned index = opqBuf - m_inp_mem_ptr; if (!opqBuf || index >= m_sInPortDef.nBufferCountActual) { DEBUG_PRINT_ERROR("push_empty_eos_buffer: Could not find a " - "color-conversion buffer to queue !"); - retVal = OMX_ErrorBadParameter; - break; + "color-conversion buffer to queue ! defer until available"); + //[3] else, returning back will defer calling this function again + //until a conversion buffer is returned by the encoder and also + //hold on to the client's buffer + return OMX_ErrorNone; } struct pmem Input_pmem_info; Input_pmem_info.buffer = opqBuf; |
