summaryrefslogtreecommitdiffstats
path: root/ext/speex
diff options
context:
space:
mode:
authorOlivier Crete <tester@tester.ca>2008-05-02 12:39:03 +0000
committerWim Taymans <wim.taymans@gmail.com>2008-05-02 12:39:03 +0000
commitca2bc1840a53ad7eba34177cfb23bc75f244e9b8 (patch)
treea28dfebd8dcd72f347d336680274db250ba68ac4 /ext/speex
parent08ae06f96085c6194fc129e42018d34ebdf619af (diff)
ext/speex/gstspeexenc.c: Add negotiation for the speex channels and rate. Fixes #465146.
Original commit message from CVS: Patch by: Olivier Crete <tester at tester dot ca> * ext/speex/gstspeexenc.c: (gst_speex_enc_sink_getcaps), (gst_speex_enc_init), (gst_speex_enc_chain): Add negotiation for the speex channels and rate. Fixes #465146.
Diffstat (limited to 'ext/speex')
-rw-r--r--ext/speex/gstspeexenc.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/ext/speex/gstspeexenc.c b/ext/speex/gstspeexenc.c
index dc14beec..398aac20 100644
--- a/ext/speex/gstspeexenc.c
+++ b/ext/speex/gstspeexenc.c
@@ -48,7 +48,8 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-speex")
+ GST_STATIC_CAPS ("audio/x-speex, "
+ "rate = (int) [ 6000, 48000 ], " "channels = (int) [ 1, 2]")
);
static const GstElementDetails speexenc_details =
@@ -220,6 +221,39 @@ gst_speex_enc_sink_setcaps (GstPad * pad, GstCaps * caps)
return enc->setup;
}
+
+static GstCaps *
+gst_speex_enc_sink_getcaps (GstPad * pad)
+{
+ GstCaps *caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+ GstCaps *peercaps = NULL;
+ GstSpeexEnc *enc = GST_SPEEX_ENC (gst_pad_get_parent_element (pad));
+
+ peercaps = gst_pad_peer_get_caps (enc->srcpad);
+
+ if (peercaps) {
+ if (!gst_caps_is_empty (peercaps) && !gst_caps_is_any (peercaps)) {
+ GstStructure *ps = gst_caps_get_structure (peercaps, 0);
+ GstStructure *s = gst_caps_get_structure (caps, 0);;
+ gint rate, channels;
+
+ if (gst_structure_get_int (ps, "rate", &rate)) {
+ gst_structure_fixate_field_nearest_int (s, "rate", rate);
+ }
+
+ if (gst_structure_get_int (ps, "channels", &channels)) {
+ gst_structure_fixate_field_nearest_int (s, "channels", channels);
+ }
+ }
+ gst_caps_unref (peercaps);
+ }
+
+ gst_object_unref (enc);
+
+ return caps;
+}
+
+
static gboolean
gst_speex_enc_convert_src (GstPad * pad, GstFormat src_format, gint64 src_value,
GstFormat * dest_format, gint64 * dest_value)
@@ -458,6 +492,8 @@ gst_speex_enc_init (GstSpeexEnc * enc, GstSpeexEncClass * klass)
GST_DEBUG_FUNCPTR (gst_speex_enc_chain));
gst_pad_set_setcaps_function (enc->sinkpad,
GST_DEBUG_FUNCPTR (gst_speex_enc_sink_setcaps));
+ gst_pad_set_getcaps_function (enc->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_speex_enc_sink_getcaps));
gst_pad_set_query_function (enc->sinkpad,
GST_DEBUG_FUNCPTR (gst_speex_enc_sink_query));
@@ -781,6 +817,10 @@ gst_speex_enc_chain (GstPad * pad, GstBuffer * buf)
caps = gst_pad_get_caps (enc->srcpad);
caps = gst_speex_enc_set_header_on_caps (caps, buf1, buf2);
+ gst_caps_set_simple (caps,
+ "rate", G_TYPE_INT, enc->rate,
+ "channels", G_TYPE_INT, enc->channels, NULL);
+
/* negotiate with these caps */
GST_DEBUG ("here are the caps: %" GST_PTR_FORMAT, caps);
gst_pad_set_caps (enc->srcpad, caps);