mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
Add missing GstBaseSink::buffer_alloc() override. i.e. make sure
to allocate a GstVaapiVideoBuffer instead of a plain GstBuffer from the peer pad.
This commit is contained in:
parent
f1fc4b52c5
commit
73b50487f3
1 changed files with 59 additions and 10 deletions
|
@ -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);
|
||||
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;
|
||||
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;
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue