rpms/gstreamer-plugins-good/devel 0001-Move-farsight-plugins-from-bad-to-good.patch, 1.3, 1.4 gstreamer-plugins-good.spec, 1.116, 1.117

Bastien Nocera hadess at fedoraproject.org
Fri Jan 8 15:28:01 UTC 2010


Author: hadess

Update of /cvs/pkgs/rpms/gstreamer-plugins-good/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv26565

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-5
- Update Farsight plugins from -bad 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/devel/0001-Move-farsight-plugins-from-bad-to-good.patch,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -p -r1.3 -r1.4
--- 0001-Move-farsight-plugins-from-bad-to-good.patch	22 Oct 2009 15:21:10 -0000	1.3
+++ 0001-Move-farsight-plugins-from-bad-to-good.patch	8 Jan 2010 15:28:01 -0000	1.4
@@ -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/devel/gstreamer-plugins-good.spec,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -p -r1.116 -r1.117
--- gstreamer-plugins-good.spec	7 Dec 2009 12:39:50 -0000	1.116
+++ gstreamer-plugins-good.spec	8 Jan 2010 15:28:01 -0000	1.117
@@ -6,7 +6,7 @@
 
 Name: 		%{gstreamer}-plugins-good
 Version: 	0.10.17
-Release:  	4%{?dist}
+Release:  	5%{?dist}
 Summary: 	GStreamer plug-ins with good code and licensing
 
 Group: 		Applications/Multimedia
@@ -257,6 +257,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-5
+- Update Farsight plugins from -bad 0.10.17
+
 * Mon Dec 07 2009 Bastien Nocera <bnocera at redhat.com> 0.10.17-4
 - Remove HAL elements, they're unused and obsolete
 




More information about the fedora-extras-commits mailing list