<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[207531] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/207531">207531</a></dd>
<dt>Author</dt> <dd>philn@webkit.org</dd>
<dt>Date</dt> <dd>2016-10-19 01:18:24 -0700 (Wed, 19 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>WebRTC: [GTK] Update jhbuild environment for OpenWebRTC
https://bugs.webkit.org/show_bug.cgi?id=163330

Reviewed by Michael Catanzaro.

Bring back the openwebrtc JHBuild moduleset in the time being. It
should be removed after the bump to GStreamer 1.10 is complete and
the libnice patches have been upstreamed. The GStreamer git
snapshots used in this patch are the ones configured in Ericsson's
GStreamer Cerbero fork.

* gtk/openwebrtc.modules: Added.
* gtk/patches/libnice-0001-TURN-allow-REALM-to-be-empty.patch: Added.
* gtk/patches/libnice-0001-agent-Remove-unnecessary-NULL-check.patch: Added.
* gtk/patches/libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch: Added.
* gtk/patches/libnice-0002-Do-not-update-a-remote-candidate-s-type.patch: Added.
* gtk/patches/libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch: Added.
* gtk/patches/libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch: Added.
* gtk/patches/libnice-0004-Removing-no-op-assignment.patch: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsgtkjhbuildmodules">trunk/Tools/gtk/jhbuild.modules</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsgtkopenwebrtcmodules">trunk/Tools/gtk/openwebrtc.modules</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0001TURNallowREALMtobeemptypatch">trunk/Tools/gtk/patches/libnice-0001-TURN-allow-REALM-to-be-empty.patch</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0001agentRemoveunnecessaryNULLcheckpatch">trunk/Tools/gtk/patches/libnice-0001-agent-Remove-unnecessary-NULL-check.patch</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0001nicesrcspintheagentmainloopinaseparatethreadpatch">trunk/Tools/gtk/patches/libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0002Donotupdatearemotecandidatestypepatch">trunk/Tools/gtk/patches/libnice-0002-Do-not-update-a-remote-candidate-s-type.patch</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0002TURNhandle437AllocationMismatchresponsespatch">trunk/Tools/gtk/patches/libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0003DonotcomparescopeforIPv6addresswhenscopeispatch">trunk/Tools/gtk/patches/libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch</a></li>
<li><a href="#trunkToolsgtkpatcheslibnice0004Removingnoopassignmentpatch">trunk/Tools/gtk/patches/libnice-0004-Removing-no-op-assignment.patch</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (207530 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-10-19 07:59:27 UTC (rev 207530)
+++ trunk/Tools/ChangeLog        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2016-10-18  Philippe Normand  &lt;pnormand@igalia.com&gt;
+
+        WebRTC: [GTK] Update jhbuild environment for OpenWebRTC
+        https://bugs.webkit.org/show_bug.cgi?id=163330
+
+        Reviewed by Michael Catanzaro.
+
+        Bring back the openwebrtc JHBuild moduleset in the time being. It
+        should be removed after the bump to GStreamer 1.10 is complete and
+        the libnice patches have been upstreamed. The GStreamer git
+        snapshots used in this patch are the ones configured in Ericsson's
+        GStreamer Cerbero fork.
+
+        * gtk/openwebrtc.modules: Added.
+        * gtk/patches/libnice-0001-TURN-allow-REALM-to-be-empty.patch: Added.
+        * gtk/patches/libnice-0001-agent-Remove-unnecessary-NULL-check.patch: Added.
+        * gtk/patches/libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch: Added.
+        * gtk/patches/libnice-0002-Do-not-update-a-remote-candidate-s-type.patch: Added.
+        * gtk/patches/libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch: Added.
+        * gtk/patches/libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch: Added.
+        * gtk/patches/libnice-0004-Removing-no-op-assignment.patch: Added.
+
</ins><span class="cx"> 2016-10-18  Sam Weinig  &lt;sam@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Replace std::experimental::variant with WTF::Variant (or similar)
</span></span></pre></div>
<a id="trunkToolsgtkjhbuildmodules"></a>
<div class="modfile"><h4>Modified: trunk/Tools/gtk/jhbuild.modules (207530 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/jhbuild.modules        2016-10-19 07:59:27 UTC (rev 207530)
+++ trunk/Tools/gtk/jhbuild.modules        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -512,6 +512,7 @@
</span><span class="cx">   &lt;autotools id=&quot;openwebrtc&quot; autogenargs=&quot;--enable-bridge=no --enable-owr-gst=yes&quot;&gt;
</span><span class="cx">     &lt;dependencies&gt;
</span><span class="cx">       &lt;dep package=&quot;gst-plugins-openwebrtc&quot;/&gt;
</span><ins>+      &lt;dep package=&quot;gst-plugins-bad&quot;/&gt;
</ins><span class="cx">       &lt;dep package=&quot;libnice&quot;/&gt;
</span><span class="cx">      &lt;/dependencies&gt;
</span><span class="cx">     &lt;branch repo=&quot;github.com&quot; module=&quot;EricssonResearch/openwebrtc.git&quot; checkoutdir=&quot;openwebrtc&quot; tag=&quot;0b28b080d61af3adb1f779e693fc029f9c1ad499&quot;/&gt;
</span></span></pre></div>
<a id="trunkToolsgtkopenwebrtcmodules"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/openwebrtc.modules (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/openwebrtc.modules                                (rev 0)
+++ trunk/Tools/gtk/openwebrtc.modules        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,87 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot;?&gt;
+&lt;!DOCTYPE moduleset SYSTEM &quot;moduleset.dtd&quot;&gt;
+&lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;moduleset.xsl&quot;?&gt;
+&lt;moduleset&gt;
+
+  &lt;repository type=&quot;tarball&quot; name=&quot;github-tarball&quot;
+      href=&quot;https://github.com/&quot;/&gt;
+  &lt;repository type=&quot;git&quot; name=&quot;gstreamer&quot;
+      href=&quot;git://anongit.freedesktop.org/git/gstreamer/&quot;/&gt;
+  &lt;repository type=&quot;tarball&quot; name=&quot;nice.freedesktop.org&quot;
+      href=&quot;http://nice.freedesktop.org&quot;/&gt;
+  &lt;repository type=&quot;git&quot; name=&quot;github.com&quot;
+      href=&quot;https://github.com&quot;/&gt;
+
+  &lt;autotools id=&quot;openh264&quot; supports-non-srcdir-builds=&quot;no&quot; autogen-sh=&quot;pseudo-configure&quot;&gt;
+    &lt;branch module=&quot;cisco/openh264/archive/v${version}.tar.gz&quot; version=&quot;1.5.0&quot;
+            checkoutdir=&quot;openh264-${version}&quot; repo=&quot;github-tarball&quot;&gt;
+      &lt;patch file=&quot;openh264-configure.patch&quot; strip=&quot;0&quot;/&gt;
+    &lt;/branch&gt;
+  &lt;/autotools&gt;
+
+  &lt;autotools id=&quot;libvpx&quot;
+    autogen-template=&quot;%(srcdir)s/configure --prefix=%(prefix)s --enable-pic --as=yasm --disable-unit-tests --size-limit=16384x16384 --enable-postproc --enable-multi-res-encoding --enable-temporal-denoising --enable-vp9-temporal-denoising --enable-vp9-postproc --enable-shared&quot;&gt;
+    &lt;branch repo=&quot;github.com&quot; module=&quot;webmproject/libvpx.git&quot; version=&quot;1.6.0&quot; checkoutdir=&quot;libvpx-1.6.0&quot;&gt;
+    &lt;/branch&gt;
+  &lt;/autotools&gt;
+
+  &lt;autotools id=&quot;libnice&quot; supports-non-srcdir-builds=&quot;no&quot;&gt;
+    &lt;dependencies&gt;
+      &lt;dep package=&quot;gstreamer&quot;/&gt;
+    &lt;/dependencies&gt;
+    &lt;branch repo=&quot;nice.freedesktop.org&quot; module=&quot;releases/libnice-${version}.tar.gz&quot; version=&quot;0.1.13&quot; checkoutdir=&quot;libnice-${version}&quot;&gt;
+      &lt;patch file=&quot;libnice-0001-agent-Remove-unnecessary-NULL-check.patch&quot; strip=&quot;1&quot;/&gt;
+      &lt;patch file=&quot;libnice-0002-Do-not-update-a-remote-candidate-s-type.patch&quot; strip=&quot;1&quot;/&gt;
+      &lt;patch file=&quot;libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch&quot; strip=&quot;1&quot;/&gt;
+      &lt;patch file=&quot;libnice-0004-Removing-no-op-assignment.patch&quot; strip=&quot;1&quot;/&gt;
+      &lt;patch file=&quot;libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch&quot; strip=&quot;1&quot;/&gt;
+      &lt;patch file=&quot;libnice-0001-TURN-allow-REALM-to-be-empty.patch&quot; strip=&quot;1&quot;/&gt;
+      &lt;patch file=&quot;libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch&quot; strip=&quot;1&quot;/&gt;
+    &lt;/branch&gt;
+  &lt;/autotools&gt;
+
+  &lt;autotools id=&quot;gstreamer&quot; autogenargs=&quot;--disable-gtk-doc&quot;&gt;
+    &lt;if condition-set=&quot;macos&quot;&gt;
+      &lt;autogenargs value=&quot;--disable-introspection&quot;/&gt;
+    &lt;/if&gt;
+    &lt;dependencies&gt;
+      &lt;dep package=&quot;orc&quot;/&gt;
+    &lt;/dependencies&gt;
+    &lt;branch repo=&quot;gstreamer&quot; module=&quot;gstreamer&quot; checkoutdir=&quot;gstreamer-b6e69ffdfb3bb21dbada8f01b488ae877f8d205c&quot; tag=&quot;b6e69ffdfb3bb21dbada8f01b488ae877f8d205c&quot;/&gt;
+  &lt;/autotools&gt;
+
+  &lt;autotools id=&quot;gst-plugins-base&quot;
+             autogen-sh=&quot;autogen.sh&quot;
+             autogenargs=&quot;--disable-examples --disable-gtk-doc&quot;&gt;
+    &lt;if condition-set=&quot;macos&quot;&gt;
+      &lt;autogenargs value=&quot;--disable-introspection&quot;/&gt;
+    &lt;/if&gt;
+    &lt;dependencies&gt;
+      &lt;dep package=&quot;gstreamer&quot;/&gt;
+    &lt;/dependencies&gt;
+    &lt;branch repo=&quot;gstreamer&quot; module=&quot;gst-plugins-base&quot; checkoutdir=&quot;gst-plugins-base-cf18fae9deb02f0867b67593f678b932f8eb931a&quot; tag=&quot;cf18fae9deb02f0867b67593f678b932f8eb931a&quot;/&gt;
+  &lt;/autotools&gt;
+
+  &lt;autotools id=&quot;gst-plugins-good&quot; autogenargs=&quot;--disable-examples --disable-soup --disable-gtk-doc&quot;&gt;
+    &lt;if condition-set=&quot;macos&quot;&gt;
+      &lt;autogenargs value=&quot;--disable-introspection&quot;/&gt;
+    &lt;/if&gt;
+    &lt;dependencies&gt;
+     &lt;dep package=&quot;libvpx&quot;/&gt;
+     &lt;dep package=&quot;gst-plugins-base&quot;/&gt;
+    &lt;/dependencies&gt;
+     &lt;branch repo=&quot;gstreamer&quot; module=&quot;gst-plugins-good&quot; checkoutdir=&quot;gst-plugins-good-567afdd4d3f2fa07fecf4c02a7eca70f7a7ef7f7&quot; tag=&quot;567afdd4d3f2fa07fecf4c02a7eca70f7a7ef7f7&quot;/&gt;
+  &lt;/autotools&gt;
+
+  &lt;autotools id=&quot;gst-plugins-bad&quot; autogenargs=&quot;--disable-examples --disable-gtk-doc --enable-openh264&quot;&gt;
+    &lt;if condition-set=&quot;macos&quot;&gt;
+      &lt;autogenargs value=&quot;--disable-introspection&quot;/&gt;
+    &lt;/if&gt;
+    &lt;dependencies&gt;
+      &lt;dep package=&quot;gst-plugins-base&quot;/&gt;
+      &lt;dep package=&quot;openh264&quot;/&gt;
+    &lt;/dependencies&gt;
+    &lt;branch repo=&quot;gstreamer&quot; module=&quot;gst-plugins-bad&quot; checkoutdir=&quot;gst-plugins-bad-a036b7ef9ffe9fe5dac4a7e46fbc3bac92921a54&quot; tag=&quot;a036b7ef9ffe9fe5dac4a7e46fbc3bac92921a54&quot;/&gt;
+  &lt;/autotools&gt;
+  
+&lt;/moduleset&gt;
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0001TURNallowREALMtobeemptypatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0001-TURN-allow-REALM-to-be-empty.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0001-TURN-allow-REALM-to-be-empty.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0001-TURN-allow-REALM-to-be-empty.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+From 0c55166a817ec51096460f789234ef49237000cc Mon Sep 17 00:00:00 2001
+From: Alessandro Decina &lt;alessandro.d@gmail.com&gt;
+Date: Thu, 24 Mar 2016 10:48:27 +1100
+Subject: [PATCH 1/2] TURN: allow REALM to be empty
+
+---
+ agent/conncheck.c | 6 ++----
+ stun/stunhmac.c   | 6 ++++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/agent/conncheck.c b/agent/conncheck.c
+index 057fc81..97bf536 100644
+--- a/agent/conncheck.c
++++ b/agent/conncheck.c
+@@ -2768,13 +2768,11 @@ static gboolean priv_map_reply_to_relay_request (NiceAgent *agent, StunMessage *
+                agent-&gt;compatibility == NICE_COMPATIBILITY_OC2007R2) &amp;&amp;
+               stun_message_get_class (resp) == STUN_ERROR &amp;&amp;
+               stun_message_find_error (resp, &amp;code) ==
+-              STUN_MESSAGE_RETURN_SUCCESS &amp;&amp;
+-              recv_realm != NULL &amp;&amp; recv_realm_len &gt; 0) {
+-
++              STUN_MESSAGE_RETURN_SUCCESS) {
+             if (code == 438 ||
+                 (code == 401 &amp;&amp;
+                     !(recv_realm_len == sent_realm_len &amp;&amp;
+-                        sent_realm != NULL &amp;&amp;
++                        recv_realm != NULL &amp;&amp; sent_realm != NULL &amp;&amp;
+                         memcmp (sent_realm, recv_realm, sent_realm_len) == 0))) {
+               d-&gt;stun_resp_msg = *resp;
+               memcpy (d-&gt;stun_resp_buffer, resp-&gt;buffer,
+diff --git a/stun/stunhmac.c b/stun/stunhmac.c
+index df5deb6..f73943f 100644
+--- a/stun/stunhmac.c
++++ b/stun/stunhmac.c
+@@ -90,8 +90,10 @@ static const uint8_t *priv_trim_var (const uint8_t *var, size_t *var_len)
+     ptr++;
+     (*var_len)--;
+   }
+-  while(ptr[*var_len-1] == '&quot;' ||
+-      ptr[*var_len-1] == 0) {
++
++  while(*var_len &gt; 0 &amp;&amp;
++      (ptr[*var_len-1] == '&quot;' ||
++      ptr[*var_len-1] == 0)) {
+     (*var_len)--;
+   }

+-- 
+2.3.4
+
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0001agentRemoveunnecessaryNULLcheckpatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0001-agent-Remove-unnecessary-NULL-check.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0001-agent-Remove-unnecessary-NULL-check.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0001-agent-Remove-unnecessary-NULL-check.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+From 7b7d2d986876fc53a23af7b516d78f82f2a546e9 Mon Sep 17 00:00:00 2001
+From: Philip Withnall &lt;philip@tecnocode.co.uk&gt;
+Date: Sun, 3 May 2015 16:05:30 +0100
+Subject: [PATCH 1/4] agent: Remove unnecessary NULL check
+
+With the changes in commit 483bdcf8, @name is now guaranteed to be
+non-NULL. Spotted by Coverity.
+
+CID: #109878
+---
+ agent/agent.c | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/agent/agent.c b/agent/agent.c
+index 259fdc9..e733c82 100644
+--- a/agent/agent.c
++++ b/agent/agent.c
+@@ -5329,16 +5329,14 @@ nice_agent_set_stream_name (NiceAgent *agent, guint stream_id,

+   agent_lock();

+-  if (name != NULL) {
+-    for (i = agent-&gt;streams; i; i = i-&gt;next) {
+-      Stream *stream = i-&gt;data;
++  for (i = agent-&gt;streams; i; i = i-&gt;next) {
++    Stream *stream = i-&gt;data;

+-      if (stream-&gt;id != stream_id &amp;&amp;
+-          g_strcmp0 (stream-&gt;name, name) == 0)
+-        goto done;
+-      else if (stream-&gt;id == stream_id)
+-        stream_to_name = stream;
+-    }
++    if (stream-&gt;id != stream_id &amp;&amp;
++        g_strcmp0 (stream-&gt;name, name) == 0)
++      goto done;
++    else if (stream-&gt;id == stream_id)
++      stream_to_name = stream;
+   }

+   if (stream_to_name == NULL)
+-- 
+2.3.2 (Apple Git-55)
+
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0001nicesrcspintheagentmainloopinaseparatethreadpatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0001-nicesrc-spin-the-agent-mainloop-in-a-separate-thread.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,253 @@
</span><ins>+From 3196a96a408a90f707dff3f31fa3d05d64aeb68a Mon Sep 17 00:00:00 2001
+From: Alessandro Decina &lt;alessandro.d@gmail.com&gt;
+Date: Tue, 13 Oct 2015 12:49:19 +1100
+Subject: [PATCH] nicesrc: spin the agent mainloop in a separate thread
+
+Don't run the mainloop from the srcpad task, since that can get blocked in the
+pipeline and cause unnecessary STUN retrasmissions (at best) and completely
+block the agent (at worst).
+---
+ gst/gstnicesrc.c | 158 ++++++++++++++++++++++++++++++++-----------------------
+ gst/gstnicesrc.h |   4 +-
+ 2 files changed, 93 insertions(+), 69 deletions(-)
+
+diff --git a/gst/gstnicesrc.c b/gst/gstnicesrc.c
+index d369e09..eb59fe9 100644
+--- a/gst/gstnicesrc.c
++++ b/gst/gstnicesrc.c
+@@ -48,6 +48,14 @@ GST_DEBUG_CATEGORY_STATIC (nicesrc_debug);

+ #define BUFFER_SIZE (65536)

++static gboolean
++gst_nice_src_start (
++    GstBaseSrc *basesrc);
++
++static gboolean
++gst_nice_src_stop (
++    GstBaseSrc *basesrc);
++
+ static GstFlowReturn
+ gst_nice_src_create (
+   GstPushSrc *basesrc,
+@@ -57,10 +65,6 @@ static gboolean
+ gst_nice_src_unlock (
+     GstBaseSrc *basesrc);

+-static gboolean
+-gst_nice_src_unlock_stop (
+-    GstBaseSrc *basesrc);
+-
+ static void
+ gst_nice_src_set_property (
+   GObject *object,
+@@ -116,8 +120,9 @@ gst_nice_src_class_init (GstNiceSrcClass *klass)
+   gstpushsrc_class-&gt;create = GST_DEBUG_FUNCPTR (gst_nice_src_create);

+   gstbasesrc_class = (GstBaseSrcClass *) klass;
++  gstbasesrc_class-&gt;start = GST_DEBUG_FUNCPTR (gst_nice_src_start);
++  gstbasesrc_class-&gt;stop = GST_DEBUG_FUNCPTR (gst_nice_src_stop);
+   gstbasesrc_class-&gt;unlock = GST_DEBUG_FUNCPTR (gst_nice_src_unlock);
+-  gstbasesrc_class-&gt;unlock_stop = GST_DEBUG_FUNCPTR (gst_nice_src_unlock_stop);

+   gobject_class = (GObjectClass *) klass;
+   gobject_class-&gt;set_property = gst_nice_src_set_property;
+@@ -179,9 +184,83 @@ gst_nice_src_init (GstNiceSrc *src)
+   src-&gt;component_id = 0;
+   src-&gt;mainctx = g_main_context_new ();
+   src-&gt;mainloop = g_main_loop_new (src-&gt;mainctx, FALSE);
+-  src-&gt;unlocked = FALSE;
+-  src-&gt;idle_source = NULL;
+   src-&gt;outbufs = g_queue_new ();
++  src-&gt;agent_io_thread = NULL;
++  g_cond_init (&amp;src-&gt;outcond);
++}
++
++static gpointer
++gst_nice_src_agent_io_thread (gpointer data)
++{
++  GstNiceSrc *nicesrc = GST_NICE_SRC (data);
++
++  GST_INFO_OBJECT (nicesrc, &quot;starting agent io thread&quot;);
++  g_main_loop_run (nicesrc-&gt;mainloop);
++  GST_INFO_OBJECT (nicesrc, &quot;exiting agent io thread&quot;);
++
++  return NULL;
++}
++
++static gboolean
++main_loop_running_cb (gpointer data)
++{
++  GstNiceSrc *nicesrc = GST_NICE_SRC (data);
++
++  GST_OBJECT_LOCK (nicesrc);
++  /* _start() and _stop() could both be waiting for the mainloop to start so we
++   * need to broadcast */
++  g_cond_broadcast (&amp;nicesrc-&gt;outcond);
++  GST_OBJECT_UNLOCK (nicesrc);
++
++  return FALSE;
++}
++
++static gboolean
++gst_nice_src_start (GstBaseSrc * basesrc)
++{
++  GstNiceSrc *nicesrc = GST_NICE_SRC (basesrc);
++  GSource *source;
++  gchar *thread_name;
++
++  GST_OBJECT_LOCK (nicesrc);
++  source = g_idle_source_new ();
++  g_source_set_callback (source,
++      (GSourceFunc) main_loop_running_cb, nicesrc, NULL);
++  g_source_attach (source, nicesrc-&gt;mainctx);
++  g_source_unref (source);
++
++  thread_name = g_strdup_printf (&quot;%s:agent_io&quot;, GST_OBJECT_NAME (nicesrc));
++  nicesrc-&gt;agent_io_thread = g_thread_new (thread_name, gst_nice_src_agent_io_thread, nicesrc);
++  g_free (thread_name);
++  /* wait until the agent thread starts spinning the mainloop or _stop() is
++   * called */
++  while (GST_BASE_SRC_IS_STARTING (basesrc) &amp;&amp;
++      !g_main_loop_is_running (nicesrc-&gt;mainloop))
++    g_cond_wait (&amp;nicesrc-&gt;outcond, GST_OBJECT_GET_LOCK (nicesrc));
++  GST_OBJECT_UNLOCK (nicesrc);
++
++  return TRUE;
++}
++
++static gboolean
++gst_nice_src_stop (GstBaseSrc * basesrc)
++{
++  GstNiceSrc *nicesrc = GST_NICE_SRC (basesrc);
++  GThread *agent_io_thread = NULL;
++
++  GST_OBJECT_LOCK (nicesrc);
++  /* here we wait for the agent thread created in _start() to be scheduled so
++   * that we don't risk calling _quit() first and then _run() on the mainloop */
++  while (!g_main_loop_is_running (nicesrc-&gt;mainloop))
++    g_cond_wait (&amp;nicesrc-&gt;outcond, GST_OBJECT_GET_LOCK (nicesrc));
++  g_main_loop_quit (nicesrc-&gt;mainloop);
++  agent_io_thread = nicesrc-&gt;agent_io_thread;
++  nicesrc-&gt;agent_io_thread = NULL;
++  GST_OBJECT_UNLOCK (nicesrc);
++
++  g_thread_join (agent_io_thread);
++
++  return TRUE;
+ }

+ static void
+@@ -207,62 +286,17 @@ gst_nice_src_read_callback (NiceAgent *agent,
+ #endif
+   GST_OBJECT_LOCK (nicesrc);
+   g_queue_push_tail (nicesrc-&gt;outbufs, buffer);
+-  g_main_loop_quit (nicesrc-&gt;mainloop);
++  g_cond_signal (&amp;nicesrc-&gt;outcond);
+   GST_OBJECT_UNLOCK (nicesrc);
+ }

+ static gboolean
+-gst_nice_src_unlock_idler (gpointer data)
+-{
+-  GstNiceSrc *nicesrc = GST_NICE_SRC (data);
+-
+-  GST_OBJECT_LOCK (nicesrc);
+-  if (nicesrc-&gt;unlocked)
+-    g_main_loop_quit (nicesrc-&gt;mainloop);
+-
+-  if (nicesrc-&gt;idle_source) {
+-    g_source_destroy (nicesrc-&gt;idle_source);
+-    g_source_unref (nicesrc-&gt;idle_source);
+-    nicesrc-&gt;idle_source = NULL;
+-  }
+-  GST_OBJECT_UNLOCK (nicesrc);
+-
+-  return FALSE;
+-}
+-
+-static gboolean
+ gst_nice_src_unlock (GstBaseSrc *src)
+ {
+   GstNiceSrc *nicesrc = GST_NICE_SRC (src);

+   GST_OBJECT_LOCK (src);
+-  nicesrc-&gt;unlocked = TRUE;
+-
+-  g_main_loop_quit (nicesrc-&gt;mainloop);
+-
+-  if (!nicesrc-&gt;idle_source) {
+-    nicesrc-&gt;idle_source = g_idle_source_new ();
+-    g_source_set_priority (nicesrc-&gt;idle_source, G_PRIORITY_HIGH);
+-    g_source_set_callback (nicesrc-&gt;idle_source, gst_nice_src_unlock_idler, src, NULL);
+-    g_source_attach (nicesrc-&gt;idle_source, g_main_loop_get_context (nicesrc-&gt;mainloop));
+-  }
+-  GST_OBJECT_UNLOCK (src);
+-
+-  return TRUE;
+-}
+-
+-static gboolean
+-gst_nice_src_unlock_stop (GstBaseSrc *src)
+-{
+-  GstNiceSrc *nicesrc = GST_NICE_SRC (src);
+-
+-  GST_OBJECT_LOCK (src);
+-  nicesrc-&gt;unlocked = FALSE;
+-  if (nicesrc-&gt;idle_source) {
+-    g_source_destroy (nicesrc-&gt;idle_source);
+-    g_source_unref(nicesrc-&gt;idle_source);
+-  }
+-  nicesrc-&gt;idle_source = NULL;
++  g_cond_signal (&amp;nicesrc-&gt;outcond);
+   GST_OBJECT_UNLOCK (src);

+   return TRUE;
+@@ -278,19 +312,8 @@ gst_nice_src_create (
+   GST_LOG_OBJECT (nicesrc, &quot;create called&quot;);

+   GST_OBJECT_LOCK (basesrc);
+-  if (nicesrc-&gt;unlocked) {
+-    GST_OBJECT_UNLOCK (basesrc);
+-#if GST_CHECK_VERSION (1,0,0)
+-    return GST_FLOW_FLUSHING;
+-#else
+-    return GST_FLOW_WRONG_STATE;
+-#endif
+-  }
+-  if (g_queue_is_empty (nicesrc-&gt;outbufs)) {
+-    GST_OBJECT_UNLOCK (basesrc);
+-    g_main_loop_run (nicesrc-&gt;mainloop);
+-    GST_OBJECT_LOCK (basesrc);
+-  }
++  if (g_queue_is_empty (nicesrc-&gt;outbufs))
++    g_cond_wait (&amp;nicesrc-&gt;outcond, GST_OBJECT_GET_LOCK (nicesrc));

+   *buffer = g_queue_pop_head (nicesrc-&gt;outbufs);
+   GST_OBJECT_UNLOCK (basesrc);
+@@ -331,6 +354,7 @@ gst_nice_src_dispose (GObject *object)
+     g_queue_free (src-&gt;outbufs);
+   }
+   src-&gt;outbufs = NULL;
++  g_cond_clear (&amp;src-&gt;outcond);

+   G_OBJECT_CLASS (gst_nice_src_parent_class)-&gt;dispose (object);
+ }
+diff --git a/gst/gstnicesrc.h b/gst/gstnicesrc.h
+index 5d3f554..2d9f674 100644
+--- a/gst/gstnicesrc.h
++++ b/gst/gstnicesrc.h
+@@ -68,8 +68,8 @@ struct _GstNiceSrc
+   GMainContext *mainctx;
+   GMainLoop *mainloop;
+   GQueue *outbufs;
+-  gboolean unlocked;
+-  GSource *idle_source;
++  GCond outcond;
++  GThread *agent_io_thread;
+ };

+ typedef struct _GstNiceSrcClass GstNiceSrcClass;
+-- 
+2.3.4
+
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0002Donotupdatearemotecandidatestypepatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0002-Do-not-update-a-remote-candidate-s-type.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0002-Do-not-update-a-remote-candidate-s-type.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0002-Do-not-update-a-remote-candidate-s-type.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+From 93862c1e1940618e06143d4788f54bffd4d1c5da Mon Sep 17 00:00:00 2001
+From: Youness Alaoui &lt;kakaroto@kakaroto.homelinux.net&gt;
+Date: Tue, 5 May 2015 14:24:15 -0400
+Subject: [PATCH 2/4] Do not update a remote candidate's type
+
+When adding a remote candidate, if it's the same ip:port, we should
+also check its type, otherwise it's a new candidate. We can't allow
+a candidate type to be updated. This caused issues to ikonst_ on IRC
+where for some reason a host candidate appeared as both host and prflx
+and the update caused a remote host candidate to be updated to prflx
+causing a crash when the sockptr was being accessed.
+---
+ agent/agent.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/agent/agent.c b/agent/agent.c
+index e733c82..38b679f 100644
+--- a/agent/agent.c
++++ b/agent/agent.c
+@@ -3041,7 +3041,7 @@ static gboolean priv_add_remote_candidate (

+   /* step: check whether the candidate already exists */
+   candidate = component_find_remote_candidate(component, addr, transport);
+-  if (candidate) {
++  if (candidate &amp;&amp; candidate-&gt;type == type) {
+     if (nice_debug_is_enabled ()) {
+       gchar tmpbuf[INET6_ADDRSTRLEN];
+       nice_address_to_string (addr, tmpbuf);
+-- 
+2.3.2 (Apple Git-55)
+
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0002TURNhandle437AllocationMismatchresponsespatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0002-TURN-handle-437-Allocation-Mismatch-responses.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,131 @@
</span><ins>+From 9e2ced131ac0fc642ef5c861851c5988d8b96d16 Mon Sep 17 00:00:00 2001
+From: Alessandro Decina &lt;alessandro.d@gmail.com&gt;
+Date: Thu, 24 Mar 2016 10:54:20 +1100
+Subject: [PATCH 2/2] TURN: handle 437 Allocation Mismatch responses
+
+On Allocation Mismatch responses, the client is supposed to retry with a
+different host:port combination.
+---
+ agent/conncheck.c | 42 +++++++++++++++++++++++++++++++++---------
+ agent/discovery.h |  1 +
+ stun/stunagent.c  |  2 +-
+ 3 files changed, 35 insertions(+), 10 deletions(-)
+
+diff --git a/agent/conncheck.c b/agent/conncheck.c
+index 97bf536..d03e57a 100644
+--- a/agent/conncheck.c
++++ b/agent/conncheck.c
+@@ -2630,9 +2630,10 @@ static gboolean priv_map_reply_to_relay_request (NiceAgent *agent, StunMessage *
+   StunTransactionId discovery_id;
+   StunTransactionId response_id;
+   stun_message_id (resp, response_id);
++  CandidateDiscovery *d = NULL;

+   for (i = agent-&gt;discovery_list; i &amp;&amp; trans_found != TRUE; i = i-&gt;next) {
+-    CandidateDiscovery *d = i-&gt;data;
++    d = i-&gt;data;

+     if (d-&gt;type == NICE_CANDIDATE_TYPE_RELAYED &amp;&amp;
+         d-&gt;stun_message.buffer) {
+@@ -2757,6 +2758,7 @@ static gboolean priv_map_reply_to_relay_request (NiceAgent *agent, StunMessage *
+           uint16_t sent_realm_len = 0;
+           uint16_t recv_realm_len = 0;

++          trans_found = TRUE;
+           sent_realm = (uint8_t *) stun_message_find (&amp;d-&gt;stun_message,
+               STUN_ATTRIBUTE_REALM, &amp;sent_realm_len);
+           recv_realm = (uint8_t *) stun_message_find (resp,
+@@ -2769,11 +2771,31 @@ static gboolean priv_map_reply_to_relay_request (NiceAgent *agent, StunMessage *
+               stun_message_get_class (resp) == STUN_ERROR &amp;&amp;
+               stun_message_find_error (resp, &amp;code) ==
+               STUN_MESSAGE_RETURN_SUCCESS) {
+-            if (code == 438 ||
++            if (code == 437 ||
++                code == 438 ||
+                 (code == 401 &amp;&amp;
+                     !(recv_realm_len == sent_realm_len &amp;&amp;
+                         recv_realm != NULL &amp;&amp; sent_realm != NULL &amp;&amp;
+                         memcmp (sent_realm, recv_realm, sent_realm_len) == 0))) {
++              if (code == 437) {
++                if (d-&gt;turn_retries++ == 3)
++                  goto error;
++
++                /* retry up to three times on Allocation Mismatch errors */
++                NiceAddress addr = d-&gt;nicesock-&gt;addr;
++                NiceSocket *new_socket;
++
++                /* FIXME: this ignores nice_agent_set_port_range */
++                nice_address_set_port (&amp;addr, 0);
++
++                new_socket = nice_udp_bsd_socket_new (&amp;addr);
++                if (new_socket) {
++                  _priv_set_socket_tos (agent, new_socket, d-&gt;stream-&gt;tos);
++                  component_attach_socket (d-&gt;component, new_socket);
++                  d-&gt;nicesock = new_socket;
++                }
++              }
++
+               d-&gt;stun_resp_msg = *resp;
+               memcpy (d-&gt;stun_resp_buffer, resp-&gt;buffer,
+                   stun_message_length (resp));
+@@ -2782,23 +2804,25 @@ static gboolean priv_map_reply_to_relay_request (NiceAgent *agent, StunMessage *
+               d-&gt;pending = FALSE;
+             } else {
+               /* case: a real unauthorized error */
+-              d-&gt;stun_message.buffer = NULL;
+-              d-&gt;stun_message.buffer_len = 0;
+-              d-&gt;done = TRUE;
++              goto error;
+             }
+           } else {
+             /* case: STUN error, the check STUN context was freed */
+-            d-&gt;stun_message.buffer = NULL;
+-            d-&gt;stun_message.buffer_len = 0;
+-            d-&gt;done = TRUE;
++            goto error;
+           }
+-          trans_found = TRUE;
+         }
+       }
+     }
+   }

+   return trans_found;
++
++error:
++  d-&gt;stun_message.buffer = NULL;
++  d-&gt;stun_message.buffer_len = 0;
++  d-&gt;done = TRUE;
++
++  return trans_found;
+ }


+diff --git a/agent/discovery.h b/agent/discovery.h
+index c22ea6a..148b8c2 100644
+--- a/agent/discovery.h
++++ b/agent/discovery.h
+@@ -56,6 +56,7 @@ typedef struct
+   Stream *stream;
+   Component *component;
+   TurnServer *turn;
++  gint turn_retries;
+   StunAgent stun_agent;
+   StunTimer timer;
+   uint8_t stun_buffer[STUN_MAX_MESSAGE_SIZE_IPV6];
+diff --git a/stun/stunagent.c b/stun/stunagent.c
+index 2abcc29..0abae3d 100644
+--- a/stun/stunagent.c
++++ b/stun/stunagent.c
+@@ -301,7 +301,7 @@ StunValidationStatus stun_agent_validate (StunAgent *agent, StunMessage *msg,
+     } else if (!(stun_message_get_class (msg) == STUN_ERROR &amp;&amp;
+         stun_message_find_error (msg, &amp;error_code) ==
+             STUN_MESSAGE_RETURN_SUCCESS &amp;&amp;
+-        (error_code == 400 || error_code == 401))) {
++        (error_code == 400 || error_code == 401 || error_code == 437))) {
+       stun_debug (&quot;STUN auth error: No message integrity attribute!&quot;);
+       return STUN_VALIDATION_UNAUTHORIZED;
+     }
+-- 
+2.3.4
+
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0003DonotcomparescopeforIPv6addresswhenscopeispatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0003-Do-not-compare-scope-for-IPv6-address-when-scope-is-.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+From 91a7b9324244844baf35d8fcef019a4ea3872d30 Mon Sep 17 00:00:00 2001
+From: Youness Alaoui &lt;kakaroto@kakaroto.homelinux.net&gt;
+Date: Tue, 5 May 2015 15:00:30 -0400
+Subject: [PATCH 3/4] Do not compare scope for IPv6 address when scope is 0
+
+This caused issues with thinking local host candidates were peer-reflexive
+candidates because the nice_address_equal would fail since the scope
+would be 6 (or some other value) but locally created NiceAddress from
+a stun response would have the scope set to 0.
+We ignore the scope when comparing ipv6 candidates when scope is 0
+to avoid these kinds of issues.
+Thanks to ikonst_ for finding these issues
+---
+ agent/address.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/agent/address.c b/agent/address.c
+index a8d9c76..01eebab 100644
+--- a/agent/address.c
++++ b/agent/address.c
+@@ -297,7 +297,8 @@ nice_address_equal (const NiceAddress *a, const NiceAddress *b)
+     case AF_INET6:
+       return IN6_ARE_ADDR_EQUAL (&amp;a-&gt;s.ip6.sin6_addr, &amp;b-&gt;s.ip6.sin6_addr)
+           &amp;&amp; (a-&gt;s.ip6.sin6_port == b-&gt;s.ip6.sin6_port)
+-          &amp;&amp; (a-&gt;s.ip6.sin6_scope_id == b-&gt;s.ip6.sin6_scope_id);
++          &amp;&amp; (a-&gt;s.ip6.sin6_scope_id == 0 || b-&gt;s.ip6.sin6_scope_id == 0 ||
++              (a-&gt;s.ip6.sin6_scope_id == b-&gt;s.ip6.sin6_scope_id));

+     default:
+       g_return_val_if_reached (FALSE);
+@@ -412,7 +413,8 @@ nice_address_equal_no_port (const NiceAddress *a, const NiceAddress *b)

+     case AF_INET6:
+       return IN6_ARE_ADDR_EQUAL (&amp;a-&gt;s.ip6.sin6_addr, &amp;b-&gt;s.ip6.sin6_addr)
+-          &amp;&amp; (a-&gt;s.ip6.sin6_scope_id == b-&gt;s.ip6.sin6_scope_id);
++          &amp;&amp; (a-&gt;s.ip6.sin6_scope_id == 0 || b-&gt;s.ip6.sin6_scope_id == 0 ||
++              (a-&gt;s.ip6.sin6_scope_id == b-&gt;s.ip6.sin6_scope_id));

+     default:
+       g_return_val_if_reached (FALSE);
+-- 
+2.3.2 (Apple Git-55)
+
</ins></span></pre></div>
<a id="trunkToolsgtkpatcheslibnice0004Removingnoopassignmentpatch"></a>
<div class="addfile"><h4>Added: trunk/Tools/gtk/patches/libnice-0004-Removing-no-op-assignment.patch (0 => 207531)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/gtk/patches/libnice-0004-Removing-no-op-assignment.patch                                (rev 0)
+++ trunk/Tools/gtk/patches/libnice-0004-Removing-no-op-assignment.patch        2016-10-19 08:18:24 UTC (rev 207531)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+From 6a8c63219c632c27707267b6510dca096c6fd511 Mon Sep 17 00:00:00 2001
+From: Youness Alaoui &lt;kakaroto@kakaroto.homelinux.net&gt;
+Date: Tue, 5 May 2015 15:07:10 -0400
+Subject: [PATCH 4/4] Removing no-op assignment
+
+---
+ agent/agent.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/agent/agent.c b/agent/agent.c
+index 38b679f..84d4093 100644
+--- a/agent/agent.c
++++ b/agent/agent.c
+@@ -3051,7 +3051,6 @@ static gboolean priv_add_remote_candidate (
+           username, password, priority);
+     }
+     /* case 1: an existing candidate, update the attributes */
+-    candidate-&gt;type = type;
+     if (base_addr)
+       candidate-&gt;base_addr = *base_addr;
+     candidate-&gt;priority = priority;
+-- 
+2.3.2 (Apple Git-55)
+
</ins></span></pre>
</div>
</div>

</body>
</html>