msm: vidc: Fix bug in calling streamoff on driver

Streamoff should not be called on driver if streamon
was not called. In this case, video driver was returning
an error on streamoff and OMX component was not handling it.

Change-Id: I25b70595cb5b0072a8ef43ec316d23596df04ccb
diff --git a/mm-video/vidc/venc/inc/video_encoder_device_msm8974.h b/mm-video/vidc/venc/inc/video_encoder_device_msm8974.h
index 01f39b6..faf291e 100644
--- a/mm-video/vidc/venc/inc/video_encoder_device_msm8974.h
+++ b/mm-video/vidc/venc/inc/video_encoder_device_msm8974.h
@@ -158,6 +158,12 @@
 	 unsigned long	header_extension;

 };

 

+enum v4l2_ports {

+	CAPTURE_PORT,

+	OUTPUT_PORT,

+	MAX_PORT

+};

+

 class venc_dev

 {

 public:

@@ -267,7 +273,8 @@
 	  return x;

   }

 #endif

-int metadatamode;

+  int metadatamode;

+  bool streaming[MAX_PORT];

 };

 

 enum instance_state {

diff --git a/mm-video/vidc/venc/src/video_encoder_device_msm8974.cpp b/mm-video/vidc/venc/src/video_encoder_device_msm8974.cpp
index 3da08d9..ee8e1a5 100644
--- a/mm-video/vidc/venc/src/video_encoder_device_msm8974.cpp
+++ b/mm-video/vidc/venc/src/video_encoder_device_msm8974.cpp
@@ -158,9 +158,12 @@
 //constructor
 venc_dev::venc_dev(class omx_venc *venc_class)
 {
-//nothing to do
-venc_handle = venc_class;
-etb_count=0;
+	//nothing to do
+	int i = 0;
+	venc_handle = venc_class;
+	etb_count=0;
+	for (i = 0; i < MAX_PORT; i++)
+		streaming[i] = false;
 }
 
 venc_dev::~venc_dev()
@@ -1203,18 +1206,34 @@
 
 unsigned venc_dev::venc_stop( void)
 {
-  struct venc_msg venc_msg;
-  if(!stopped) {
-	  enum v4l2_buf_type out_type, cap_type;
-	  out_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-	  cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-	  if(!ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &out_type) &&
-		 !ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type)) {
-		   venc_stop_done();
-		   stopped = 1;
-	   }
-  }
-  return 0;
+	struct venc_msg venc_msg;
+	int rc = 0;
+	if(!stopped) {
+		enum v4l2_buf_type out_type, cap_type;
+		if (streaming[OUTPUT_PORT]) {
+			cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+			rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
+			if (rc) {
+				DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
+						out_type, rc);
+			} else
+				streaming[OUTPUT_PORT] = false;
+		}
+		if (!rc && streaming[CAPTURE_PORT]) {
+			cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+			rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
+			if (rc) {
+				DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d\n",
+						cap_type, rc);
+			} else
+				streaming[CAPTURE_PORT] = false;
+		}
+		if (!rc) {
+			venc_stop_done();
+			stopped = 1;
+		}
+	}
+	return rc;
 }
 
 unsigned venc_dev::venc_pause(void)
@@ -1275,12 +1294,11 @@
 
 	ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
 
-	if (ret) {
+	if (ret)
 		return -1;
-	}
-	else {
-		return 0;
-	}
+
+	streaming[CAPTURE_PORT] = true;
+	return 0;
 }
 
 void venc_dev::venc_config_print()
@@ -1537,7 +1555,9 @@
 	  ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
 	  if (ret) {
 		  DEBUG_PRINT_ERROR("Failed to call streamon\n");
-	  }
+	  } else {
+			streaming[OUTPUT_PORT] = true;
+		}
   }
 #ifdef INPUT_BUFFER_LOG