rtppayload: Fix VP8/VP9/OPUS dual encoding name handling
All these were copy pasted and would lead to assertion when chained with
rtpmux. This commit rewrite the negotiation with downstream. This also
drop the fallback to ancient names if the pad is unlinked. This was
completly arbitrary decision that made no sense.
https://bugzilla.gnome.org/show_bug.cgi?id=796809
diff --git a/gst/rtp/gstrtpopuspay.c b/gst/rtp/gstrtpopuspay.c
index b610885..f353800 100644
--- a/gst/rtp/gstrtpopuspay.c
+++ b/gst/rtp/gstrtpopuspay.c
@@ -103,21 +103,28 @@
gboolean res;
GstCaps *src_caps;
GstStructure *s;
- char *encoding_name;
+ const char *encoding_name = "OPUS";
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) {
- src_caps = gst_caps_make_writable (src_caps);
- src_caps = gst_caps_truncate (src_caps);
+ GstStructure *s;
+ const GValue *value;
+
s = gst_caps_get_structure (src_caps, 0);
- gst_structure_fixate_field_string (s, "encoding-name", "OPUS");
- encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name"));
- gst_caps_unref (src_caps);
- } else {
- encoding_name = g_strdup ("X-GST-OPUS-DRAFT-SPITTKA-00");
+
+ if (gst_structure_has_field (s, "encoding-name")) {
+ GValue default_value = G_VALUE_INIT;
+
+ g_value_init (&default_value, G_TYPE_STRING);
+ g_value_set_static_string (&default_value, encoding_name);
+
+ value = gst_structure_get_value (s, "encoding-name");
+ if (!gst_value_can_intersect (&default_value, value))
+ encoding_name = "X-GST-OPUS-DRAFT-SPITTKA-00";
+ }
}
s = gst_caps_get_structure (caps, 0);
@@ -139,7 +146,6 @@
gst_rtp_base_payload_set_options (payload, "audio", FALSE,
encoding_name, 48000);
- g_free (encoding_name);
if (sprop_maxcapturerate && sprop_stereo) {
res =
diff --git a/gst/rtp/gstrtpvp8pay.c b/gst/rtp/gstrtpvp8pay.c
index 9649502..17a7788 100644
--- a/gst/rtp/gstrtpvp8pay.c
+++ b/gst/rtp/gstrtpvp8pay.c
@@ -512,24 +512,30 @@
gst_rtp_vp8_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
{
GstCaps *src_caps;
- GstStructure *s;
- char *encoding_name;
+ const char *encoding_name = "VP8";
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
if (src_caps) {
- src_caps = gst_caps_make_writable (src_caps);
- src_caps = gst_caps_truncate (src_caps);
+ GstStructure *s;
+ const GValue *value;
+
s = gst_caps_get_structure (src_caps, 0);
- gst_structure_fixate_field_string (s, "encoding-name", "VP8");
- encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name"));
- gst_caps_unref (src_caps);
- } else {
- encoding_name = g_strdup ("VP8-DRAFT-IETF-01");
+
+ if (gst_structure_has_field (s, "encoding-name")) {
+ GValue default_value = G_VALUE_INIT;
+
+ g_value_init (&default_value, G_TYPE_STRING);
+ g_value_set_static_string (&default_value, encoding_name);
+
+ value = gst_structure_get_value (s, "encoding-name");
+ if (!gst_value_can_intersect (&default_value, value))
+ encoding_name = "VP8-DRAFT-IETF-01";
+ }
}
gst_rtp_base_payload_set_options (payload, "video", TRUE,
encoding_name, 90000);
- g_free (encoding_name);
+
return gst_rtp_base_payload_set_outcaps (payload, NULL);
}
diff --git a/gst/rtp/gstrtpvp9pay.c b/gst/rtp/gstrtpvp9pay.c
index a0b01e1..fd16765 100644
--- a/gst/rtp/gstrtpvp9pay.c
+++ b/gst/rtp/gstrtpvp9pay.c
@@ -527,24 +527,30 @@
gst_rtp_vp9_pay_set_caps (GstRTPBasePayload * payload, GstCaps * caps)
{
GstCaps *src_caps;
- GstStructure *s;
- char *encoding_name;
+ const char *encoding_name = "VP9";
src_caps = gst_pad_get_allowed_caps (GST_RTP_BASE_PAYLOAD_SRCPAD (payload));
if (src_caps) {
- src_caps = gst_caps_make_writable (src_caps);
- src_caps = gst_caps_truncate (src_caps);
+ GstStructure *s;
+ const GValue *value;
+
s = gst_caps_get_structure (src_caps, 0);
- gst_structure_fixate_field_string (s, "encoding-name", "VP9");
- encoding_name = g_strdup (gst_structure_get_string (s, "encoding-name"));
- gst_caps_unref (src_caps);
- } else {
- encoding_name = g_strdup ("VP9-DRAFT-IETF-01");
+
+ if (gst_structure_has_field (s, "encoding-name")) {
+ GValue default_value = G_VALUE_INIT;
+
+ g_value_init (&default_value, G_TYPE_STRING);
+ g_value_set_static_string (&default_value, encoding_name);
+
+ value = gst_structure_get_value (s, "encoding-name");
+ if (!gst_value_can_intersect (&default_value, value))
+ encoding_name = "VP9-DRAFT-IETF-01";
+ }
}
gst_rtp_base_payload_set_options (payload, "video", TRUE,
encoding_name, 90000);
- g_free (encoding_name);
+
return gst_rtp_base_payload_set_outcaps (payload, NULL);
}