rtppayload: Fix VP8/VP9/OPUS dual encoding name handling
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Sat, 14 Jul 2018 02:31:04 +0000 (22:31 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 1 Aug 2018 13:42:36 +0000 (09:42 -0400)
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
gst/rtp/gstrtpvp8pay.c
gst/rtp/gstrtpvp9pay.c

index b610885..f353800 100644 (file)
@@ -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 =
index 9649502..17a7788 100644 (file)
@@ -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);
 }
 
index a0b01e1..fd16765 100644 (file)
@@ -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);
 }