media: ignore codecs with duplicate payload type
authorJakub Adam <jakub.adam@ktknet.cz>
Wed, 26 Mar 2014 11:16:48 +0000 (26 12:16 +0100)
committerJakub Adam <jakub.adam@ktknet.cz>
Wed, 26 Mar 2014 13:17:32 +0000 (26 14:17 +0100)
Buggy(?) codecs may report non-unique id (a.k.a. payload type) this must
not appear in SDP messages we send. Thus, let's ignore any codec having
the same id as one we already have in the converted list.

src/core/sdpmsg.c
src/core/sdpmsg.h
src/core/sipe-media.c

index 95477a2..28a64ec 100644 (file)
@@ -732,7 +732,7 @@ sdpcandidate_free(struct sdpcandidate *candidate)
        }
 }
 
-static void
+void
 sdpcodec_free(struct sdpcodec *codec)
 {
        if (codec) {
index 144fd5e..5b017d9 100644 (file)
@@ -83,6 +83,11 @@ gchar *sdpmsg_to_string(const struct sdpmsg *msg);
 void sdpmsg_free(struct sdpmsg *msg);
 
 /**
+ * Deallocates @c sdpcodec.
+ */
+void sdpcodec_free(struct sdpcodec *codec);
+
+/**
  * Deallocates @c sdpmedia.
  */
 void sdpmedia_free(struct sdpmedia *media);
index cce76c5..5b2cbb5 100644 (file)
@@ -172,6 +172,13 @@ get_stream_ip_and_ports(GSList *candidates,
        }
 }
 
+static gint
+sdpcodec_compare(gconstpointer a, gconstpointer b)
+{
+       return ((const struct sdpcodec *)a)->id -
+              ((const struct sdpcodec *)b)->id;
+}
+
 static struct sdpmedia *
 backend_stream_to_sdpmedia(struct sipe_backend_media *backend_media,
                           struct sipe_backend_stream *backend_stream)
@@ -221,7 +228,13 @@ backend_stream_to_sdpmedia(struct sipe_backend_media *backend_media,
                        c->parameters = g_slist_append(c->parameters, copy);
                }
 
-               media->codecs = g_slist_append(media->codecs, c);
+               /* Buggy(?) codecs may report non-unique id (a.k.a. payload
+                * type) that must not appear in SDP messages we send. Thus,
+                * let's ignore any codec having the same id as one we already
+                * have in the converted list. */
+               media->codecs = sipe_utils_slist_insert_unique_sorted(
+                               media->codecs, c, sdpcodec_compare,
+                               (GDestroyNotify)sdpcodec_free);
        }
 
        sipe_media_codec_list_free(codecs);