From 61a8fc07a1fc93290a0971c314fa52632436ef1a Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Jun 19 2008 17:48:59 +0000 Subject: - gst-plugins-good-0.10.8-speex-nego.patch: Backport speex channel and rate negotiation from 0.10.9. (#451391) --- diff --git a/gst-plugins-good-0.10.8-speex-nego.patch b/gst-plugins-good-0.10.8-speex-nego.patch new file mode 100644 index 0000000..42275a5 --- /dev/null +++ b/gst-plugins-good-0.10.8-speex-nego.patch @@ -0,0 +1,136 @@ +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) diff --git a/gstreamer-plugins-good.spec b/gstreamer-plugins-good.spec index 0ae7aa6..f871076 100644 --- a/gstreamer-plugins-good.spec +++ b/gstreamer-plugins-good.spec @@ -6,7 +6,7 @@ Name: %{gstreamer}-plugins-good Version: 0.10.8 -Release: 6%{?dist} +Release: 7%{?dist} Summary: GStreamer plug-ins with good code and licensing Group: Applications/Multimedia @@ -16,6 +16,8 @@ Source: http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugin Patch0: gst-plugins-good-0.10.8-docs.patch # http://bugzilla.gnome.org/show_bug.cgi?id=536317 Patch1: gst-plugins-good-v4l2-new-kernel.patch +# bug #451391 +Patch2: gst-plugins-good-0.10.8-speex-nego.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: %{gstreamer} >= %{_gst} @@ -99,6 +101,7 @@ This package contains documentation for the GStreamer Good Plug-ins. pushd sys/v4l2 %patch1 -p0 -b .new-kernel popd +%patch2 -p1 -b .speex-nego %build @@ -240,6 +243,10 @@ export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/gstreamer-%{majorminor}.schemas > /dev/null || : %changelog +* Thu Jun 19 2008 Adam Jackson 0.10.8-7 +- gst-plugins-good-0.10.8-speex-nego.patch: Backport speex channel and + rate negotiation from 0.10.9. (#451391) + * Tue Jun 17 2008 - Bastien Nocera - 0.10.8-6 - Really fix the default audio output not being correct