From: gb Date: Mon, 15 Mar 2010 17:09:12 +0000 (+0000) Subject: Display frames. X-Git-Tag: accepted/trunk/20120822.173359~729 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=271d8334ba23b9a1f99aadd3144ba4b016b121fb;p=profile%2Fivi%2Fgstreamer-vaapi.git Display frames. --- diff --git a/sys/vaapisink/gstvaapisink.c b/sys/vaapisink/gstvaapisink.c index 1e72580..8853cb3 100644 --- a/sys/vaapisink/gstvaapisink.c +++ b/sys/vaapisink/gstvaapisink.c @@ -20,8 +20,10 @@ #include "config.h" #include +#include #include #include +#include #include "gstvaapisink.h" #define GST_PLUGIN_NAME "vaapisink" @@ -98,6 +100,67 @@ gst_vaapisink_destroy(GstVaapiSink *sink) } } +static inline gboolean +gst_vaapisink_ensure_display(GstVaapiSink *sink) +{ + if (!sink->display) + sink->display = gst_vaapi_display_x11_new(sink->display_name); + return sink->display != NULL; +} + +static gboolean +gst_vaapisink_start(GstBaseSink *base_sink) +{ + GstVaapiSink * const sink = GST_VAAPISINK(base_sink); + + if (!gst_vaapisink_ensure_display(sink)) + return FALSE; + return TRUE; +} + +static gboolean +gst_vaapisink_stop(GstBaseSink *base_sink) +{ + GstVaapiSink * const sink = GST_VAAPISINK(base_sink); + + if (sink->window) { + g_object_unref(sink->window); + sink->window = NULL; + } + + if (sink->display) { + g_object_unref(sink->display); + sink->display = NULL; + } + return TRUE; +} + +static GstFlowReturn +gst_vaapisink_show_frame(GstVideoSink *video_sink, GstBuffer *buffer) +{ + GstVaapiSink * const sink = GST_VAAPISINK(video_sink); + GstVaapiVideoBuffer * const vbuffer = GST_VAAPI_VIDEO_BUFFER(buffer); + GstVaapiSurface *surface; + guint width, height, flags; + + 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; + + return GST_FLOW_OK; +} + static void gst_vaapisink_finalize(GObject *object) { @@ -165,7 +228,6 @@ static void gst_vaapisink_base_init(gpointer klass) static void gst_vaapisink_class_init(GstVaapiSinkClass *klass) { GObjectClass * const object_class = G_OBJECT_CLASS(klass); - GstElementClass * const element_class = GST_ELEMENT_CLASS(klass); GstBaseSinkClass * const basesink_class = GST_BASE_SINK_CLASS(klass); GstVideoSinkClass * const videosink_class = GST_VIDEO_SINK_CLASS(klass); @@ -173,6 +235,11 @@ static void gst_vaapisink_class_init(GstVaapiSinkClass *klass) 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; + + videosink_class->show_frame = gst_vaapisink_show_frame; + g_object_class_install_property (object_class, PROP_DISPLAY, @@ -201,8 +268,8 @@ static void gst_vaapisink_init(GstVaapiSink *sink, GstVaapiSinkClass *klass) GstVaapiDisplay * gst_vaapisink_get_display(GstVaapiSink *sink) { - if (!sink->display) - sink->display = gst_vaapi_display_x11_new(sink->display_name); + if (!gst_vaapisink_ensure_display(sink)) + return NULL; return sink->display; } diff --git a/sys/vaapisink/gstvaapisink.h b/sys/vaapisink/gstvaapisink.h index c0291ad..bc04bfa 100644 --- a/sys/vaapisink/gstvaapisink.h +++ b/sys/vaapisink/gstvaapisink.h @@ -23,6 +23,7 @@ #include #include +#include #include G_BEGIN_DECLS @@ -60,6 +61,7 @@ struct _GstVaapiSink { gchar *display_name; GstVaapiDisplay *display; + GstVaapiWindow *window; }; struct _GstVaapiSinkClass {