Initialize the X window in a ::set_caps() handler.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Wed, 17 Mar 2010 07:20:19 +0000 (07:20 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Wed, 17 Mar 2010 07:20:19 +0000 (07:20 +0000)
Also fix build with GStreamer < 0.10.25. i.e. use preroll/render hooks.

sys/vaapisink/gstvaapisink.c

index 6f55f02..4c00ad4 100644 (file)
@@ -135,25 +135,46 @@ gst_vaapisink_stop(GstBaseSink *base_sink)
     return TRUE;
 }
 
+static gboolean
+gst_vaapisink_set_caps(GstBaseSink *base_sink, GstCaps *caps)
+{
+    GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
+    GstStructure * const structure = gst_caps_get_structure(caps, 0);
+    gint width, height;
+
+    if (!structure)
+        return FALSE;
+    if (!gst_structure_get_int(structure, "width",  &width))
+        return FALSE;
+    if (!gst_structure_get_int(structure, "height", &height))
+        return FALSE;
+
+    if (sink->window)
+        gst_vaapi_window_set_size(sink->window, width, height);
+    else {
+        sink->window = gst_vaapi_window_x11_new(sink->display, width, height);
+        if (!sink->window)
+            return FALSE;
+        gst_vaapi_window_show(sink->window);
+    }
+    return TRUE;
+}
+
 static GstFlowReturn
-gst_vaapisink_show_frame(GstVideoSink *video_sink, GstBuffer *buffer)
+gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer)
 {
-    GstVaapiSink * const sink = GST_VAAPISINK(video_sink);
+    GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
     GstVaapiVideoBuffer * const vbuffer = GST_VAAPI_VIDEO_BUFFER(buffer);
     GstVaapiSurface *surface;
-    guint width, height, flags;
+    guint flags;
+
+    if (!sink->window)
+        return GST_FLOW_UNEXPECTED;
 
     surface = gst_vaapi_video_buffer_get_surface(vbuffer);
     if (!surface)
         return GST_FLOW_UNEXPECTED;
 
-    gst_vaapi_surface_get_size(surface, &width, &height);
-    if (!sink->window) {
-        sink->window = gst_vaapi_window_x11_new(sink->display, width, height);
-        if (!sink->window)
-            return GST_FLOW_UNEXPECTED;
-    }
-
     flags = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
     if (!gst_vaapi_window_put_surface(sink->window, surface, flags))
         return GST_FLOW_UNEXPECTED;
@@ -229,7 +250,6 @@ static void gst_vaapisink_class_init(GstVaapiSinkClass *klass)
 {
     GObjectClass * const      object_class    = G_OBJECT_CLASS(klass);
     GstBaseSinkClass * const  basesink_class  = GST_BASE_SINK_CLASS(klass);
-    GstVideoSinkClass * const videosink_class = GST_VIDEO_SINK_CLASS(klass);
 
     object_class->finalize      = gst_vaapisink_finalize;
     object_class->set_property  = gst_vaapisink_set_property;
@@ -237,8 +257,9 @@ static void gst_vaapisink_class_init(GstVaapiSinkClass *klass)
 
     basesink_class->start       = gst_vaapisink_start;
     basesink_class->stop        = gst_vaapisink_stop;
-
-    videosink_class->show_frame = gst_vaapisink_show_frame;
+    basesink_class->set_caps    = gst_vaapisink_set_caps;
+    basesink_class->preroll     = gst_vaapisink_show_frame;
+    basesink_class->render      = gst_vaapisink_show_frame;
 
     g_object_class_install_property
         (object_class,