rpms/gstreamer-plugins-good/F-12 0001-Move-farsight-plugins-from-bad-to-good.patch, 1.2, 1.3 gstreamer-plugins-good.spec, 1.113, 1.114
Bastien Nocera
hadess at fedoraproject.org
Fri Jan 8 15:26:20 UTC 2010
Author: hadess
Update of /cvs/pkgs/rpms/gstreamer-plugins-good/F-12
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv26240
Modified Files:
0001-Move-farsight-plugins-from-bad-to-good.patch
gstreamer-plugins-good.spec
Log Message:
* Fri Jan 08 2010 Bastien Nocera <bnocera at redhat.com> 0.10.17-4
- Update Farsight plugins to 0.10.17
0001-Move-farsight-plugins-from-bad-to-good.patch:
Makefile.am | 1
configure.ac | 6
farsight/Makefile.am | 1
farsight/autoconvert/Makefile.am | 9
farsight/autoconvert/gstautoconvert.c | 1566 ++++++++++++++++++++++++++++++++++
farsight/autoconvert/gstautoconvert.h | 69 +
farsight/dtmf/Makefile.am | 23
farsight/dtmf/gstdtmf.c | 33
farsight/dtmf/gstdtmfsrc.c | 905 +++++++++++++++++++
farsight/dtmf/gstdtmfsrc.h | 98 ++
farsight/dtmf/gstrtpdtmfcommon.h | 23
farsight/dtmf/gstrtpdtmfdepay.c | 555 ++++++++++++
farsight/dtmf/gstrtpdtmfdepay.h | 66 +
farsight/dtmf/gstrtpdtmfsrc.c | 1099 +++++++++++++++++++++++
farsight/dtmf/gstrtpdtmfsrc.h | 112 ++
farsight/liveadder/Makefile.am | 11
farsight/liveadder/liveadder.c | 1548 +++++++++++++++++++++++++++++++++
farsight/liveadder/liveadder.h | 108 ++
farsight/rtpmux/Makefile.am | 13
farsight/rtpmux/gstrtpdtmfmux.c | 327 +++++++
farsight/rtpmux/gstrtpdtmfmux.h | 68 +
farsight/rtpmux/gstrtpmux.c | 662 ++++++++++++++
farsight/rtpmux/gstrtpmux.h | 78 +
farsight/rtpmux/gstrtpmuxer.c | 48 +
farsight/valve/Makefile.am | 9
farsight/valve/gstvalve.c | 311 ++++++
farsight/valve/gstvalve.h | 83 +
27 files changed, 7831 insertions(+), 1 deletion(-)
Index: 0001-Move-farsight-plugins-from-bad-to-good.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gstreamer-plugins-good/F-12/0001-Move-farsight-plugins-from-bad-to-good.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -p -r1.2 -r1.3
--- 0001-Move-farsight-plugins-from-bad-to-good.patch 22 Oct 2009 15:32:30 -0000 1.2
+++ 0001-Move-farsight-plugins-from-bad-to-good.patch 8 Jan 2010 15:26:20 -0000 1.3
@@ -1,37 +1,38 @@
-From 3f4951b983a9dfbec87ad57f69ade6829abbbab3 Mon Sep 17 00:00:00 2001
+From 2957a90c63922e4856242ecfa0c766edeac12945 Mon Sep 17 00:00:00 2001
From: Bastien Nocera <hadess at hadess.net>
Date: Mon, 22 Jun 2009 16:09:04 +0100
Subject: [PATCH] Move farsight plugins from -bad to -good
---
Makefile.am | 1 +
+ common | 2 +-
configure.ac | 6 +
farsight/Makefile.am | 1 +
farsight/autoconvert/Makefile.am | 9 +
- farsight/autoconvert/gstautoconvert.c | 1434 ++++++++++++++++++++++++++++++
- farsight/autoconvert/gstautoconvert.h | 65 ++
- farsight/dtmf/Makefile.am | 17 +
- farsight/dtmf/gstdtmf.c | 30 +
- farsight/dtmf/gstdtmfsrc.c | 935 ++++++++++++++++++++
- farsight/dtmf/gstdtmfsrc.h | 98 +++
+ farsight/autoconvert/gstautoconvert.c | 1566 +++++++++++++++++++++++++++++++++
+ farsight/autoconvert/gstautoconvert.h | 69 ++
+ farsight/dtmf/Makefile.am | 23 +
+ farsight/dtmf/gstdtmf.c | 33 +
+ farsight/dtmf/gstdtmfsrc.c | 905 +++++++++++++++++++
+ farsight/dtmf/gstdtmfsrc.h | 98 ++
farsight/dtmf/gstrtpdtmfcommon.h | 23 +
farsight/dtmf/gstrtpdtmfdepay.c | 555 ++++++++++++
farsight/dtmf/gstrtpdtmfdepay.h | 66 ++
farsight/dtmf/gstrtpdtmfsrc.c | 1099 +++++++++++++++++++++++
farsight/dtmf/gstrtpdtmfsrc.h | 112 +++
- farsight/liveadder/Makefile.am | 9 +
- farsight/liveadder/liveadder.c | 1548 +++++++++++++++++++++++++++++++++
+ farsight/liveadder/Makefile.am | 11 +
+ farsight/liveadder/liveadder.c | 1548 ++++++++++++++++++++++++++++++++
farsight/liveadder/liveadder.h | 108 +++
- farsight/rtpmux/Makefile.am | 11 +
- farsight/rtpmux/gstrtpdtmfmux.c | 326 +++++++
+ farsight/rtpmux/Makefile.am | 13 +
+ farsight/rtpmux/gstrtpdtmfmux.c | 327 +++++++
farsight/rtpmux/gstrtpdtmfmux.h | 68 ++
- farsight/rtpmux/gstrtpmux.c | 632 ++++++++++++++
+ farsight/rtpmux/gstrtpmux.c | 662 ++++++++++++++
farsight/rtpmux/gstrtpmux.h | 78 ++
farsight/rtpmux/gstrtpmuxer.c | 48 +
farsight/valve/Makefile.am | 9 +
farsight/valve/gstvalve.c | 311 +++++++
farsight/valve/gstvalve.h | 82 ++
- 27 files changed, 7681 insertions(+), 0 deletions(-)
+ 28 files changed, 7832 insertions(+), 1 deletions(-)
create mode 100644 farsight/Makefile.am
create mode 100644 farsight/autoconvert/Makefile.am
create mode 100644 farsight/autoconvert/gstautoconvert.c
@@ -71,10 +72,10 @@ index 4247a97..997881b 100644
docs \
po \
diff --git a/configure.ac b/configure.ac
-index 36b3884..c8e111b 100644
+index baa92bb..ea7f999 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -1117,6 +1117,12 @@ sys/osxvideo/Makefile
+@@ -1120,6 +1120,12 @@ sys/osxvideo/Makefile
sys/v4l2/Makefile
sys/waveform/Makefile
sys/ximage/Makefile
@@ -96,7 +97,7 @@ index 0000000..a5fac23
+SUBDIRS = autoconvert dtmf liveadder rtpmux valve
diff --git a/farsight/autoconvert/Makefile.am b/farsight/autoconvert/Makefile.am
new file mode 100644
-index 0000000..22e8a67
+index 0000000..28fc015
--- /dev/null
+++ b/farsight/autoconvert/Makefile.am
@@ -0,0 +1,9 @@
@@ -104,17 +105,17 @@ index 0000000..22e8a67
+
+libgstautoconvert_la_SOURCES = gstautoconvert.c gstautoconvert.h
+
-+libgstautoconvert_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS)
-+libgstautoconvert_la_LIBADD = $(GST_LIBS_LIBS)
-+libgstautoconvert_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS)
++libgstautoconvert_la_CFLAGS = $(GST_CFLAGS)
++libgstautoconvert_la_LIBADD = $(GST_LIBS)
++libgstautoconvert_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstautoconvert_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/farsight/autoconvert/gstautoconvert.c b/farsight/autoconvert/gstautoconvert.c
new file mode 100644
-index 0000000..55f4719
+index 0000000..4fb0a41
--- /dev/null
+++ b/farsight/autoconvert/gstautoconvert.c
-@@ -0,0 +1,1434 @@
+@@ -0,0 +1,1566 @@
+/* GStreamer
+ *
+ * Copyright 2007-2008 Collabora Ltd
@@ -162,6 +163,11 @@ index 0000000..55f4719
+GST_DEBUG_CATEGORY (autoconvert_debug);
+#define GST_CAT_DEFAULT (autoconvert_debug)
+
++#define DEFAULT_INITIAL_IDENTITY FALSE
++
++#define GST_AUTOCONVERT_LOCK(ac) GST_OBJECT_LOCK (ac)
++#define GST_AUTOCONVERT_UNLOCK(ac) GST_OBJECT_UNLOCK (ac)
++
+/* elementfactory information */
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
@@ -195,7 +201,8 @@ index 0000000..55f4719
+enum
+{
+ PROP_0,
-+ PROP_FACTORIES
++ PROP_FACTORIES,
++ PROP_INITIAL_IDENTITY
+};
+
+static void gst_auto_convert_set_property (GObject * object,
@@ -208,7 +215,7 @@ index 0000000..55f4719
+ GstStateChange transition);
+
+static GstElement *gst_auto_convert_get_subelement (GstAutoConvert *
-+ autoconvert);
++ autoconvert, gboolean query_only);
+static GstPad *gst_auto_convert_get_internal_sinkpad (GstAutoConvert *
+ autoconvert);
+static GstPad *gst_auto_convert_get_internal_srcpad (GstAutoConvert *
@@ -251,6 +258,11 @@ index 0000000..55f4719
+ pad);
+
+static GList *gst_auto_convert_load_factories (GstAutoConvert * autoconvert);
++static GstElement
++ * gst_auto_convert_get_or_make_element_from_factory (GstAutoConvert *
++ autoconvert, GstElementFactory * factory);
++static gboolean gst_auto_convert_activate_element (GstAutoConvert * autoconvert,
++ GstElement * element, GstCaps * caps);
+
+static GQuark internal_srcpad_quark = 0;
+static GQuark internal_sinkpad_quark = 0;
@@ -292,7 +304,7 @@ index 0000000..55f4719
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstElementClass *gstelement_class = (GstElementClass *) klass;
+
-+ gobject_class->dispose = gst_auto_convert_dispose;
++ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_auto_convert_dispose);
+
+ gobject_class->set_property = gst_auto_convert_set_property;
+ gobject_class->get_property = gst_auto_convert_get_property;
@@ -305,6 +317,13 @@ index 0000000..55f4719
+ " elements), can only be set once",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
++ g_object_class_install_property (gobject_class, PROP_INITIAL_IDENTITY,
++ g_param_spec_boolean ("initial-identity",
++ "Install identity initially",
++ "If true, then the identity element will be installed initially "
++ "and used for event passing until the first data buffer arrives ",
++ DEFAULT_INITIAL_IDENTITY, G_PARAM_READWRITE));
++
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_auto_convert_change_state);
+}
@@ -341,6 +360,10 @@ index 0000000..55f4719
+
+ gst_element_add_pad (GST_ELEMENT (autoconvert), autoconvert->sinkpad);
+ gst_element_add_pad (GST_ELEMENT (autoconvert), autoconvert->srcpad);
++
++ gst_segment_init (&autoconvert->sink_segment, GST_FORMAT_UNDEFINED);
++
++ autoconvert->initial_identity = DEFAULT_INITIAL_IDENTITY;
+}
+
+static void
@@ -350,7 +373,7 @@ index 0000000..55f4719
+
+ gst_pad_set_fixatecaps_function (autoconvert->sinkpad, NULL);
+
-+ GST_OBJECT_LOCK (object);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->current_subelement) {
+ gst_object_unref (autoconvert->current_subelement);
+ autoconvert->current_subelement = NULL;
@@ -362,12 +385,16 @@ index 0000000..55f4719
+ NULL);
+ g_list_free (autoconvert->cached_events);
+ autoconvert->cached_events = NULL;
-+ GST_OBJECT_UNLOCK (object);
++
++ if (autoconvert->factories) {
++ gst_plugin_feature_list_free (autoconvert->factories);
++ autoconvert->factories = NULL;
++ }
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
-+
+static void
+gst_auto_convert_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
@@ -379,13 +406,20 @@ index 0000000..55f4719
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ case PROP_FACTORIES:
-+ GST_OBJECT_LOCK (autoconvert);
-+ if (autoconvert->factories == NULL)
-+ autoconvert->factories = g_value_get_pointer (value);
-+ else
++ GST_AUTOCONVERT_LOCK (autoconvert);
++ if (autoconvert->factories == NULL) {
++ GList *factories = g_value_get_pointer (value);
++ autoconvert->factories = g_list_copy (factories);
++ g_list_foreach (autoconvert->factories, (GFunc) g_object_ref, NULL);
++ } else
+ GST_WARNING_OBJECT (object, "Can not reset factories after they"
+ " have been set or auto-discovered");
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
++ break;
++ case PROP_INITIAL_IDENTITY:
++ GST_AUTOCONVERT_LOCK (autoconvert);
++ autoconvert->initial_identity = g_value_get_boolean (value);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+ break;
+ }
+}
@@ -401,9 +435,14 @@ index 0000000..55f4719
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ case PROP_FACTORIES:
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ g_value_set_pointer (value, &autoconvert->factories);
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
++ break;
++ case PROP_INITIAL_IDENTITY:
++ GST_AUTOCONVERT_LOCK (autoconvert);
++ g_value_set_boolean (value, autoconvert->initial_identity);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+ break;
+ }
+}
@@ -548,14 +587,40 @@ index 0000000..55f4719
+}
+
+static GstElement *
-+gst_auto_convert_get_subelement (GstAutoConvert * autoconvert)
++gst_auto_convert_get_subelement (GstAutoConvert * autoconvert,
++ gboolean query_only)
+{
+ GstElement *element = NULL;
++ gboolean initial_identity;
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->current_subelement)
+ element = gst_object_ref (autoconvert->current_subelement);
-+ GST_OBJECT_UNLOCK (autoconvert);
++ initial_identity = autoconvert->initial_identity;
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
++
++ if (G_UNLIKELY (!query_only && element == NULL && initial_identity)) {
++ /* No current sub-element - create an identity and install it */
++ GstElementFactory *identity_feature;
++ GstElement *identity;
++
++ GST_INFO_OBJECT (autoconvert,
++ "No existing child element - instantiating identity");
++ /* if the identity feature doesn't exist - something is very wrong */
++ identity_feature =
++ GST_ELEMENT_FACTORY_CAST (gst_default_registry_find_feature ("identity",
++ GST_TYPE_ELEMENT_FACTORY));
++ identity =
++ gst_auto_convert_get_or_make_element_from_factory (autoconvert,
++ identity_feature);
++ if (identity
++ && gst_auto_convert_activate_element (autoconvert, identity, NULL)) {
++ GST_AUTOCONVERT_LOCK (autoconvert);
++ if (autoconvert->current_subelement)
++ element = gst_object_ref (autoconvert->current_subelement);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
++ }
++ }
+
+ return element;
+}
@@ -565,24 +630,23 @@ index 0000000..55f4719
+{
+ GstPad *pad = NULL;
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->current_internal_sinkpad)
+ pad = gst_object_ref (autoconvert->current_internal_sinkpad);
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ return pad;
+}
+
-+
+static GstPad *
+gst_auto_convert_get_internal_srcpad (GstAutoConvert * autoconvert)
+{
+ GstPad *pad = NULL;
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->current_internal_srcpad)
+ pad = gst_object_ref (autoconvert->current_internal_srcpad);
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ return pad;
+}
@@ -618,8 +682,6 @@ index 0000000..55f4719
+ return NULL;
+ }
+
-+ gst_object_ref (element);
-+
+ srcpad = get_pad_by_direction (element, GST_PAD_SRC);
+ if (!srcpad) {
+ GST_ERROR_OBJECT (autoconvert, "Could not find source in %s",
@@ -704,11 +766,13 @@ index 0000000..55f4719
+ /* Iffy */
+ gst_element_sync_state_with_parent (element);
+
++ /* Increment the reference count we will return to the caller */
++ gst_object_ref (element);
++
+ return element;
+
+error:
+ gst_bin_remove (GST_BIN (autoconvert), element);
-+ gst_object_unref (element);
+
+ return NULL;
+}
@@ -744,8 +808,8 @@ index 0000000..55f4719
+ */
+
+static gboolean
-+factory_can_intersect (GstElementFactory * factory, GstPadDirection direction,
-+ GstCaps * caps)
++factory_can_intersect (GstAutoConvert * autoconvert,
++ GstElementFactory * factory, GstPadDirection direction, GstCaps * caps)
+{
+ GList *templates;
+ gint has_direction = FALSE;
@@ -761,18 +825,26 @@ index 0000000..55f4719
+
+ if (template->direction == direction) {
+ GstCaps *intersect = NULL;
++ GstCaps *tmpl_caps = NULL;
+
+ /* If there is more than one pad in this direction, we return FALSE
+ * Only transform elements (with one sink and one source pad)
+ * are accepted
+ */
-+ if (has_direction)
++ if (has_direction) {
++ GST_DEBUG_OBJECT (autoconvert, "Factory %" GST_PTR_FORMAT
++ " has more than one static template with dir %d",
++ template, direction);
+ return FALSE;
++ }
+ has_direction = TRUE;
+
-+ intersect =
-+ gst_caps_intersect (gst_static_caps_get (&template->static_caps),
-+ caps);
++ tmpl_caps = gst_static_caps_get (&template->static_caps);
++ intersect = gst_caps_intersect (tmpl_caps, caps);
++ GST_DEBUG_OBJECT (autoconvert, "Intersection of factory %" GST_PTR_FORMAT
++ " static caps %" GST_PTR_FORMAT " and caps %" GST_PTR_FORMAT
++ " is %" GST_PTR_FORMAT, factory, tmpl_caps, caps, intersect);
++ gst_caps_unref (tmpl_caps);
+
+ if (intersect) {
+ if (!gst_caps_is_empty (intersect))
@@ -787,6 +859,52 @@ index 0000000..55f4719
+ return ret;
+}
+
++static gboolean
++gst_auto_convert_activate_element (GstAutoConvert * autoconvert,
++ GstElement * element, GstCaps * caps)
++{
++ GstPad *internal_srcpad = g_object_get_qdata (G_OBJECT (element),
++ internal_srcpad_quark);
++ GstPad *internal_sinkpad = g_object_get_qdata (G_OBJECT (element),
++ internal_sinkpad_quark);
++
++ if (caps) {
++ /* check if the element can really accept said caps */
++ if (!gst_pad_peer_accept_caps (internal_srcpad, caps)) {
++ GST_DEBUG_OBJECT (autoconvert, "Could not set %s:%s to %"
++ GST_PTR_FORMAT, GST_DEBUG_PAD_NAME (internal_srcpad), caps);
++ return FALSE;
++ }
++ }
++
++ gst_pad_set_fixatecaps_function (autoconvert->sinkpad,
++ gst_auto_convert_sink_fixatecaps);
++ GST_AUTOCONVERT_LOCK (autoconvert);
++ autoconvert->current_subelement = element;
++ autoconvert->current_internal_srcpad = internal_srcpad;
++ autoconvert->current_internal_sinkpad = internal_sinkpad;
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
++
++ GST_INFO_OBJECT (autoconvert,
++ "Selected element %s",
++ GST_OBJECT_NAME (GST_OBJECT (autoconvert->current_subelement)));
++
++ /* Send new-segment event if we have one */
++ if (autoconvert->sink_segment.format != GST_FORMAT_UNDEFINED) {
++ GstEvent *event;
++ GstSegment *seg = &autoconvert->sink_segment;
++ event = gst_event_new_new_segment_full (TRUE,
++ seg->rate, seg->applied_rate, seg->format, seg->start,
++ seg->stop, seg->time);
++
++ autoconvert->drop_newseg = TRUE;
++ gst_pad_push_event (internal_srcpad, event);
++ autoconvert->drop_newseg = FALSE;
++ }
++
++ return TRUE;
++}
++
+/*
+ * If there is already an internal element, it will try to call set_caps on it
+ *
@@ -807,7 +925,7 @@ index 0000000..55f4719
+
+ g_return_val_if_fail (autoconvert != NULL, FALSE);
+
-+ subelement = gst_auto_convert_get_subelement (autoconvert);
++ subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+ if (subelement) {
+ if (gst_pad_peer_accept_caps (autoconvert->current_internal_srcpad, caps)) {
+ /* If we can set the new caps on the current element,
@@ -823,14 +941,14 @@ index 0000000..55f4719
+ * By unsetting the fixatecaps function, we go back to the default one
+ */
+ gst_pad_set_fixatecaps_function (autoconvert->sinkpad, NULL);
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->current_subelement == subelement) {
+ gst_object_unref (autoconvert->current_subelement);
+ autoconvert->current_subelement = NULL;
+ autoconvert->current_internal_srcpad = NULL;
+ autoconvert->current_internal_sinkpad = NULL;
+ }
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+ gst_object_unref (subelement);
+ }
+ }
@@ -841,9 +959,9 @@ index 0000000..55f4719
+ gst_object_unref (peer);
+ }
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ factories = autoconvert->factories;
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ if (!factories)
+ factories = gst_auto_convert_load_factories (autoconvert);
@@ -851,22 +969,21 @@ index 0000000..55f4719
+ for (elem = factories; elem; elem = g_list_next (elem)) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY (elem->data);
+ GstElement *element;
-+ GstPad *internal_srcpad = NULL;
-+ GstPad *internal_sinkpad = NULL;
+
+ /* Lets first check if according to the static pad templates on the factory
+ * these caps have any chance of success
+ */
-+ if (!factory_can_intersect (factory, GST_PAD_SINK, caps)) {
++ if (!factory_can_intersect (autoconvert, factory, GST_PAD_SINK, caps)) {
+ GST_LOG_OBJECT (autoconvert, "Factory %s does not accept sink caps %"
+ GST_PTR_FORMAT,
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)), caps);
+ continue;
+ }
+ if (other_caps != NULL) {
-+ if (!factory_can_intersect (factory, GST_PAD_SRC, other_caps)) {
-+ GST_LOG_OBJECT (autoconvert, "Factory %s does not accept src caps %"
-+ GST_PTR_FORMAT,
++ if (!factory_can_intersect (autoconvert, factory, GST_PAD_SRC,
++ other_caps)) {
++ GST_LOG_OBJECT (autoconvert,
++ "Factory %s does not accept src caps %" GST_PTR_FORMAT,
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)),
+ other_caps);
+ continue;
@@ -874,43 +991,15 @@ index 0000000..55f4719
+ }
+
+ /* The element had a chance of success, lets make it */
-+
+ element =
+ gst_auto_convert_get_or_make_element_from_factory (autoconvert,
+ factory);
-+
-+ if (!element) {
++ if (!element)
+ continue;
-+ }
+
-+ internal_srcpad = g_object_get_qdata (G_OBJECT (element),
-+ internal_srcpad_quark);
-+ internal_sinkpad = g_object_get_qdata (G_OBJECT (element),
-+ internal_sinkpad_quark);
-+
-+ /* Now we check if the element can really accept said caps */
-+ if (!gst_pad_peer_accept_caps (internal_srcpad, caps)) {
-+ GST_DEBUG_OBJECT (autoconvert, "Could not set %s:%s to %" GST_PTR_FORMAT,
-+ GST_DEBUG_PAD_NAME (internal_srcpad), caps);
-+ goto next_element;
-+ }
-+
-+ gst_pad_set_fixatecaps_function (autoconvert->sinkpad,
-+ gst_auto_convert_sink_fixatecaps);
-+ GST_OBJECT_LOCK (autoconvert);
-+ autoconvert->current_subelement = element;
-+ autoconvert->current_internal_srcpad = internal_srcpad;
-+ autoconvert->current_internal_sinkpad = internal_sinkpad;
-+ GST_OBJECT_UNLOCK (autoconvert);
-+
-+ GST_INFO_OBJECT (autoconvert,
-+ "Selected element %s",
-+ GST_OBJECT_NAME (GST_OBJECT (autoconvert->current_subelement)));
-+
-+ break;
-+
-+ next_element:
-+ continue;
++ /* And make it the current child */
++ if (gst_auto_convert_activate_element (autoconvert, element, caps))
++ break;
+ }
+
+get_out:
@@ -1018,13 +1107,13 @@ index 0000000..55f4719
+
+ g_assert (all_factories);
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->factories == NULL) {
+ autoconvert->factories = all_factories;
+ all_factories = NULL;
+ }
+ out_factories = autoconvert->factories;
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ if (all_factories) {
+ /* In this case, someone set the property while we were looking! */
@@ -1050,12 +1139,12 @@ index 0000000..55f4719
+ GList *events = NULL;
+ GList *l;
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ if (autoconvert->cached_events) {
+ events = g_list_reverse (autoconvert->cached_events);
+ autoconvert->cached_events = NULL;
+ }
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ if (events) {
+ GST_DEBUG_OBJECT (autoconvert, "Sending cached events downstream");
@@ -1066,6 +1155,14 @@ index 0000000..55f4719
+
+ ret = gst_pad_push (internal_srcpad, buffer);
+ gst_object_unref (internal_srcpad);
++ if (GST_FLOW_IS_FATAL (ret)) {
++ GstElement *child = gst_auto_convert_get_subelement (autoconvert, TRUE);
++ GST_DEBUG_OBJECT (autoconvert,
++ "Child element %" GST_PTR_FORMAT "returned flow %s", child,
++ gst_flow_get_name (ret));
++ if (child)
++ gst_object_unref (child);
++ }
+ } else {
+ GST_ERROR_OBJECT (autoconvert, "Got buffer without an negotiated element,"
+ " returning not-negotiated");
@@ -1083,29 +1180,58 @@ index 0000000..55f4719
+ GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
+ GstPad *internal_srcpad;
+
++ if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
++ GstFormat format;
++ gdouble rate, arate;
++ gint64 start, stop, time;
++ gboolean update;
++
++ gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
++ &start, &stop, &time);
++
++ GST_DEBUG_OBJECT (autoconvert,
++ "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT
++ ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT,
++ update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
++ GST_TIME_ARGS (time));
++
++ /* Store the values for feeding to sub-elements */
++ gst_segment_set_newsegment_full (&autoconvert->sink_segment, update,
++ rate, arate, format, start, stop, time);
++ }
++
+ internal_srcpad = gst_auto_convert_get_internal_srcpad (autoconvert);
++ if (internal_srcpad == NULL) {
++ /* Query the subelement - triggers creation of an identity if necessary */
++ GstElement *subelement =
++ gst_auto_convert_get_subelement (autoconvert, FALSE);
++ if (subelement)
++ gst_object_unref (subelement);
++ internal_srcpad = gst_auto_convert_get_internal_srcpad (autoconvert);
++ }
++
+ if (internal_srcpad) {
+ ret = gst_pad_push_event (internal_srcpad, event);
+ gst_object_unref (internal_srcpad);
+ } else {
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ g_list_foreach (autoconvert->cached_events,
+ (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (autoconvert->cached_events);
+ autoconvert->cached_events = NULL;
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+ /* fall through */
+ case GST_EVENT_FLUSH_START:
+ ret = gst_pad_push_event (autoconvert->srcpad, event);
+ break;
+ default:
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ autoconvert->cached_events =
+ g_list_prepend (autoconvert->cached_events, event);
+ ret = TRUE;
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+ break;
+ }
+ }
@@ -1123,7 +1249,7 @@ index 0000000..55f4719
+ GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
+ GstElement *subelement;
+
-+ subelement = gst_auto_convert_get_subelement (autoconvert);
++ subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+ if (subelement) {
+ GstPad *sub_sinkpad = get_pad_by_direction (subelement, GST_PAD_SINK);
+
@@ -1150,7 +1276,7 @@ index 0000000..55f4719
+ GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
+ GstElement *subelement;
+
-+ subelement = gst_auto_convert_get_subelement (autoconvert);
++ subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+ if (subelement) {
+ GstPad *sub_sinkpad = get_pad_by_direction (subelement, GST_PAD_SINK);
+
@@ -1173,7 +1299,7 @@ index 0000000..55f4719
+ GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
+ GstElement *subelement;
+
-+ subelement = gst_auto_convert_get_subelement (autoconvert);
++ subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+ if (subelement) {
+ GstPad *sinkpad = get_pad_by_direction (subelement, GST_PAD_SINK);
+ gst_pad_fixate_caps (sinkpad, caps);
@@ -1218,9 +1344,9 @@ index 0000000..55f4719
+ goto out;
+ }
+
-+ GST_OBJECT_LOCK (autoconvert);
++ GST_AUTOCONVERT_LOCK (autoconvert);
+ factories = autoconvert->factories;
-+ GST_OBJECT_UNLOCK (autoconvert);
++ GST_AUTOCONVERT_UNLOCK (autoconvert);
+
+ if (!factories)
+ factories = gst_auto_convert_load_factories (autoconvert);
@@ -1232,9 +1358,10 @@ index 0000000..55f4719
+ GstPad *internal_srcpad = NULL;
+
+ if (other_caps != NULL) {
-+ if (!factory_can_intersect (factory, GST_PAD_SRC, other_caps)) {
-+ GST_LOG_OBJECT (autoconvert, "Factory %s does not accept src caps %"
-+ GST_PTR_FORMAT,
++ if (!factory_can_intersect (autoconvert, factory, GST_PAD_SRC,
++ other_caps)) {
++ GST_LOG_OBJECT (autoconvert,
++ "Factory %s does not accept src caps %" GST_PTR_FORMAT,
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)),
+ other_caps);
+ continue;
@@ -1246,10 +1373,8 @@ index 0000000..55f4719
+ element =
+ gst_auto_convert_get_or_make_element_from_factory (autoconvert,
+ factory);
-+
-+ if (!element) {
++ if (!element)
+ continue;
-+ }
+
+ internal_srcpad = g_object_get_qdata (G_OBJECT (element),
+ internal_srcpad_quark);
@@ -1338,8 +1463,8 @@ index 0000000..55f4719
+ ret = gst_pad_push_event (internal_sinkpad, event);
+ gst_object_unref (internal_sinkpad);
+ } else {
-+ GST_WARNING_OBJECT (autoconvert, "Got event while not element was selected,"
-+ "letting through");
++ GST_WARNING_OBJECT (autoconvert,
++ "Got upstream event while no element was selected," "forwarding.");
+ ret = gst_pad_push_event (autoconvert->sinkpad, event);
+ }
+
@@ -1356,7 +1481,7 @@ index 0000000..55f4719
+ GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
+ GstElement *subelement;
+
-+ subelement = gst_auto_convert_get_subelement (autoconvert);
++ subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+ if (subelement) {
+ GstPad *sub_srcpad = get_pad_by_direction (subelement, GST_PAD_SRC);
+
@@ -1365,8 +1490,8 @@ index 0000000..55f4719
+ gst_object_unref (sub_srcpad);
+ gst_object_unref (subelement);
+ } else {
-+ GST_WARNING_OBJECT (autoconvert, "Got query while not element was selected,"
-+ "letting through");
++ GST_WARNING_OBJECT (autoconvert,
++ "Got upstream query while no element was selected," "forwarding.");
+ ret = gst_pad_peer_query (autoconvert->sinkpad, query);
+ }
+
@@ -1383,7 +1508,7 @@ index 0000000..55f4719
+ GstAutoConvert *autoconvert = GST_AUTO_CONVERT (gst_pad_get_parent (pad));
+ GstElement *subelement;
+
-+ subelement = gst_auto_convert_get_subelement (autoconvert);
++ subelement = gst_auto_convert_get_subelement (autoconvert, TRUE);
+ if (subelement) {
+ GstPad *sub_srcpad = get_pad_by_direction (subelement, GST_PAD_SRC);
+
@@ -1417,6 +1542,14 @@ index 0000000..55f4719
+ GST_AUTO_CONVERT (g_object_get_qdata (G_OBJECT (pad),
+ parent_quark));
+
++ if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) {
++ if (autoconvert->drop_newseg) {
++ GST_DEBUG_OBJECT (autoconvert, "Dropping primer newsegment event");
++ gst_event_unref (event);
++ return TRUE;
++ }
++ }
++
+ return gst_pad_push_event (autoconvert->srcpad, event);
+}
+
@@ -1551,10 +1684,10 @@ index 0000000..55f4719
+ GST_PACKAGE_ORIGIN)
diff --git a/farsight/autoconvert/gstautoconvert.h b/farsight/autoconvert/gstautoconvert.h
new file mode 100644
-index 0000000..af463f4
+index 0000000..4375255
--- /dev/null
+++ b/farsight/autoconvert/gstautoconvert.h
-@@ -0,0 +1,65 @@
+@@ -0,0 +1,69 @@
+/* GStreamer
+ *
+ * Copyright 2007 Collabora Ltd
@@ -1611,6 +1744,10 @@ index 0000000..af463f4
+ GstPad *current_internal_sinkpad;
+
+ GList *cached_events;
++ GstSegment sink_segment;
++ gboolean drop_newseg;
++
++ gboolean initial_identity;
+};
+
+struct _GstAutoConvertClass
@@ -1622,38 +1759,45 @@ index 0000000..af463f4
+#endif /* __GST_AUTO_CONVERT_H__ */
diff --git a/farsight/dtmf/Makefile.am b/farsight/dtmf/Makefile.am
new file mode 100644
-index 0000000..3bdabbb
+index 0000000..049518e
--- /dev/null
+++ b/farsight/dtmf/Makefile.am
-@@ -0,0 +1,17 @@
+@@ -0,0 +1,23 @@
+plugin_LTLIBRARIES = libgstdtmf.la
+
+libgstdtmf_la_SOURCES = gstdtmfsrc.c \
++ gstdtmfdetect.c \
+ gstrtpdtmfsrc.c \
+ gstrtpdtmfdepay.c \
++ tone_detect.c \
+ gstdtmf.c
+
+noinst_HEADERS = gstdtmfsrc.h \
++ gstdtmfdetect.h \
+ gstrtpdtmfsrc.h \
+ gstrtpdtmfdepay.h \
-+ gstrtpdtmfcommon.h
++ gstrtpdtmfcommon.h \
++ tone_detect.h
+
-+libgstdtmf_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS) -DEXTERN_BUF -DRTP_SUPPORT
-+libgstdtmf_la_LIBADD = $(GST_LIBS_LIBS) -lm
-+libgstdtmf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstrtp- at GST_MAJORMINOR@
++libgstdtmf_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \
++ -DEXTERN_BUF -DRTP_SUPPORT
++libgstdtmf_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp- at GST_MAJORMINOR@ \
++ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
++libgstdtmf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstdtmf_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/farsight/dtmf/gstdtmf.c b/farsight/dtmf/gstdtmf.c
new file mode 100644
-index 0000000..d50cf03
+index 0000000..9d5854f
--- /dev/null
+++ b/farsight/dtmf/gstdtmf.c
-@@ -0,0 +1,30 @@
+@@ -0,0 +1,33 @@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
++#include "gstdtmfdetect.h"
+#include "gstdtmfsrc.h"
+#include "gstrtpdtmfsrc.h"
+#include "gstrtpdtmfdepay.h"
@@ -1662,13 +1806,15 @@ index 0000000..d50cf03
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
++ if (!gst_dtmf_detect_plugin_init (plugin))
++ return FALSE;
++
+ if (!gst_dtmf_src_plugin_init (plugin))
+ return FALSE;
+
+ if (!gst_rtp_dtmf_src_plugin_init (plugin))
+ return FALSE;
+
-+
+ if (!gst_rtp_dtmf_depay_plugin_init (plugin))
+ return FALSE;
+
@@ -1681,10 +1827,10 @@ index 0000000..d50cf03
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/farsight/dtmf/gstdtmfsrc.c b/farsight/dtmf/gstdtmfsrc.c
new file mode 100644
-index 0000000..7a1f14b
+index 0000000..39699d8
--- /dev/null
+++ b/farsight/dtmf/gstdtmfsrc.c
-@@ -0,0 +1,935 @@
+@@ -0,0 +1,905 @@
+/* GStreamer DTMF source
+ *
+ * gstdtmfsrc.c:
@@ -1905,7 +2051,7 @@ index 0000000..7a1f14b
+ "width = (int) 16, "
+ "depth = (int) 16, "
+ "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", "
-+ "signed = (bool) true, " "rate = (int) 8000, " "channels = (int) 1")
++ "signed = (bool) true, rate = (int) [1, MAX], channels = (int) 1")
+ );
+
+GST_BOILERPLATE (GstDTMFSrc, gst_dtmf_src, GstBaseSrc, GST_TYPE_BASE_SRC);
@@ -2267,7 +2413,7 @@ index 0000000..7a1f14b
+ gboolean send_silence = FALSE;
+ GstPad *srcpad = GST_BASE_SRC_PAD (dtmfsrc);
+
-+ GST_DEBUG_OBJECT (dtmfsrc, "Creating buffer for tone %s",
++ GST_LOG_OBJECT (dtmfsrc, "Creating buffer for tone %s",
+ DTMF_KEYS[event->event_number].event_name);
+
+ /* create buffer to hold the tone */
@@ -2278,11 +2424,11 @@ index 0000000..7a1f14b
+ }
+
+ if (send_silence) {
-+ GST_DEBUG_OBJECT (dtmfsrc, "Generating silence");
++ GST_LOG_OBJECT (dtmfsrc, "Generating silence");
+ gst_dtmf_src_generate_silence (buf, dtmfsrc->interval,
+ dtmfsrc->sample_rate);
+ } else {
-+ GST_DEBUG_OBJECT (dtmfsrc, "Generating tone");
++ GST_LOG_OBJECT (dtmfsrc, "Generating tone");
+ gst_dtmf_src_generate_tone (event, DTMF_KEYS[event->event_number],
+ dtmfsrc->interval, buf, dtmfsrc->sample_rate);
+ }
@@ -2390,7 +2536,7 @@ index 0000000..7a1f14b
+ }
+ } while (dtmfsrc->last_event == NULL);
+
-+ GST_DEBUG_OBJECT (dtmfsrc, "end event check, now wait for the proper time");
++ GST_LOG_OBJECT (dtmfsrc, "end event check, now wait for the proper time");
+
+ clock = gst_element_get_clock (GST_ELEMENT (basesrc));
+
@@ -2425,11 +2571,9 @@ index 0000000..7a1f14b
+
+ buf = gst_dtmf_src_create_next_tone_packet (dtmfsrc, dtmfsrc->last_event);
+
-+ GST_DEBUG_OBJECT (dtmfsrc, "Created buffer of size %d",
-+ GST_BUFFER_SIZE (buf));
++ GST_LOG_OBJECT (dtmfsrc, "Created buffer of size %d", GST_BUFFER_SIZE (buf));
+ *buffer = buf;
+
-+ GST_DEBUG_OBJECT (dtmfsrc, "returning a buffer");
+ return GST_FLOW_OK;
+
+paused_locked:
@@ -2491,63 +2635,35 @@ index 0000000..7a1f14b
+static gboolean
+gst_dtmf_src_negotiate (GstBaseSrc * basesrc)
+{
-+ GstCaps *srccaps, *peercaps;
+ GstDTMFSrc *dtmfsrc = GST_DTMF_SRC (basesrc);
-+ gboolean ret = FALSE;
-+
-+ srccaps = gst_caps_new_simple ("audio/x-raw-int",
-+ "width", G_TYPE_INT, 16,
-+ "depth", G_TYPE_INT, 16,
-+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
-+ "signed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, 1, NULL);
-+
-+ peercaps = gst_pad_peer_get_caps (GST_BASE_SRC_PAD (basesrc));
-+
-+ if (peercaps == NULL) {
-+ /* no peer caps, just add the other properties */
-+ gst_caps_set_simple (srccaps,
-+ "rate", G_TYPE_INT, dtmfsrc->sample_rate, NULL);
-+ } else {
-+ GstStructure *s;
-+ gint sample_rate;
-+ GstCaps *temp = NULL;
++ GstCaps *caps;
++ GstStructure *s;
++ gboolean ret;
+
-+ /* peer provides caps we can use to fixate, intersect. This always returns a
-+ * writable caps. */
-+ temp = gst_caps_intersect (srccaps, peercaps);
-+ gst_caps_unref (srccaps);
-+ gst_caps_unref (peercaps);
++ caps = gst_pad_get_allowed_caps (GST_BASE_SRC_PAD (basesrc));
+
-+ if (!temp) {
-+ GST_DEBUG_OBJECT (dtmfsrc, "Could not get intersection with peer caps");
-+ return FALSE;
-+ }
++ if (!caps)
++ caps =
++ gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD
++ (basesrc)));
+
-+ if (gst_caps_is_empty (temp)) {
-+ GST_DEBUG_OBJECT (dtmfsrc, "Intersection with peer caps is empty");
-+ gst_caps_unref (temp);
-+ return FALSE;
-+ }
++ if (gst_caps_is_empty (caps))
++ return FALSE;
+
-+ /* now fixate, start by taking the first caps */
-+ gst_caps_truncate (temp);
-+ srccaps = temp;
++ gst_caps_truncate (caps);
++ s = gst_caps_get_structure (caps, 0);
+
-+ /* get first structure */
-+ s = gst_caps_get_structure (srccaps, 0);
++ gst_structure_fixate_field_nearest_int (s, "rate", DEFAULT_SAMPLE_RATE);
+
-+ if (gst_structure_get_int (s, "rate", &sample_rate)) {
-+ dtmfsrc->sample_rate = sample_rate;
-+ GST_LOG_OBJECT (dtmfsrc, "using rate from caps %d", dtmfsrc->sample_rate);
-+ } else {
-+ GST_LOG_OBJECT (dtmfsrc, "using existing rate %d", dtmfsrc->sample_rate);
-+ }
-+ gst_structure_set (s, "rate", G_TYPE_INT, dtmfsrc->sample_rate, NULL);
++ if (!gst_structure_get_int (s, "rate", &dtmfsrc->sample_rate)) {
++ GST_ERROR_OBJECT (dtmfsrc, "Could not get rate");
++ gst_caps_unref (caps);
++ return FALSE;
+ }
+
-+ ret = gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), srccaps);
++ ret = gst_pad_set_caps (GST_BASE_SRC_PAD (basesrc), caps);
+
-+ gst_caps_unref (srccaps);
++ gst_caps_unref (caps);
+
+ return ret;
+}
@@ -4611,16 +4727,18 @@ index 0000000..b1a483a
+#endif /* __GST_RTP_DTMF_SRC_H__ */
diff --git a/farsight/liveadder/Makefile.am b/farsight/liveadder/Makefile.am
new file mode 100644
-index 0000000..e278333
+index 0000000..fcc971b
--- /dev/null
+++ b/farsight/liveadder/Makefile.am
-@@ -0,0 +1,9 @@
+@@ -0,0 +1,11 @@
+plugin_LTLIBRARIES = libgstliveadder.la
+
+libgstliveadder_la_SOURCES = liveadder.c
-+libgstliveadder_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS)
-+libgstliveadder_la_LIBADD = $(GST_LIBS_LIBS)
-+libgstliveadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-0.10
++libgstliveadder_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
++libgstliveadder_la_LIBADD = \
++ $(GST_PLUGINS_BASE_LIBS) -lgstaudio- at GST_MAJORMINOR@ \
++ $(GST_BASE_LIBS) $(GST_LIBS)
++libgstliveadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstliveadder_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = liveadder.h
@@ -6294,27 +6412,29 @@ index 0000000..7448601
+#endif /* __GST_LIVE_ADDER_H__ */
diff --git a/farsight/rtpmux/Makefile.am b/farsight/rtpmux/Makefile.am
new file mode 100644
-index 0000000..17447ba
+index 0000000..b77deeb
--- /dev/null
+++ b/farsight/rtpmux/Makefile.am
-@@ -0,0 +1,11 @@
+@@ -0,0 +1,13 @@
+plugin_LTLIBRARIES = libgstrtpmux.la
+
+libgstrtpmux_la_SOURCES = gstrtpmuxer.c gstrtpmux.c gstrtpdtmfmux.c
+
-+libgstrtpmux_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS) -DEXTERN_BUF -DRTP_SUPPORT
-+libgstrtpmux_la_LIBADD = $(GST_LIBS_LIBS)
-+libgstrtpmux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstrtp- at GST_MAJORMINOR@
++libgstrtpmux_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \
++ -DEXTERN_BUF -DRTP_SUPPORT
++libgstrtpmux_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp- at GST_MAJORMINOR@ \
++ $(GST_BASE_LIBS) $(GST_LIBS)
++libgstrtpmux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstrtpmux_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = gstrtpmux.h gstrtpdtmfmux.h
+
diff --git a/farsight/rtpmux/gstrtpdtmfmux.c b/farsight/rtpmux/gstrtpdtmfmux.c
new file mode 100644
-index 0000000..573a1d1
+index 0000000..9622c26
--- /dev/null
+++ b/farsight/rtpmux/gstrtpdtmfmux.c
-@@ -0,0 +1,326 @@
+@@ -0,0 +1,327 @@
+/* RTP DTMF muxer element for GStreamer
+ *
+ * gstrtpdtmfmux.c:
@@ -6406,7 +6526,7 @@ index 0000000..573a1d1
+
+static void gst_rtp_dtmf_mux_dispose (GObject * object);
+
-+static void gst_rtp_mux_release_pad (GstElement * element, GstPad * pad);
++static void gst_rtp_dtmf_mux_release_pad (GstElement * element, GstPad * pad);
+
+static gboolean gst_rtp_dtmf_mux_sink_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_rtp_dtmf_mux_chain (GstPad * pad, GstBuffer * buffer);
@@ -6448,7 +6568,8 @@ index 0000000..573a1d1
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_rtp_dtmf_mux_dispose);
-+ gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_rtp_mux_release_pad);
++ gstelement_class->release_pad =
++ GST_DEBUG_FUNCPTR (gst_rtp_dtmf_mux_release_pad);
+ gstrtpmux_class->chain_func = GST_DEBUG_FUNCPTR (gst_rtp_dtmf_mux_chain);
+ gstrtpmux_class->sink_event_func =
+ GST_DEBUG_FUNCPTR (gst_rtp_dtmf_mux_sink_event);
@@ -6618,7 +6739,7 @@ index 0000000..573a1d1
+}
+
+static void
-+gst_rtp_mux_release_pad (GstElement * element, GstPad * pad)
++gst_rtp_dtmf_mux_release_pad (GstElement * element, GstPad * pad)
+{
+ GstRTPDTMFMux *mux = GST_RTP_DTMF_MUX (element);
+
@@ -6717,10 +6838,10 @@ index 0000000..343be5c
+#endif /* __GST_RTP_DTMF_MUX_H__ */
diff --git a/farsight/rtpmux/gstrtpmux.c b/farsight/rtpmux/gstrtpmux.c
new file mode 100644
-index 0000000..23a6c7e
+index 0000000..7785889
--- /dev/null
+++ b/farsight/rtpmux/gstrtpmux.c
-@@ -0,0 +1,632 @@
+@@ -0,0 +1,662 @@
+/* RTP muxer element for GStreamer
+ *
+ * gstrtpmux.c:
@@ -6820,7 +6941,7 @@ index 0000000..23a6c7e
+ const GValue * value, GParamSpec * pspec);
+static void gst_rtp_mux_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
-+
++static void gst_rtp_mux_dispose (GObject * object);
+
+GST_BOILERPLATE (GstRTPMux, gst_rtp_mux, GstElement, GST_TYPE_ELEMENT);
+
@@ -6848,6 +6969,7 @@ index 0000000..23a6c7e
+
+ gobject_class->get_property = gst_rtp_mux_get_property;
+ gobject_class->set_property = gst_rtp_mux_set_property;
++ gobject_class->dispose = gst_rtp_mux_dispose;
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass),
+ PROP_TIMESTAMP_OFFSET, g_param_spec_int ("timestamp-offset",
@@ -6875,6 +6997,23 @@ index 0000000..23a6c7e
+ klass->chain_func = gst_rtp_mux_chain;
+}
+
++static void
++gst_rtp_mux_dispose (GObject * object)
++{
++ GList *item;
++
++restart:
++ for (item = GST_ELEMENT_PADS (object); item; item = g_list_next (item)) {
++ GstPad *pad = GST_PAD (item->data);
++ if (GST_PAD_IS_SINK (pad)) {
++ gst_element_release_request_pad (GST_ELEMENT (object), pad);
++ goto restart;
++ }
++ }
++
++ G_OBJECT_CLASS (parent_class)->dispose (object);
++}
++
+static gboolean
+gst_rtp_mux_src_event (GstPad * pad, GstEvent * event)
+{
@@ -6932,7 +7071,8 @@ index 0000000..23a6c7e
+}
+
+static GstPad *
-+gst_rtp_mux_create_sinkpad (GstRTPMux * rtp_mux, GstPadTemplate * templ)
++gst_rtp_mux_create_sinkpad (GstRTPMux * rtp_mux, GstPadTemplate * templ,
++ const gchar * req_name)
+{
+ GstPad *newpad = NULL;
+ GstPadTemplate *class_templ;
@@ -6942,12 +7082,16 @@ index 0000000..23a6c7e
+ "sink_%d");
+
+ if (templ == class_templ) {
-+ gchar *name;
++ gchar *tmpname = NULL;
++ const gchar *name = NULL;
+
+ /* create new pad with the name */
-+ name = g_strdup_printf ("sink_%02d", rtp_mux->numpads);
++ if (req_name)
++ name = req_name;
++ else
++ name = tmpname = g_strdup_printf ("sink_%02d", rtp_mux->numpads);
+ newpad = gst_pad_new_from_template (templ, name);
-+ g_free (name);
++ g_free (tmpname);
+
+ rtp_mux->numpads++;
+ } else {
@@ -6999,7 +7143,7 @@ index 0000000..23a6c7e
+ return NULL;
+ }
+
-+ newpad = gst_rtp_mux_create_sinkpad (rtp_mux, templ);
++ newpad = gst_rtp_mux_create_sinkpad (rtp_mux, templ, req_name);
+ if (newpad)
+ gst_rtp_mux_setup_sinkpad (rtp_mux, newpad);
+ else
@@ -7125,6 +7269,13 @@ index 0000000..23a6c7e
+ "setting caps %" GST_PTR_FORMAT " on src pad..", caps);
+ ret = gst_pad_set_caps (rtp_mux->srcpad, caps);
+
++ if (rtp_mux->ssrc == -1) {
++ if (gst_structure_has_field_typed (structure, "ssrc", G_TYPE_UINT)) {
++ rtp_mux->current_ssrc = g_value_get_uint
++ (gst_structure_get_value (structure, "ssrc"));
++ }
++ }
++
+ if (ret) {
+ GST_OBJECT_LOCK (rtp_mux);
+ padpriv = gst_pad_get_element_private (pad);
@@ -7493,7 +7644,7 @@ index 0000000..619418b
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/farsight/valve/Makefile.am b/farsight/valve/Makefile.am
new file mode 100644
-index 0000000..09ffadf
+index 0000000..4662a13
--- /dev/null
+++ b/farsight/valve/Makefile.am
@@ -0,0 +1,9 @@
@@ -7501,9 +7652,9 @@ index 0000000..09ffadf
+
+libgstvalve_la_SOURCES = gstvalve.c gstvalve.h
+
-+libgstvalve_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(ERROR_CFLAGS)
-+libgstvalve_la_LIBADD = $(GST_LIBS_LIBS)
-+libgstvalve_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS)
++libgstvalve_la_CFLAGS = $(GST_CFLAGS)
++libgstvalve_la_LIBADD = $(GST_LIBS)
++libgstvalve_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvalve_la_LIBTOOLFLAGS = --tag=disable-static
+
diff --git a/farsight/valve/gstvalve.c b/farsight/valve/gstvalve.c
@@ -7912,5 +8063,5 @@ index 0000000..cc7cd38
+G_END_DECLS
+#endif /* __GST_VALVE_H__ */
--
-1.6.5.rc2
+1.6.6
Index: gstreamer-plugins-good.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gstreamer-plugins-good/F-12/gstreamer-plugins-good.spec,v
retrieving revision 1.113
retrieving revision 1.114
diff -u -p -r1.113 -r1.114
--- gstreamer-plugins-good.spec 4 Dec 2009 10:49:28 -0000 1.113
+++ gstreamer-plugins-good.spec 8 Jan 2010 15:26:20 -0000 1.114
@@ -6,7 +6,7 @@
Name: %{gstreamer}-plugins-good
Version: 0.10.17
-Release: 3%{?dist}
+Release: 4%{?dist}
Summary: GStreamer plug-ins with good code and licensing
Group: Applications/Multimedia
@@ -259,6 +259,9 @@ export GCONF_CONFIG_SOURCE=`gconftool-2
gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas > /dev/null || :
%changelog
+* Fri Jan 08 2010 Bastien Nocera <bnocera at redhat.com> 0.10.17-4
+- Update Farsight plugins to 0.10.17
+
* Fri Dec 04 2009 Bastien Nocera <bnocera at redhat.com> 0.10.17-3
- Disable LADSPA plugins, they should be in -bad (#540198)
More information about the fedora-extras-commits
mailing list