From ebad8a4dbc342748db61e65755076e6fd1499918 Mon Sep 17 00:00:00 2001 From: Luis de Bethencourt Date: Wed, 9 May 2012 15:44:02 +0100 Subject: [PATCH] gaudieffects: port chromium to GstVideoFilter --- gst/gaudieffects/gstchromium.c | 74 +++++++++++++--------------------- gst/gaudieffects/gstchromium.h | 2 - 2 files changed, 27 insertions(+), 49 deletions(-) diff --git a/gst/gaudieffects/gstchromium.c b/gst/gaudieffects/gstchromium.c index 8a6c433f1b..795b422a70 100644 --- a/gst/gaudieffects/gstchromium.c +++ b/gst/gaudieffects/gstchromium.c @@ -67,6 +67,9 @@ #include "gstplugin.h" #include "gstchromium.h" +#define gst_chromium_parent_class parent_class +G_DEFINE_TYPE (GstChromium, gst_chromium, GST_TYPE_VIDEO_FILTER); + GST_DEBUG_CATEGORY_STATIC (gst_chromium_debug); #define GST_CAT_DEFAULT gst_chromium_debug @@ -76,8 +79,6 @@ GST_DEBUG_CATEGORY_STATIC (gst_chromium_debug); #define CAPS_STR GST_VIDEO_CAPS_MAKE ("{ xBGR, xRGB }") #endif -G_DEFINE_TYPE (GstChromium, gst_chromium, GST_TYPE_VIDEO_FILTER); - /* Filter signals and args. */ enum { @@ -131,11 +132,10 @@ static void gst_chromium_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_chromium_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_chromium_finalize (GObject * object); -static gboolean gst_chromium_set_caps (GstBaseTransform * btrans, - GstCaps * incaps, GstCaps * outcaps); -static GstFlowReturn gst_chromium_transform (GstBaseTransform * btrans, - GstBuffer * in_buf, GstBuffer * out_buf); +static GstFlowReturn gst_chromium_transform_frame (GstVideoFilter * vfilter, + GstVideoFrame * in_frame, GstVideoFrame * out_frame); /* GObject vmethod implementations */ @@ -145,7 +145,7 @@ gst_chromium_class_init (GstChromiumClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; - GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass; + GstVideoFilterClass *vfilter_class = (GstVideoFilterClass *) klass; gst_element_class_set_details_simple (gstelement_class, "Chromium", "Filter/Effect/Video", @@ -159,6 +159,7 @@ gst_chromium_class_init (GstChromiumClass * klass) gobject_class->set_property = gst_chromium_set_property; gobject_class->get_property = gst_chromium_get_property; + gobject_class->finalize = gst_chromium_finalize; g_object_class_install_property (gobject_class, PROP_EDGE_A, g_param_spec_uint ("edge-a", "Edge A", @@ -174,8 +175,8 @@ gst_chromium_class_init (GstChromiumClass * klass) g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_chromium_set_caps); - trans_class->transform = GST_DEBUG_FUNCPTR (gst_chromium_transform); + vfilter_class->transform_frame = + GST_DEBUG_FUNCPTR (gst_chromium_transform_frame); } /* Initialize the element, @@ -215,7 +216,6 @@ gst_chromium_set_property (GObject * object, guint prop_id, } } - static void gst_chromium_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) @@ -240,56 +240,36 @@ gst_chromium_get_property (GObject * object, guint prop_id, GST_OBJECT_UNLOCK (filter); } -/* GstElement vmethod implementations */ - -/* Handle the link with other elements. */ -static gboolean -gst_chromium_set_caps (GstBaseTransform * btrans, GstCaps * incaps, - GstCaps * outcaps) +static void +gst_chromium_finalize (GObject * object) { - GstChromium *chromium = GST_CHROMIUM (btrans); - GstVideoInfo info; - - if (!gst_video_info_from_caps (&info, incaps)) - goto invalid_caps; - - chromium->info = info; - - chromium->width = GST_VIDEO_INFO_WIDTH (&info); - chromium->height = GST_VIDEO_INFO_HEIGHT (&info); - - return TRUE; - - /* ERRORS */ -invalid_caps: - { - GST_DEBUG_OBJECT (btrans, "could not parse caps"); - return FALSE; - } + G_OBJECT_CLASS (parent_class)->finalize (object); } +/* GstElement vmethod implementations */ + /* Actual processing. */ static GstFlowReturn -gst_chromium_transform (GstBaseTransform * btrans, - GstBuffer * in_buf, GstBuffer * out_buf) +gst_chromium_transform_frame (GstVideoFilter * vfilter, + GstVideoFrame * in_frame, GstVideoFrame * out_frame) { - GstChromium *filter = GST_CHROMIUM (btrans); - gint video_size, edge_a, edge_b; + GstChromium *filter = GST_CHROMIUM (vfilter); + gint video_size, edge_a, edge_b, width, height; guint32 *src, *dest; GstClockTime timestamp; gint64 stream_time; - GstVideoFrame in_frame, out_frame; - gst_video_frame_map (&in_frame, &filter->info, in_buf, GST_MAP_READ); - gst_video_frame_map (&out_frame, &filter->info, out_buf, GST_MAP_WRITE); + src = GST_VIDEO_FRAME_PLANE_DATA (in_frame, 0); + dest = GST_VIDEO_FRAME_PLANE_DATA (out_frame, 0); - src = GST_VIDEO_FRAME_PLANE_DATA (&in_frame, 0); - dest = GST_VIDEO_FRAME_PLANE_DATA (&out_frame, 0); + width = GST_VIDEO_FRAME_WIDTH (in_frame); + height = GST_VIDEO_FRAME_HEIGHT (in_frame); /* GstController: update the properties */ - timestamp = GST_BUFFER_TIMESTAMP (in_buf); + timestamp = GST_BUFFER_TIMESTAMP (in_frame->buffer); stream_time = - gst_segment_to_stream_time (&btrans->segment, GST_FORMAT_TIME, timestamp); + gst_segment_to_stream_time (&GST_BASE_TRANSFORM (filter)->segment, + GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); @@ -302,7 +282,7 @@ gst_chromium_transform (GstBaseTransform * btrans, edge_b = filter->edge_b; GST_OBJECT_UNLOCK (filter); - video_size = filter->width * filter->height; + video_size = width * height; transform (src, dest, video_size, edge_a, edge_b); return GST_FLOW_OK; diff --git a/gst/gaudieffects/gstchromium.h b/gst/gaudieffects/gstchromium.h index e93b34f69d..e7ea4f8ebe 100644 --- a/gst/gaudieffects/gstchromium.h +++ b/gst/gaudieffects/gstchromium.h @@ -68,10 +68,8 @@ typedef struct GstChromiumClass GstChromiumClass; struct GstChromium { GstVideoFilter videofilter; - gint width, height; /* < private > */ - GstVideoInfo info; gint edge_a, edge_b; gboolean silent; };