mm-video: Adds support for back to back decoding
Adds a fix to move to Idle state after recieving FLUSH_DONE.
This avoid freeing of buffer by client which are not
freed by Venus yet.
Change-Id: Ia1cba24e42ee4c39f320c9815a91b349098675c3
diff --git a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
index 1035caa..8f55cc5 100755
--- a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -1909,33 +1909,14 @@
at the end of this function definition
*/
DEBUG_PRINT_LOW("\n send_command_proxy(): Executing --> Idle \n");
- //BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
+ BITMASK_SET(&m_flags,OMX_COMPONENT_IDLE_PENDING);
if(!sem_posted)
{
sem_posted = 1;
sem_post (&m_cmd_lock);
execute_omx_flush(OMX_ALL);
}
- bFlag = 1;
- int rc=0;
- enum v4l2_buf_type btype;
- btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
- if (rc) {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
- } else {
- streaming[OUTPUT_PORT] = false;
- }
- btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- rc = ioctl(drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
- if (rc) {
- /*TODO: How to handle this case */
- DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
- } else {
- streaming[CAPTURE_PORT] = false;
- }
- m_state = OMX_StateIdle;
+ bFlag = 0;
}
/* Requesting transition from Executing to Paused */
else if(eState == OMX_StatePause)
@@ -6639,6 +6620,30 @@
OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
break;
case VDEC_MSG_RESP_FLUSH_OUTPUT_DONE:
+ if(BITMASK_PRESENT(&omx->m_flags,OMX_COMPONENT_IDLE_PENDING)) {
+ int rc=0;
+ enum v4l2_buf_type btype;
+ btype = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+ rc = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ //TODO: How to handle this case /
+ DEBUG_PRINT_ERROR("\n Failed to call streamoff on OUTPUT Port \n");
+ } else {
+ omx->streaming[OUTPUT_PORT] = false;
+ }
+ btype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ rc = ioctl(omx->drv_ctx.video_driver_fd, VIDIOC_STREAMOFF, &btype);
+ if (rc) {
+ //TODO: How to handle this case /
+ DEBUG_PRINT_ERROR("\n Failed to call streamoff on CAPTURE Port \n");
+ } else {
+ omx->streaming[CAPTURE_PORT] = false;
+ }
+
+ omx->post_event (NULL,vdec_msg->status_code,\
+ OMX_COMPONENT_GENERATE_STOP_DONE);
+ }
+ else
omx->post_event (NULL,vdec_msg->status_code,\
OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
break;