vaapisink: always keep the last displayed buffer around.
[platform/upstream/gstreamer-vaapi.git] / gst / vaapi / gstvaapisink.c
index ad4d8d7..61d92ac 100644 (file)
@@ -128,6 +128,7 @@ enum {
     PROP_0,
 
     PROP_DISPLAY_TYPE,
+    PROP_DISPLAY_NAME,
     PROP_FULLSCREEN,
     PROP_SYNCHRONOUS,
     PROP_USE_GLX,
@@ -210,26 +211,10 @@ static void
 gst_vaapisink_video_overlay_expose(GstVideoOverlay *overlay)
 {
     GstVaapiSink * const sink = GST_VAAPISINK(overlay);
-    GstBaseSink * const base_sink = GST_BASE_SINK(overlay);
-    GstBuffer *buffer;
 
-    if (sink->use_overlay)
-        buffer = sink->video_buffer ? gst_buffer_ref(sink->video_buffer) : NULL;
-    else {
-#if GST_CHECK_VERSION(1,0,0)
-        GstSample * const sample = gst_base_sink_get_last_sample(base_sink);
-        if (!sample)
-            return;
-        buffer = gst_buffer_ref(gst_sample_get_buffer(sample));
-        gst_sample_unref(sample);
-#else
-        buffer = gst_base_sink_get_last_buffer(base_sink);
-#endif
-    }
-    if (buffer) {
-        gst_vaapisink_show_frame(base_sink, buffer);
-        gst_buffer_unref(buffer);
-    }
+    if (sink->video_buffer)
+        gst_vaapisink_show_frame(GST_BASE_SINK_CAST(sink),
+            gst_buffer_ref(sink->video_buffer));
 }
 
 static void
@@ -1074,8 +1059,7 @@ gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *src_buffer)
         goto error;
 
     /* Retain VA surface until the next one is displayed */
-    if (sink->use_overlay)
-        gst_buffer_replace(&sink->video_buffer, buffer);
+    gst_buffer_replace(&sink->video_buffer, buffer);
     gst_buffer_unref(buffer);
     return GST_FLOW_OK;
 
@@ -1148,6 +1132,10 @@ gst_vaapisink_set_property(
         gst_vaapi_plugin_base_set_display_type(GST_VAAPI_PLUGIN_BASE(sink),
             g_value_get_enum(value));
         break;
+    case PROP_DISPLAY_NAME:
+        gst_vaapi_plugin_base_set_display_name(GST_VAAPI_PLUGIN_BASE(sink),
+            g_value_get_string(value));
+        break;
     case PROP_FULLSCREEN:
         sink->fullscreen = g_value_get_boolean(value);
         break;
@@ -1186,6 +1174,9 @@ gst_vaapisink_get_property(
     case PROP_DISPLAY_TYPE:
         g_value_set_enum(value, GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink));
         break;
+    case PROP_DISPLAY_NAME:
+        g_value_set_string(value, GST_VAAPI_PLUGIN_BASE_DISPLAY_NAME(sink));
+        break;
     case PROP_FULLSCREEN:
         g_value_set_boolean(value, sink->fullscreen);
         break;
@@ -1277,6 +1268,15 @@ gst_vaapisink_class_init(GstVaapiSinkClass *klass)
                            GST_VAAPI_DISPLAY_TYPE_ANY,
                            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+    g_object_class_install_property
+        (object_class,
+         PROP_DISPLAY_NAME,
+         g_param_spec_string("display-name",
+                             "display name",
+                             "display name to use",
+                             NULL,
+                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
 #if USE_GLX
     g_object_class_install_property
         (object_class,