summaryrefslogtreecommitdiffstats
path: root/gst/videofilter
diff options
context:
space:
mode:
authorChristian Schaller <uraeus@gnome.org>2005-05-06 11:25:56 +0000
committerChristian Schaller <uraeus@gnome.org>2005-05-06 11:25:56 +0000
commit012d4c657708cc2a90dd737345b1a2af9a8ecdfa (patch)
tree473597034531ad603aec199d64607476d7826805 /gst/videofilter
parent08b451f17fba2689412e6eb8a660bf259ad80037 (diff)
add ported videofilter to cvs head
Original commit message from CVS: add ported videofilter to cvs head
Diffstat (limited to 'gst/videofilter')
-rw-r--r--gst/videofilter/Makefile.am12
-rw-r--r--gst/videofilter/gstgamma.c6
-rw-r--r--gst/videofilter/gstvideobalance.c5
-rw-r--r--gst/videofilter/gstvideofilter.c118
-rw-r--r--gst/videofilter/gstvideoflip.c6
5 files changed, 65 insertions, 82 deletions
diff --git a/gst/videofilter/Makefile.am b/gst/videofilter/Makefile.am
index 25323004..985ae2fa 100644
--- a/gst/videofilter/Makefile.am
+++ b/gst/videofilter/Makefile.am
@@ -1,9 +1,9 @@
plugin_LTLIBRARIES = libgstvideofilter.la libgstvideoflip.la \
- libgstvideobalance.la libgstgamma.la
+ libgstgamma.la
noinst_LTLIBRARIES = libgstvideoexample.la
-noinst_HEADERS = gstvideofilter.h gstvideoflip.h gstvideobalance.h
+noinst_HEADERS = gstvideofilter.h gstvideoflip.h
EXTRA_DIST = gstvideotemplate.c make_filter
CLEANFILES = gstvideoexample.c
@@ -23,10 +23,10 @@ libgstvideoflip_la_CFLAGS = $(GST_CFLAGS)
libgstvideoflip_la_LIBADD =
libgstvideoflip_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstvideobalance_la_SOURCES = gstvideobalance.c
-libgstvideobalance_la_CFLAGS = $(GST_CFLAGS) $(LIBOIL_CFLAGS)
-libgstvideobalance_la_LIBADD = $(top_builddir)/gst-libs/gst/libgstinterfaces-$(GST_MAJORMINOR).la
-libgstvideobalance_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBOIL_LIBS) -lm
+# libgstvideobalance_la_SOURCES = gstvideobalance.c
+# libgstvideobalance_la_CFLAGS = $(GST_CFLAGS) $(LIBOIL_CFLAGS)
+# libgstvideobalance_la_LIBADD = $(top_builddir)/gst-libs/gst/libgstinterfaces-$(GST_MAJORMINOR).la
+# libgstvideobalance_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(LIBOIL_LIBS) -lm
libgstgamma_la_SOURCES = gstgamma.c
libgstgamma_la_CFLAGS = $(GST_CFLAGS)
diff --git a/gst/videofilter/gstgamma.c b/gst/videofilter/gstgamma.c
index 5a7edf2b..025eeac6 100644
--- a/gst/videofilter/gstgamma.c
+++ b/gst/videofilter/gstgamma.c
@@ -164,6 +164,9 @@ gst_gamma_class_init (gpointer g_class, gpointer class_data)
gobject_class = G_OBJECT_CLASS (g_class);
videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
+ gobject_class->set_property = gst_gamma_set_property;
+ gobject_class->get_property = gst_gamma_get_property;
+
g_object_class_install_property (gobject_class, ARG_GAMMA,
g_param_spec_double ("gamma", "Gamma", "gamma",
0.01, 10, 1, G_PARAM_READWRITE));
@@ -177,9 +180,6 @@ gst_gamma_class_init (gpointer g_class, gpointer class_data)
g_param_spec_double ("bluegamma", "Gamma_b",
"gamma value for the blue channel", 0.01, 10, 1, G_PARAM_READWRITE));
- gobject_class->set_property = gst_gamma_set_property;
- gobject_class->get_property = gst_gamma_get_property;
-
videofilter_class->setup = gst_gamma_setup;
}
diff --git a/gst/videofilter/gstvideobalance.c b/gst/videofilter/gstvideobalance.c
index 338fb66d..dbb61f5c 100644
--- a/gst/videofilter/gstvideobalance.c
+++ b/gst/videofilter/gstvideobalance.c
@@ -198,6 +198,9 @@ gst_videobalance_class_init (gpointer g_class, gpointer class_data)
parent_class = g_type_class_ref (GST_TYPE_VIDEOFILTER);
+ gobject_class->set_property = gst_videobalance_set_property;
+ gobject_class->get_property = gst_videobalance_get_property;
+
g_object_class_install_property (gobject_class, ARG_CONTRAST,
g_param_spec_double ("contrast", "Contrast", "contrast",
0, 2, 1, G_PARAM_READWRITE));
@@ -210,8 +213,6 @@ gst_videobalance_class_init (gpointer g_class, gpointer class_data)
g_param_spec_double ("saturation", "Saturation", "saturation",
0, 2, 1, G_PARAM_READWRITE));
- gobject_class->set_property = gst_videobalance_set_property;
- gobject_class->get_property = gst_videobalance_get_property;
gobject_class->dispose = gst_videobalance_dispose;
videofilter_class->setup = gst_videobalance_setup;
diff --git a/gst/videofilter/gstvideofilter.c b/gst/videofilter/gstvideofilter.c
index 6ba77f5d..ccc995c1 100644
--- a/gst/videofilter/gstvideofilter.c
+++ b/gst/videofilter/gstvideofilter.c
@@ -51,7 +51,7 @@ static void gst_videofilter_set_property (GObject * object, guint prop_id,
static void gst_videofilter_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static void gst_videofilter_chain (GstPad * pad, GstData * _data);
+static GstFlowReturn gst_videofilter_chain (GstPad * pad, GstBuffer * buffer);
GstCaps *gst_videofilter_class_get_capslist (GstVideofilterClass * klass);
static void gst_videofilter_setup (GstVideofilter * videofilter);
@@ -172,70 +172,56 @@ gst_videofilter_getcaps (GstPad * pad)
{
GstVideofilter *videofilter;
GstVideofilterClass *klass;
-
- //GstCaps *caps;
- GstCaps *othercaps;
- GstPad *otherpad;
-
- //int i;
+ GstCaps *caps;
+ GstPad *peer;
+ int i;
GST_DEBUG ("gst_videofilter_getcaps");
- videofilter = GST_VIDEOFILTER (gst_pad_get_parent (pad));
+ videofilter = GST_VIDEOFILTER (GST_PAD_PARENT (pad));
klass = GST_VIDEOFILTER_CLASS (G_OBJECT_GET_CLASS (videofilter));
- otherpad = (pad == videofilter->srcpad) ? videofilter->sinkpad :
- videofilter->srcpad;
-
- othercaps = gst_pad_get_allowed_caps (otherpad);
-
- return othercaps;
-#if 0
- /* FIXME videofilter doesn't allow passthru of video formats it
- * doesn't understand. */
- /* Look through our list of caps and find those that match with
- * the peer's formats. Create a list of them. */
- /* FIXME optimize if peercaps == NULL */
+ /* we can handle anything that was registered */
caps = gst_caps_new_empty ();
for (i = 0; i < klass->formats->len; i++) {
- GstCaps *icaps;
GstCaps *fromcaps;
fromcaps =
gst_caps_new_full (gst_videofilter_format_get_structure
(g_ptr_array_index (klass->formats, i)), NULL);
- icaps = gst_caps_intersect (fromcaps, peercaps);
- if (icaps != NULL) {
- gst_caps_append (caps, fromcaps);
- } else {
- gst_caps_free (fromcaps);
+ gst_caps_append (caps, fromcaps);
+ }
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ GstCaps *peercaps;
+
+ peercaps = gst_pad_get_caps (peer);
+ if (peercaps) {
+ GstCaps *icaps;
+
+ icaps = gst_caps_intersect (peercaps, caps);
+ gst_caps_unref (peercaps);
+ gst_caps_unref (caps);
+ caps = icaps;
}
- if (icaps)
- gst_caps_free (icaps);
+ //gst_object_unref (peer);
}
- gst_caps_free (peercaps);
return caps;
-#endif
}
-static GstPadLinkReturn
-gst_videofilter_link (GstPad * pad, const GstCaps * caps)
+static gboolean
+gst_videofilter_setcaps (GstPad * pad, GstCaps * caps)
{
GstVideofilter *videofilter;
GstStructure *structure;
- gboolean ret;
int width, height;
double framerate;
- GstPadLinkReturn lret;
- GstPad *otherpad;
-
- GST_DEBUG ("gst_videofilter_src_link");
- videofilter = GST_VIDEOFILTER (gst_pad_get_parent (pad));
+ int ret;
- otherpad = (pad == videofilter->srcpad) ? videofilter->sinkpad :
- videofilter->srcpad;
+ videofilter = GST_VIDEOFILTER (GST_PAD_PARENT (pad));
structure = gst_caps_get_structure (caps, 0);
@@ -248,11 +234,9 @@ gst_videofilter_link (GstPad * pad, const GstCaps * caps)
ret &= gst_structure_get_double (structure, "framerate", &framerate);
if (!ret)
- return GST_PAD_LINK_REFUSED;
+ return FALSE;
- lret = gst_pad_try_set_caps (otherpad, caps);
- if (GST_PAD_LINK_FAILED (lret))
- return lret;
+ gst_pad_set_caps (videofilter->srcpad, caps);
GST_DEBUG ("width %d height %d", width, height);
@@ -273,7 +257,7 @@ gst_videofilter_link (GstPad * pad, const GstCaps * caps)
gst_videofilter_setup (videofilter);
- return GST_PAD_LINK_OK;
+ return TRUE;
}
static void
@@ -290,7 +274,7 @@ gst_videofilter_init (GTypeInstance * instance, gpointer g_class)
videofilter->sinkpad = gst_pad_new_from_template (pad_template, "sink");
gst_element_add_pad (GST_ELEMENT (videofilter), videofilter->sinkpad);
gst_pad_set_chain_function (videofilter->sinkpad, gst_videofilter_chain);
- gst_pad_set_link_function (videofilter->sinkpad, gst_videofilter_link);
+ gst_pad_set_setcaps_function (videofilter->sinkpad, gst_videofilter_setcaps);
gst_pad_set_getcaps_function (videofilter->sinkpad, gst_videofilter_getcaps);
pad_template =
@@ -298,16 +282,14 @@ gst_videofilter_init (GTypeInstance * instance, gpointer g_class)
g_return_if_fail (pad_template != NULL);
videofilter->srcpad = gst_pad_new_from_template (pad_template, "src");
gst_element_add_pad (GST_ELEMENT (videofilter), videofilter->srcpad);
- gst_pad_set_link_function (videofilter->srcpad, gst_videofilter_link);
gst_pad_set_getcaps_function (videofilter->srcpad, gst_videofilter_getcaps);
videofilter->inited = FALSE;
}
-static void
-gst_videofilter_chain (GstPad * pad, GstData * _data)
+static GstFlowReturn
+gst_videofilter_chain (GstPad * pad, GstBuffer * buf)
{
- GstBuffer *buf = GST_BUFFER (_data);
GstVideofilter *videofilter;
guchar *data;
gulong size;
@@ -315,19 +297,21 @@ gst_videofilter_chain (GstPad * pad, GstData * _data)
GST_DEBUG ("gst_videofilter_chain");
- g_return_if_fail (pad != NULL);
- g_return_if_fail (GST_IS_PAD (pad));
- g_return_if_fail (buf != NULL);
+ g_return_val_if_fail (pad != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
- videofilter = GST_VIDEOFILTER (gst_pad_get_parent (pad));
- //g_return_if_fail (videofilter->inited);
+ videofilter = GST_VIDEOFILTER (GST_PAD_PARENT (pad));
data = GST_BUFFER_DATA (buf);
size = GST_BUFFER_SIZE (buf);
if (videofilter->passthru) {
- gst_pad_push (videofilter->srcpad, GST_DATA (buf));
- return;
+ return gst_pad_push (videofilter->srcpad, buf);
+ }
+
+ if (GST_PAD_CAPS (pad) == NULL) {
+ return GST_FLOW_NOT_NEGOTIATED;
}
GST_DEBUG ("gst_videofilter_chain: got buffer of %ld bytes in '%s'", size,
@@ -339,19 +323,19 @@ gst_videofilter_chain (GstPad * pad, GstData * _data)
videofilter->to_width, videofilter->to_height, size,
videofilter->from_buf_size, videofilter->to_buf_size);
- g_return_if_fail (size >= videofilter->from_buf_size);
if (size > videofilter->from_buf_size) {
GST_INFO ("buffer size %ld larger than expected (%d)",
size, videofilter->from_buf_size);
+ return GST_FLOW_ERROR;
}
outbuf = gst_pad_alloc_buffer (videofilter->srcpad, GST_BUFFER_OFFSET_NONE,
- videofilter->to_buf_size);
+ videofilter->to_buf_size, GST_RPAD_CAPS (videofilter->srcpad));
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf);
- g_return_if_fail (videofilter->format);
+ g_return_val_if_fail (videofilter->format, GST_FLOW_ERROR);
GST_DEBUG ("format %s", videofilter->format->fourcc);
videofilter->in_buf = buf;
@@ -363,9 +347,11 @@ gst_videofilter_chain (GstPad * pad, GstData * _data)
GST_DEBUG ("gst_videofilter_chain: pushing buffer of %d bytes in '%s'",
GST_BUFFER_SIZE (outbuf), GST_OBJECT_NAME (videofilter));
- gst_pad_push (videofilter->srcpad, GST_DATA (outbuf));
+ gst_pad_push (videofilter->srcpad, outbuf);
gst_buffer_unref (buf);
+
+ return GST_FLOW_OK;
}
static void
@@ -422,7 +408,6 @@ void
gst_videofilter_set_output_size (GstVideofilter * videofilter,
int width, int height)
{
- int ret;
GstCaps *srccaps;
GstStructure *structure;
@@ -434,17 +419,14 @@ gst_videofilter_set_output_size (GstVideofilter * videofilter,
videofilter->to_buf_size = (videofilter->to_width * videofilter->to_height
* videofilter->format->bpp) / 8;
- srccaps = gst_caps_copy (gst_pad_get_negotiated_caps (videofilter->srcpad));
+ //srccaps = gst_caps_copy (gst_pad_get_negotiated_caps (videofilter->srcpad));
+ srccaps = gst_caps_copy (GST_PAD_CAPS (videofilter->srcpad));
structure = gst_caps_get_structure (srccaps, 0);
gst_structure_set (structure, "width", G_TYPE_INT, width,
"height", G_TYPE_INT, height, NULL);
- ret = gst_pad_try_set_caps (videofilter->srcpad, srccaps);
-
- if (ret < 0) {
- g_critical ("could not set output size");
- }
+ gst_pad_set_caps (videofilter->srcpad, srccaps);
}
static void
diff --git a/gst/videofilter/gstvideoflip.c b/gst/videofilter/gstvideoflip.c
index 81f9d767..b6685b2f 100644
--- a/gst/videofilter/gstvideoflip.c
+++ b/gst/videofilter/gstvideoflip.c
@@ -147,14 +147,14 @@ gst_videoflip_class_init (gpointer g_class, gpointer class_data)
gobject_class = G_OBJECT_CLASS (g_class);
videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
+ gobject_class->set_property = gst_videoflip_set_property;
+ gobject_class->get_property = gst_videoflip_get_property;
+
g_object_class_install_property (gobject_class, ARG_METHOD,
g_param_spec_enum ("method", "method", "method",
GST_TYPE_VIDEOFLIP_METHOD, GST_VIDEOFLIP_METHOD_90R,
G_PARAM_READWRITE));
- gobject_class->set_property = gst_videoflip_set_property;
- gobject_class->get_property = gst_videoflip_get_property;
-
videofilter_class->setup = gst_videoflip_setup;
}