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
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 ecb7c6b..98443b7 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 @@
 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 @@
                         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 @@
                         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;
         }