waylandsink : update last_sample in paused state when signal_handoffs is set to zero 40/138340/3
authorHyunil <hyunil46.park@samsung.com>
Wed, 12 Jul 2017 01:40:42 +0000 (10:40 +0900)
committerHyunil <hyunil46.park@samsung.com>
Wed, 12 Jul 2017 06:59:00 +0000 (15:59 +0900)
Change-Id: I640d8f10d54c573a615d7b1126374ac5ad62c515
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
ext/wayland/gstwaylandsink.c

index bcc7813..fe0eed6 100755 (executable)
@@ -183,15 +183,15 @@ GST_DEBUG_CATEGORY (gstwayland_debug);
 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE
 #ifdef TIZEN_FEATURE_WLSINK_ENHANCEMENT
-        ("{BGRx, BGRA, I420, NV12, NV12MT, NV21, SN12, ST12, SN21, SR32, S420}"))
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE
+        ("{BGRx, BGRA, I420, NV12, NV12MT, NV21, SN12, ST12, SN21, SR32, S420}")));
 #else
+    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE
         ("{ BGRx, BGRA, RGBx, xBGR, xRGB, RGBA, ABGR, ARGB, RGB, BGR, "
             "RGB16, BGR16, YUY2, YVYU, UYVY, AYUV, NV12, NV21, NV16, "
-            "YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }"))
+            "YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }")));
 #endif
-    );
 
 static void gst_wayland_sink_get_property (GObject * object,
     guint prop_id, GValue * value, GParamSpec * pspec);
@@ -887,6 +887,29 @@ gst_wayland_sink_render_flush_buffer (GstBaseSink * bsink)
   gst_wayland_sink_render (bsink, sink->last_buffer);
 }
 
+static void
+gst_wayland_sink_render_last_sample (GstWaylandSink * sink)
+{
+  GstSample *last_sample = NULL;
+  GstBuffer *last_buffer = NULL;
+  FUNCTION;
+  g_return_if_fail (sink != NULL);
+
+  g_object_get (G_OBJECT (sink), "last-sample", &last_sample, NULL);
+  if (last_sample) {
+    last_buffer = gst_sample_get_buffer (last_sample);
+    if (last_buffer) {
+      GST_LOG ("PAUSED state : last buffer %p", last_buffer);
+      gst_buffer_ref (last_buffer);
+      gst_wayland_sink_render (GST_BASE_SINK (sink), last_buffer);
+      gst_buffer_unref (last_buffer);
+      last_buffer = NULL;
+    }
+    gst_sample_unref (last_sample);
+    last_sample = NULL;
+  }
+}
+
 #endif
 
 static void
@@ -1027,9 +1050,28 @@ gst_wayland_sink_set_property (GObject * object,
     case PROP_SIGNAL_HANDOFFS:
       sink->signal_handoffs = g_value_get_boolean (value);
       GST_LOG ("set signal_handoffs(%d)", sink->signal_handoffs);
-      if (sink->signal_handoffs && sink->window) {
-        /* overlay -> hand-off */
-        gst_wayland_sink_stop_video (sink);
+      if (sink->window) {
+        if (sink->signal_handoffs) {
+          /* overlay -> hand-off */
+          if (GST_STATE (sink) == GST_STATE_PAUSED) {
+            /* check if the prerolled buffer has been rendered in GST_STATE_PAUSED */
+            if (sink->last_buffer) {
+              GST_LOG ("g_signal_emit: preroll-handoff");
+              g_signal_emit (sink,
+                  gst_waylandsink_signals[SIGNAL_PREROLL_HANDOFF], 0,
+                  sink->last_buffer, GST_BASE_SINK (object)->sinkpad);
+            }
+          }
+          gst_wayland_sink_stop_video (sink);
+        } else {
+          if (GST_STATE (sink) == GST_STATE_PAUSED) {
+            g_mutex_unlock (&sink->render_lock);
+            /* scenario: inline video mode->paused->fullscreen mode->signal_handoffs(0)
+               we need to update preroll buffer on wayland surface */
+            gst_wayland_sink_render_last_sample (sink);
+            g_mutex_lock (&sink->render_lock);
+          }
+        }
       }
       break;
     case PROP_KEEP_CAMERA_PREVIEW: