mm-video: vdec: hevc: fix buffer state issue
When rejecting zero length buffer and the buffer
is not an EOS buffer, reset its state to be with
omx component.
Change-Id: I83feceef17a10654af0f976f5f2d86c9ed9095f4
diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp
index b1fd66c..265af45 100644
--- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp
+++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_hevc_swvdec.cpp
@@ -5526,8 +5526,8 @@
return OMX_ErrorBadParameter;
}
- DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu)",
- buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen);
+ DEBUG_PRINT_LOW("[ETB] BHdr(%p) pBuf(%p) nTS(%lld) nFL(%lu) nFlags(%x)",
+ buffer, buffer->pBuffer, buffer->nTimeStamp, buffer->nFilledLen, buffer->nFlags);
if (arbitrary_bytes)
{
post_event ((unsigned)hComp,(unsigned)buffer,
@@ -5834,9 +5834,10 @@
return OMX_ErrorIncorrectStateOperation;
}
- if (buffer == NULL ||
- ((buffer - client_buffers.get_il_buf_hdr()) >= (int)drv_ctx.op_buf.actualcount))
+ unsigned int nPortIndex = (unsigned int)(buffer - client_buffers.get_il_buf_hdr());
+ if (buffer == NULL || nPortIndex >= drv_ctx.op_buf.actualcount)
{
+ DEBUG_PRINT_ERROR("ERROR:FTB invalid bufHdr %p, nPortIndex %u", buffer, nPortIndex);
return OMX_ErrorBadParameter;
}
@@ -5878,8 +5879,12 @@
nPortIndex = buffer-((OMX_BUFFERHEADERTYPE *)client_buffers.get_il_buf_hdr());
- if (bufferAdd == NULL || nPortIndex > drv_ctx.op_buf.actualcount)
+ if (bufferAdd == NULL || nPortIndex >= drv_ctx.op_buf.actualcount)
+ {
+ DEBUG_PRINT_ERROR("FTBProxy: bufhdr = %p, nPortIndex %u bufCount %u",
+ bufferAdd, nPortIndex, drv_ctx.op_buf.actualcount);
return OMX_ErrorBadParameter;
+ }
DEBUG_PRINT_LOW("FTBProxy: bufhdr = %p, bufhdr->pBuffer = %p",
bufferAdd, bufferAdd->pBuffer);
@@ -6091,9 +6096,6 @@
}
#endif
- DEBUG_PRINT_LOW("Calling VDEC_IOCTL_STOP_NEXT_MSG");
- //(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
- // NULL);
DEBUG_PRINT_HIGH("Close the driver instance");
#ifdef INPUT_BUFFER_LOG
@@ -6526,8 +6528,8 @@
buffer->nFlags &= ~OMX_BUFFERFLAG_DATACORRUPT;
}
- DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p idx %d, TS %lld",
- buffer, buffer->pBuffer, buffer - m_out_mem_ptr, buffer->nTimeStamp );
+ DEBUG_PRINT_LOW("fill_buffer_done: bufhdr = %p, bufhdr->pBuffer = %p idx %d, TS %lld nFlags %x",
+ buffer, buffer->pBuffer, buffer - m_out_mem_ptr, buffer->nTimeStamp, buffer->nFlags );
pending_output_buffers --;
if (buffer->nFlags & OMX_BUFFERFLAG_EOS)
@@ -9140,6 +9142,9 @@
((buffer->nFlags & OMX_BUFFERFLAG_EOS) == 0))
{
DEBUG_PRINT_HIGH("return zero legth buffer");
+ pthread_mutex_lock(&m_lock);
+ m_interm_buf_state[nPortIndex] = WITH_SWVDEC;
+ pthread_mutex_unlock(&m_lock);
post_event ((unsigned int)buffer,VDEC_S_SUCCESS,
OMX_COMPONENT_GENERATE_EBD_SWVDEC);
return OMX_ErrorNone;