From 2b11c625710aad9f0b0e35a3b939a7e85a7cfeb2 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Fri, 13 Jul 2018 22:31:04 -0400 Subject: [PATCH] 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 --- gst/rtp/gstrtpopuspay.c | 24 +++++++++++++++--------- gst/rtp/gstrtpvp8pay.c | 26 ++++++++++++++++---------- gst/rtp/gstrtpvp9pay.c | 26 ++++++++++++++++---------- 3 files changed, 47 insertions(+), 29 deletions(-) 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 @@ gst_rtp_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps) 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_opus_pay_setcaps (GstRTPBasePayload * payload, GstCaps * caps) 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 @@ static gboolean 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 @@ static gboolean 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); } -- 2.7.4