Add GstXOverlay interface to vaapisink (e.g. for Totem).

This commit is contained in:
gb 2010-05-12 11:43:50 +00:00 committed by Gwenole Beauchesne
parent 2531b21a72
commit 601db12ccb
4 changed files with 110 additions and 0 deletions

1
NEWS
View file

@ -4,6 +4,7 @@ Copyright (C) 2010 Splitted-Desktop Systems
Version 0.2.1 - DD.May.2010
* Fix integration within the playbin2 pipeline
* Fix vaapidecode to expose the HW supported caps only
* Add GstXOverlay interface to vaapisink (e.g. for Totem)
Version 0.2.0 - 05.May.2010
* Relicense gst-libs/ code to LGPL v2.1+

View file

@ -154,6 +154,13 @@ PKG_CHECK_MODULES([GST_VIDEO],
AC_SUBST(GST_VIDEO_CFLAGS)
AC_SUBST(GST_VIDEO_LIBS)
dnl Check for GStreamer interfaces
PKG_CHECK_MODULES([GST_INTERFACES],
[gstreamer-interfaces-$GST_MAJORMINOR >= $GST_PLUGINS_BASE_VERSION_REQUIRED]
)
AC_SUBST(GST_INTERFACES_CFLAGS)
AC_SUBST(GST_INTERFACES_LIBS)
dnl GST_ALL_LDFLAGS:
dnl LDFLAGS really should only contain flags, not libs - they get added before
dnl whatevertarget_LIBS and -L flags here affect the rest of the linking

View file

@ -23,12 +23,14 @@ libgstvaapisink_la_CFLAGS = \
$(libgstvaapi_CFLAGS) \
$(GST_CFLAGS) \
$(GST_VIDEO_CFLAGS) \
$(GST_INTERFACES_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS)
libgstvaapisink_la_LIBADD = \
$(libgstvaapi_LIBS) \
$(GST_LIBS) \
$(GST_VIDEO_LIBS) \
$(GST_INTERFACES_LIBS) \
$(GST_PLUGINS_BASE_LIBS)
libgstvaapisink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)

View file

@ -40,6 +40,9 @@
#endif
#include "gstvaapisink.h"
/* Supported interfaces */
#include <gst/interfaces/xoverlay.h>
#define GST_PLUGIN_NAME "vaapisink"
#define GST_PLUGIN_DESC "A VA-API based videosink"
@ -81,6 +84,26 @@ enum {
PROP_USE_REFLECTION
};
/* GstImplementsInterface interface */
static gboolean
gst_vaapisink_implements_interface_supported(
GstImplementsInterface *iface,
GType type
)
{
return (type == GST_VAAPI_TYPE_VIDEO_SINK ||
type == GST_TYPE_X_OVERLAY);
}
static void
gst_vaapisink_implements_iface_init(GstImplementsInterfaceClass *iface)
{
iface->supported = gst_vaapisink_implements_interface_supported;
}
/* GstVaapiVideoSink interface */
static GstVaapiDisplay *
gst_vaapisink_get_display(GstVaapiSink *sink);
@ -96,13 +119,75 @@ gst_vaapi_video_sink_iface_init(GstVaapiVideoSinkInterface *iface)
iface->get_display = gst_vaapi_video_sink_do_get_display;
}
/* GstXOverlay interface */
static GstFlowReturn
gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer);
static void
gst_vaapisink_xoverlay_set_xid(GstXOverlay *overlay, XID xid)
{
GstVaapiSink * const sink = GST_VAAPISINK(overlay);
XWindowAttributes wattr;
if (sink->window &&
gst_vaapi_window_x11_get_xid(GST_VAAPI_WINDOW_X11(sink->window)) == xid)
return;
gst_vaapi_display_lock(sink->display);
XGetWindowAttributes(
gst_vaapi_display_x11_get_display(GST_VAAPI_DISPLAY_X11(sink->display)),
xid,
&wattr
);
gst_vaapi_display_unlock(sink->display);
sink->window_width = wattr.width;
sink->window_height = wattr.height;
if (sink->window) {
g_object_unref(sink->window);
sink->window = NULL;
}
#if USE_VAAPISINK_GLX
if (sink->use_glx)
sink->window = gst_vaapi_window_glx_new_with_xid(sink->display, xid);
else
#endif
sink->window = gst_vaapi_window_x11_new_with_xid(sink->display, xid);
}
static void
gst_vaapisink_xoverlay_expose(GstXOverlay *overlay)
{
GstBaseSink * const base_sink = GST_BASE_SINK(overlay);
GstBuffer *buffer;
buffer = gst_base_sink_get_last_buffer(base_sink);
if (buffer) {
gst_vaapisink_show_frame(base_sink, buffer);
gst_buffer_unref(buffer);
}
}
static void
gst_vaapisink_xoverlay_iface_init(GstXOverlayClass *iface)
{
iface->set_xwindow_id = gst_vaapisink_xoverlay_set_xid;
iface->expose = gst_vaapisink_xoverlay_expose;
}
static void
gst_vaapisink_iface_init(GType type)
{
const GType g_define_type_id = type;
G_IMPLEMENT_INTERFACE(GST_TYPE_IMPLEMENTS_INTERFACE,
gst_vaapisink_implements_iface_init);
G_IMPLEMENT_INTERFACE(GST_VAAPI_TYPE_VIDEO_SINK,
gst_vaapi_video_sink_iface_init);
G_IMPLEMENT_INTERFACE(GST_TYPE_X_OVERLAY,
gst_vaapisink_xoverlay_iface_init);
}
static void
@ -131,6 +216,11 @@ gst_vaapisink_ensure_window(GstVaapiSink *sink, guint width, guint height)
else
#endif
sink->window = gst_vaapi_window_x11_new(display, width, height);
if (sink->window)
gst_x_overlay_got_xwindow_id(
GST_X_OVERLAY(sink),
gst_vaapi_window_x11_get_xid(GST_VAAPI_WINDOW_X11(sink->window))
);
}
return sink->window != NULL;
}
@ -246,6 +336,16 @@ gst_vaapisink_set_caps(GstBaseSink *base_sink, GstCaps *caps)
}
GST_DEBUG("window size %ux%u", win_width, win_height);
if (!sink->window) {
gst_vaapi_display_lock(sink->display);
gst_x_overlay_prepare_xwindow_id(GST_X_OVERLAY(sink));
gst_vaapi_display_unlock(sink->display);
if (sink->window) {
win_width = sink->window_width;
win_height = sink->window_height;
}
}
if (sink->fullscreen) {
disp_rect->x = (display_width - win_width) / 2;
disp_rect->y = (display_height - win_height) / 2;