summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArun Menon <avmenon@codeaurora.org>2013-08-14 16:00:03 +0530
committerVineeta Srivastava <vsrivastava@google.com>2013-11-12 12:55:47 -0800
commit9051a9833db84a4dad38adebc94fdb0861ae3b94 (patch)
tree4da6486900bf1a7c61f671a1ecbafac3f4a90377
parenta44fe520fdabcc8960f93dad69ac3ab01bf8509f (diff)
downloadandroid_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-xmm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp27
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;
}