mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 17:50:36 +00:00
Initialize the X window in a ::set_caps() handler.
Also fix build with GStreamer < 0.10.25. i.e. use preroll/render hooks.
This commit is contained in:
parent
912684b904
commit
65cc4aa494
1 changed files with 35 additions and 14 deletions
|
@ -135,25 +135,46 @@ gst_vaapisink_stop(GstBaseSink *base_sink)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static gboolean
|
||||||
gst_vaapisink_show_frame(GstVideoSink *video_sink, GstBuffer *buffer)
|
gst_vaapisink_set_caps(GstBaseSink *base_sink, GstCaps *caps)
|
||||||
{
|
{
|
||||||
GstVaapiSink * const sink = GST_VAAPISINK(video_sink);
|
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(GstBaseSink *base_sink, GstBuffer *buffer)
|
||||||
|
{
|
||||||
|
GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
|
||||||
GstVaapiVideoBuffer * const vbuffer = GST_VAAPI_VIDEO_BUFFER(buffer);
|
GstVaapiVideoBuffer * const vbuffer = GST_VAAPI_VIDEO_BUFFER(buffer);
|
||||||
GstVaapiSurface *surface;
|
GstVaapiSurface *surface;
|
||||||
guint width, height, flags;
|
guint flags;
|
||||||
|
|
||||||
|
if (!sink->window)
|
||||||
|
return GST_FLOW_UNEXPECTED;
|
||||||
|
|
||||||
surface = gst_vaapi_video_buffer_get_surface(vbuffer);
|
surface = gst_vaapi_video_buffer_get_surface(vbuffer);
|
||||||
if (!surface)
|
if (!surface)
|
||||||
return GST_FLOW_UNEXPECTED;
|
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;
|
flags = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
||||||
if (!gst_vaapi_window_put_surface(sink->window, surface, flags))
|
if (!gst_vaapi_window_put_surface(sink->window, surface, flags))
|
||||||
return GST_FLOW_UNEXPECTED;
|
return GST_FLOW_UNEXPECTED;
|
||||||
|
@ -229,7 +250,6 @@ static void gst_vaapisink_class_init(GstVaapiSinkClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass * const object_class = G_OBJECT_CLASS(klass);
|
GObjectClass * const object_class = G_OBJECT_CLASS(klass);
|
||||||
GstBaseSinkClass * const basesink_class = GST_BASE_SINK_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->finalize = gst_vaapisink_finalize;
|
||||||
object_class->set_property = gst_vaapisink_set_property;
|
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->start = gst_vaapisink_start;
|
||||||
basesink_class->stop = gst_vaapisink_stop;
|
basesink_class->stop = gst_vaapisink_stop;
|
||||||
|
basesink_class->set_caps = gst_vaapisink_set_caps;
|
||||||
videosink_class->show_frame = gst_vaapisink_show_frame;
|
basesink_class->preroll = gst_vaapisink_show_frame;
|
||||||
|
basesink_class->render = gst_vaapisink_show_frame;
|
||||||
|
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class,
|
(object_class,
|
||||||
|
|
Loading…
Reference in a new issue