diff -urp gst-plugins-good-0.10.8.OLD/ext/speex/gstspeexenc.c gst-plugins-good-0.10.8/ext/speex/gstspeexenc.c
--- gst-plugins-good-0.10.8.OLD/ext/speex/gstspeexenc.c 2008-06-13 15:45:41.000000000 -0400
+++ gst-plugins-good-0.10.8/ext/speex/gstspeexenc.c 2008-06-13 15:53:03.000000000 -0400
@@ -48,7 +48,9 @@ static GstStaticPadTemplate sink_factory
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 +222,37 @@ gst_speex_enc_sink_setcaps (GstPad * pad
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 +491,8 @@ gst_speex_enc_init (GstSpeexEnc * enc, G
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 +816,10 @@ gst_speex_enc_chain (GstPad * pad, GstBu
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);
diff -urp gst-plugins-good-0.10.8.OLD/gst/rtp/gstrtpspeexpay.c gst-plugins-good-0.10.8/gst/rtp/gstrtpspeexpay.c
--- gst-plugins-good-0.10.8.OLD/gst/rtp/gstrtpspeexpay.c 2008-06-13 15:45:41.000000000 -0400
+++ gst-plugins-good-0.10.8/gst/rtp/gstrtpspeexpay.c 2008-06-13 15:57:25.000000000 -0400
@@ -41,7 +41,9 @@ static GstStaticPadTemplate gst_rtp_spee
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("audio/x-speex")
+ GST_STATIC_CAPS ("audio/x-speex, "
+ "rate = (int) [ 6000, 48000 ], "
+ "channels = (int) 1")
);
static GstStaticPadTemplate gst_rtp_speex_pay_src_template =
@@ -61,6 +63,8 @@ static GstStateChangeReturn gst_rtp_spee
static gboolean gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload,
GstCaps * caps);
+static GstCaps * gst_rtp_speex_pay_getcaps (GstBaseRTPPayload * payload,
+ GstPad * pad);
static GstFlowReturn gst_rtp_speex_pay_handle_buffer (GstBaseRTPPayload *
payload, GstBuffer * buffer);
@@ -96,6 +100,7 @@ gst_rtp_speex_pay_class_init (GstRtpSPEE
gstelement_class->change_state = gst_rtp_speex_pay_change_state;
gstbasertppayload_class->set_caps = gst_rtp_speex_pay_setcaps;
+ gstbasertppayload_class->get_caps = gst_rtp_speex_pay_getcaps;
gstbasertppayload_class->handle_buffer = gst_rtp_speex_pay_handle_buffer;
}
@@ -114,6 +119,32 @@ gst_rtp_speex_pay_setcaps (GstBaseRTPPay
return TRUE;
}
+static GstCaps *
+gst_rtp_speex_pay_getcaps (GstBaseRTPPayload * payload, GstPad * pad)
+{
+ GstCaps * otherpadcaps;
+ GstCaps * caps;
+
+ otherpadcaps = gst_pad_get_allowed_caps(payload->srcpad);
+ caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+
+ if (otherpadcaps) {
+ if (!gst_caps_is_empty (otherpadcaps)) {
+ GstStructure * ps = gst_caps_get_structure (otherpadcaps, 0);
+ GstStructure * s = gst_caps_get_structure (caps, 0);
+ gint clock_rate;
+
+ if (gst_structure_get_int (ps, "clock-rate", &clock_rate)) {
+ gst_structure_fixate_field_nearest_int (s, "rate", clock_rate);
+ }
+ }
+
+ gst_caps_unref (otherpadcaps);
+ }
+
+ return caps;
+}
+
static gboolean
gst_rtp_speex_pay_parse_ident (GstRtpSPEEXPay * rtpspeexpay,
const guint8 * data, guint size)