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);
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
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: