diff --git a/ext/opus/gstrtpopusdepay.c b/ext/opus/gstrtpopusdepay.c index 6bcdd12627..f58259ff8a 100644 --- a/ext/opus/gstrtpopusdepay.c +++ b/ext/opus/gstrtpopusdepay.c @@ -92,9 +92,38 @@ static gboolean gst_rtp_opus_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) { GstCaps *srccaps; + GstStructure *s; gboolean ret; + const gchar *sprop_stereo, *sprop_maxcapturerate; srccaps = gst_caps_new_empty_simple ("audio/x-opus"); + + s = gst_caps_get_structure (caps, 0); + if ((sprop_stereo = gst_structure_get_string (s, "sprop-stereo"))) { + if (strcmp (sprop_stereo, "0") == 0) + gst_caps_set_simple (srccaps, "channels", G_TYPE_INT, 1, NULL); + else if (strcmp (sprop_stereo, "1") == 0) + gst_caps_set_simple (srccaps, "channels", G_TYPE_INT, 2, NULL); + else + GST_WARNING_OBJECT (depayload, "Unknown sprop-stereo value '%s'", + sprop_stereo); + } + + if ((sprop_maxcapturerate = + gst_structure_get_string (s, "sprop-maxcapturerate"))) { + gulong rate; + gchar *tailptr; + + rate = strtoul (sprop_maxcapturerate, &tailptr, 10); + if (rate > INT_MAX || *tailptr != '\0') { + GST_WARNING_OBJECT (depayload, + "Failed to parse sprop-maxcapturerate value '%s'", + sprop_maxcapturerate); + } else { + gst_caps_set_simple (srccaps, "rate", G_TYPE_INT, rate, NULL); + } + } + ret = gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (depayload), srccaps); GST_DEBUG_OBJECT (depayload, diff --git a/ext/opus/gstrtpopuspay.c b/ext/opus/gstrtpopuspay.c index d0f7b10c54..a5a69569e4 100644 --- a/ext/opus/gstrtpopuspay.c +++ b/ext/opus/gstrtpopuspay.c @@ -97,6 +97,9 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps) GstCaps *src_caps; GstStructure *s; char *encoding_name; + gint channels, rate; + const char *sprop_stereo = NULL; + char *sprop_maxcapturerate = NULL; src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload)); if (src_caps) { @@ -110,10 +113,44 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps) encoding_name = g_strdup ("X-GST-OPUS-DRAFT-SPITTKA-00"); } + s = gst_caps_get_structure (caps, 0); + if (gst_structure_get_int (s, "channels", &channels)) { + if (channels > 2) { + GST_ERROR_OBJECT (payload, "More than 2 channels are not supported yet"); + return FALSE; + } else if (channels == 2) { + sprop_stereo = "1"; + } else { + sprop_stereo = "0"; + } + } + + if (gst_structure_get_int (s, "rate", &rate)) { + sprop_maxcapturerate = g_strdup_printf ("%d", rate); + } + gst_rtp_base_payload_set_options (payload, "audio", FALSE, encoding_name, 48000); g_free (encoding_name); - res = gst_rtp_base_payload_set_outcaps (payload, NULL); + + if (sprop_maxcapturerate && sprop_stereo) { + res = + gst_rtp_base_payload_set_outcaps (payload, "sprop-maxcapturerate", + G_TYPE_STRING, sprop_maxcapturerate, "sprop-stereo", G_TYPE_STRING, + sprop_stereo, NULL); + } else if (sprop_maxcapturerate) { + res = + gst_rtp_base_payload_set_outcaps (payload, "sprop-maxcapturerate", + G_TYPE_STRING, sprop_maxcapturerate, NULL); + } else if (sprop_stereo) { + res = + gst_rtp_base_payload_set_outcaps (payload, "sprop-stereo", + G_TYPE_STRING, sprop_stereo, NULL); + } else { + res = gst_rtp_base_payload_set_outcaps (payload, NULL); + } + + g_free (sprop_maxcapturerate); return res; }