mm-video: vdec: Fix for blocking pthread_join

If a file descriptor being monitored by poll() is closed in
another thread, the result is unspecified. So, poll() might
not exit on closing the fd. This change fixes the issue by
always calling stop command before closing the fd. On
receipt of stop done, poll thread exits and then fd can be
closed.

Change-Id: I9e258e90c2c8687659aeb8616778fa1ff9fc8436
CRs-fixed: 478727
diff --git a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
index 8e10470..c79ea75 100644
--- a/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
+++ b/mm-video/vidc/vdec/src/omx_vdec_msm8974.cpp
@@ -706,9 +706,9 @@
   pthread_join(msg_thread_id,NULL);
   DEBUG_PRINT_HIGH("Waiting on OMX Async Thread exit");
   dec.cmd = V4L2_DEC_CMD_STOP;
-  if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
-  {
-    DEBUG_PRINT_ERROR("\n STOP Command failed\n");
+  if (drv_ctx.video_driver_fd >=0 ) {
+    if (ioctl(drv_ctx.video_driver_fd, VIDIOC_DECODER_CMD, &dec))
+      DEBUG_PRINT_ERROR("\n STOP Command failed\n");
   }
   pthread_join(async_thread_id,NULL);
   unsubscribe_to_events(drv_ctx.video_driver_fd);
@@ -1425,12 +1425,13 @@
 	drv_ctx.frame_rate.fps_numerator = DEFAULT_FPS;
 	drv_ctx.frame_rate.fps_denominator = 1;
 
-    ret = pthread_create(&async_thread_id,0,async_message_thread,this);
-    if(ret < 0) {
-	  close(drv_ctx.video_driver_fd);
+    ret = subscribe_to_events(drv_ctx.video_driver_fd);
+    if (!ret)
+      ret = pthread_create(&async_thread_id,0,async_message_thread,this);
+    if(ret) {
 	  DEBUG_PRINT_ERROR("\n Failed to create async_message_thread \n");
 	  return OMX_ErrorInsufficientResources;
-   }
+    }
 
 #ifdef INPUT_BUFFER_LOG
 	strcpy(inputfilename, INPUT_BUFFER_FILE_NAME);
@@ -1613,11 +1614,6 @@
         }
 
 		capture_capability= V4L2_PIX_FMT_NV12;
-		ret = subscribe_to_events(drv_ctx.video_driver_fd);
-		if (ret) {
-			DEBUG_PRINT_ERROR("\n Subscribe Event Failed \n");
-			return OMX_ErrorInsufficientResources;
-		}
 
 		struct v4l2_capability cap;
 		ret = ioctl(drv_ctx.video_driver_fd, VIDIOC_QUERYCAP, &cap);
@@ -1713,7 +1709,6 @@
 			ret=ioctl(drv_ctx.video_driver_fd, VIDIOC_S_CTRL,&control);
 			if (ret) {
 				DEBUG_PRINT_ERROR("Omx_vdec:: Unable to open secure device %d\n", ret);
-				close(drv_ctx.video_driver_fd);
 				return OMX_ErrorInsufficientResources;
 			}
 		}
@@ -1824,12 +1819,6 @@
 	if (eRet != OMX_ErrorNone)
 	{
 		DEBUG_PRINT_ERROR("\n Component Init Failed");
-		DEBUG_PRINT_HIGH("\n Calling VDEC_IOCTL_STOP_NEXT_MSG");
-		(void)ioctl(drv_ctx.video_driver_fd, VDEC_IOCTL_STOP_NEXT_MSG,
-				NULL);
-		DEBUG_PRINT_HIGH("\n Calling close() on Video Driver");
-		close (drv_ctx.video_driver_fd);
-		drv_ctx.video_driver_fd = -1;
 	}
 	else
 	{