summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPraveen Chavan <pchavan@codeaurora.org>2013-10-04 01:25:34 -0700
committerThe Android Automerger <android-build@google.com>2013-10-04 16:19:37 -0700
commitc7c814157b326ed6501ecd64a10dd325fd961bdd (patch)
tree08e59ae1d8993dd6e547219d3fb7db29c5e6297f
parent7710bfb160a14d79118f68ede730c6f26147f63e (diff)
downloadandroid_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-xmm-video-v4l2/vidc/venc/src/omx_video_base.cpp27
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;