diff --git a/gst/interleave/interleave.c b/gst/interleave/interleave.c
index bda27be1fe..32c50ccc9a 100644
--- a/gst/interleave/interleave.c
+++ b/gst/interleave/interleave.c
@@ -45,6 +45,9 @@
* some of the request pads but this will change the caps of the output buffers. Changing the input
* caps is _not_ supported yet.
*
+ *
+ * The channel number of every sinkpad in the out can be retrieved from the "channel" property of the pad.
+ *
*
Example launch line
*
*
@@ -144,6 +147,14 @@ typedef struct
guint channel;
} GstInterleavePad;
+enum
+{
+ PROP_PAD_0,
+ PROP_PAD_CHANNEL
+};
+
+static void gst_interleave_pad_class_init (GstPadClass * klass);
+
#define GST_TYPE_INTERLEAVE_PAD (gst_interleave_pad_get_type())
#define GST_INTERLEAVE_PAD(pad) (G_TYPE_CHECK_INSTANCE_CAST((pad),GST_TYPE_INTERLEAVE_PAD,GstInterleavePad))
#define GST_INTERLEAVE_PAD_CAST(pad) ((GstInterleavePad *) pad)
@@ -154,23 +165,45 @@ gst_interleave_pad_get_type (void)
static GType type = 0;
if (G_UNLIKELY (type == 0)) {
- static const GTypeInfo info = {
- sizeof (GstPadClass),
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- sizeof (GstInterleavePad),
- 0,
- NULL
- };
-
- type = g_type_register_static (GST_TYPE_PAD, "GstInterleavePad", &info, 0);
+ type = g_type_register_static_simple (GST_TYPE_PAD,
+ g_intern_static_string ("GstInterleavePad"), sizeof (GstPadClass),
+ (GClassInitFunc) gst_interleave_pad_class_init,
+ sizeof (GstInterleavePad), NULL, 0);
}
return type;
}
+static void
+gst_interleave_pad_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstInterleavePad *self = GST_INTERLEAVE_PAD (object);
+
+ switch (prop_id) {
+ case PROP_PAD_CHANNEL:
+ g_value_set_uint (value, self->channel);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_interleave_pad_class_init (GstPadClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ gobject_class->get_property = gst_interleave_pad_get_property;
+
+ g_object_class_install_property (gobject_class,
+ PROP_PAD_CHANNEL,
+ g_param_spec_uint ("channel",
+ "Channel number",
+ "Number of the channel of this pad in the output", 0, G_MAXUINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+}
+
GST_BOILERPLATE (GstInterleave, gst_interleave, GstElement, GST_TYPE_ELEMENT);
enum
@@ -455,15 +488,16 @@ gst_interleave_request_new_pad (GstElement * element, GstPadTemplate * templ,
gchar *pad_name;
- gint channels;
+ gint channels, padnumber;
GValue val = { 0, };
if (templ->direction != GST_PAD_SINK)
goto not_sink_pad;
channels = g_atomic_int_exchange_and_add (&self->channels, 1);
+ padnumber = g_atomic_int_exchange_and_add (&self->padcounter, 1);
- pad_name = g_strdup_printf ("sink%d", channels);
+ pad_name = g_strdup_printf ("sink%d", padnumber);
new_pad = GST_PAD_CAST (g_object_new (GST_TYPE_INTERLEAVE_PAD,
"name", pad_name, "direction", templ->direction,
"template", templ, NULL));
@@ -544,7 +578,7 @@ gst_interleave_release_pad (GstElement * element, GstPad * pad)
/* Take lock to make sure we're not changing this when processing buffers */
GST_OBJECT_LOCK (self->collect);
- self->channels--;
+ g_atomic_int_add (&self->channels, -1);
g_value_array_remove (self->input_channel_positions,
GST_INTERLEAVE_PAD_CAST (pad)->channel);
diff --git a/gst/interleave/interleave.h b/gst/interleave/interleave.h
index c98cc43bd5..fb3b27415d 100644
--- a/gst/interleave/interleave.h
+++ b/gst/interleave/interleave.h
@@ -52,6 +52,7 @@ struct _GstInterleave
GstCollectPads *collect;
gint channels;
+ gint padcounter;
gint rate;
gint width;