Enabled dynamic port reconfiguration without no-component-reconfigure 48/117948/9
authorSejun Park <sejun79.park@samsung.com>
Wed, 8 Mar 2017 05:52:27 +0000 (14:52 +0900)
committerSejun Park <sejun79.park@samsung.com>
Fri, 10 Mar 2017 08:08:59 +0000 (17:08 +0900)
Change-Id: Iddba0199399633268679f4243368a4911fedc043

omx/gstomxvideodec.c
packaging/gst-omx.spec

index cce0852..7874971 100755 (executable)
@@ -84,6 +84,10 @@ static OMX_ERRORTYPE gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec *
 static OMX_ERRORTYPE gst_omx_video_dec_deallocate_output_buffers (GstOMXVideoDec
     * self);
 
+#ifdef TIZEN_FEATURE_OMX
+static gboolean gst_omx_video_dec_acquire_request_flush_buffer (GstOMXVideoDec * self, GstBuffer ** flush_request_buffer);
+#endif
+
 enum
 {
   PROP_0
@@ -1366,6 +1370,9 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
   GstOMXAcquireBufferReturn acq_return;
   GstClockTimeDiff deadline;
   OMX_ERRORTYPE err;
+#ifdef TIZEN_FEATURE_OMX
+  GstBuffer *flush_request_buffer = NULL;
+#endif
 
 #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL)
   port = self->eglimage ? self->egl_out_port : self->dec_out_port;
@@ -1393,6 +1400,17 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
     /* Reallocate all buffers */
     if (acq_return == GST_OMX_ACQUIRE_BUFFER_RECONFIGURE
         && gst_omx_port_is_enabled (port)) {
+#ifdef TIZEN_FEATURE_OMX
+      if(gst_omx_video_dec_acquire_request_flush_buffer (self, &flush_request_buffer)) {
+        flow_ret = gst_pad_push (GST_VIDEO_DECODER_SRC_PAD (self), flush_request_buffer);
+
+        if (flow_ret != GST_FLOW_OK) {
+          gst_buffer_unref(flush_request_buffer);
+          flush_request_buffer = NULL;
+          goto reconfigure_error;
+        }
+      }
+#endif
       err = gst_omx_port_set_enabled (port, FALSE);
       if (err != OMX_ErrorNone)
         goto reconfigure_error;
@@ -2092,27 +2110,33 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
         gst_omx_port_set_flushing (self->egl_out_port, 5 * GST_SECOND, TRUE);
       }
 #endif
-
       if (gst_omx_port_set_enabled (self->dec_in_port, FALSE) != OMX_ErrorNone)
         return FALSE;
-      if (gst_omx_port_set_enabled (out_port, FALSE) != OMX_ErrorNone)
-        return FALSE;
+
       if (gst_omx_port_wait_buffers_released (self->dec_in_port,
               5 * GST_SECOND) != OMX_ErrorNone)
         return FALSE;
-      if (gst_omx_port_wait_buffers_released (out_port,
-              1 * GST_SECOND) != OMX_ErrorNone)
-        return FALSE;
+
       if (gst_omx_port_deallocate_buffers (self->dec_in_port) != OMX_ErrorNone)
         return FALSE;
-      if (gst_omx_video_dec_deallocate_output_buffers (self) != OMX_ErrorNone)
-        return FALSE;
+
       if (gst_omx_port_wait_enabled (self->dec_in_port,
               1 * GST_SECOND) != OMX_ErrorNone)
         return FALSE;
-      if (gst_omx_port_wait_enabled (out_port, 1 * GST_SECOND) != OMX_ErrorNone)
+#ifndef TIZEN_FEATURE_OMX
+      if (gst_omx_port_set_enabled (out_port, FALSE) != OMX_ErrorNone)
         return FALSE;
 
+      if (gst_omx_port_wait_buffers_released (out_port,
+              1 * GST_SECOND) != OMX_ErrorNone)
+        return FALSE;
+
+      if (gst_omx_video_dec_deallocate_output_buffers (self) != OMX_ErrorNone)
+        return FALSE;
+
+      if (gst_omx_port_wait_enabled (out_port, 1 * GST_SECOND) != OMX_ErrorNone)
+        return FALSE;
+#endif
 #if defined (USE_OMX_TARGET_RPI) && defined (HAVE_GST_GL)
       if (self->eglimage) {
         OMX_STATETYPE egl_state;
@@ -2192,7 +2216,7 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
     if (gst_omx_port_allocate_buffers (self->dec_in_port) != OMX_ErrorNone)
       return FALSE;
 #endif
-
+#ifndef TIZEN_FEATURE_OMX
     if ((klass->cdata.hacks & GST_OMX_HACK_NO_DISABLE_OUTPORT)) {
       if (gst_omx_port_set_enabled (self->dec_out_port, TRUE) != OMX_ErrorNone)
         return FALSE;
@@ -2203,7 +2227,7 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
               5 * GST_SECOND) != OMX_ErrorNone)
         return FALSE;
     }
-
+#endif
     if (gst_omx_port_wait_enabled (self->dec_in_port,
             5 * GST_SECOND) != OMX_ErrorNone)
       return FALSE;
@@ -2261,7 +2285,6 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
 #endif
   }
 
-
     if (gst_omx_component_get_state (self->dec,
             GST_CLOCK_TIME_NONE) != OMX_StateIdle)
       return FALSE;
@@ -2830,3 +2853,42 @@ gst_omx_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query)
   return TRUE;
 }
 
+#ifdef TIZEN_FEATURE_OMX
+static gboolean
+gst_omx_video_dec_acquire_request_flush_buffer (GstOMXVideoDec * self, GstBuffer ** flush_request_buffer)
+{
+  GstFlowReturn flow_ret = GST_FLOW_OK;
+  guint8 *dummy_data = NULL;
+  GstBuffer *buf = NULL;
+  MMVideoBuffer *mm_vbuffer = NULL;
+
+  GST_DEBUG_OBJECT (self, "flush buffer request");
+
+  if (self->out_port_pool) {
+    if (gst_buffer_pool_is_active(self->out_port_pool)) {
+      dummy_data = g_malloc0(128*128);
+      buf = gst_buffer_new_wrapped(dummy_data, 128*128);
+      mm_vbuffer = g_malloc(sizeof(MMVideoBuffer));
+
+      mm_vbuffer->type = MM_VIDEO_BUFFER_TYPE_TBM_BO;
+      mm_vbuffer->size[0] = 0;
+      mm_vbuffer->flush_request = TRUE;
+
+      gst_buffer_append_memory(buf,
+        gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, mm_vbuffer, sizeof(MMVideoBuffer), 0,
+          sizeof(MMVideoBuffer), mm_vbuffer, g_free));
+
+      *flush_request_buffer = buf;
+
+      GST_DEBUG_OBJECT (self, "flush buffer requested");
+      return TRUE;
+    } else {
+        GST_DEBUG_OBJECT (self, "the out port pool has not yet been activated");
+        return FALSE;
+    }
+  } else {
+    GST_DEBUG_OBJECT (self, "the output port has not yet been activated");
+    return FALSE;
+  }
+}
+#endif
index 534677d..caa1578 100755 (executable)
@@ -1,6 +1,6 @@
 Name:           gst-omx
 Summary:        GStreamer plug-in that allows communication with OpenMAX IL components
-Version:        1.2.3
+Version:        1.2.4
 Release:        1
 License:        LGPL-2.1+
 Group:          Multimedia/Framework