From: Tim-Philipp Müller Date: Tue, 8 Sep 2009 17:19:19 +0000 (+0100) Subject: video: add GstVideoSinkClass::show_frame() X-Git-Tag: 1.19.3~511^2~9227 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e2b4187fe3a87fba63fd34dc4ecc7eb9471beabe;p=platform%2Fupstream%2Fgstreamer.git video: add GstVideoSinkClass::show_frame() Add ::show_frame() vfunc which maps to basesink's ::preroll and ::render vfuncs and add some gtk-doc chunks. API: GstVideoSinkClass::show_frame() --- diff --git a/gst-libs/gst/video/gstvideosink.c b/gst-libs/gst/video/gstvideosink.c index a3cc126..6a2e608 100644 --- a/gst-libs/gst/video/gstvideosink.c +++ b/gst-libs/gst/video/gstvideosink.c @@ -1,7 +1,6 @@ -/* - * GStreamer Video sink. - * +/* GStreamer video sink base class * Copyright (C) <2003> Julien Moutte + * Copyright (C) <2009> Tim-Philipp Müller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -44,7 +43,12 @@ GST_DEBUG_CATEGORY_STATIC (video_sink_debug); #define GST_CAT_DEFAULT video_sink_debug -static GstElementClass *parent_class = NULL; +static GstBaseSinkClass *parent_class = NULL; + +static GstFlowReturn gst_video_sink_show_preroll_frame (GstBaseSink * bsink, + GstBuffer * buf); +static GstFlowReturn gst_video_sink_show_frame (GstBaseSink * bsink, + GstBuffer * buf); /** * gst_video_sink_center_rect: @@ -112,7 +116,13 @@ gst_video_sink_init (GstVideoSink * videosink) static void gst_video_sink_class_init (GstVideoSinkClass * klass) { + GstBaseSinkClass *basesink_class = (GstBaseSinkClass *) klass; + parent_class = g_type_class_peek_parent (klass); + + basesink_class->render = GST_DEBUG_FUNCPTR (gst_video_sink_show_frame); + basesink_class->preroll = + GST_DEBUG_FUNCPTR (gst_video_sink_show_preroll_frame); } static void @@ -121,6 +131,46 @@ gst_video_sink_base_init (gpointer g_class) GST_DEBUG_CATEGORY_INIT (video_sink_debug, "videosink", 0, "GstVideoSink"); } +static GstFlowReturn +gst_video_sink_show_preroll_frame (GstBaseSink * bsink, GstBuffer * buf) +{ + GstVideoSinkClass *klass; + + klass = GST_VIDEO_SINK_GET_CLASS (bsink); + + if (klass->show_frame == NULL) { + if (parent_class->preroll != NULL) + return parent_class->preroll (bsink, buf); + else + return GST_FLOW_OK; + } + + GST_LOG_OBJECT (bsink, "rendering frame, ts=%" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + return klass->show_frame (GST_VIDEO_SINK_CAST (bsink), buf); +} + +static GstFlowReturn +gst_video_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) +{ + GstVideoSinkClass *klass; + + klass = GST_VIDEO_SINK_GET_CLASS (bsink); + + if (klass->show_frame == NULL) { + if (parent_class->render != NULL) + return parent_class->render (bsink, buf); + else + return GST_FLOW_OK; + } + + GST_LOG_OBJECT (bsink, "rendering frame, ts=%" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf))); + + return klass->show_frame (GST_VIDEO_SINK_CAST (bsink), buf); +} + /* Public methods */ GType diff --git a/gst-libs/gst/video/gstvideosink.h b/gst-libs/gst/video/gstvideosink.h index ca9f33c..0e4cd88 100644 --- a/gst-libs/gst/video/gstvideosink.h +++ b/gst-libs/gst/video/gstvideosink.h @@ -1,7 +1,6 @@ -/* - * GStreamer Video sink. - * +/* GStreamer video sink base class * Copyright (C) <2003> Julien Moutte + * Copyright (C) <2009> Tim-Philipp Müller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -18,7 +17,9 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - + +/* FIXME 0.11: turn this into a proper base class */ + #ifndef __GST_VIDEO_SINK_H__ #define __GST_VIDEO_SINK_H__ @@ -80,18 +81,40 @@ struct _GstVideoRectangle { gint h; }; +/** + * GstVideoSink: + * @element: the parent object structure (which is GstBaseSink) + * @height: video height (derived class needs to set this) + * @width: video width (derived class needs to set this) + * + * The video sink instance structure. Derived video sinks should set the + * @height and @width members. + */ struct _GstVideoSink { - GstBaseSink element; + GstBaseSink element; /* FIXME 0.11: this should not be called 'element' */ gint width, height; + /*< private >*/ gpointer _gst_reserved[GST_PADDING]; }; +/** + * GstVideoSinkClass: + * @parent_class: the parent class structure + * @show_frame: render a video frame. Maps to #GstBaseSink::render and + * #GstBaseSink::preroll vfuncs. Since: 0.10.25 + * + * The video sink class structure. Derived classes should override the + * @show_frame virtual function. + */ struct _GstVideoSinkClass { GstBaseSinkClass parent_class; - - gpointer _gst_reserved[GST_PADDING]; + + GstFlowReturn (*show_frame) (GstVideoSink *video_sink, GstBuffer *buf); + + /*< private >*/ + gpointer _gst_reserved[GST_PADDING - 1]; }; GType gst_video_sink_get_type (void);