[FIX] Check for valid input ID and correct order of deletion
authorAmarinder Bindra <a-bindra@ti.com>
Sat, 15 Mar 2014 09:59:01 +0000 (15:29 +0530)
committerAmarinder Bindra <a-bindra@ti.com>
Sat, 15 Mar 2014 09:59:01 +0000 (15:29 +0530)
During the flush command, the inputID would not be valid, hence
the function call to get the dmabuf id would result in SIGSEGV
error. Added a check for the inputID before getting the fd.
Also, if the call to IPU Engine_close is done in the starting, the
access to params or dce related data results in SIGSEGV, hence moving
the call to Engine_close just before dce_deinit.

Signed-off-by: Amarinder Bindra <a-bindra@ti.com>
src/gstducatividdec.c

index 3b3c9db48bad7fccea6db791ad17990508872935..5cd95b438a7d718792704ba0c17217c81af90554 100644 (file)
@@ -48,11 +48,6 @@ enum
 static void
 engine_close (GstDucatiVidDec * self)
 {
-  if (self->engine) {
-    Engine_close (self->engine);
-    self->engine = NULL;
-  }
-
   if (self->params) {
     dce_free (self->params);
     self->params = NULL;
@@ -88,6 +83,11 @@ engine_close (GstDucatiVidDec * self)
     self->outArgs = NULL;
   }
 
+  if (self->engine) {
+    Engine_close (self->engine);
+    self->engine = NULL;
+  }
+
   if (self->device) {
     dce_deinit (self->device);
     self->device = NULL;
@@ -402,10 +402,12 @@ codec_process (GstDucatiVidDec * self, gboolean send, gboolean flush,
   memset (&self->outArgs->outputID, 0, sizeof (self->outArgs->outputID));
   memset (&self->outArgs->freeBufID, 0, sizeof (self->outArgs->freeBufID));
 
-  /* Get dmabuf fd of the buffer to lock it*/
-  fd = gst_dma_buf_get_fd(gst_buffer_get_dma_buf((GstBuffer *) self->inArgs->inputID));
-  /* Must lock all the buffer passed to ducati */
-  dce_buf_lock(1,&fd);
+  if (self->inArgs->inputID != 0) {
+         /* Get dmabuf fd of the buffer to lock it*/
+         fd = gst_dma_buf_get_fd(gst_buffer_get_dma_buf((GstBuffer *) self->inArgs->inputID));
+         /* Must lock all the buffer passed to ducati */
+         dce_buf_lock(1,&fd);
+  }
 
   GST_DEBUG ("Calling VIDDEC3_process");
   t = gst_util_get_timestamp ();