diff options
| author | Arun Menon <avmenon@codeaurora.org> | 2013-08-14 16:00:03 +0530 |
|---|---|---|
| committer | Vineeta Srivastava <vsrivastava@google.com> | 2013-11-12 12:55:47 -0800 |
| commit | 9051a9833db84a4dad38adebc94fdb0861ae3b94 (patch) | |
| tree | 4da6486900bf1a7c61f671a1ecbafac3f4a90377 | |
| parent | a44fe520fdabcc8960f93dad69ac3ab01bf8509f (diff) | |
| download | android_hardware_qcom_media-9051a9833db84a4dad38adebc94fdb0861ae3b94.tar.gz android_hardware_qcom_media-9051a9833db84a4dad38adebc94fdb0861ae3b94.tar.bz2 android_hardware_qcom_media-9051a9833db84a4dad38adebc94fdb0861ae3b94.zip | |
mm-video: vidc: release registered buffers from driver
In some scenarios, component may restart from loaded to idle
state in the same context and it is resulting in the preapare
buf failure as previous buffers are not unregistered. Unregister
the buffers from driver while stopping the component.
b/11051201
Signed-off: Manikanta Kanamarlapudi<kmanikan@codeaurora.org>
Change-Id: I048cf715d2e83b05df99eaf10776cff0bbb2acd2
| -rwxr-xr-x | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index ecb7c6b1..98443b76 100755 --- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -1438,7 +1438,8 @@ bool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index) unsigned venc_dev::venc_stop( void) { struct venc_msg venc_msg; - int rc = 0; + struct v4l2_requestbuffers bufreq; + int rc = 0, ret = 0; if (!stopped) { enum v4l2_buf_type cap_type; @@ -1452,6 +1453,17 @@ unsigned venc_dev::venc_stop( void) cap_type, rc); } else streaming[OUTPUT_PORT] = false; + + DEBUG_PRINT_LOW("Releasing registered buffers from driver on o/p port"); + bufreq.memory = V4L2_MEMORY_USERPTR; + bufreq.count = 0; + bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; + ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq); + + if (ret) { + DEBUG_PRINT_ERROR("\nERROR: VIDIOC_REQBUFS OUTPUT MPLANE Failed \n "); + return false; + } } if (!rc && streaming[CAPTURE_PORT]) { @@ -1463,9 +1475,20 @@ unsigned venc_dev::venc_stop( void) cap_type, rc); } else streaming[CAPTURE_PORT] = false; + + DEBUG_PRINT_LOW("Releasing registered buffers from driver on capture port"); + bufreq.memory = V4L2_MEMORY_USERPTR; + bufreq.count = 0; + bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq); + + if (ret) { + DEBUG_PRINT_ERROR("\nERROR: VIDIOC_REQBUFS CAPTURE MPLANE Failed \n "); + return false; + } } - if (!rc) { + if (!rc && !ret) { venc_stop_done(); stopped = 1; } |
