Add missing GstBaseSink::buffer_alloc() override. i.e. make sure
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Thu, 29 Apr 2010 21:59:14 +0000 (21:59 +0000)
committerGwenole Beauchesne <gbeauchesne@splitted-desktop.com>
Mon, 20 Sep 2010 10:55:41 +0000 (12:55 +0200)
to allocate a GstVaapiVideoBuffer instead of a plain GstBuffer
from the peer pad.

gst/vaapisink/gstvaapisink.c

index 51cea5b..bb56b75 100644 (file)
@@ -275,6 +275,54 @@ gst_vaapisink_set_caps(GstBaseSink *base_sink, GstCaps *caps)
     return TRUE;
 }
 
+static GstFlowReturn
+gst_vaapisink_buffer_alloc(
+    GstBaseSink *base_sink,
+    guint64      offset,
+    guint        size,
+    GstCaps     *caps,
+    GstBuffer  **pout_buffer
+)
+{
+    GstBuffer *buffer;
+    GstCaps *sink_caps;
+
+    sink_caps = gst_static_pad_template_get_caps(&gst_vaapisink_sink_factory);
+    if (!sink_caps)
+        goto error_no_sink_caps;
+
+    if (!gst_caps_is_always_compatible(caps, sink_caps))
+        goto error_invalid_caps;
+
+    buffer = gst_vaapi_video_buffer_new();
+    if (!buffer)
+        goto error_create_buffer;
+
+    gst_buffer_set_caps(buffer, caps);
+    gst_caps_unref(sink_caps);
+    *pout_buffer = buffer;
+    return GST_FLOW_OK;
+
+    /* ERRORS */
+error_no_sink_caps:
+    {
+        GST_DEBUG("failed to get static sink caps");
+        return GST_FLOW_UNEXPECTED;
+    }
+error_invalid_caps:
+    {
+        GST_DEBUG("failed to validate input caps");
+        gst_caps_unref(sink_caps);
+        return GST_FLOW_UNEXPECTED;
+    }
+error_create_buffer:
+    {
+        GST_DEBUG("failed to create video buffer");
+        gst_caps_unref(sink_caps);
+        return GST_FLOW_UNEXPECTED;
+    }
+}
+
 #if USE_VAAPISINK_GLX
 static void
 render_background(GstVaapiSink *sink)
@@ -539,18 +587,19 @@ static void gst_vaapisink_base_init(gpointer klass)
 
 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);
-
-    object_class->finalize      = gst_vaapisink_finalize;
-    object_class->set_property  = gst_vaapisink_set_property;
-    object_class->get_property  = gst_vaapisink_get_property;
-
-    basesink_class->start       = gst_vaapisink_start;
-    basesink_class->stop        = gst_vaapisink_stop;
-    basesink_class->set_caps    = gst_vaapisink_set_caps;
-    basesink_class->preroll     = gst_vaapisink_show_frame;
-    basesink_class->render      = gst_vaapisink_show_frame;
+    GObjectClass * const     object_class   = G_OBJECT_CLASS(klass);
+    GstBaseSinkClass * const basesink_class = GST_BASE_SINK_CLASS(klass);
+
+    object_class->finalize       = gst_vaapisink_finalize;
+    object_class->set_property   = gst_vaapisink_set_property;
+    object_class->get_property   = gst_vaapisink_get_property;
+
+    basesink_class->start        = gst_vaapisink_start;
+    basesink_class->stop         = gst_vaapisink_stop;
+    basesink_class->set_caps     = gst_vaapisink_set_caps;
+    basesink_class->buffer_alloc = gst_vaapisink_buffer_alloc;
+    basesink_class->preroll      = gst_vaapisink_show_frame;
+    basesink_class->render       = gst_vaapisink_show_frame;
 
 #if USE_VAAPISINK_GLX
     g_object_class_install_property