Blob Blame Raw
From fefa55ae7f2236264a7578dfd50e9945d5b0b1b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 16 Jun 2016 10:57:32 -0400
Subject: [PATCH 02/30] rtp-tfrc: Fix memset to the right size

This was reported from static analysis by dcb314@hotmail.com

https://bugs.freedesktop.org/show_bug.cgi?id=96546
---
 gst/fsrtpconference/fs-rtp-tfrc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gst/fsrtpconference/fs-rtp-tfrc.c b/gst/fsrtpconference/fs-rtp-tfrc.c
index 11aa6b1b..f1435519 100644
--- a/gst/fsrtpconference/fs-rtp-tfrc.c
+++ b/gst/fsrtpconference/fs-rtp-tfrc.c
@@ -158,7 +158,7 @@ fs_rtp_tfrc_init (FsRtpTfrc *self)
 
   self->extension_type = EXTENSION_NONE;
   self->extension_id = 0;
-  memset (self->pts, 0, 128);
+  memset (self->pts, 0, 128 * sizeof (gboolean));
 
   self->systemclock = gst_system_clock_obtain ();
 }
@@ -1444,7 +1444,7 @@ fs_rtp_tfrc_codecs_updated (FsRtpTfrc *self,
 
   GST_OBJECT_LOCK (self);
 
-  memset (self->pts, 0, 128);
+  memset (self->pts, 0, 128 * sizeof (gboolean));
   for (item = codec_associations; item; item = item->next)
   {
     CodecAssociation *ca = item->data;
-- 
2.21.0

From 482550e7e47cf48dd4bdab3adfe0d1777e20743a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Tue, 21 Jun 2016 15:40:59 -0400
Subject: [PATCH 03/30] Sync with latest common/

---
 common                              |  2 +-
 common-modified/gst-glib-gen.mak    |  6 +--
 common-modified/gtk-doc-plugins.mak | 69 +++++++++++------------------
 common-modified/gtk-doc.mak         | 37 +++++++++++-----
 4 files changed, 54 insertions(+), 60 deletions(-)

diff --git a/common-modified/gst-glib-gen.mak b/common-modified/gst-glib-gen.mak
index 2d29b036..d14f5c64 100644
--- a/common-modified/gst-glib-gen.mak
+++ b/common-modified/gst-glib-gen.mak
@@ -10,16 +10,16 @@ enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
 
 # these are all the rules generating the relevant files
 $(glib_gen_basename)-enumtypes.h: $(glib_enum_headers)
-	$(AM_V_GEN)glib-mkenums \
+	$(AM_V_GEN)$(GLIB_MKENUMS) \
 	--fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
 	--fprod "\n/* enumerations from \"@filename@\" */\n" \
-	--vhead "GType @enum_name@_get_type (void);\n#define FS_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \
+	--vhead "GType @enum_name@_get_type (void);\n#define FS_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n"         \
 	--ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \
 	$^ > $@
 
 $(glib_gen_basename)-enumtypes.c: $(glib_enum_headers)
 	@if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi
-	$(AM_V_GEN)glib-mkenums \
+	$(AM_V_GEN)$(GLIB_MKENUMS) \
 	--fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \
 	--fprod "\n/* enumerations from \"@filename@\" */" \
 	--vhead "GType\n@enum_name@_get_type (void)\n{\n  static volatile gsize g_define_type_id__volatile = 0;\n  if (g_once_init_enter (&g_define_type_id__volatile)) {\n    static const G@Type@Value values[] = {"     \
diff --git a/common-modified/gtk-doc-plugins.mak b/common-modified/gtk-doc-plugins.mak
index 017aedc6..82dbad46 100644
--- a/common-modified/gtk-doc-plugins.mak
+++ b/common-modified/gtk-doc-plugins.mak
@@ -14,10 +14,19 @@ help:
 	@echo
 
 # update the stuff maintained by doc maintainers
-update:
-	$(MAKE) scanobj-update
+update: scanobj-update
 	$(MAKE) check-outdated-docs
 
+if GTK_DOC_USE_LIBTOOL
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN = $(LIBTOOL) --mode=execute
+else
+GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN =
+endif
+
 # We set GPATH here; this gives us semantics for GNU make
 # which are more like other make's VPATH, when it comes to
 # whether a source that is a target of one rule is then
@@ -29,8 +38,7 @@ GPATH = $(srcdir)
 TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@FS_APIVERSION@
 
 MAINTAINER_DOC_STAMPS =			\
-	scanobj-build.stamp		\
-	scanobj-trans-build.stamp
+	scanobj-build.stamp
 
 EXTRA_DIST = 				\
 	$(MAINTAINER_DOC_STAMPS)		\
@@ -47,17 +55,15 @@ EXTRA_DIST = 				\
 # maintainers and result is commited to git
 DOC_STAMPS =				\
 	scan-build.stamp		\
-	tmpl-build.stamp		\
 	sgml-build.stamp		\
 	html-build.stamp		\
 	scan.stamp			\
-	tmpl.stamp			\
 	sgml.stamp			\
 	html.stamp
 
 # files generated/updated by gtkdoc-scangobj
 SCANOBJ_FILES =				\
-	$(DOC_MODULE).args		\
+	$(DOC_MODULE).args              \
 	$(DOC_MODULE).hierarchy         \
 	$(DOC_MODULE).interfaces        \
 	$(DOC_MODULE).prerequisites     \
@@ -97,9 +103,9 @@ all-local: html-build.stamp
 INSPECT_REGISTRY=$(top_builddir)/docs/plugins/inspect-registry.xml
 INSPECT_ENVIRONMENT=\
 	LC_ALL=C \
-	GST_PLUGIN_SYSTEM_PATH= \
-	GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \
-	GST_REGISTRY=$(INSPECT_REGISTRY) \
+	GST_PLUGIN_SYSTEM_PATH_1_0= \
+	GST_PLUGIN_PATH_1_0=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \
+	GST_REGISTRY_1_0=$(INSPECT_REGISTRY) \
 	PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
 	$(INSPECT_EXTRA_ENVIRONMENT)
 
@@ -125,14 +131,14 @@ scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles)
 	    scanobj_options="--verbose"; \
 	fi; \
 	$(INSPECT_ENVIRONMENT) 					\
-	CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)"				\
+	CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)"	\
 	CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS) $(WARNING_CFLAGS)"	\
 	LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)"				\
 	$(GST_DOC_SCANOBJ) $$scanobj_options --type-init-func="gst_init(NULL,NULL)"	\
 	    --module=$(DOC_MODULE) --source=$(PACKAGE) --inspect-dir=$(INSPECT_DIR) &&		\
 	    echo "  DOC   Merging introspection data" && \
 	    $(PYTHON)						\
-	    $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE);	\
+	    $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE) || exit 1;	\
 	if test x"$(srcdir)" != x. ; then				\
 	    for f in $(SCANOBJ_FILES);					\
 	    do								\
@@ -164,34 +170,12 @@ scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp
 	    --ignore-headers="$(IGNORE_HFILES)";			\
 	touch scan-build.stamp
 
-#### update templates; done on every build ####
-
-### FIXME: make this error out again when docs are fixed for 0.9
-# in a non-srcdir build, we need to copy files from the previous step
-# and the files from previous runs of this step
-tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES)
-	@echo '  DOC   Rebuilding template files'
-	@if test x"$(srcdir)" != x. ; then				\
-	    for f in $(SCANOBJ_FILES) $(SCAN_FILES);			\
-	    do								\
-	        if test -e $(srcdir)/$$f; then cp -u $(srcdir)/$$f . ; fi;	\
-	    done;							\
-	fi
-	@gtkdoc-mktmpl --module=$(DOC_MODULE)
-	@$(PYTHON) \
-		$(top_srcdir)/common/mangle-tmpl.py $(srcdir)/$(INSPECT_DIR) tmpl
-	@touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
-	@true
-
 #### xml ####
 
-### FIXME: make this error out again when docs are fixed for 0.9
-sgml-build.stamp: tmpl.stamp scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl $(expand_content_files)
+sgml-build.stamp: scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl $(expand_content_files)
 	@echo '  DOC   Building XML'
 	@-mkdir -p xml
-	@for a in $(srcdir)/$(INSPECT_DIR)/*.xml; do \
+	@for a in $(inspect_files); do \
 	    xsltproc --stringparam module $(MODULE) \
 		$(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done
 	@for f in $(EXAMPLE_CFILES); do \
@@ -204,6 +188,7 @@ sgml-build.stamp: tmpl.stamp scan-build.stamp $(CFILE_GLOB) $(top_srcdir)/common
 		--output-format=xml \
 		--ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \
 		$(MKDB_OPTIONS)
+	@$(PYTHON) $(top_srcdir)/common/mangle-db.py xml
 	@cp ../version.entities xml
 	@touch sgml-build.stamp
 
@@ -227,10 +212,7 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
 	    mkhtml_options="$$mkhtml_options --verbose"; \
 	  fi; \
 	fi; \
-	cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE)
-	@mv html/index.sgml html/index.sgml.bak
-	@$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_API_VERSION@\//g" html/index.sgml.bak >html/index.sgml
-	@rm -f html/index.sgml.bak
+	cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE)-@GST_API_VERSION@ $(DOC_MAIN_SGML_FILE)
 	@rm -f html/$(DOC_MAIN_SGML_FILE)
 	@rm -rf html/xml
 	@rm -f html/version.entities
@@ -253,8 +235,8 @@ clean-local-gtkdoc:
 endif
 
 clean-local: clean-local-gtkdoc
-	rm -f *~ *.bak
-	rm -rf .libs
+	@rm -f *~ *.bak
+	@rm -rf .libs
 
 distclean-local:
 	@rm -f $(REPORT_FILES) \
@@ -299,8 +281,7 @@ install-data-local:
 	            $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \
 	            $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@FS_APIVERSION@.devhelp2; \
 	  fi; \
-	  (which gtkdoc-rebase >/dev/null && \
-	    gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \
+	  $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR) || true ; \
 	fi)
 uninstall-local:
 	if test -d $(DESTDIR)$(TARGET_DIR); then \
diff --git a/common-modified/gtk-doc.mak b/common-modified/gtk-doc.mak
index be81d9b9..37542ec2 100644
--- a/common-modified/gtk-doc.mak
+++ b/common-modified/gtk-doc.mak
@@ -3,7 +3,16 @@
 ###########################################################################
 # thomas: except of course that we did
 
-# thomas: copied from glib-2
+if GTK_DOC_USE_LIBTOOL
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN = $(LIBTOOL) --mode=execute
+else
+GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+GTKDOC_RUN =
+endif
+
 # We set GPATH here; this gives us semantics for GNU make
 # which are more like other make's VPATH, when it comes to
 # whether a source that is a target of one rule is then
@@ -81,17 +90,25 @@ scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
 		--ignore-headers="$(IGNORE_HFILES)"
 	@if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null; then	\
 	    echo "  DOC   Introspecting gobjects"; \
-	    GST_PLUGIN_SYSTEM_PATH=`cd $(top_builddir) && pwd`		\
-	    GST_PLUGIN_PATH=						\
-	    GST_REGISTRY=doc-registry.xml				\
+	    scanobj_options=""; \
+	    gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+	    if test "$$?" = "0"; then \
+	        if test "x$(V)" = "x1"; then \
+	            scanobj_options="--verbose"; \
+	        fi; \
+	    fi; \
+	    GST_PLUGIN_SYSTEM_PATH_1_0=`cd $(top_builddir) && pwd`	\
+	    GST_PLUGIN_PATH_1_0=					\
+	    GST_REGISTRY_1_0=doc-registry.xml				\
 	    $(GTKDOC_EXTRA_ENVIRONMENT)					\
-	    CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)"				\
+	    CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)"	\
 	    CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)"				\
 	    LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)"				\
 	    gtkdoc-scangobj --type-init-func="gst_init(NULL,NULL)"	\
-	        --module=$(DOC_MODULE) ;				\
+	        $$scanobj_options --module=$(DOC_MODULE) ;		\
 	else								\
 	    for i in $(SCANOBJ_FILES) ; do				\
+	       $(MKDIR_P) $(dirname $$i) ;				\
 	       test -f $$i || touch $$i ;				\
 	    done							\
 	fi
@@ -130,10 +147,7 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
 	if test "$(?)" = "0"; then \
 	  mkhtml_options=--path="$(abs_srcdir)"; \
 	fi; \
-	cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
-	@mv html/index.sgml html/index.sgml.bak
-	@$(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_API_VERSION@\//g" html/index.sgml.bak >html/index.sgml
-	@rm -f html/index.sgml.bak
+	cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE)-@GST_API_VERSION@ ../$(DOC_MAIN_SGML_FILE)
 	@rm -rf html/xml
 	@rm -f version.entities
 	@test "x$(HTML_IMAGES)" = "x" ||  ( cd $(srcdir) && cp $(HTML_IMAGES) $(abs_builddir)/html )
@@ -194,8 +208,7 @@ install-data-local:
 	            $(INSTALL_DATA) $(builddir)/html/$(DOC_MODULE).devhelp2 \
 	            $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@FS_APIVERSION@.devhelp2; \
 	  fi; \
-	  (which gtkdoc-rebase >/dev/null && \
-	    gtkdoc-rebase --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR)) || true ; \
+	  $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$(DESTDIR)$(TARGET_DIR) || true ; \
 	fi)
 uninstall-local:
 	if test -d $(DESTDIR)$(TARGET_DIR); then \
-- 
2.21.0

From e5b221d844163f2ba5baedbf63c13d3ef87db388 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Mon, 11 Jul 2016 18:27:59 -0400
Subject: [PATCH 04/30] rtp-codec-specific: Document types better

---
 gst/fsrtpconference/fs-rtp-codec-specific.h | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/gst/fsrtpconference/fs-rtp-codec-specific.h b/gst/fsrtpconference/fs-rtp-codec-specific.h
index e269c083..069f3425 100644
--- a/gst/fsrtpconference/fs-rtp-codec-specific.h
+++ b/gst/fsrtpconference/fs-rtp-codec-specific.h
@@ -34,11 +34,13 @@ G_BEGIN_DECLS
 /*
  * These are the basic types:
  *
- * @FS_PARAM_TYPE_SEND: The parameter define what we are allowed to send
- * @FS_PARAM_TYPE_RECV: The parameter defines what will be received,
+ * @FS_PARAM_TYPE_SEND: The parameter define what we are allowed to send, it
+ *  describes the capabilities of the decoder
+ * @FS_PARAM_TYPE_RECV: The parameter defines what will be received, it
+ *  describes the stream
  * @FS_PARAM_TYPE_CONFIG: The parameter is some configuration that must be
  *  fed to the decoder to be able to decode the stream
- * @FS_PARAM_TYPE_SEND_AVOID_NEGO: The parameter is not negotiated and can
+ * @FS_PARAM_TYPE_SEND_AVOID_NEGO: The send parameter is not negotiated and can
  *  be different on both sides
  * @FS_PARAM_TYPE_MANDATORY: This parameter is mandatory and the codec's
  *  definition is not useful without it.
-- 
2.21.0

From 4c483cb097ab5bf1c6ac51c47e77bbbc12bcf5a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 14 Jul 2016 17:06:27 -0400
Subject: [PATCH 05/30] doc: Put stream message parsers in right section

---
 docs/libs/farstream-libs-sections.txt | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/docs/libs/farstream-libs-sections.txt b/docs/libs/farstream-libs-sections.txt
index e9324ade..f9695dc4 100644
--- a/docs/libs/farstream-libs-sections.txt
+++ b/docs/libs/farstream-libs-sections.txt
@@ -34,6 +34,11 @@ fs_stream_force_remote_candidates
 fs_stream_set_decryption_parameters
 fs_stream_destroy
 fs_stream_iterate_src_pads
+fs_stream_parse_component_state_changed
+fs_stream_parse_local_candidates_prepared
+fs_stream_parse_new_active_candidate_pair
+fs_stream_parse_new_local_candidate
+fs_stream_parse_recv_codecs_changed
 fs_stream_add_id
 fs_stream_emit_error
 fs_stream_emit_src_pad_added
@@ -209,11 +214,6 @@ fs_stream_transmitter_gather_local_candidates
 fs_stream_transmitter_force_remote_candidates
 fs_stream_transmitter_stop
 fs_stream_transmitter_emit_error
-fs_stream_parse_component_state_changed
-fs_stream_parse_local_candidates_prepared
-fs_stream_parse_new_active_candidate_pair
-fs_stream_parse_new_local_candidate
-fs_stream_parse_recv_codecs_changed
 <SUBSECTION Standard>
 FS_IS_STREAM_TRANSMITTER
 FS_IS_STREAM_TRANSMITTER_CLASS
-- 
2.21.0

From d91fc0fb3e57f4231126cd30df44ffaad5ee6ab3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 14 Jul 2016 17:07:00 -0400
Subject: [PATCH 06/30] rtp-codec-specific: Add OPUS non-negotiation

Also include unit test
---
 gst/fsrtpconference/fs-rtp-codec-specific.c |  14 +-
 tests/check/rtp/codecs.c                    | 255 ++++++++++++++++++++
 2 files changed, 268 insertions(+), 1 deletion(-)

diff --git a/gst/fsrtpconference/fs-rtp-codec-specific.c b/gst/fsrtpconference/fs-rtp-codec-specific.c
index 20767d18..55f2172d 100644
--- a/gst/fsrtpconference/fs-rtp-codec-specific.c
+++ b/gst/fsrtpconference/fs-rtp-codec-specific.c
@@ -279,6 +279,19 @@ static const struct SdpNegoFunction sdp_nego_functions[] = {
       {"height", FS_PARAM_TYPE_SEND, param_minimum}
     }
   },
+  /* OPUS: RFC 7687 */
+  {FS_MEDIA_TYPE_AUDIO, "OPUS", sdp_negotiate_codec_default,
+    {
+      {"sprop-maxcapturerate", FS_PARAM_TYPE_CONFIG | FS_PARAM_TYPE_RECV, param_copy},
+      {"sprop-stereo",  FS_PARAM_TYPE_CONFIG | FS_PARAM_TYPE_RECV, param_copy},
+      /* Not sure how to handle those */
+      {"maxplaybackrate", FS_PARAM_TYPE_SEND_AVOID_NEGO, param_copy},
+      {"stereo", FS_PARAM_TYPE_SEND_AVOID_NEGO, param_copy},
+      {"cbr", FS_PARAM_TYPE_SEND_AVOID_NEGO, param_copy},
+      {"useinbandfec", FS_PARAM_TYPE_SEND_AVOID_NEGO, param_copy},
+      {"usedtx", FS_PARAM_TYPE_SEND_AVOID_NEGO, param_copy},
+    }
+  },
   {0, NULL, NULL}
 };
 
@@ -1227,7 +1240,6 @@ param_list_commas (const struct SdpParam *sdp_param,
   return TRUE;
 }
 
-
 /**
  * param_copy:
  *
diff --git a/tests/check/rtp/codecs.c b/tests/check/rtp/codecs.c
index 0bf10336..f512580b 100644
--- a/tests/check/rtp/codecs.c
+++ b/tests/check/rtp/codecs.c
@@ -2173,6 +2173,12 @@ GST_START_TEST (test_rtpcodecs_nego_h264)
   test_one_codec (dat->session, participant, prefcodec, outprefcodec,
       codec, outcodec);
 
+  codec = fs_codec_new (96, "H264", FS_MEDIA_TYPE_VIDEO, 90000);
+  fs_codec_add_optional_parameter (codec, "sprop-init-buf-time", "1");
+  outcodec = fs_codec_new (96, "H264", FS_MEDIA_TYPE_VIDEO, 90000);
+  test_one_codec (dat->session, participant, prefcodec, outprefcodec,
+      codec, outcodec);
+
   /* Now test the minimum_reporting_interval property */
 
   codec = fs_codec_new (96, "H264", FS_MEDIA_TYPE_VIDEO, 90000);
@@ -2209,6 +2215,251 @@ GST_START_TEST (test_rtpcodecs_nego_h264)
 }
 GST_END_TEST;
 
+static gboolean
+check_opus_params (struct SimpleTestConference *dat, const gchar *param,
+    const gchar *value)
+{
+  GList *codecs = NULL, *item;
+  gboolean ret = FALSE;
+
+  g_object_get (dat->session, "codecs", &codecs, NULL);
+
+  for (item = codecs; item; item = item->next)
+  {
+    FsCodec *codec = item->data;
+    if (!g_ascii_strcasecmp ("OPUS", codec->encoding_name)) {
+      if (fs_codec_get_optional_parameter (codec, param, value))
+        ret = TRUE;
+      break;
+    }
+  }
+  fs_codec_list_destroy (codecs);
+
+  return ret;
+}
+
+static void
+opus_src_caps_set_cb (GstPad *pad, GParamSpec *spec, gpointer user_data)
+{
+  GstCaps **desired_src_caps = user_data;
+  GstCaps *current_caps;
+
+  current_caps = gst_pad_get_current_caps (pad);
+
+  if (current_caps) {
+    g_print ("caps: %s\n", gst_caps_to_string (gst_pad_get_current_caps (pad)));
+    g_mutex_lock (&check_mutex);
+    if (*desired_src_caps) {
+      if (gst_caps_can_intersect (current_caps, *desired_src_caps)) {
+        gst_caps_replace (desired_src_caps, 0);
+        g_cond_broadcast (&check_cond);
+      }
+    }
+    g_mutex_unlock (&check_mutex);
+    gst_caps_unref (current_caps);
+  }
+}
+
+static void
+opus_src_pad_added_cb (FsStream *self, GstPad *pad, FsCodec  *codec,
+    gpointer user_data)
+{
+  GstCaps **desired_src_caps = user_data;
+  GstCaps *current_caps;
+
+  current_caps = gst_pad_get_current_caps (pad);
+
+  if (current_caps) {
+    g_print ("caps: %s\n", gst_caps_to_string (gst_pad_get_current_caps (pad)));
+    g_mutex_lock (&check_mutex);
+    if (*desired_src_caps) {
+      if (gst_caps_can_intersect (current_caps, *desired_src_caps)) {
+        gst_caps_replace (desired_src_caps, 0);
+        g_cond_broadcast (&check_cond);
+      }
+    }
+    g_mutex_unlock (&check_mutex);
+    gst_caps_unref (current_caps);
+  } else {
+    g_signal_connect (pad, "notify::caps", G_CALLBACK (opus_src_caps_set_cb),
+        user_data);
+  }
+}
+
+GST_START_TEST (test_rtpcodecs_nego_opus)
+{
+  struct SimpleTestConference *dat = NULL;
+  FsCodec *codec = NULL;
+  FsCodec *outcodec = NULL;
+  FsCodec *prefcodec = NULL;
+  FsCodec *outprefcodec = NULL;
+  FsParticipant *participant;
+  GError *error = NULL;
+  GstCaps *caps;
+  FsStream *stream;
+  GstBus *bus;
+  GstElement *src;
+  GstPad *srcpad, *sinkpad;
+  gboolean done = FALSE;
+  GList *codecs = NULL, *item;
+  GError *gerror = NULL;
+  GstCaps *desired_src_caps = NULL;
+  FsCandidate *rtp_cand = NULL;
+  GstElement *send_pipeline;
+  gchar *tmp;
+
+  setup_codec_tests (&dat, &participant, FS_MEDIA_TYPE_AUDIO);
+
+
+  outprefcodec = fs_codec_new (FS_CODEC_ID_ANY, "OPUS", FS_MEDIA_TYPE_AUDIO,
+      48000);
+  outprefcodec->channels = 2;
+
+  prefcodec = fs_codec_copy (outprefcodec);
+  fs_codec_add_optional_parameter (prefcodec, "farstream-recv-profile",
+      "rtpopusdepay ! identity");
+  fs_codec_add_optional_parameter (prefcodec, "farstream-send-profile",
+      "identity ! rtpopuspay");
+
+  caps = gst_caps_from_string ("audio/x-opus; audio/x-raw");
+  fail_unless (fs_session_set_allowed_caps (dat->session, caps, caps, &error));
+  g_assert_no_error (error);
+  gst_caps_unref (caps);
+
+
+  codec = fs_codec_new (96, "OPUS", FS_MEDIA_TYPE_AUDIO, 48000);
+  outcodec = fs_codec_new (96, "OPUS", FS_MEDIA_TYPE_AUDIO, 48000);
+  outcodec->channels = 2;
+  test_one_codec (dat->session, participant, prefcodec, outprefcodec,
+      codec, outcodec);
+
+  codec = fs_codec_new (96, "OPUS", FS_MEDIA_TYPE_AUDIO, 48000);
+  fs_codec_add_optional_parameter (codec, "sprop-stereo", "1");
+  fs_codec_add_optional_parameter (codec, "stereo", "1");
+  outcodec = fs_codec_new (96, "OPUS", FS_MEDIA_TYPE_AUDIO, 48000);
+  outcodec->channels = 2;
+  test_one_codec (dat->session, participant, prefcodec, outprefcodec,
+      codec, outcodec);
+
+  fs_codec_destroy (outprefcodec);
+  fs_codec_destroy (prefcodec);
+  cleanup_codec_tests (dat, participant);
+
+
+
+  dat = setup_simple_conference (1, "fsrtpconference", "bob@127.0.0.1");
+  participant = fs_conference_new_participant (
+      FS_CONFERENCE (dat->conference), &gerror);
+  g_assert_no_error (gerror);
+
+  stream = fs_session_new_stream (dat->session, participant,
+      FS_DIRECTION_BOTH, &gerror);
+  g_assert_no_error (gerror);
+
+  g_object_get (dat->session, "codecs-without-config", &codecs, NULL);
+  for (item = codecs; item; item = item->next)
+  {
+    FsCodec *codec = item->data;
+    if (!g_ascii_strcasecmp ("OPUS", codec->encoding_name))
+      break;
+
+  }
+  fs_codec_list_destroy (codecs);
+
+  if (!item)
+  {
+    GST_WARNING ("Could not find Opus encoder/decoder/payloader/depayloaders,"
+        " so we are skipping the config-data test");
+    goto out;
+  }
+
+  g_object_set (dat->session, "no-rtcp-timeout", 0, NULL);
+
+  g_object_get (dat->session, "sink-pad", &sinkpad, NULL);
+  src = gst_parse_bin_from_description (
+      "audiotestsrc ! audio/x-raw, rate=16000, channels=1 ! identity", TRUE,
+      &gerror);
+  g_assert_no_error (gerror);
+  g_assert (src);
+  gst_bin_add (GST_BIN (dat->pipeline), src);
+  srcpad = gst_element_get_static_pad (src, "src");
+  g_assert (srcpad);
+  gst_pad_link (srcpad, sinkpad);
+  g_object_unref (sinkpad);
+  g_object_unref (srcpad);
+  gst_element_set_state (dat->pipeline, GST_STATE_PLAYING);
+
+  fs_stream_set_transmitter (stream, "rawudp", NULL, 0, &gerror);
+  g_assert_no_error (gerror);
+
+  desired_src_caps = gst_caps_from_string ("audio/x-raw, clock=rate=24000,"
+      " channels=2");
+
+  g_signal_connect (stream, "src-pad-added", G_CALLBACK (opus_src_pad_added_cb),
+      &desired_src_caps);
+
+  codec = fs_codec_new (96, "OPUS", FS_MEDIA_TYPE_AUDIO, 48000);
+  fs_codec_add_optional_parameter (codec, "sprop-stereo", "1");
+  fs_codec_add_optional_parameter (codec, "sprop-maxcapturerate", "24000");
+  codecs = g_list_append (NULL, codec);
+  fs_stream_set_remote_codecs (stream, codecs, &gerror);
+  fs_codec_list_destroy (codecs);
+  g_assert_no_error (gerror);
+
+  done = check_opus_params (dat, "sprop-maxcapturerate", "16000") &&
+    check_opus_params (dat, "sprop-stereo", "0");
+
+  bus = gst_pipeline_get_bus (GST_PIPELINE (dat->pipeline));
+
+
+  while (!done || rtp_cand == NULL) {
+    GstMessage *msg =  gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
+        GST_MESSAGE_ELEMENT);
+    FsCandidate *cand = NULL;
+
+    g_assert (msg);
+
+    if (fs_session_parse_codecs_changed (dat->session, msg)) {
+      done = check_opus_params (dat, "sprop-maxcapturerate", "16000") &&
+        check_opus_params (dat, "sprop-stereo", "0");
+    } else if (fs_stream_parse_new_local_candidate (stream, msg, &cand)) {
+      if (cand->component_id == 1)
+        rtp_cand = fs_candidate_copy (cand);
+    }
+    gst_message_unref (msg);
+  }
+  gst_object_unref (bus);
+
+  g_assert (check_opus_params (dat, "sprop-maxcapturerate", "16000"));
+  g_assert (check_opus_params (dat, "sprop-stereo", "0"));
+
+  tmp = g_strdup_printf (
+      "audiotestsrc ! opusenc ! rtpopuspay ! udpsink port=%d", rtp_cand->port);
+  send_pipeline = gst_parse_launch (tmp, &gerror);
+  g_assert_no_error (gerror);
+  g_free (tmp);
+
+  fs_candidate_destroy (rtp_cand);
+  gst_element_set_state (send_pipeline, GST_STATE_PLAYING);
+
+  g_mutex_lock (&check_mutex);
+  while (desired_src_caps != NULL)
+    g_cond_wait (&check_cond, &check_mutex);
+  g_mutex_unlock (&check_mutex);
+
+  gst_element_set_state (send_pipeline, GST_STATE_NULL);
+  gst_object_unref (send_pipeline);
+
+  gst_element_set_state (dat->pipeline, GST_STATE_NULL);
+ out:
+
+  fs_stream_destroy (stream);
+  g_object_unref (stream);
+  g_object_unref (participant);
+
+  cleanup_simple_conference (dat);
+}
+GST_END_TEST;
 
 GST_START_TEST (test_rtpcodecs_nego_feedback)
 {
@@ -2564,6 +2815,10 @@ fsrtpcodecs_suite (void)
   tcase_add_test (tc_chain, test_rtpcodecs_nego_h264);
   suite_add_tcase (s, tc_chain);
 
+  tc_chain = tcase_create ("fsrtpcodecs_nego_opus");
+  tcase_add_test (tc_chain, test_rtpcodecs_nego_opus);
+  suite_add_tcase (s, tc_chain);
+
   tc_chain = tcase_create ("fsrtpcodecs_nego_feedback");
   tcase_add_test (tc_chain, test_rtpcodecs_nego_feedback);
   suite_add_tcase (s, tc_chain);
-- 
2.21.0

From 1dcbbb07cbc8c3f05e3c86d21713d1a059eb2486 Mon Sep 17 00:00:00 2001
From: Jeremy Bicha <jbicha@ubuntu.com>
Date: Wed, 17 Aug 2016 02:51:38 -0400
Subject: [PATCH 07/30] Add missing includes to fix docs build

https://bugs.freedesktop.org/97376
---
 docs/plugins/farstream-plugins.types | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/docs/plugins/farstream-plugins.types b/docs/plugins/farstream-plugins.types
index 79a6b2a9..ddacd280 100644
--- a/docs/plugins/farstream-plugins.types
+++ b/docs/plugins/farstream-plugins.types
@@ -1,4 +1,8 @@
 #include <gst/gst.h>
+#include "../../gst/fsrtpconference/fs-rtp-participant.h"
+#include "../../gst/fsrtpconference/fs-rtp-session.h"
+#include "../../gst/fsrtpconference/fs-rtp-stream.h"
+#include "../../gst/fsmsnconference/fs-msn-conference.h"
 fs_rtp_participant_get_type
 fs_rtp_session_get_type
 fs_rtp_stream_get_type
-- 
2.21.0

From 36a64eaa3ad4b40ca4622ea752003b780fc439ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Sun, 18 Dec 2016 11:15:44 -0500
Subject: [PATCH 08/30] docs: Add missing include

Patch from Laurent Bigonville
---
 docs/plugins/farstream-plugins.types | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/plugins/farstream-plugins.types b/docs/plugins/farstream-plugins.types
index ddacd280..892ca678 100644
--- a/docs/plugins/farstream-plugins.types
+++ b/docs/plugins/farstream-plugins.types
@@ -3,6 +3,7 @@
 #include "../../gst/fsrtpconference/fs-rtp-session.h"
 #include "../../gst/fsrtpconference/fs-rtp-stream.h"
 #include "../../gst/fsmsnconference/fs-msn-conference.h"
+#include "../../gst/fsmsnconference/fs-msn-participant.h"
 fs_rtp_participant_get_type
 fs_rtp_session_get_type
 fs_rtp_stream_get_type
-- 
2.21.0

From dd86619a48117049a9aa765bbb4b0d2a3313046e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Sun, 18 Dec 2016 11:17:18 -0500
Subject: [PATCH 09/30] rtp: Switch VP8 to standard encoding name

This has been changed in GStreamer a very long time ago.

Issue reported by Fabrice Bellet

https://bugs.freedesktop.org/show_bug.cgi?id=99122
---
 gst/fsrtpconference/default-codec-preferences | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gst/fsrtpconference/default-codec-preferences b/gst/fsrtpconference/default-codec-preferences
index 95a0a7d6..12745624 100644
--- a/gst/fsrtpconference/default-codec-preferences
+++ b/gst/fsrtpconference/default-codec-preferences
@@ -51,7 +51,7 @@ id=-1
 feedback:nack/pli=
 
 # We like VP8, but H.264 is still better
-[video/VP8-DRAFT-IETF-01]
+[video/VP8]
 
 [video/H263]
 feedback:nack/pli=
-- 
2.21.0

From 433898b123957ae1319da579f356bc1f1c989309 Mon Sep 17 00:00:00 2001
From: Fabrice Bellet <fabrice@bellet.info>
Date: Sun, 11 Dec 2016 19:17:36 +0100
Subject: [PATCH 10/30] nice-stream-transmitter: fix a memory leak

https://bugs.freedesktop.org/show_bug.cgi?id=99123
---
 transmitters/nice/fs-nice-stream-transmitter.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/transmitters/nice/fs-nice-stream-transmitter.c b/transmitters/nice/fs-nice-stream-transmitter.c
index e126d9ae..5dbff443 100644
--- a/transmitters/nice/fs-nice-stream-transmitter.c
+++ b/transmitters/nice/fs-nice-stream-transmitter.c
@@ -1419,10 +1419,12 @@ fs_nice_stream_transmitter_build (FsNiceStreamTransmitter *self,
               self->priv->preferred_local_candidates))
       {
         fs_candidate_list_destroy (prefs);
+        g_free (stun_server);
         break;
       }
       fs_candidate_list_destroy (prefs);
     }
+    g_free (stun_server);
   }
 
 
-- 
2.21.0

From 11dde55cbaf5179e8e1885cf1483e538a8d5a4a9 Mon Sep 17 00:00:00 2001
From: Jakub Adam <jakub.adam@ktknet.cz>
Date: Thu, 14 Apr 2016 15:17:50 +0200
Subject: [PATCH 11/30] rtpbitrateadapter: should make no adaption by default

Description of "bitrate" property says 0 (the default value) means
the element performs no adaption, and so one would assume it would
remain passive until "bitrate" is set to some nonzero value. However,
when "bitrate" is left unset, the adapter instead requests video in tiny
128x96 resolution on its sink pad.

In order for fs_rtp_bitrate_adapter_getcaps() to return peer_caps by
default, the value of FsRtpBitrateAdapter::bitrate has to be initialized
to G_MAXUINT.

Also fix the comments to say that MAXUINT is no adaptation.

https://bugs.freedesktop.org/show_bug.cgi?id=99183
---
 gst/fsrtpconference/fs-rtp-bitrate-adapter.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/gst/fsrtpconference/fs-rtp-bitrate-adapter.c b/gst/fsrtpconference/fs-rtp-bitrate-adapter.c
index e8684fd5..99ea03a0 100644
--- a/gst/fsrtpconference/fs-rtp-bitrate-adapter.c
+++ b/gst/fsrtpconference/fs-rtp-bitrate-adapter.c
@@ -55,6 +55,7 @@ enum
 };
 
 #define PROP_INTERVAL_DEFAULT (10 * GST_SECOND)
+#define PROP_BITRATE_DEFAULT (G_MAXUINT)
 
 static void fs_rtp_bitrate_adapter_finalize (GObject *object);
 static void fs_rtp_bitrate_adapter_set_property (GObject *object,
@@ -105,8 +106,8 @@ fs_rtp_bitrate_adapter_class_init (FsRtpBitrateAdapterClass *klass)
       PROP_BITRATE,
       g_param_spec_uint ("bitrate",
           "Bitrate to adapt for",
-          "The bitrate to adapt for (0 means no adaption)",
-          0, G_MAXUINT, 0,
+          "The bitrate to adapt for (MAXUINT means no adaption)",
+          0, G_MAXUINT, PROP_BITRATE_DEFAULT,
           G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
 
  g_object_class_install_property (gobject_class,
@@ -161,6 +162,7 @@ fs_rtp_bitrate_adapter_init (FsRtpBitrateAdapter *self)
   self->system_clock = gst_system_clock_obtain ();
   self->interval = PROP_INTERVAL_DEFAULT;
 
+  self->bitrate = PROP_BITRATE_DEFAULT;
   self->last_bitrate = G_MAXUINT;
 }
 
-- 
2.21.0

From 182fb0223bee9067cafa00c5c6a56b71e6c892a6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Fri, 24 Jul 2015 19:29:38 -0400
Subject: [PATCH 12/30] Remove MSN plugin

---
 .gitignore                                    |    1 -
 README                                        |    3 -
 configure.ac                                  |    2 -
 docs/plugins/Makefile.am                      |    8 -
 docs/plugins/farstream-plugins-docs.sgml      |    9 -
 docs/plugins/farstream-plugins-sections.txt   |  115 --
 docs/plugins/farstream-plugins.types          |    4 -
 gst/fsmsnconference/Makefile.am               |   66 -
 .../fs-msn-cam-recv-conference.c              |   86 --
 .../fs-msn-cam-recv-conference.h              |   69 -
 .../fs-msn-cam-send-conference.c              |   85 --
 .../fs-msn-cam-send-conference.h              |   69 -
 gst/fsmsnconference/fs-msn-conference.c       |  311 -----
 gst/fsmsnconference/fs-msn-conference.h       |   75 --
 gst/fsmsnconference/fs-msn-connection.c       | 1134 -----------------
 gst/fsmsnconference/fs-msn-connection.h       |   97 --
 gst/fsmsnconference/fs-msn-participant.c      |   65 -
 gst/fsmsnconference/fs-msn-participant.h      |   79 --
 gst/fsmsnconference/fs-msn-session.c          |  544 --------
 gst/fsmsnconference/fs-msn-session.h          |   90 --
 gst/fsmsnconference/fs-msn-stream.c           |  912 -------------
 gst/fsmsnconference/fs-msn-stream.h           |   86 --
 tests/check/Makefile.am                       |    5 -
 tests/check/msn/conference.c                  |  424 ------
 24 files changed, 4339 deletions(-)
 delete mode 100644 gst/fsmsnconference/Makefile.am
 delete mode 100644 gst/fsmsnconference/fs-msn-cam-recv-conference.c
 delete mode 100644 gst/fsmsnconference/fs-msn-cam-recv-conference.h
 delete mode 100644 gst/fsmsnconference/fs-msn-cam-send-conference.c
 delete mode 100644 gst/fsmsnconference/fs-msn-cam-send-conference.h
 delete mode 100644 gst/fsmsnconference/fs-msn-conference.c
 delete mode 100644 gst/fsmsnconference/fs-msn-conference.h
 delete mode 100644 gst/fsmsnconference/fs-msn-connection.c
 delete mode 100644 gst/fsmsnconference/fs-msn-connection.h
 delete mode 100644 gst/fsmsnconference/fs-msn-participant.c
 delete mode 100644 gst/fsmsnconference/fs-msn-participant.h
 delete mode 100644 gst/fsmsnconference/fs-msn-session.c
 delete mode 100644 gst/fsmsnconference/fs-msn-session.h
 delete mode 100644 gst/fsmsnconference/fs-msn-stream.c
 delete mode 100644 gst/fsmsnconference/fs-msn-stream.h
 delete mode 100644 tests/check/msn/conference.c

diff --git a/README b/README
index 55e482cc..cc8efeda 100644
--- a/README
+++ b/README
@@ -29,9 +29,6 @@ Run time for the RTP plugin:
  - gst-plugins-good 1.4.0
  - gst-plugins-bad 1.4.0
 
-Run time for the MSN plugin:
- - gst-plugins-bad 1.4.0
-
 For the GUI example:
  - Gtk 3.0
 
diff --git a/configure.ac b/configure.ac
index 240a4859..38c49807 100644
--- a/configure.ac
+++ b/configure.ac
@@ -113,7 +113,6 @@ dnl these are all the gst plug-ins, compilable without additional libs
 FS_PLUGINS_ALL=" \
 	fsrawconference \
 	fsrtpconference \
-	fsmsnconference \
  	fsvideoanyrate \
  	fsrtpxdata \
 	"
@@ -403,7 +402,6 @@ common-modified/Makefile
 gst/Makefile
 gst/fsrawconference/Makefile
 gst/fsrtpconference/Makefile
-gst/fsmsnconference/Makefile
 gst/fsvideoanyrate/Makefile
 gst/fsrtpxdata/Makefile
 farstream/Makefile
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index da8678ff..7b4913fb 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -60,7 +60,6 @@ SCANOBJ_DEPS = \
 	$(top_builddir)/transmitters/nice/libnice-transmitter.la \
 	$(top_builddir)/transmitters/shm/libshm-transmitter.la \
 	$(top_builddir)/gst/fsrtpconference/libfsrtpconference_doc.la \
-	$(top_builddir)/gst/fsmsnconference/libfsmsnconference_doc.la \
 	$(top_builddir)/gst/fsrawconference/libfsrawconference_doc.la \
 	$(top_builddir)/gst/fsvideoanyrate/libfsvideoanyrate.la \
 	$(top_builddir)/gst/fsrtpxdata/libfsrtpxdata.la
@@ -89,12 +88,6 @@ EXTRA_HFILES = \
 	$(top_srcdir)/gst/fsrawconference/fs-raw-session.h \
 	$(top_srcdir)/gst/fsrawconference/fs-raw-stream.h \
 	$(top_srcdir)/gst/fsrawconference/fs-raw-participant.h \
-	$(top_srcdir)/gst/fsmsnconference/fs-msn-cam-recv-conference.h \
-	$(top_srcdir)/gst/fsmsnconference/fs-msn-cam-send-conference.h \
-	$(top_srcdir)/gst/fsmsnconference/fs-msn-conference.h \
-	$(top_srcdir)/gst/fsmsnconference/fs-msn-session.h \
-	$(top_srcdir)/gst/fsmsnconference/fs-msn-stream.h \
-	$(top_srcdir)/gst/fsmsnconference/fs-msn-participant.h \
 	$(top_srcdir)/transmitters/rawudp/fs-rawudp-transmitter.h \
 	$(top_srcdir)/transmitters/rawudp/fs-rawudp-stream-transmitter.h \
 	$(top_srcdir)/transmitters/multicast/fs-multicast-transmitter.h \
@@ -130,7 +123,6 @@ GTKDOC_LIBS = \
 	$(top_builddir)/farstream/libfarstream-@FS_APIVERSION@.la \
 	$(top_builddir)/gst/fsrtpconference/libfsrtpconference_doc.la \
 	$(top_builddir)/gst/fsrawconference/libfsrawconference_doc.la \
-	$(top_builddir)/gst/fsmsnconference/libfsmsnconference_doc.la \
 	$(GST_BASE_LIBS) 
 
 GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
diff --git a/docs/plugins/farstream-plugins-docs.sgml b/docs/plugins/farstream-plugins-docs.sgml
index 1a7a365e..b5572a4d 100644
--- a/docs/plugins/farstream-plugins-docs.sgml
+++ b/docs/plugins/farstream-plugins-docs.sgml
@@ -33,15 +33,6 @@
       <xi:include href="xml/fs-raw-session.xml"/>
       <xi:include href="xml/fs-raw-stream.xml"/>
     </chapter>
-    <chapter>
-      <title>MSN Webcam plugin</title>
-      <xi:include href="xml/element-fsmsncamsendconference.xml"/>
-      <xi:include href="xml/element-fsmsncamrecvconference.xml"/>
-      <xi:include href="xml/fs-msn-conference.xml"/>
-      <xi:include href="xml/fs-msn-participant.xml"/>
-      <xi:include href="xml/fs-msn-session.xml"/>
-      <xi:include href="xml/fs-msn-stream.xml"/>
-    </chapter>
   </part>
 
   <part>
diff --git a/docs/plugins/farstream-plugins-sections.txt b/docs/plugins/farstream-plugins-sections.txt
index c4eef75b..095d1b2a 100644
--- a/docs/plugins/farstream-plugins-sections.txt
+++ b/docs/plugins/farstream-plugins-sections.txt
@@ -331,121 +331,6 @@ FS_SHM_STREAM_TRANSMITTER_GET_CLASS
 </SECTION>
 
 
-<SECTION>
-<FILE>fs-msn-conference</FILE>
-<TITLE>FsMsnConference</TITLE>
-FsMsnConference
-<SUBSECTION Standard>
-FS_MSN_CONFERENCE_CAST
-FsMsnConferencePrivate
-FsMsnConferenceClass
-FS_MSN_CONFERENCE
-FS_IS_MSN_CONFERENCE
-FS_TYPE_MSN_CONFERENCE
-fs_msn_conference_get_type
-FS_MSN_CONFERENCE_CLASS
-FS_IS_MSN_CONFERENCE_CLASS
-FS_MSN_CONFERENCE_GET_CLASS
-</SECTION>
-
-
-<SECTION>
-<FILE>fs-msn-session</FILE>
-<TITLE>FsMsnSession</TITLE>
-FsMsnSession
-<SUBSECTION Standard>
-FS_IS_MSN_SESSION
-FS_IS_MSN_SESSION_CLASS
-FS_MSN_SESSION
-FS_MSN_SESSION_CAST
-FS_MSN_SESSION_CLASS
-FS_MSN_SESSION_GET_CLASS
-FS_TYPE_MSN_SESSION
-FsMsnSessionClass
-FsMsnSessionPrivate
-fs_msn_session_get_type
-<SUBSECTION Private>
-fs_msn_session_new
-fs_msn_session_new_recv_pad
-connection
-</SECTION>
-
-
-<SECTION>
-<FILE>fs-msn-stream</FILE>
-<TITLE>FsMsnStream</TITLE>
-FsMsnStream
-<SUBSECTION Standard>
-FS_IS_MSN_STREAM
-FS_IS_MSN_STREAM_CLASS
-FS_MSN_STREAM
-FS_MSN_STREAM_CAST
-FS_MSN_STREAM_CLASS
-FS_MSN_STREAM_GET_CLASS
-FS_TYPE_MSN_STREAM
-FsMsnStreamClass
-FsMsnStreamPrivate
-fs_msn_stream_get_type
-<SUBSECTION Private>
-fs_msn_stream_new
-fs_msn_stream_set_tos_locked
-</SECTION>
-
-
-<SECTION>
-<FILE>fs-msn-participant</FILE>
-<TITLE>FsMsnParticipant</TITLE>
-FsMsnParticipant
-<SUBSECTION Standard>
-FS_IS_MSN_PARTICIPANT
-FS_IS_MSN_PARTICIPANT_CLASS
-FS_MSN_PARTICIPANT
-FS_MSN_PARTICIPANT_CAST
-FS_MSN_PARTICIPANT_CLASS
-FS_MSN_PARTICIPANT_GET_CLASS
-FS_TYPE_MSN_PARTICIPANT
-FsMsnParticipantClass
-FsMsnParticipantPrivate
-fs_msn_participant_get_type
-<SUBSECTION Private>
-fs_msn_participant_new
-</SECTION>
-
-<SECTION>
-<FILE>element-fsmsncamrecvconference</FILE>
-<TITLE>FsMsnCamCamRecvConference</TITLE>
-FsMsnCamRecvConference
-<SUBSECTION Private>
-FS_IS_MSN_CAM_RECV_CONFERENCE
-FS_IS_MSN_CAM_RECV_CONFERENCE_CLASS
-FS_MSN_CAM_RECV_CONFERENCE
-FS_MSN_CAM_RECV_CONFERENCE_CAST
-FS_MSN_CAM_RECV_CONFERENCE_CLASS
-FS_MSN_CAM_RECV_CONFERENCE_GET_CLASS
-FS_TYPE_MSN_CAM_RECV_CONFERENCE
-FsMsnCamRecvConferenceClass
-FsMsnCamRecvConferencePrivate
-fs_msn_cam_recv_conference_get_type
-</SECTION>
-
-<SECTION>
-<FILE>element-fsmsncamsendconference</FILE>
-<TITLE>FsMsnCamSendConference</TITLE>
-FsMsnCamSendConference
-<SUBSECTION Private>
-FS_IS_MSN_CAM_SEND_CONFERENCE
-FS_IS_MSN_CAM_SEND_CONFERENCE_CLASS
-FS_MSN_CAM_SEND_CONFERENCE
-FS_MSN_CAM_SEND_CONFERENCE_CAST
-FS_MSN_CAM_SEND_CONFERENCE_CLASS
-FS_MSN_CAM_SEND_CONFERENCE_GET_CLASS
-FS_TYPE_MSN_CAM_SEND_CONFERENCE
-FsMsnCamSendConferenceClass
-FsMsnCamSendConferencePrivate
-fs_msn_cam_send_conference_get_type
-</SECTION>
-
-
 <SECTION>
 <FILE>element-fsrawconference</FILE>
 <TITLE>FsRawConference</TITLE>
diff --git a/docs/plugins/farstream-plugins.types b/docs/plugins/farstream-plugins.types
index 892ca678..4dbbef27 100644
--- a/docs/plugins/farstream-plugins.types
+++ b/docs/plugins/farstream-plugins.types
@@ -2,10 +2,6 @@
 #include "../../gst/fsrtpconference/fs-rtp-participant.h"
 #include "../../gst/fsrtpconference/fs-rtp-session.h"
 #include "../../gst/fsrtpconference/fs-rtp-stream.h"
-#include "../../gst/fsmsnconference/fs-msn-conference.h"
-#include "../../gst/fsmsnconference/fs-msn-participant.h"
 fs_rtp_participant_get_type
 fs_rtp_session_get_type
 fs_rtp_stream_get_type
-fs_msn_conference_get_type
-fs_msn_participant_get_type
diff --git a/gst/fsmsnconference/Makefile.am b/gst/fsmsnconference/Makefile.am
deleted file mode 100644
index 3faa34d8..00000000
--- a/gst/fsmsnconference/Makefile.am
+++ /dev/null
@@ -1,66 +0,0 @@
-plugin_LTLIBRARIES = libfsmsnconference.la
-
-
-# First build a convenience lib with the common stuff so its not built twice
-
-noinst_LTLIBRARIES = libfsmsnconference-convenience.la
-
-libfsmsnconference_convenience_la_SOURCES = \
-	fs-msn-cam-recv-conference.c \
-	fs-msn-cam-send-conference.c \
-	fs-msn-participant.c \
-	fs-msn-session.c \
-	fs-msn-connection.c \
-	fs-msn-stream.c 
-
-noinst_HEADERS = \
-	fs-msn-cam-recv-conference.h \
-	fs-msn-cam-send-conference.h \
-	fs-msn-conference.h \
-	fs-msn-participant.h \
-	fs-msn-session.h \
-	fs-msn-connection.h  \
-	fs-msn-stream.h 
-
-
-AM_CFLAGS = \
-	$(FS_INTERNAL_CFLAGS) \
-	$(FS_CFLAGS) \
-	$(GST_PLUGINS_BASE_CFLAGS) \
-	$(GST_CFLAGS) \
-	$(NICE_CFLAGS) 
-
-# Build the main plugin
-
-libfsmsnconference_la_SOURCES = \
-	fs-msn-conference.c
-
-libfsmsnconference_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libfsmsnconference_la_LIBTOOLFLAGS = $(PLUGIN_LIBTOOLFLAGS)
-libfsmsnconference_la_LIBADD = \
-	libfsmsnconference-convenience.la \
-	$(top_builddir)/farstream/libfarstream-@FS_APIVERSION@.la \
-	$(FS_LIBS) \
-	$(GST_BASE_LIBS) \
-	$(GST_LIBS) \
-	$(NICE_LIBS)
-
-
-
-# Optionally build a library to allow building the gtk-doc
-
-if ENABLE_GTK_DOC
-noinst_LTLIBRARIES += libfsmsnconference_doc.la
-
-nodist_libfsmsnconference_doc_la_CFLAGS = -DBUILD_GTK_DOC
-
-nodist_libfsmsnconference_doc_la_SOURCES = $(libfsmsnconference_la_SOURCES)
-
-
-libfsmsnconference_doc_la_LIBADD = libfsmsnconference-convenience.la \
-	$(libfsmsnconference_la_LIBADD)
-
-CLEANFILES = $(BUILT_SOURCES)
-
-endif
-
diff --git a/gst/fsmsnconference/fs-msn-cam-recv-conference.c b/gst/fsmsnconference/fs-msn-cam-recv-conference.c
deleted file mode 100644
index 462bc4dc..00000000
--- a/gst/fsmsnconference/fs-msn-cam-recv-conference.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Farstream - Farstream MSN Conference Implementation
- *
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-recv-conference.c - MSN implementation for Farstream Conference
- *   Gstreamer Elements
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-/**
- * SECTION:element-fsmsncamrecvconference
- * @short_description: Farstream MSN Receive Conference Gstreamer Element
- *
- * This element implements the unidirection webcam feature found in various
- * version of MSN Messenger (tm) and Windows Live Messenger (tm). This is
- * to receive someone else's webcam.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-cam-recv-conference.h"
-
-#include "fs-msn-conference.h"
-#include "fs-msn-session.h"
-#include "fs-msn-stream.h"
-#include "fs-msn-participant.h"
-
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-
-G_DEFINE_TYPE (FsMsnCamRecvConference, fs_msn_cam_recv_conference,
-    FS_TYPE_MSN_CONFERENCE);
-
-
-static void
-fs_msn_cam_recv_conference_class_init (FsMsnCamRecvConferenceClass * klass)
-{
-  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-
-  gst_element_class_set_metadata (gstelement_class,
-      "Farstream MSN Reception Conference",
-      "Generic/Bin/MSN",
-      "A Farstream MSN Reception Conference",
-      "Richard Spiers <richard.spiers@gmail.com>, "
-      "Youness Alaoui <youness.alaoui@collabora.com>, "
-      "Olivier Crete <olivier.crete@collabora.com>");
-}
-
-static void
-fs_msn_cam_recv_conference_init (FsMsnCamRecvConference *self)
-{
-  FsMsnConference *conf = FS_MSN_CONFERENCE (self);
-  GstElementFactory *fact = NULL;
-
-  GST_DEBUG_OBJECT (conf, "fs_msn_cam_recv_conference_init");
-
-  conf->max_direction = FS_DIRECTION_RECV;
-
-  fact = gst_element_factory_find ("mimenc");
-  if (fact)
-    gst_object_unref (fact);
-  else
-    g_set_error (&conf->missing_element_error,
-        FS_ERROR, FS_ERROR_CONSTRUCTION,
-        "mimenc missing");
-}
-
diff --git a/gst/fsmsnconference/fs-msn-cam-recv-conference.h b/gst/fsmsnconference/fs-msn-cam-recv-conference.h
deleted file mode 100644
index dcd43547..00000000
--- a/gst/fsmsnconference/fs-msn-cam-recv-conference.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Farstream - Farstream MSN Conference Implementation
- *
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-recv-conference.h - MSN implementation for Farstream Conference
- * Gstreamer Elements
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_CAM_RECV_CONFERENCE_H__
-#define __FS_MSN_CAM_RECV_CONFERENCE_H__
-
-#include "fs-msn-conference.h"
-
-G_BEGIN_DECLS
-
-#define FS_TYPE_MSN_CAM_RECV_CONFERENCE (fs_msn_cam_recv_conference_get_type ())
-#define FS_MSN_CAM_RECV_CONFERENCE(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), FS_TYPE_MSN_CAM_RECV_CONFERENCE, \
-      FsMsnCamRecvConference))
-#define FS_MSN_CAM_RECV_CONFERENCE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), FS_TYPE_MSN_CAM_RECV_CONFERENCE, \
-      FsMsnCamRecvConferenceClass))
-#define FS_MSN_CAM_RECV_CONFERENCE_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS((obj), FS_TYPE_MSN_CAM_RECV_CONFERENCE, \
-      FsMsnCamRecvConferenceClass))
-#define FS_IS_MSN_CAM_RECV_CONFERENCE(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FS_TYPE_MSN_CAM_RECV_CONFERENCE))
-#define FS_IS_MSN_CAM_RECV_CONFERENCE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), FS_TYPE_MSN_CAM_RECV_CONFERENCE))
-#define FS_MSN_CAM_RECV_CONFERENCE_CAST(obj) \
-  ((FsMsnCamRecvConference *)(obj))
-
-typedef struct _FsMsnCamRecvConference FsMsnCamRecvConference;
-typedef struct _FsMsnCamRecvConferenceClass FsMsnCamRecvConferenceClass;
-typedef struct _FsMsnCamRecvConferencePrivate FsMsnCamRecvConferencePrivate;
-
-struct _FsMsnCamRecvConference
-{
-  FsMsnConference parent;
-};
-
-struct _FsMsnCamRecvConferenceClass
-{
-  FsMsnConferenceClass parent_class;
-};
-
-GType fs_msn_cam_recv_conference_get_type (void);
-
-
-G_END_DECLS
-
-#endif /* __FS_MSN_CAM_RECV_CONFERENCE_H__ */
diff --git a/gst/fsmsnconference/fs-msn-cam-send-conference.c b/gst/fsmsnconference/fs-msn-cam-send-conference.c
deleted file mode 100644
index 12d3ec70..00000000
--- a/gst/fsmsnconference/fs-msn-cam-send-conference.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Farstream - Farstream MSN Conference Implementation
- *
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-send-conference.c - MSN implementation for Farstream Conference
- *   Gstreamer Elements
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-/**
- * SECTION:element-fsmsncamsendconference
- * @short_description: Farstream MSN send Conference Gstreamer Element
- *
- * This element implements the unidirection webcam feature found in various
- * version of MSN Messenger (tm) and Windows Live Messenger (tm). This is
- * to send the local webcam's video to someone else.
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-cam-send-conference.h"
-
-#include "fs-msn-conference.h"
-#include "fs-msn-session.h"
-#include "fs-msn-stream.h"
-#include "fs-msn-participant.h"
-
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-
-G_DEFINE_TYPE (FsMsnCamSendConference, fs_msn_cam_send_conference,
-    FS_TYPE_MSN_CONFERENCE);
-
-static void
-fs_msn_cam_send_conference_class_init (FsMsnCamSendConferenceClass * klass)
-{
-  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-
-  gst_element_class_set_metadata (gstelement_class,
-      "Farstream MSN Sending Conference",
-      "Generic/Bin/MSN",
-      "A Farstream MSN Sending Conference",
-      "Richard Spiers <richard.spiers@gmail.com>, "
-      "Youness Alaoui <youness.alaoui@collabora.co.uk>, "
-      "Olivier Crete <olivier.crete@collabora.co.uk>");
-}
-
-static void
-fs_msn_cam_send_conference_init (FsMsnCamSendConference *self)
-{
-  FsMsnConference *conf = FS_MSN_CONFERENCE (self);
-  GstElementFactory *fact = NULL;
-
-  GST_DEBUG_OBJECT (conf, "fs_msn_cam_send_conference_init");
-
-  conf->max_direction = FS_DIRECTION_SEND;
-
-  fact = gst_element_factory_find ("mimenc");
-  if (fact)
-    gst_object_unref (fact);
-  else
-    g_set_error (&conf->missing_element_error,
-        FS_ERROR, FS_ERROR_CONSTRUCTION,
-        "mimenc missing");
-}
-
diff --git a/gst/fsmsnconference/fs-msn-cam-send-conference.h b/gst/fsmsnconference/fs-msn-cam-send-conference.h
deleted file mode 100644
index 2c8897ea..00000000
--- a/gst/fsmsnconference/fs-msn-cam-send-conference.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Farstream - Farstream MSN Conference Implementation
- *
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-send-conference.h - MSN implementation for Farstream Conference
- * Gstreamer Elements
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_CAM_SEND_CONFERENCE_H__
-#define __FS_MSN_CAM_SEND_CONFERENCE_H__
-
-#include "fs-msn-conference.h"
-
-G_BEGIN_DECLS
-
-#define FS_TYPE_MSN_CAM_SEND_CONFERENCE (fs_msn_cam_send_conference_get_type ())
-#define FS_MSN_CAM_SEND_CONFERENCE(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), FS_TYPE_MSN_CAM_SEND_CONFERENCE, \
-      FsMsnCamSendConference))
-#define FS_MSN_CAM_SEND_CONFERENCE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), FS_TYPE_MSN_CAM_SEND_CONFERENCE, \
-      FsMsnCamSendConferenceClass))
-#define FS_MSN_CAM_SEND_CONFERENCE_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS((obj), FS_TYPE_MSN_CAM_SEND_CONFERENCE, \
-      FsMsnCamSendConferenceClass))
-#define FS_IS_MSN_CAM_SEND_CONFERENCE(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FS_TYPE_MSN_CAM_SEND_CONFERENCE))
-#define FS_IS_MSN_CAM_SEND_CONFERENCE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), FS_TYPE_MSN_CAM_SEND_CONFERENCE))
-#define FS_MSN_CAM_SEND_CONFERENCE_CAST(obj) \
-  ((FsMsnCamSendConference *)(obj))
-
-typedef struct _FsMsnCamSendConference FsMsnCamSendConference;
-typedef struct _FsMsnCamSendConferenceClass FsMsnCamSendConferenceClass;
-typedef struct _FsMsnCamSendConferencePrivate FsMsnCamSendConferencePrivate;
-
-struct _FsMsnCamSendConference
-{
-  FsMsnConference parent;
-};
-
-struct _FsMsnCamSendConferenceClass
-{
-  FsMsnConferenceClass parent_class;
-};
-
-GType fs_msn_cam_send_conference_get_type (void);
-
-
-G_END_DECLS
-
-#endif /* __FS_MSN_CAM_SEND_CONFERENCE_H__ */
diff --git a/gst/fsmsnconference/fs-msn-conference.c b/gst/fsmsnconference/fs-msn-conference.c
deleted file mode 100644
index ab79674b..00000000
--- a/gst/fsmsnconference/fs-msn-conference.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Farstream - Farstream MSN Conference Implementation
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-conference.c - MSN implementation for Farstream Conference Gstreamer
- *                       Elements
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-/**
- * SECTION:fs-msn-conference
- * @short_description: Farstream MSN Conference Gstreamer Elements Base class
- *
- * This element implements the unidirection webcam feature found in various
- * version of MSN Messenger (tm) and Windows Live Messenger (tm).
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-
-#include "fs-msn-conference.h"
-
-#include "fs-msn-session.h"
-#include "fs-msn-stream.h"
-#include "fs-msn-participant.h"
-
-#include "fs-msn-cam-send-conference.h"
-#include "fs-msn-cam-recv-conference.h"
-
-GST_DEBUG_CATEGORY (fsmsnconference_debug);
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-/* Signals */
-enum
-{
-  LAST_SIGNAL
-};
-
-/* Properties */
-enum
-{
-  PROP_0
-};
-
-
-static GstStaticPadTemplate fs_msn_conference_sink_template =
-  GST_STATIC_PAD_TEMPLATE ("sink_%d",
-      GST_PAD_SINK,
-      GST_PAD_SOMETIMES,
-      GST_STATIC_CAPS_ANY);
-
-static GstStaticPadTemplate fs_msn_conference_src_template =
-  GST_STATIC_PAD_TEMPLATE ("src_%d_%d_%d",
-      GST_PAD_SRC,
-      GST_PAD_SOMETIMES,
-      GST_STATIC_CAPS_ANY);
-
-#define FS_MSN_CONFERENCE_GET_PRIVATE(obj) \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((obj), FS_TYPE_MSN_CONFERENCE,  \
-      FsMsnConferencePrivate))
-
-struct _FsMsnConferencePrivate
-{
-  gboolean disposed;
-  /* Protected by GST_OBJECT_LOCK */
-  FsMsnParticipant *participant;
-  FsMsnSession *session;
-};
-
-G_DEFINE_ABSTRACT_TYPE (FsMsnConference, fs_msn_conference,
-    FS_TYPE_CONFERENCE);
-
-static FsSession *fs_msn_conference_new_session (FsConference *conf,
-    FsMediaType media_type,
-    GError **error);
-
-static FsParticipant *fs_msn_conference_new_participant (FsConference *conf,
-    GError **error);
-
-static void _remove_session (gpointer user_data,
-    GObject *where_the_object_was);
-static void _remove_participant (gpointer user_data,
-    GObject *where_the_object_was);
-
-static void
-fs_msn_conference_dispose (GObject * object)
-{
-  FsMsnConference *self = FS_MSN_CONFERENCE (object);
-
-  if (self->priv->disposed)
-    return;
-
-  GST_OBJECT_LOCK (object);
-  if (self->priv->session)
-    g_object_weak_unref (G_OBJECT (self->priv->session), _remove_session, self);
-  self->priv->session = NULL;
-
-  if (self->priv->participant)
-    g_object_weak_unref (G_OBJECT (self->priv->participant),
-        _remove_participant, self);
-  self->priv->participant = NULL;
-  GST_OBJECT_UNLOCK (object);
-
-  self->priv->disposed = TRUE;
-
-  g_clear_error (&self->missing_element_error);
-
-  G_OBJECT_CLASS (fs_msn_conference_parent_class)->dispose (object);
-}
-
-static void
-fs_msn_conference_class_init (FsMsnConferenceClass * klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-  FsConferenceClass *baseconf_class = FS_CONFERENCE_CLASS (klass);
-
-  g_type_class_add_private (klass, sizeof (FsMsnConferencePrivate));
-
-  GST_DEBUG_CATEGORY_INIT (fsmsnconference_debug, "fsmsnconference", 0,
-                           "Farstream MSN Conference Element");
-
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_static_pad_template_get (&fs_msn_conference_sink_template));
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_static_pad_template_get (&fs_msn_conference_src_template));
-
-  baseconf_class->new_session =
-    GST_DEBUG_FUNCPTR (fs_msn_conference_new_session);
-  baseconf_class->new_participant =
-    GST_DEBUG_FUNCPTR (fs_msn_conference_new_participant);
-
-  gobject_class->dispose = GST_DEBUG_FUNCPTR (fs_msn_conference_dispose);
-}
-
-
-static void
-fs_msn_conference_init (FsMsnConference *conf)
-{
-  GST_DEBUG_OBJECT (conf, "fs_msn_conference_init");
-
-  conf->priv = FS_MSN_CONFERENCE_GET_PRIVATE (conf);
-}
-
-static void
-_remove_session (gpointer user_data,
-                 GObject *where_the_object_was)
-{
-  FsMsnConference *self = FS_MSN_CONFERENCE (user_data);
-
-  GST_OBJECT_LOCK (self);
-  if (self->priv->session == (FsMsnSession *) where_the_object_was)
-    self->priv->session = NULL;
-  GST_OBJECT_UNLOCK (self);
-}
-
-static void
-_remove_participant (gpointer user_data,
-                     GObject *where_the_object_was)
-{
-  FsMsnConference *self = FS_MSN_CONFERENCE (user_data);
-
-  GST_OBJECT_LOCK (self);
-  if (self->priv->participant == (FsMsnParticipant *) where_the_object_was)
-    self->priv->participant = NULL;
-  GST_OBJECT_UNLOCK (self);
-}
-
-
-static FsSession *
-fs_msn_conference_new_session (FsConference *conf,
-                               FsMediaType media_type,
-                               GError **error)
-{
-  FsMsnConference *self = FS_MSN_CONFERENCE (conf);
-  FsMsnSession *new_session = NULL;
-
-  if (self->missing_element_error)
-  {
-    if (error)
-      *error = g_error_copy (self->missing_element_error);
-    return NULL;
-  }
-
-  if (media_type != FS_MEDIA_TYPE_VIDEO)
-  {
-    g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-        "Only video supported for msn webcam");
-    return NULL;
-  }
-
-  GST_OBJECT_LOCK (self);
-  if (self->priv->session)
-  {
-    GST_OBJECT_UNLOCK (self);
-    g_set_error (error, FS_ERROR, FS_ERROR_ALREADY_EXISTS,
-        "There already is a session");
-    return NULL;
-  }
-
-  GST_OBJECT_UNLOCK (self);
-
-  new_session = fs_msn_session_new (media_type, self, error);
-
-  if (new_session)
-  {
-    GST_OBJECT_LOCK (self);
-    self->priv->session = new_session;
-    g_object_weak_ref (G_OBJECT (new_session), _remove_session, self);
-    GST_OBJECT_UNLOCK (self);
-  }
-
-  return FS_SESSION (new_session);
-}
-
-
-static FsParticipant *
-fs_msn_conference_new_participant (FsConference *conf,
-                                   GError **error)
-{
-  FsMsnConference *self = FS_MSN_CONFERENCE (conf);
-  FsMsnParticipant *new_participant = NULL;
-
-  if (self->missing_element_error)
-  {
-    if (error)
-      *error = g_error_copy (self->missing_element_error);
-    return NULL;
-  }
-
-  GST_OBJECT_LOCK (self);
-  if (self->priv->participant)
-  {
-    GST_OBJECT_UNLOCK (self);
-    g_set_error (error, FS_ERROR, FS_ERROR_ALREADY_EXISTS,
-        "There already is a participant");
-    return NULL;
-  }
-
-  GST_OBJECT_UNLOCK (self);
-
-  new_participant = fs_msn_participant_new ();
-
-  if (new_participant)
-  {
-    GST_OBJECT_LOCK (self);
-    self->priv->participant = new_participant;
-    g_object_weak_ref (G_OBJECT (new_participant), _remove_participant, self);
-    GST_OBJECT_UNLOCK (self);
-  }
-
-  return FS_PARTICIPANT (new_participant);
-
-}
-
-
-static gboolean plugin_init (GstPlugin * plugin)
-{
-  return gst_element_register (plugin, "fsmsncamsendconference",
-      GST_RANK_NONE, FS_TYPE_MSN_CAM_SEND_CONFERENCE) &&
-    gst_element_register (plugin, "fsmsncamrecvconference",
-        GST_RANK_NONE, FS_TYPE_MSN_CAM_RECV_CONFERENCE);
-}
-
-
-
-#ifdef BUILD_GTK_DOC
-void
-fs_msn_plugin_init_real (void)
-{
-  gst_plugin_register_static (
-#else
-GST_PLUGIN_DEFINE (
-#endif
-  GST_VERSION_MAJOR,
-  GST_VERSION_MINOR,
-  fsmsnconference,
-  "Farstream MSN Conference plugin",
-  plugin_init,
-  VERSION,
-  "LGPL",
-  "Farstream",
-  "http://www.freedesktop.org/wiki/Software/Farstream"
-#ifdef BUILD_GTK_DOC
-  );
-}
-#else
-)
-#endif
-
diff --git a/gst/fsmsnconference/fs-msn-conference.h b/gst/fsmsnconference/fs-msn-conference.h
deleted file mode 100644
index 9e1afc51..00000000
--- a/gst/fsmsnconference/fs-msn-conference.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Farstream - Farstream MSN Conference Implementation
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * gstfsmsnconference.h - MSN implementation for Farstream Conference Gstreamer
- *                        Elements
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_CONFERENCE_H__
-#define __FS_MSN_CONFERENCE_H__
-
-#include <farstream/fs-conference.h>
-
-G_BEGIN_DECLS
-
-#define FS_TYPE_MSN_CONFERENCE \
-  (fs_msn_conference_get_type ())
-#define FS_MSN_CONFERENCE(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj),FS_TYPE_MSN_CONFERENCE,FsMsnConference))
-#define FS_MSN_CONFERENCE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass),FS_TYPE_MSN_CONFERENCE,FsMsnConferenceClass))
-#define FS_MSN_CONFERENCE_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS((obj),FS_TYPE_MSN_CONFERENCE,FsMsnConferenceClass))
-#define FS_IS_MSN_CONFERENCE(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj),FS_TYPE_MSN_CONFERENCE))
-#define FS_IS_MSN_CONFERENCE_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass),FS_TYPE_MSN_CONFERENCE))
-#define FS_MSN_CONFERENCE_CAST(obj) \
-  ((FsMsnConference *)(obj))
-
-typedef struct _FsMsnConference FsMsnConference;
-typedef struct _FsMsnConferenceClass FsMsnConferenceClass;
-typedef struct _FsMsnConferencePrivate FsMsnConferencePrivate;
-
-struct _FsMsnConference
-{
-  FsConference parent;
-  FsMsnConferencePrivate *priv;
-
-  FsStreamDirection max_direction;
-
-  GError *missing_element_error;
-};
-
-struct _FsMsnConferenceClass
-{
-  FsConferenceClass parent_class;
-};
-
-GType fs_msn_conference_get_type (void);
-
-
-GST_DEBUG_CATEGORY_EXTERN (fsmsnconference_debug);
-
-G_END_DECLS
-
-#endif /* __FS_MSN_CONFERENCE_H__ */
diff --git a/gst/fsmsnconference/fs-msn-connection.c b/gst/fsmsnconference/fs-msn-connection.c
deleted file mode 100644
index 0acf8c33..00000000
--- a/gst/fsmsnconference/fs-msn-connection.c
+++ /dev/null
@@ -1,1134 +0,0 @@
-/*
- * Farstream - Farstream MSN Connection
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *  @author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * fs-msn-connection.c - A MSN Connection gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-connection.h"
-
-#include <arpa/inet.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <stdio.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
-#include <gst/gst.h>
-#include <nice/interfaces.h>
-
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-/* Signals */
-enum
-{
-  SIGNAL_NEW_LOCAL_CANDIDATE,
-  SIGNAL_LOCAL_CANDIDATES_PREPARED,
-  SIGNAL_CONNECTED,
-  SIGNAL_CONNECTION_FAILED,
-  N_SIGNALS
-};
-
-
-static guint signals[N_SIGNALS];
-
-/* props */
-enum
-{
-  PROP_0,
-  PROP_SESSION_ID
-};
-
-
-typedef enum {
-  FS_MSN_STATUS_AUTH,
-  FS_MSN_STATUS_CONNECTED,
-  FS_MSN_STATUS_CONNECTED2,
-  FS_MSN_STATUS_SEND_RECEIVE,
-  FS_MSN_STATUS_PAUSED,
-} FsMsnStatus;
-
-typedef struct _FsMsnPollFD FsMsnPollFD;
-typedef void (*PollFdCallback) (FsMsnConnection *self, FsMsnPollFD *pollfd);
-
-struct _FsMsnPollFD {
-  GstPollFD pollfd;
-  FsMsnStatus status;
-  gboolean server;
-  gboolean want_read;
-  gboolean want_write;
-  PollFdCallback callback;
-};
-
-#define FS_MSN_CONNECTION_LOCK(conn)   g_rec_mutex_lock(&(conn)->mutex)
-#define FS_MSN_CONNECTION_UNLOCK(conn) g_rec_mutex_unlock(&(conn)->mutex)
-
-
-G_DEFINE_TYPE(FsMsnConnection, fs_msn_connection, G_TYPE_OBJECT);
-
-static void fs_msn_connection_dispose (GObject *object);
-static void fs_msn_connection_finalize (GObject *object);
-static void fs_msn_connection_get_property (GObject *object,
-    guint prop_id,
-    GValue *value,
-    GParamSpec *pspec);
-static void fs_msn_connection_set_property (GObject *object,
-    guint prop_id,
-    const GValue *value,
-    GParamSpec *pspec);
-
-
-static gboolean fs_msn_connection_attempt_connection_locked (
-    FsMsnConnection *connection,
-    FsCandidate *candidate,
-    GError **error);
-static gboolean fs_msn_open_listening_port_unlock (FsMsnConnection *connection,
-    guint16 port,
-    GError **error);
-
-static void successful_connection_cb (FsMsnConnection *self, FsMsnPollFD *fd);
-static void accept_connection_cb (FsMsnConnection *self, FsMsnPollFD *fd);
-static void connection_cb (FsMsnConnection *self, FsMsnPollFD *fd);
-
-static gpointer connection_polling_thread (gpointer data);
-static void shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd,
-    gboolean equal);
-static void shutdown_fd_locked (FsMsnConnection *self, FsMsnPollFD *pollfd,
-    gboolean equal);
-static FsMsnPollFD * add_pollfd_locked (FsMsnConnection *self, int fd,
-    PollFdCallback callback, gboolean read, gboolean write, gboolean server);
-
-static void
-fs_msn_connection_class_init (FsMsnConnectionClass *klass)
-{
-  GObjectClass *gobject_class = (GObjectClass *) klass;
-
-  gobject_class->dispose = fs_msn_connection_dispose;
-  gobject_class->finalize = fs_msn_connection_finalize;
-  gobject_class->get_property = fs_msn_connection_get_property;
-  gobject_class->set_property = fs_msn_connection_set_property;
-
-  signals[SIGNAL_NEW_LOCAL_CANDIDATE] = g_signal_new
-      ("new-local-candidate",
-          G_TYPE_FROM_CLASS (klass),
-          G_SIGNAL_RUN_LAST,
-          0,
-          NULL,
-          NULL,
-          g_cclosure_marshal_VOID__BOXED,
-          G_TYPE_NONE, 1, FS_TYPE_CANDIDATE);
-
-  signals[SIGNAL_LOCAL_CANDIDATES_PREPARED] = g_signal_new
-    ("local-candidates-prepared",
-      G_TYPE_FROM_CLASS (klass),
-      G_SIGNAL_RUN_LAST,
-      0,
-      NULL,
-      NULL,
-      g_cclosure_marshal_VOID__VOID,
-      G_TYPE_NONE, 0);
-
-  signals[SIGNAL_CONNECTED] = g_signal_new
-    ("connected",
-      G_TYPE_FROM_CLASS (klass),
-      G_SIGNAL_RUN_LAST,
-      0,
-      NULL,
-      NULL,
-      g_cclosure_marshal_VOID__UINT,
-        G_TYPE_NONE, 1, G_TYPE_UINT);
-
-  signals[SIGNAL_CONNECTION_FAILED] = g_signal_new
-    ("connection-failed",
-      G_TYPE_FROM_CLASS (klass),
-      G_SIGNAL_RUN_LAST,
-      0,
-      NULL,
-      NULL,
-      g_cclosure_marshal_VOID__VOID,
-      G_TYPE_NONE, 0);
-
-  g_object_class_install_property (gobject_class,
-      PROP_SESSION_ID,
-      g_param_spec_uint ("session-id",
-          "The session-id of the session",
-          "This is the session-id of the MSN session",
-          1, 9999, 1,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-fs_msn_connection_init (FsMsnConnection *self)
-{
-  /* member init */
-
-  self->poll_timeout = GST_CLOCK_TIME_NONE;
-  self->poll = gst_poll_new (TRUE);
-  gst_poll_set_flushing (self->poll, FALSE);
-  self->pollfds = g_ptr_array_new ();
-
-  g_rec_mutex_init (&self->mutex);
-}
-
-static void
-fs_msn_connection_dispose (GObject *object)
-{
-  FsMsnConnection *self = FS_MSN_CONNECTION (object);
-
-  FS_MSN_CONNECTION_LOCK(self);
-
-  if (self->polling_thread)
-  {
-    GThread *polling_thread = g_thread_ref (self->polling_thread);
-    gst_poll_set_flushing (self->poll, TRUE);
-    FS_MSN_CONNECTION_UNLOCK(self);
-    g_thread_join (polling_thread);
-    FS_MSN_CONNECTION_LOCK(self);
-    g_thread_unref (polling_thread);
-    self->polling_thread = NULL;
-  }
-
-  FS_MSN_CONNECTION_UNLOCK(self);
-
-  G_OBJECT_CLASS (fs_msn_connection_parent_class)->dispose (object);
-}
-
-static void
-fs_msn_connection_finalize (GObject *object)
-{
-  FsMsnConnection *self = FS_MSN_CONNECTION (object);
-  gint i;
-
-  g_free (self->local_recipient_id);
-  g_free (self->remote_recipient_id);
-
-  gst_poll_free (self->poll);
-
-  for (i = 0; i < self->pollfds->len; i++)
-  {
-    FsMsnPollFD *p = g_ptr_array_index(self->pollfds, i);
-    close (p->pollfd.fd);
-    g_slice_free (FsMsnPollFD, p);
-  }
-  g_ptr_array_free (self->pollfds, TRUE);
-
-  g_rec_mutex_clear (&self->mutex);
-
-  G_OBJECT_CLASS (fs_msn_connection_parent_class)->finalize (object);
-}
-
-/**
- * fs_msn_connection_new:
- * @session: The #FsMsnSession this connection is a child of
- * @participant: The #FsMsnParticipant this connection is for
- * @direction: the initial #FsDirection for this connection
- *
- *
- * This function create a new connection
- *
- * Returns: the newly created string or NULL on error
- */
-
-FsMsnConnection *
-fs_msn_connection_new (guint session_id, gboolean producer, guint initial_port)
-{
-  FsMsnConnection *self = g_object_new (FS_TYPE_MSN_CONNECTION, NULL);
-
-  if (self) {
-    self->session_id = session_id;
-    self->initial_port = initial_port;
-    self->producer = producer;
-  }
-
-  return self;
-}
-
-static void
-fs_msn_connection_get_property (GObject *object,
-                            guint prop_id,
-                            GValue *value,
-                            GParamSpec *pspec)
-{
-  FsMsnConnection *self = FS_MSN_CONNECTION (object);
-
-  FS_MSN_CONNECTION_LOCK (self);
-  switch (prop_id)
-  {
-    case PROP_SESSION_ID:
-      g_value_set_uint (value, self->session_id);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-  FS_MSN_CONNECTION_UNLOCK (self);
-}
-
-static void
-fs_msn_connection_set_property (GObject *object,
-                            guint prop_id,
-                            const GValue *value,
-                            GParamSpec *pspec)
-{
-  FsMsnConnection *self = FS_MSN_CONNECTION (object);
-
-  FS_MSN_CONNECTION_LOCK (self);
-  switch (prop_id)
-  {
-    case PROP_SESSION_ID:
-      self->session_id = g_value_get_uint (value);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-  FS_MSN_CONNECTION_LOCK (self);
-
-}
-
-gboolean
-fs_msn_connection_gather_local_candidates (FsMsnConnection *self,
-    GError **error)
-{
-  gboolean ret;
-
-  FS_MSN_CONNECTION_LOCK(self);
-
-  self->polling_thread = g_thread_try_new ("msn polling thread",
-      connection_polling_thread, self, error);
-
-  if (!self->polling_thread)
-  {
-    FS_MSN_CONNECTION_UNLOCK(self);
-    return FALSE;
-  }
-
-  ret = fs_msn_open_listening_port_unlock (self, self->initial_port, error);
-
-  g_signal_emit (self, signals[SIGNAL_LOCAL_CANDIDATES_PREPARED], 0);
-
-  return ret;
-}
-
-
-/**
- * fs_msn_connection_add_remote_candidate:
- */
-gboolean
-fs_msn_connection_add_remote_candidates (FsMsnConnection *self,
-    GList *candidates, GError **error)
-{
-  GList *item = NULL;
-  gchar *recipient_id = NULL;
-  gboolean ret = FALSE;
-  guint session_id = 0;
-
-  if (!candidates)
-  {
-    g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-        "Candidate list can no be empty");
-    return FALSE;
-  }
-
-  FS_MSN_CONNECTION_LOCK(self);
-
-  recipient_id = self->remote_recipient_id;
-
-  for (item = candidates; item; item = g_list_next (item))
-  {
-    FsCandidate *candidate = item->data;
-
-    if (!candidate->ip || !candidate->port)
-    {
-      g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-          "The candidate passed does not contain a valid ip or port");
-      goto out;
-    }
-    if (!candidate->foundation)
-    {
-      g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-          "The candidate passed does not have a foundation (MSN recipient ID)");
-      goto out;
-    }
-    if (recipient_id)
-    {
-      if (g_strcmp0 (candidate->foundation, recipient_id) != 0)
-      {
-        g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-            "The candidates do not have the same recipient ID");
-        goto out;
-      }
-    }
-    else
-    {
-      recipient_id = candidate->foundation;
-    }
-
-    if (candidate->username)
-    {
-      gint sid = atoi (candidate->username);
-
-      if (sid < 1 || sid > 9999)
-      {
-          g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-              "The session ID (in the username) must be between 1 and 9999,"
-              " %d is invalid", sid);
-          goto out;
-      }
-
-      if (session_id)
-      {
-        if (session_id != sid)
-        {
-          g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-              "The candidates do not have the same session ID"
-              " (in the username)");
-          goto out;
-        }
-      }
-      else
-      {
-        session_id = sid;
-      }
-    }
-  }
-
-  self->remote_recipient_id = g_strdup (recipient_id);
-  self->session_id = session_id;
-  ret = TRUE;
-  for (item = candidates; item; item = g_list_next (item))
-  {
-    FsCandidate *candidate = item->data;
-    if (!fs_msn_connection_attempt_connection_locked (self, candidate, error))
-    {
-      ret = FALSE;
-      break;
-    }
-  }
-
- out:
-  FS_MSN_CONNECTION_UNLOCK(self);
-  return ret;
-}
-
-
-
-static GList *
-filter_ips_ipv4 (GList *ips)
-{
-  GList *item;
-
-  for (item = ips; item;)
-  {
-    gchar *ip = item->data;
-    GList *next = item->next;
-
-    if (!strchr (ip, '.'))
-    {
-      g_free (ip);
-      ips = g_list_delete_link (ips, item);
-    }
-    item = next;
-  }
-
-  return ips;
-}
-
-static gboolean
-fs_msn_open_listening_port_unlock (FsMsnConnection *self, guint16 port,
-    GError **error)
-{
-  gint fd = -1;
-  struct sockaddr_in myaddr;
-  guint myaddr_len = sizeof (struct sockaddr_in);
-  FsCandidate * candidate = NULL;
-  GList *addresses = nice_interfaces_get_local_ips (FALSE);
-  GList *item = NULL;
-  gchar *session_id;
-
-  addresses = filter_ips_ipv4 (addresses);
-
-
-  GST_DEBUG ("Attempting to listen on port %d.....",port);
-
-  if ( (fd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
-  {
-    gchar error_str[256];
-    strerror_r (errno, error_str, 256);
-    g_set_error (error, FS_ERROR, FS_ERROR_NETWORK,
-        "Could not create socket: %s", error_str);
-    goto error;
-  }
-
-  // set non-blocking mode
-  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
-  for (;;) {
-    GST_DEBUG ("Attempting to listen on port %d.....",port);
-    memset(&myaddr, 0, sizeof(myaddr));
-    myaddr.sin_family = AF_INET;
-    myaddr.sin_port = htons (port);
-    // bind
-    if (bind(fd, (struct sockaddr *) &myaddr, sizeof(myaddr)) != 0)
-    {
-      if (port != 0 && errno == EADDRINUSE)
-      {
-        port++;
-      }
-      else
-      {
-        gchar error_str[256];
-        strerror_r (errno, error_str, 256);
-        g_set_error (error, FS_ERROR, FS_ERROR_NETWORK,
-            "Could not bind socket: %s", error_str);
-        goto error;
-      }
-    } else {
-      /* Listen */
-      if (listen(fd, 3) != 0)
-      {
-        if (port != 0 && errno == EADDRINUSE)
-        {
-          port++;
-        }
-        else
-        {
-          gchar error_str[256];
-          strerror_r (errno, error_str, 256);
-          g_set_error (error, FS_ERROR, FS_ERROR_NETWORK,
-              "Could not listen on socket: %s", error_str);
-          goto error;
-        }
-      }
-      else
-      {
-        goto done;
-      }
-    }
-  }
-
- done:
-
-  if (getsockname (fd, (struct sockaddr *) &myaddr, &myaddr_len) < 0) {
-    gchar error_str[256];
-    strerror_r (errno, error_str, 256);
-    g_set_error (error, FS_ERROR, FS_ERROR_NETWORK,
-        "Could not get the socket name: %s", error_str);
-    goto error;
-  }
-  port = ntohs (myaddr.sin_port);
-  add_pollfd_locked (self, fd, accept_connection_cb, TRUE, TRUE, FALSE);
-
-  GST_DEBUG ("Listening on port %d", port);
-
-  self->local_recipient_id = g_strdup_printf ("%d",
-      g_random_int_range (100, 199));
-  session_id = g_strdup_printf ("%u", self->session_id);
-
-  FS_MSN_CONNECTION_UNLOCK (self);
-
-  for (item = addresses;
-       item;
-       item = g_list_next (item))
-  {
-    candidate = fs_candidate_new (self->local_recipient_id, 1,
-        FS_CANDIDATE_TYPE_HOST, FS_NETWORK_PROTOCOL_TCP, item->data, port);
-    candidate->username = g_strdup (session_id);
-
-    g_signal_emit (self, signals[SIGNAL_NEW_LOCAL_CANDIDATE], 0, candidate);
-
-    fs_candidate_destroy (candidate);
-  }
-
-  g_free (session_id);
-
-  g_list_foreach (addresses, (GFunc) g_free, NULL);
-  g_list_free (addresses);
-
-  return TRUE;
-
- error:
-  if (fd >= 0)
-    close (fd);
-  g_list_foreach (addresses, (GFunc) g_free, NULL);
-  g_list_free (addresses);
-  FS_MSN_CONNECTION_UNLOCK (self);
-  return FALSE;
-}
-
-static gboolean
-fs_msn_connection_attempt_connection_locked (FsMsnConnection *connection,
-    FsCandidate *candidate,
-    GError **error)
-{
-  FsMsnConnection *self = FS_MSN_CONNECTION (connection);
-  gint fd = -1;
-  gint ret;
-  struct sockaddr_in theiraddr;
-  memset(&theiraddr, 0, sizeof(theiraddr));
-
-
-  if ( (fd = socket(PF_INET, SOCK_STREAM, 0)) == -1 )
-  {
-    gchar error_str[256];
-    strerror_r (errno, error_str, 256);
-    g_set_error (error, FS_ERROR, FS_ERROR_NETWORK,
-        "Could not create socket: %s", error_str);
-    return FALSE;
-  }
-
-  // set non-blocking mode
-  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
-
-  theiraddr.sin_family = AF_INET;
-  theiraddr.sin_addr.s_addr = inet_addr (candidate->ip);
-  theiraddr.sin_port = htons (candidate->port);
-
-  GST_DEBUG ("Attempting connection to %s %d on socket %d", candidate->ip,
-      candidate->port, fd);
-  // this is non blocking, the return value isn't too usefull
-  ret = connect (fd, (struct sockaddr *) &theiraddr, sizeof (theiraddr));
-  if (ret < 0 && errno != EINPROGRESS)
-  {
-    gchar error_str[256];
-    strerror_r (errno, error_str, 256);
-    g_set_error (error, FS_ERROR, FS_ERROR_NETWORK,
-        "Could not connect socket: %s", error_str);
-    close (fd);
-    return FALSE;
-  }
-
-  FS_MSN_CONNECTION_LOCK (self);
-  add_pollfd_locked (self, fd, successful_connection_cb, TRUE, TRUE, FALSE);
-  FS_MSN_CONNECTION_UNLOCK (self);
-
-  return TRUE;
-}
-
-static void
-accept_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
-{
-  struct sockaddr_in in;
-  int fd = -1;
-  socklen_t n = sizeof (in);
-
-  if (gst_poll_fd_has_error (self->poll, &pollfd->pollfd) ||
-      gst_poll_fd_has_closed (self->poll, &pollfd->pollfd))
-  {
-    GST_WARNING ("Error in accept socket : %d", pollfd->pollfd.fd);
-    goto error;
-  }
-
-  if ((fd = accept(pollfd->pollfd.fd,
-              (struct sockaddr*) &in, &n)) == -1)
-  {
-    GST_ERROR ("Error while running accept() %d", errno);
-    return;
-  }
-
-  FS_MSN_CONNECTION_LOCK (self);
-  add_pollfd_locked (self, fd, connection_cb, TRUE, FALSE, TRUE);
-  FS_MSN_CONNECTION_UNLOCK (self);
-
-  return;
-
-  /* Error */
- error:
-  GST_WARNING ("Got error from fd %d, closing", fd);
-  // find, shutdown and remove channel from fdlist
-  shutdown_fd (self, pollfd, TRUE);
-
-  return;
-}
-
-
-static void
-successful_connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
-{
-  gint error;
-  socklen_t option_len;
-
-  GST_DEBUG ("handler called on fd %d", pollfd->pollfd.fd);
-
-  errno = 0;
-  if (gst_poll_fd_has_error (self->poll, &pollfd->pollfd) ||
-      gst_poll_fd_has_closed (self->poll, &pollfd->pollfd))
-  {
-    GST_WARNING ("connecton closed or error");
-    goto error;
-  }
-
-  option_len = sizeof(error);
-
-  /* Get the error option */
-  if (getsockopt(pollfd->pollfd.fd, SOL_SOCKET, SO_ERROR, (void*) &error, &option_len) < 0)
-  {
-    g_warning ("getsockopt() failed");
-    goto error;
-  }
-
-  /* Check if there is an error */
-  if (error)
-  {
-    GST_WARNING ("getsockopt gave an error : %d", error);
-    goto error;
-  }
-
-  pollfd->callback = connection_cb;
-
-  GST_DEBUG ("connection succeeded on socket %p", pollfd);
-  return;
-
-  /* Error */
- error:
-  GST_WARNING ("Got error from fd %d, closing", pollfd->pollfd.fd);
-  // find, shutdown and remove channel from fdlist
-  shutdown_fd (self, pollfd, TRUE);
-
-  return;
-}
-
-
-static void
-connection_cb (FsMsnConnection *self, FsMsnPollFD *pollfd)
-{
-  gboolean success = FALSE;
-
-  GST_DEBUG ("handler called on fd:%d server: %d status:%d r:%d w:%d",
-      pollfd->pollfd.fd,
-      pollfd->server, pollfd->status,
-      gst_poll_fd_can_read (self->poll, &pollfd->pollfd),
-      gst_poll_fd_can_write (self->poll, &pollfd->pollfd));
-
-  if (gst_poll_fd_has_error (self->poll, &pollfd->pollfd) ||
-      gst_poll_fd_has_closed (self->poll, &pollfd->pollfd))
-  {
-    GST_WARNING ("connecton closed or error (error: %d closed: %d)",
-        gst_poll_fd_has_error (self->poll, &pollfd->pollfd),
-        gst_poll_fd_has_closed (self->poll, &pollfd->pollfd));
-    goto error;
-  }
-
-  if (gst_poll_fd_can_read (self->poll, &pollfd->pollfd))
-  {
-    switch (pollfd->status)
-    {
-      case FS_MSN_STATUS_AUTH:
-        if (pollfd->server)
-        {
-          gchar str[35] = {0};
-          gchar check[35] = {0};
-
-          if (recv (pollfd->pollfd.fd, str, 34, 0) == 34)
-          {
-            GST_DEBUG ("Got %s, checking if it's auth", str);
-            FS_MSN_CONNECTION_LOCK(self);
-            snprintf(check, 35, "recipientid=%s&sessionid=%d\r\n\r\n",
-                self->local_recipient_id, self->session_id);
-            FS_MSN_CONNECTION_UNLOCK(self);
-            if (strncmp (str, check, 35) == 0)
-            {
-              GST_DEBUG ("Authentication successful");
-              pollfd->status = FS_MSN_STATUS_CONNECTED;
-              pollfd->want_write = TRUE;
-              gst_poll_fd_ctl_write (self->poll, &pollfd->pollfd, TRUE);
-            }
-            else
-            {
-              GST_WARNING ("Authentication failed check=%s", check);
-              goto error;
-            }
-          }
-          else
-          {
-            gchar error_str[256];
-            strerror_r (errno, error_str, 256);
-            GST_WARNING ("auth: %s", error_str);
-            goto error;
-          }
-
-        } else {
-          GST_ERROR ("shouldn't receive data when client on AUTH state");
-          goto error;
-        }
-        break;
-      case FS_MSN_STATUS_CONNECTED:
-        if (!pollfd->server)
-        {
-          gchar str[14] = {0};
-          ssize_t size;
-
-          size = recv (pollfd->pollfd.fd, str, 13, MSG_PEEK);
-          if (size > 0)
-          {
-            GST_DEBUG ("Got %s, checking if it's connected", str);
-            if (size == 13 && strcmp (str, "connected\r\n\r\n") == 0)
-            {
-              GST_DEBUG ("connection successful");
-              if (recv (pollfd->pollfd.fd, str, 13, 0) != 13)
-              {
-                GST_WARNING ("Could not read 13 bytes that had previously"
-                    " been peeked at!");
-                goto error;
-              }
-              pollfd->status = FS_MSN_STATUS_CONNECTED2;
-              pollfd->want_write = TRUE;
-              gst_poll_fd_ctl_write (self->poll, &pollfd->pollfd, TRUE);
-            }
-            else if (!self->producer)
-            {
-              GST_DEBUG ("connection successful");
-              pollfd->status = FS_MSN_STATUS_SEND_RECEIVE;
-              success = TRUE;
-            }
-            else
-            {
-              GST_WARNING ("connected failed");
-              goto error;
-            }
-          }
-          else
-          {
-            gchar error_str[256];
-            strerror_r (errno, error_str, 256);
-            GST_WARNING ("recv: %s", error_str);
-            goto error;
-          }
-        } else {
-          GST_ERROR ("shouldn't receive data when server on CONNECTED state");
-          goto error;
-        }
-        break;
-      case FS_MSN_STATUS_CONNECTED2:
-        if (pollfd->server)
-        {
-          gchar str[14] = {0};
-          ssize_t size;
-
-          size = recv (pollfd->pollfd.fd, str, 13, MSG_PEEK);
-          if (size > 0)
-          {
-            GST_DEBUG ("Got %s, checking if it's connected", str);
-            if (size == 13 && strcmp (str, "connected\r\n\r\n") == 0)
-            {
-              GST_DEBUG ("connection successful");
-              if (recv (pollfd->pollfd.fd, str, 13, 0) != 13)
-              {
-                GST_WARNING ("Could not read 13 bytes that had previously"
-                    " been peeked at!");
-
-                goto error;
-              }
-              pollfd->status = FS_MSN_STATUS_SEND_RECEIVE;
-              success = TRUE;
-            }
-            else if (!self->producer)
-            {
-              GST_DEBUG ("connection successful");
-              pollfd->status = FS_MSN_STATUS_SEND_RECEIVE;
-              success = TRUE;
-            }
-            else
-            {
-              GST_WARNING ("connected failed");
-              goto error;
-            }
-          }
-          else
-          {
-            gchar error_str[256];
-            strerror_r (errno, error_str, 256);
-            GST_WARNING ("recv: %s", error_str);
-            goto error;
-          }
-
-        } else {
-          GST_ERROR ("shouldn't receive data when client on CONNECTED2 state");
-          goto error;
-        }
-        break;
-      default:
-        GST_ERROR ("Invalid status %d", pollfd->status);
-        goto error;
-        break;
-
-    }
-  }
-  else if (gst_poll_fd_can_write (self->poll, &pollfd->pollfd))
-  {
-    pollfd->want_write = FALSE;
-    gst_poll_fd_ctl_write (self->poll, &pollfd->pollfd, FALSE);
-    switch (pollfd->status)
-    {
-      case FS_MSN_STATUS_AUTH:
-        if (!pollfd->server)
-        {
-          gchar *str;
-          FS_MSN_CONNECTION_LOCK(self);
-          str = g_strdup_printf("recipientid=%s&sessionid=%d\r\n\r\n",
-              self->remote_recipient_id, self->session_id);
-          FS_MSN_CONNECTION_UNLOCK(self);
-          if (send(pollfd->pollfd.fd, str, strlen (str), 0) != -1)
-          {
-            GST_DEBUG ("Sent %s", str);
-            pollfd->status = FS_MSN_STATUS_CONNECTED;
-            g_free (str);
-          }
-          else
-          {
-            gchar error_str[256];
-            strerror_r (errno, error_str, 256);
-            GST_WARNING ("auth send: %s", error_str);
-            g_free (str);
-            goto error;
-          }
-
-        }
-        break;
-      case FS_MSN_STATUS_CONNECTED:
-        if (pollfd->server)
-        {
-
-          if (send(pollfd->pollfd.fd, "connected\r\n\r\n", 13, 0) != -1)
-          {
-            GST_DEBUG ("sent connected");
-            if (self->producer)
-            {
-              pollfd->status = FS_MSN_STATUS_SEND_RECEIVE;
-              success = TRUE;
-            }
-            else
-            {
-              pollfd->status = FS_MSN_STATUS_CONNECTED2;
-            }
-          }
-          else
-          {
-            gchar error_str[256];
-            strerror_r (errno, error_str, 256);
-            GST_WARNING ("sending connected: %s", error_str);
-            goto error;
-          }
-        } else {
-          GST_DEBUG ("shouldn't receive data when server on CONNECTED state");
-          goto error;
-        }
-        break;
-      case FS_MSN_STATUS_CONNECTED2:
-        if (!pollfd->server)
-        {
-
-          if (send(pollfd->pollfd.fd, "connected\r\n\r\n", 13, 0) != -1)
-          {
-            GST_DEBUG ("sent connected");
-            pollfd->status = FS_MSN_STATUS_SEND_RECEIVE;
-            success = TRUE;
-          }
-          else
-          {
-            gchar error_str[256];
-            strerror_r (errno, error_str, 256);
-            GST_WARNING ("sending connected: %s", error_str);
-            goto error;
-          }
-        } else {
-          GST_ERROR ("shouldn't receive data when client on CONNECTED2 state");
-          goto error;
-        }
-        break;
-      default:
-        GST_ERROR ("Invalid status %d", pollfd->status);
-        goto error;
-        break;
-    }
-  }
-
-  if (success) {
-    // success! we need to shutdown/close all other channels
-    shutdown_fd (self, pollfd, FALSE);
-
-    g_signal_emit (self, signals[SIGNAL_CONNECTED], 0, pollfd->pollfd.fd);
-
-    pollfd->want_read = FALSE;
-    pollfd->want_write = FALSE;
-    gst_poll_fd_ctl_read (self->poll, &pollfd->pollfd, FALSE);
-    gst_poll_fd_ctl_write (self->poll, &pollfd->pollfd, FALSE);
-  }
-
-  return;
- error:
-  /* Error */
-  GST_WARNING ("Got error from fd %d, closing", pollfd->pollfd.fd);
-  shutdown_fd (self, pollfd, TRUE);
-
-  FS_MSN_CONNECTION_LOCK (self);
-  success = (self->pollfds->len > 1);
-  FS_MSN_CONNECTION_UNLOCK (self);
-
-  if (!success)
-    g_signal_emit (self, signals[SIGNAL_CONNECTION_FAILED], 0);
-
-  return;
-}
-
-static gpointer
-connection_polling_thread (gpointer data)
-{
-  FsMsnConnection *self = data;
-  gint ret;
-  GstClockTime timeout;
-  GstPoll * poll;
-
-  FS_MSN_CONNECTION_LOCK(self);
-  timeout = self->poll_timeout;
-  poll = self->poll;
-  GST_DEBUG ("poll waiting %d", self->pollfds->len);
-  FS_MSN_CONNECTION_UNLOCK(self);
-
-  while ((ret = gst_poll_wait (poll, timeout)) >= 0)
-  {
-    GST_DEBUG ("gst_poll_wait returned : %d", ret);
-    FS_MSN_CONNECTION_LOCK(self);
-    if (ret > 0)
-    {
-      gint i;
-
-      for (i = 0; i < self->pollfds->len; i++)
-      {
-        FsMsnPollFD *pollfd = NULL;
-
-        pollfd = g_ptr_array_index(self->pollfds, i);
-
-        GST_DEBUG ("ret %d - i = %d, len = %d", ret, i, self->pollfds->len);
-
-        GST_DEBUG ("%p - error %d, close %d, read %d-%d, write %d-%d",
-            pollfd,
-            gst_poll_fd_has_error (poll, &pollfd->pollfd),
-            gst_poll_fd_has_closed (poll, &pollfd->pollfd),
-            pollfd->want_read,
-            gst_poll_fd_can_read (poll, &pollfd->pollfd),
-            pollfd->want_write,
-            gst_poll_fd_can_write (poll, &pollfd->pollfd));
-
-        if (gst_poll_fd_has_error (poll, &pollfd->pollfd) ||
-            gst_poll_fd_has_closed (poll, &pollfd->pollfd))
-        {
-          pollfd->callback (self, pollfd);
-          shutdown_fd_locked (self, pollfd, TRUE);
-          i--;
-          continue;
-        }
-        if ((pollfd->want_read &&
-                gst_poll_fd_can_read (poll, &pollfd->pollfd)) ||
-            (pollfd->want_write &&
-                gst_poll_fd_can_write (poll, &pollfd->pollfd)))
-        {
-          pollfd->callback (self, pollfd);
-        }
-
-      }
-    }
-    timeout = self->poll_timeout;
-    FS_MSN_CONNECTION_UNLOCK(self);
-  }
-
-  return NULL;
-}
-
-
-static void
-shutdown_fd (FsMsnConnection *self, FsMsnPollFD *pollfd, gboolean equal)
-{
-  FS_MSN_CONNECTION_LOCK (self);
-  shutdown_fd_locked (self, pollfd, equal);
-  FS_MSN_CONNECTION_UNLOCK (self);
-}
-
-static void
-shutdown_fd_locked (FsMsnConnection *self, FsMsnPollFD *pollfd, gboolean equal)
-{
-  gint i;
-  guint closed = 0;
-
-  for (i = 0; i < self->pollfds->len; i++)
-  {
-    FsMsnPollFD *p = g_ptr_array_index(self->pollfds, i);
-    if ((equal && p == pollfd) || (!equal && p != pollfd))
-    {
-      GST_DEBUG ("Shutting down p %p (fd %d)", p, p->pollfd.fd);
-
-      if (!gst_poll_fd_has_closed (self->poll, &p->pollfd))
-        close (p->pollfd.fd);
-      if (!gst_poll_remove_fd (self->poll, &p->pollfd))
-        GST_WARNING ("Could not remove pollfd %p", p);
-      g_ptr_array_remove_index_fast (self->pollfds, i);
-      g_slice_free (FsMsnPollFD, p);
-      closed++;
-      i--;
-    }
-  }
-
-  if (closed)
-    gst_poll_restart (self->poll);
-  else
-    GST_WARNING ("Could find pollfd to remove");
-}
-
-static FsMsnPollFD *
-add_pollfd_locked (FsMsnConnection *self, int fd, PollFdCallback callback,
-    gboolean read, gboolean write, gboolean server)
-{
-  FsMsnPollFD *pollfd = g_slice_new0 (FsMsnPollFD);
-  gst_poll_fd_init (&pollfd->pollfd);
-  pollfd->pollfd.fd = fd;
-  pollfd->server = server;
-  pollfd->want_read = read;
-  pollfd->want_write = write;
-  pollfd->status = FS_MSN_STATUS_AUTH;
-
-  gst_poll_add_fd (self->poll, &pollfd->pollfd);
-
-  gst_poll_fd_ctl_read (self->poll, &pollfd->pollfd, read);
-  gst_poll_fd_ctl_write (self->poll, &pollfd->pollfd, write);
-  pollfd->callback = callback;
-
-  GST_DEBUG ("ADD_POLLFD %p (%p) - error %d, close %d, read %d-%d, write %d-%d",
-      self->pollfds, pollfd,
-      gst_poll_fd_has_error (self->poll, &pollfd->pollfd),
-      gst_poll_fd_has_closed (self->poll, &pollfd->pollfd),
-      pollfd->want_read,
-      gst_poll_fd_can_read (self->poll, &pollfd->pollfd),
-      pollfd->want_write,
-      gst_poll_fd_can_write (self->poll, &pollfd->pollfd));
-
-  g_ptr_array_add (self->pollfds, pollfd);
-  gst_poll_restart (self->poll);
-  return pollfd;
-}
diff --git a/gst/fsmsnconference/fs-msn-connection.h b/gst/fsmsnconference/fs-msn-connection.h
deleted file mode 100644
index a3563cca..00000000
--- a/gst/fsmsnconference/fs-msn-connection.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Farstream - Farstream MSN Stream
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *  @author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * fs-msn-connection.h - An MSN Connection class
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_CONNECTION_H__
-#define __FS_MSN_CONNECTION_H__
-
-#include "fs-msn-participant.h"
-#include "fs-msn-session.h"
-
-G_BEGIN_DECLS
-
-/* TYPE MACROS */
-#define FS_TYPE_MSN_CONNECTION \
-  (fs_msn_connection_get_type ())
-#define FS_MSN_CONNECTION(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), FS_TYPE_MSN_CONNECTION, FsMsnConnection))
-#define FS_MSN_CONNECTION_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), FS_TYPE_MSN_CONNECTION, FsMsnConnectionClass))
-#define FS_IS_MSN_CONNECTION(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FS_TYPE_MSN_CONNECTION))
-#define FS_IS_MSN_CONNECTION_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), FS_TYPE_MSN_CONNECTION))
-#define FS_MSN_CONNECTION_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), FS_TYPE_MSN_CONNECTION, FsMsnConnectionClass))
-#define FS_MSN_CONNECTION_CAST(obj) ((FsMsnConnection*) (obj))
-
-typedef struct _FsMsnConnection FsMsnConnection;
-typedef struct _FsMsnConnectionClass FsMsnConnectionClass;
-typedef struct _FsMsnConnectionPrivate FsMsnConnectionPrivate;
-
-
-struct _FsMsnConnectionClass
-{
-  GObjectClass parent_class;
-};
-
-/**
- * FsMsnConnection:
- *
- */
-struct _FsMsnConnection
-{
-  GObject parent;
-
-  /* All variables that are not protected by the lock are read-only */
-
-  gchar *local_recipient_id;
-  gchar *remote_recipient_id; /* protected by lock */
-  guint session_id; /* protected by lock */
-  guint initial_port;
-  gboolean producer;
-
-  GThread *polling_thread; /* protected by lock */
-  GstClockTime poll_timeout; /* protected by lock */
-  GstPoll *poll;
-  GPtrArray *pollfds; /* protected by lock */
-  GRecMutex mutex;
-};
-
-GType fs_msn_connection_get_type (void);
-
-FsMsnConnection *fs_msn_connection_new (guint session_id, gboolean producer,
-	                                guint initial_port);
-
-gboolean fs_msn_connection_gather_local_candidates (FsMsnConnection *connection,
-                                                    GError **error);
-
-gboolean fs_msn_connection_add_remote_candidates (FsMsnConnection *connection,
-    GList *candidates, GError **error);
-
-
-G_END_DECLS
-
-#endif /* __FS_MSN_CONNECTION_H__ */
diff --git a/gst/fsmsnconference/fs-msn-participant.c b/gst/fsmsnconference/fs-msn-participant.c
deleted file mode 100644
index 1dcf72c9..00000000
--- a/gst/fsmsnconference/fs-msn-participant.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Farstream - Farstream MSN Participant
- *
- * Copyright 2007 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- *
- * fs-msn-participant.c - A MSN Farstream Participant gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-/**
- * SECTION:fs-msn-participant
- * @short_description: A MSN participant in a #FsMsnConference
- *
- * This object represents one participant or person in a conference
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-participant.h"
-
-/* Signals */
-enum
-{
-  LAST_SIGNAL
-};
-
-/* props */
-enum
-{
-  PROP_0,
-};
-
-G_DEFINE_TYPE(FsMsnParticipant, fs_msn_participant, FS_TYPE_PARTICIPANT);
-
-static void
-fs_msn_participant_class_init (FsMsnParticipantClass *klass)
-{
-}
-
-static void
-fs_msn_participant_init (FsMsnParticipant *self)
-{
-}
-
-FsMsnParticipant *fs_msn_participant_new (void)
-{
-  return g_object_new (FS_TYPE_MSN_PARTICIPANT, NULL);
-}
diff --git a/gst/fsmsnconference/fs-msn-participant.h b/gst/fsmsnconference/fs-msn-participant.h
deleted file mode 100644
index 44c6a0a2..00000000
--- a/gst/fsmsnconference/fs-msn-participant.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Farstream - Farstream MSN Participant
- *
- * Copyright 2007 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- *
- * fs-msn-participant.h - A Farstream MSN Participant gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_PARTICIPANT_H__
-#define __FS_MSN_PARTICIPANT_H__
-
-#include <farstream/fs-participant.h>
-
-G_BEGIN_DECLS
-
-/* TYPE MACROS */
-#define FS_TYPE_MSN_PARTICIPANT (fs_msn_participant_get_type())
-#define FS_MSN_PARTICIPANT(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), FS_TYPE_MSN_PARTICIPANT, \
-                              FsMsnParticipant))
-#define FS_MSN_PARTICIPANT_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), FS_TYPE_MSN_PARTICIPANT, \
-                           FsMsnParticipantClass))
-#define FS_IS_MSN_PARTICIPANT(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FS_TYPE_MSN_PARTICIPANT))
-#define FS_IS_MSN_PARTICIPANT_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), FS_TYPE_MSN_PARTICIPANT))
-#define FS_MSN_PARTICIPANT_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), FS_TYPE_MSN_PARTICIPANT, \
-                              FsMsnParticipantClass))
-#define FS_MSN_PARTICIPANT_CAST(obj) ((FsMsnParticipant *) (obj))
-
-typedef struct _FsMsnParticipant FsMsnParticipant;
-typedef struct _FsMsnParticipantClass FsMsnParticipantClass;
-typedef struct _FsMsnParticipantPrivate FsMsnParticipantPrivate;
-
-struct _FsMsnParticipantClass
-{
-  FsParticipantClass parent_class;
-
-  /*virtual functions */
-
-  /*< private >*/
-  FsMsnParticipantPrivate *priv;
-};
-
-/**
- * FsMsnParticipant:
- *
- */
-struct _FsMsnParticipant
-{
-  FsParticipant parent;
-  FsMsnParticipantPrivate *priv;
-};
-
-GType fs_msn_participant_get_type (void);
-
-FsMsnParticipant *fs_msn_participant_new (void);
-
-G_END_DECLS
-
-#endif /* __FS_MSN_PARTICIPANT_H__ */
diff --git a/gst/fsmsnconference/fs-msn-session.c b/gst/fsmsnconference/fs-msn-session.c
deleted file mode 100644
index cf455fd0..00000000
--- a/gst/fsmsnconference/fs-msn-session.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * Farstream - Farstream MSN Session
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *  @author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * fs-msn-session.c - A Farstream Msn Session gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-/**
- * SECTION:fs-msn-session
- * @short_description: A  MSN session in a #FsMsnConference
- *
- * There can be only one stream per session.
- *
- * It can afterwards be modified to pause sending (or receiving) by modifying
- * the #FsMsnStream::direction property.
- *
- * The transmitter parameters to the fs_session_new_stream() function are
- * used to set the initial value of the construct properties of the stream
- * object. This plugin does not use transmitter plugins, so the transmitter
- * parameter itself is ignored.
- *
- * The codecs preferences can not be modified and the codec is a fixed value.
- * It is always "MIMIC".
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-session.h"
-
-#include <string.h>
-
-#include <gst/gst.h>
-
-#include "fs-msn-stream.h"
-#include "fs-msn-participant.h"
-
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-/* Signals */
-enum
-{
-  LAST_SIGNAL
-};
-
-/* props */
-enum
-{
-  PROP_0,
-  PROP_MEDIA_TYPE,
-  PROP_ID,
-  PROP_SINK_PAD,
-  PROP_CODEC_PREFERENCES,
-  PROP_CODECS,
-  PROP_CODECS_WITHOUT_CONFIG,
-  PROP_CURRENT_SEND_CODEC,
-  PROP_CONFERENCE,
-  PROP_TOS
-};
-
-
-
-struct _FsMsnSessionPrivate
-{
-  FsMediaType media_type;
-
-  FsMsnConference *conference;
-  FsMsnStream *stream;
-
-  GError *construction_error;
-
-  GstPad *media_sink_pad;
-
-  guint tos; /* Protected by conf lock */
-
-  GMutex mutex; /* protects the conference */
-};
-
-G_DEFINE_TYPE (FsMsnSession, fs_msn_session, FS_TYPE_SESSION);
-
-#define FS_MSN_SESSION_GET_PRIVATE(o)  \
-   (G_TYPE_INSTANCE_GET_PRIVATE ((o), FS_TYPE_MSN_SESSION, FsMsnSessionPrivate))
-
-static void fs_msn_session_dispose (GObject *object);
-static void fs_msn_session_finalize (GObject *object);
-
-static void fs_msn_session_get_property (GObject *object,
-    guint prop_id,
-    GValue *value,
-    GParamSpec *pspec);
-static void fs_msn_session_set_property (GObject *object,
-    guint prop_id,
-    const GValue *value,
-    GParamSpec *pspec);
-
-static void fs_msn_session_constructed (GObject *object);
-
-static FsStream *fs_msn_session_new_stream (FsSession *session,
-    FsParticipant *participant,
-    FsStreamDirection direction,
-    GError **error);
-
-static GType
-fs_msn_session_get_stream_transmitter_type (FsSession *session,
-    const gchar *transmitter);
-
-static void _remove_stream (gpointer user_data,
-                            GObject *where_the_object_was);
-
-static void
-fs_msn_session_class_init (FsMsnSessionClass *klass)
-{
-  GObjectClass *gobject_class;
-  FsSessionClass *session_class;
-
-  gobject_class = (GObjectClass *) klass;
-  session_class = FS_SESSION_CLASS (klass);
-
-  gobject_class->set_property = fs_msn_session_set_property;
-  gobject_class->get_property = fs_msn_session_get_property;
-  gobject_class->constructed = fs_msn_session_constructed;
-
-  session_class->new_stream = fs_msn_session_new_stream;
-  session_class->get_stream_transmitter_type =
-    fs_msn_session_get_stream_transmitter_type;
-
-  g_object_class_override_property (gobject_class,
-      PROP_MEDIA_TYPE, "media-type");
-  g_object_class_override_property (gobject_class,
-      PROP_ID, "id");
-  g_object_class_override_property (gobject_class,
-      PROP_SINK_PAD, "sink-pad");
-
-  g_object_class_override_property (gobject_class,
-    PROP_CODEC_PREFERENCES, "codec-preferences");
-  g_object_class_override_property (gobject_class,
-    PROP_CODECS, "codecs");
-  g_object_class_override_property (gobject_class,
-    PROP_CODECS_WITHOUT_CONFIG, "codecs-without-config");
-  g_object_class_override_property (gobject_class,
-    PROP_CURRENT_SEND_CODEC, "current-send-codec");
-  g_object_class_override_property (gobject_class,
-    PROP_TOS, "tos");
-  g_object_class_override_property (gobject_class,
-    PROP_CONFERENCE, "conference");
-
-  gobject_class->dispose = fs_msn_session_dispose;
-  gobject_class->finalize = fs_msn_session_finalize;
-
-  g_type_class_add_private (klass, sizeof (FsMsnSessionPrivate));
-}
-
-static void
-fs_msn_session_init (FsMsnSession *self)
-{
-  /* member init */
-  self->priv = FS_MSN_SESSION_GET_PRIVATE (self);
-  self->priv->construction_error = NULL;
-
-  g_mutex_init (&self->priv->mutex);
-
-  self->priv->media_type = FS_MEDIA_TYPE_LAST + 1;
-}
-
-
-static FsMsnConference *
-fs_msn_session_get_conference (FsMsnSession *self, GError **error)
-{
-  FsMsnConference *conference;
-
-  g_mutex_lock (&self->priv->mutex);
-  conference = self->priv->conference;
-  if (conference)
-    g_object_ref (conference);
-  g_mutex_unlock (&self->priv->mutex);
-
-  if (!conference)
-    g_set_error (error, FS_ERROR, FS_ERROR_DISPOSED,
-        "Called function after session has been disposed");
-
-  return conference;
-}
-
-
-static void
-fs_msn_session_dispose (GObject *object)
-{
-  FsMsnSession *self = FS_MSN_SESSION (object);
-  GstBin *conferencebin = NULL;
-  FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-  GstElement *valve = NULL;
-
-  g_mutex_lock (&self->priv->mutex);
-  self->priv->conference = NULL;
-  g_mutex_unlock (&self->priv->mutex);
-
-  if (!conference)
-    goto out;
-
-  if (self->priv->stream)
-  {
-    g_object_weak_unref (G_OBJECT (self->priv->stream), _remove_stream, self);
-    fs_stream_destroy (FS_STREAM (self->priv->stream));
-    self->priv->stream = NULL;
-  }
-
-  conferencebin = GST_BIN (conference);
-
-  if (!conferencebin)
-    goto out;
-
-  if (self->priv->media_sink_pad)
-    gst_pad_set_active (self->priv->media_sink_pad, FALSE);
-
-  GST_OBJECT_LOCK (conference);
-  valve = self->valve;
-  self->valve = NULL;
-  GST_OBJECT_UNLOCK (conference);
-
-  if (valve)
-  {
-    gst_element_set_locked_state (valve, TRUE);
-    gst_element_set_state (valve, GST_STATE_NULL);
-    gst_bin_remove (conferencebin, valve);
-  }
-
-  if (self->priv->media_sink_pad)
-    gst_element_remove_pad (GST_ELEMENT (conference),
-        self->priv->media_sink_pad);
-  self->priv->media_sink_pad = NULL;
-
-  gst_object_unref (conferencebin);
-  gst_object_unref (conference);
-
- out:
-
-  G_OBJECT_CLASS (fs_msn_session_parent_class)->dispose (object);
-}
-
-static void
-fs_msn_session_finalize (GObject *object)
-{
-  FsMsnSession *self = FS_MSN_SESSION (object);
-
-  g_mutex_clear (&self->priv->mutex);
-
-  G_OBJECT_CLASS (fs_msn_session_parent_class)->finalize (object);
-}
-
-static void
-fs_msn_session_get_property (GObject *object,
-                             guint prop_id,
-                             GValue *value,
-                             GParamSpec *pspec)
-{
-  FsMsnSession *self = FS_MSN_SESSION (object);
-  FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-
-  if (!conference)
-    return;
-
-  switch (prop_id)
-  {
-    case PROP_MEDIA_TYPE:
-      g_value_set_enum (value, self->priv->media_type);
-      break;
-    case PROP_ID:
-      g_value_set_uint (value, 1);
-      break;
-    case PROP_CONFERENCE:
-      g_value_set_object (value, self->priv->conference);
-      break;
-    case PROP_SINK_PAD:
-      g_value_set_object (value, self->priv->media_sink_pad);
-      break;
-    case PROP_CODEC_PREFERENCES:
-      /* There are no preferences, so return NULL */
-      break;
-    case PROP_CODECS:
-    case PROP_CODECS_WITHOUT_CONFIG:
-      {
-        GList *codecs = NULL;
-        FsCodec *mimic_codec = fs_codec_new (FS_CODEC_ID_ANY, "mimic",
-          FS_MEDIA_TYPE_VIDEO, 0);
-        codecs = g_list_append (codecs, mimic_codec);
-        g_value_take_boxed (value, codecs);
-      }
-      break;
-    case PROP_CURRENT_SEND_CODEC:
-      {
-        FsCodec *send_codec = fs_codec_new (FS_CODEC_ID_ANY, "mimic",
-            FS_MEDIA_TYPE_VIDEO, 0);
-        g_value_take_boxed (value, send_codec);
-        break;
-      }
-    case PROP_TOS:
-      GST_OBJECT_LOCK (conference);
-      g_value_set_uint (value, self->priv->tos);
-      GST_OBJECT_UNLOCK (conference);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-
-  gst_object_unref (conference);
-}
-
-static void
-fs_msn_session_set_property (GObject *object,
-                             guint prop_id,
-                             const GValue *value,
-                             GParamSpec *pspec)
-{
-  FsMsnSession *self = FS_MSN_SESSION (object);
-  FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-
-  if (!conference && !(pspec->flags & G_PARAM_CONSTRUCT_ONLY))
-    return;
-
-  switch (prop_id)
-  {
-    case PROP_MEDIA_TYPE:
-      self->priv->media_type = g_value_get_enum (value);
-      break;
-    case PROP_ID:
-      break;
-    case PROP_CONFERENCE:
-      self->priv->conference = FS_MSN_CONFERENCE (g_value_dup_object (value));
-      break;
-    case PROP_TOS:
-      if (conference)
-        GST_OBJECT_LOCK (conference);
-      self->priv->tos = g_value_get_uint (value);
-      if (self->priv->stream)
-        fs_msn_stream_set_tos_locked (self->priv->stream, self->priv->tos);
-      if (conference)
-        GST_OBJECT_UNLOCK (conference);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-
-  if (conference)
-    gst_object_unref (conference);
-}
-
-static void
-fs_msn_session_constructed (GObject *object)
-{
-  FsMsnSession *self = FS_MSN_SESSION (object);
-  GstPad *pad;
-
-  g_assert (self->priv->conference);
-
-  self->valve = gst_element_factory_make ("valve", NULL);
-
-  if (!self->valve)
-  {
-    self->priv->construction_error = g_error_new (FS_ERROR,
-        FS_ERROR_CONSTRUCTION, "Could not make sink valve");
-    return;
-  }
-
-  if (!gst_bin_add (GST_BIN (self->priv->conference), self->valve))
-  {
-    self->priv->construction_error = g_error_new (FS_ERROR,
-        FS_ERROR_CONSTRUCTION, "Could not add valve to conference");
-    return;
-  }
-
-  g_object_set (G_OBJECT (self->valve), "drop", TRUE, NULL);
-
-  pad = gst_element_get_static_pad (self->valve, "sink");
-  self->priv->media_sink_pad = gst_ghost_pad_new ("sink1", pad);
-  gst_object_unref (pad);
-
-  if (!self->priv->media_sink_pad)
-  {
-    self->priv->construction_error = g_error_new (FS_ERROR,
-        FS_ERROR_CONSTRUCTION, "Could not create sink ghost pad");
-    return;
-  }
-
-  gst_pad_set_active (self->priv->media_sink_pad, TRUE);
-  if (!gst_element_add_pad (GST_ELEMENT (self->priv->conference),
-          self->priv->media_sink_pad))
-  {
-    self->priv->construction_error = g_error_new (FS_ERROR,
-        FS_ERROR_CONSTRUCTION, "Could not add sink pad to conference");
-    gst_object_unref (self->priv->media_sink_pad);
-    self->priv->media_sink_pad = NULL;
-    return;
-  }
-
-  gst_element_sync_state_with_parent (self->valve);
-
-  if (G_OBJECT_CLASS (fs_msn_session_parent_class)->constructed)
-    G_OBJECT_CLASS (fs_msn_session_parent_class)->constructed (object);
-}
-
-
-static void
-_remove_stream (gpointer user_data,
-                GObject *where_the_object_was)
-{
-  FsMsnSession *self = FS_MSN_SESSION (user_data);
-  FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-
-  if (!conference)
-    return;
-
-  GST_OBJECT_LOCK (conference);
-  if (self->priv->stream == (FsMsnStream *) where_the_object_was)
-    self->priv->stream = NULL;
-  GST_OBJECT_UNLOCK (conference);
-  gst_object_unref (conference);
-}
-
-/**
- * fs_msn_session_new_stream:
- * @session: an #FsMsnSession
- * @participant: #FsParticipant of a participant for the new stream
- * @direction: #FsStreamDirection describing the direction of the new stream
- * that will be created for this participant
- * @error: location of a #GError, or NULL if no error occured
- *
- * This function creates a stream for the given participant into the active
- * session.
- *
- * Returns: the new #FsStream that has been created. User must unref the
- * #FsStream when the stream is ended. If an error occured, returns NULL.
- */
-static FsStream *
-fs_msn_session_new_stream (FsSession *session,
-                           FsParticipant *participant,
-                           FsStreamDirection direction,
-                           GError **error)
-{
-  FsMsnSession *self = FS_MSN_SESSION (session);
-  FsMsnParticipant *msnparticipant = NULL;
-  FsStream *new_stream = NULL;
-  FsMsnConference *conference;
-
-  if (!FS_IS_MSN_PARTICIPANT (participant))
-  {
-    g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
-        "You have to provide a participant of type MSN");
-    return NULL;
-  }
-
-  conference = fs_msn_session_get_conference (self, error);
-  if (!conference)
-    return FALSE;
-
-  GST_OBJECT_LOCK (conference);
-  if (self->priv->stream)
-    goto already_have_stream;
-  GST_OBJECT_UNLOCK (conference);
-
-  msnparticipant = FS_MSN_PARTICIPANT (participant);
-
-  new_stream = FS_STREAM_CAST (fs_msn_stream_new (self, msnparticipant,
-          direction, conference));
-
-  GST_OBJECT_LOCK (conference);
-  if (self->priv->stream)
-  {
-    g_object_unref (new_stream);
-    goto already_have_stream;
-  }
-  self->priv->stream = (FsMsnStream *) new_stream;
-  g_object_weak_ref (G_OBJECT (new_stream), _remove_stream, self);
-
-  fs_msn_stream_set_tos_locked (self->priv->stream, self->priv->tos);
-  GST_OBJECT_UNLOCK (conference);
-
-  gst_object_unref (conference);
-
-
-  return new_stream;
-
- already_have_stream:
-  GST_OBJECT_UNLOCK (conference);
-  gst_object_unref (conference);
-
-  g_set_error (error, FS_ERROR, FS_ERROR_ALREADY_EXISTS,
-        "There already is a stream in this session");
-  return NULL;
-}
-
-FsMsnSession *
-fs_msn_session_new (FsMediaType media_type,
-    FsMsnConference *conference,
-    GError **error)
-{
-  FsMsnSession *session = g_object_new (FS_TYPE_MSN_SESSION,
-      "media-type", media_type,
-      "conference", conference,
-      NULL);
-
-  if (!session)
-  {
-    *error = g_error_new (FS_ERROR, FS_ERROR_CONSTRUCTION,
-        "Could not create object");
-  }
-  else if (session->priv->construction_error)
-  {
-    g_propagate_error (error, session->priv->construction_error);
-    g_object_unref (session);
-    return NULL;
-  }
-
-  return session;
-}
-
-
-static GType
-fs_msn_session_get_stream_transmitter_type (FsSession *session,
-    const gchar *transmitter)
-{
-  return FS_TYPE_MSN_STREAM;
-}
diff --git a/gst/fsmsnconference/fs-msn-session.h b/gst/fsmsnconference/fs-msn-session.h
deleted file mode 100644
index 79189e17..00000000
--- a/gst/fsmsnconference/fs-msn-session.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Farstream - Farstream MSN Session
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-session.h - A Farstream Msn Session gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_SESSION_H__
-#define __FS_MSN_SESSION_H__
-
-#include <gst/gst.h>
-
-#include <farstream/fs-session.h>
-
-#include "fs-msn-conference.h"
-
-G_BEGIN_DECLS
-
-/* TYPE MACROS */
-#define FS_TYPE_MSN_SESSION \
-  (fs_msn_session_get_type ())
-#define FS_MSN_SESSION(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), FS_TYPE_MSN_SESSION, FsMsnSession))
-#define FS_MSN_SESSION_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), FS_TYPE_MSN_SESSION, FsMsnSessionClass))
-#define FS_IS_MSN_SESSION(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FS_TYPE_MSN_SESSION))
-#define FS_IS_MSN_SESSION_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), FS_TYPE_MSN_SESSION))
-#define FS_MSN_SESSION_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), FS_TYPE_MSN_SESSION, FsMsnSessionClass))
-#define FS_MSN_SESSION_CAST(obj) ((FsMsnSession *) (obj))
-
-typedef struct _FsMsnSession FsMsnSession;
-typedef struct _FsMsnSessionClass FsMsnSessionClass;
-typedef struct _FsMsnSessionPrivate FsMsnSessionPrivate;
-
-struct _FsMsnSessionClass
-  {
-    FsSessionClass parent_class;
-  };
-
-/**
- * FsMsnSession:
- *
- */
-struct _FsMsnSession
-{
-  FsSession parent;
-
-  /* Protected by the conf lock */
-  GstElement *valve;
-
-  /*< private >*/
-
-  FsMsnSessionPrivate *priv;
-};
-
-
-GType fs_msn_session_get_type (void);
-
-FsMsnSession *fs_msn_session_new (FsMediaType media_type,
-    FsMsnConference *conference,
-    GError **error);
-
-void fs_msn_session_new_recv_pad (FsMsnSession *session,
-    GstPad *new_pad,
-    guint32 ssrc, guint pt);
-
-G_END_DECLS
-
-#endif /* __FS_MSN_SESSION_H__ */
diff --git a/gst/fsmsnconference/fs-msn-stream.c b/gst/fsmsnconference/fs-msn-stream.c
deleted file mode 100644
index 7ac0a85e..00000000
--- a/gst/fsmsnconference/fs-msn-stream.c
+++ /dev/null
@@ -1,912 +0,0 @@
-/*
- * Farstream - Farstream MSN Stream
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *  @author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * fs-msn-stream.c - A Farstream MSN Stream gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-/**
- * SECTION:fs-msn-stream
- * @short_description: A MSN stream in a #FsMsnSession in a #FsMsnConference
- *
- * The #FsMsnStream::direction property can be used to pause the stream, but not
- * to change the direction between sending and receiving since this protocol
- * is unidirectional.
- *
- * The "foundation" field of the local #FsCandidate contains the "recipient-id"
- * that must be transmitted to the peer.
- *
- * The session id can either be retrieved as a property, but it is also
- * put into every #FsCandidate in the "username" field.
- *
- * If the peer started the webcam session, it picks the session-id, it can then
- * be set either in the transmitter parameters field of fs_session_new_stream()
- * or by putting it in the "username" field of the remote #FsCandidate.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-stream.h"
-
-#include <arpa/inet.h>
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <gst/gst.h>
-
-#include <gst/base/gstbasesrc.h>
-
-
-#include "fs-msn-connection.h"
-
-
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-/* Signals */
-enum
-{
-  LAST_SIGNAL
-};
-
-/* props */
-enum
-{
-  PROP_0,
-  PROP_DIRECTION,
-  PROP_PARTICIPANT,
-  PROP_SESSION,
-  PROP_CONFERENCE,
-  PROP_SESSION_ID,
-  PROP_INITIAL_PORT
-};
-
-
-
-struct _FsMsnStreamPrivate
-{
-  FsMsnConference *conference;
-  FsMsnSession *session;
-  FsMsnParticipant *participant;
-  FsStreamDirection direction;
-  GstElement *codecbin;
-  GstElement *recv_valve;
-  GstPad *src_pad;
-  FsMsnConnection *connection;
-
-  guint session_id;
-  guint initial_port;
-
-  gint fd;
-  gint tos;
-
-  GMutex mutex; /* protects the conference */
-};
-
-
-G_DEFINE_TYPE(FsMsnStream, fs_msn_stream, FS_TYPE_STREAM);
-
-#define FS_MSN_STREAM_GET_PRIVATE(o)  \
-   (G_TYPE_INSTANCE_GET_PRIVATE ((o), FS_TYPE_MSN_STREAM, FsMsnStreamPrivate))
-
-static void fs_msn_stream_dispose (GObject *object);
-static void fs_msn_stream_finalize (GObject *object);
-
-static void fs_msn_stream_get_property (GObject *object,
-                                        guint prop_id,
-                                        GValue *value,
-                                        GParamSpec *pspec);
-static void fs_msn_stream_set_property (GObject *object,
-                                        guint prop_id,
-                                        const GValue *value,
-                                        GParamSpec *pspec);
-
-static gboolean
-fs_msn_stream_set_transmitter (FsStream *stream,
-    const gchar *transmitter,
-    GParameter *stream_transmitter_parameters,
-    guint stream_transmitter_n_parameters,
-    GError **error);
-
-static gboolean fs_msn_stream_add_remote_candidates (FsStream *stream,
-    GList *candidates,
-    GError **error);
-
-static void _local_candidates_prepared (FsMsnConnection *connection,
-    gpointer user_data);
-
-static void _new_local_candidate (
-    FsMsnConnection *connection,
-    FsCandidate *candidate,
-    gpointer user_data);
-
-static void
-_connected (
-    FsMsnConnection *connection,
-    guint fd,
-    gpointer user_data);
-
-static void
-_connection_failed (FsMsnConnection *connection, FsMsnStream *self);
-
-
-static void
-fs_msn_stream_class_init (FsMsnStreamClass *klass)
-{
-  GObjectClass *gobject_class;
-  FsStreamClass *stream_class = FS_STREAM_CLASS (klass);
-
-  gobject_class = (GObjectClass *) klass;
-
-  gobject_class->set_property = fs_msn_stream_set_property;
-  gobject_class->get_property = fs_msn_stream_get_property;
-  gobject_class->dispose = fs_msn_stream_dispose;
-  gobject_class->finalize = fs_msn_stream_finalize;
-
-  stream_class->add_remote_candidates = fs_msn_stream_add_remote_candidates;
-  stream_class->set_transmitter = fs_msn_stream_set_transmitter;
-
-  g_type_class_add_private (klass, sizeof (FsMsnStreamPrivate));
-
-  g_object_class_override_property (gobject_class,
-      PROP_DIRECTION,
-      "direction");
-  g_object_class_override_property (gobject_class,
-      PROP_PARTICIPANT,
-      "participant");
-  g_object_class_override_property (gobject_class,
-      PROP_SESSION,
-      "session");
-
-  g_object_class_install_property (gobject_class,
-      PROP_CONFERENCE,
-      g_param_spec_object ("conference",
-          "The Conference this stream refers to",
-          "This is a conveniance pointer for the Conference",
-          FS_TYPE_MSN_CONFERENCE,
-          G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (gobject_class,
-      PROP_SESSION_ID,
-      g_param_spec_uint ("session-id",
-          "The session-id of the session",
-          "This is the session-id of the MSN session",
-          0, 9999, 0,
-          G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (gobject_class,
-      PROP_INITIAL_PORT,
-      g_param_spec_uint ("initial-port",
-          "The initial port to listen on",
-          "The initial port to try to listen on for incoming connection."
-          " If already used, port+1 is tried until one succeeds",
-          1025, 65535, 1025,
-          G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-fs_msn_stream_init (FsMsnStream *self)
-{
-  /* member init */
-  self->priv = FS_MSN_STREAM_GET_PRIVATE (self);
-
-  self->priv->session = NULL;
-  self->priv->participant = NULL;
-  self->priv->fd = -1;
-
-  self->priv->direction = FS_DIRECTION_NONE;
-
-  g_mutex_init (&self->priv->mutex);
-}
-
-
-static FsMsnConference *
-fs_msn_stream_get_conference (FsMsnStream *self, GError **error)
-{
-  FsMsnConference *conference;
-
-  g_mutex_lock (&self->priv->mutex);
-  conference = self->priv->conference;
-  if (conference)
-    g_object_ref (conference);
-  g_mutex_unlock (&self->priv->mutex);
-
-  if (!conference)
-    g_set_error (error, FS_ERROR, FS_ERROR_DISPOSED,
-        "Called function after stream has been disposed");
-
-  return conference;
-}
-
-static void
-fs_msn_stream_dispose (GObject *object)
-{
-  FsMsnStream *self = FS_MSN_STREAM (object);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-
-  if (!conference)
-    return;
-
-  g_mutex_lock (&self->priv->mutex);
-  self->priv->conference = NULL;
-  g_mutex_unlock (&self->priv->mutex);
-
-  if (self->priv->src_pad)
-  {
-    gst_pad_set_active (self->priv->src_pad, FALSE);
-    gst_element_remove_pad (GST_ELEMENT (conference), self->priv->src_pad);
-    self->priv->src_pad = NULL;
-  }
-
-  if (self->priv->recv_valve)
-  {
-    gst_object_unref (self->priv->recv_valve);
-    self->priv->recv_valve = NULL;
-  }
-
-  if (self->priv->codecbin)
-  {
-    gst_element_set_locked_state (self->priv->codecbin, TRUE);
-    gst_element_set_state (self->priv->codecbin, GST_STATE_NULL);
-    gst_bin_remove (GST_BIN (conference), self->priv->codecbin);
-    self->priv->codecbin = NULL;
-  }
-
-  if (self->priv->participant)
-  {
-    g_object_unref (self->priv->participant);
-    self->priv->participant = NULL;
-  }
-
-  if (self->priv->session)
-  {
-    g_object_unref (self->priv->session);
-    self->priv->session = NULL;
-  }
-
-  if (self->priv->connection)
-  {
-    g_object_unref (self->priv->connection);
-    self->priv->connection = NULL;
-  }
-
-  gst_object_unref (conference);
-  gst_object_unref (conference);
-
-  G_OBJECT_CLASS (fs_msn_stream_parent_class)->dispose (object);
-}
-
-static void
-fs_msn_stream_finalize (GObject *object)
-{
-  FsMsnStream *self = FS_MSN_STREAM (object);
-
-  g_mutex_clear (&self->priv->mutex);
-
-  G_OBJECT_CLASS (fs_msn_stream_parent_class)->finalize (object);
-}
-
-
-static void
-fs_msn_stream_get_property (GObject *object,
-                            guint prop_id,
-                            GValue *value,
-                            GParamSpec *pspec)
-{
-  FsMsnStream *self = FS_MSN_STREAM (object);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-
-  if (!conference &&
-      !(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)))
-    return;
-
-  if (conference)
-    GST_OBJECT_LOCK (conference);
-
-  switch (prop_id)
-  {
-    case PROP_SESSION:
-      g_value_set_object (value, self->priv->session);
-      break;
-    case PROP_PARTICIPANT:
-      g_value_set_object (value, self->priv->participant);
-      break;
-    case PROP_DIRECTION:
-      g_value_set_flags (value, self->priv->direction);
-      break;
-    case PROP_CONFERENCE:
-      g_value_set_object (value, self->priv->conference);
-      break;
-    case PROP_SESSION_ID:
-      g_object_get_property (G_OBJECT (self->priv->connection), "session-id",
-          value);
-      break;
-    case PROP_INITIAL_PORT:
-      g_value_set_uint (value, self->priv->initial_port);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-
-  if (conference)
-  {
-    GST_OBJECT_UNLOCK (conference);
-    gst_object_unref (conference);
-  }
-}
-
-static void
-fs_msn_stream_set_property (GObject *object,
-                            guint prop_id,
-                            const GValue *value,
-                            GParamSpec *pspec)
-{
-  FsMsnStream *self = FS_MSN_STREAM (object);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-
-  if (!conference &&
-      !(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)))
-    return;
-
-  if (conference)
-    GST_OBJECT_LOCK (conference);
-
-  switch (prop_id)
-  {
-    case PROP_SESSION:
-      self->priv->session = FS_MSN_SESSION (g_value_dup_object (value));
-      break;
-    case PROP_PARTICIPANT:
-      self->priv->participant = FS_MSN_PARTICIPANT (g_value_dup_object (value));
-      break;
-    case PROP_DIRECTION:
-      if (g_value_get_flags (value) != self->priv->direction)
-      {
-        GstElement *recv_valve = NULL;
-        GstElement *session_valve = NULL;
-
-        if (!conference ||
-            !self->priv->recv_valve ||
-            !self->priv->session)
-        {
-          self->priv->direction = g_value_get_flags (value);
-          break;
-        }
-
-        if (self->priv->recv_valve)
-          recv_valve = gst_object_ref (self->priv->recv_valve);
-        if (self->priv->session->valve)
-          session_valve = gst_object_ref (self->priv->session->valve);
-
-        self->priv->direction =
-          g_value_get_flags (value) & conference->max_direction;
-
-        if (self->priv->direction == FS_DIRECTION_NONE)
-        {
-          GST_OBJECT_UNLOCK (conference);
-          if (recv_valve)
-            g_object_set (recv_valve, "drop", TRUE, NULL);
-          g_object_set (session_valve, "drop", TRUE, NULL);
-          GST_OBJECT_LOCK (conference);
-        }
-        else if (self->priv->direction == FS_DIRECTION_SEND)
-        {
-          if (self->priv->codecbin)
-          {
-            GST_OBJECT_UNLOCK (conference);
-            g_object_set (session_valve, "drop", FALSE, NULL);
-            GST_OBJECT_LOCK (conference);
-          }
-        }
-        else if (self->priv->direction == FS_DIRECTION_RECV)
-        {
-          GST_OBJECT_UNLOCK (conference);
-          if (recv_valve)
-            g_object_set (recv_valve, "drop", FALSE, NULL);
-          GST_OBJECT_LOCK (conference);
-        }
-
-        if (session_valve)
-          gst_object_unref (session_valve);
-        if (recv_valve)
-          gst_object_unref (recv_valve);
-      }
-      self->priv->direction = g_value_get_flags (value);
-      break;
-    case PROP_CONFERENCE:
-      self->priv->conference = FS_MSN_CONFERENCE (g_value_dup_object (value));
-      break;
-    case PROP_SESSION_ID:
-      self->priv->session_id = g_value_get_uint (value);
-      if (self->priv->session_id == 0)
-        self->priv->session_id = g_random_int_range (9000, 9999);
-      break;
-    case PROP_INITIAL_PORT:
-      self->priv->initial_port = g_value_get_uint (value);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-
-  if (conference)
-  {
-    GST_OBJECT_UNLOCK (conference);
-    gst_object_unref (conference);
-  }
-}
-
-static void
-_local_candidates_prepared (FsMsnConnection *connection,
-    gpointer user_data)
-{
-  FsMsnStream *self = FS_MSN_STREAM (user_data);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-
-  if (!conference)
-    return;
-
-  gst_element_post_message (GST_ELEMENT (conference),
-      gst_message_new_element (GST_OBJECT (conference),
-          gst_structure_new ("farstream-local-candidates-prepared",
-              "stream", FS_TYPE_STREAM, self,
-              NULL)));
-
-  gst_object_unref (conference);
-}
-
-static void
-_new_local_candidate (
-    FsMsnConnection *connection,
-    FsCandidate *candidate,
-    gpointer user_data)
-{
-  FsMsnStream *self = FS_MSN_STREAM (user_data);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-
-  if (!conference)
-    return;
-
-  gst_element_post_message (GST_ELEMENT (conference),
-      gst_message_new_element (GST_OBJECT (conference),
-          gst_structure_new ("farstream-new-local-candidate",
-              "stream", FS_TYPE_STREAM, self,
-              "candidate", FS_TYPE_CANDIDATE, candidate,
-              NULL)));
-
-  gst_object_unref (conference);
-}
-
-static void
-_connected (
-    FsMsnConnection *connection,
-    guint fd,
-    gpointer user_data)
-{
-  FsMsnStream *self = FS_MSN_STREAM (user_data);
-  GError *error = NULL;
-  GstPad *pad;
-  GstElement *fdelem;
-  int checkfd;
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-  GstElement *codecbin = NULL;
-  GstElement *recv_valve = NULL;
-  GstElement *send_valve = NULL;
-  gboolean drop;
-
-  if (!conference)
-    goto error;
-
-  GST_DEBUG ("******** CONNECTED %d**********", fd);
-
-  gst_element_post_message (GST_ELEMENT (conference),
-      gst_message_new_element (GST_OBJECT (conference),
-          gst_structure_new ("farstream-component-state-changed",
-              "stream", FS_TYPE_STREAM, self,
-              "component", G_TYPE_UINT, 1,
-              "state", FS_TYPE_STREAM_STATE, FS_STREAM_STATE_READY,
-              NULL)));
-
-  if (self->priv->conference->max_direction == FS_DIRECTION_RECV)
-    codecbin = gst_parse_bin_from_description (
-        "fdsrc name=fdsrc do-timestamp=true ! mimdec ! valve name=recv_valve", TRUE, &error);
-  else
-    codecbin = gst_parse_bin_from_description (
-        "videoconvert ! videoscale ! mimenc name=enc !"
-        " fdsink name=fdsink sync=false async=false",
-        TRUE, &error);
-
-  if (!codecbin)
-  {
-    g_prefix_error (&error, "Error creating codecbin: ");
-    fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-        error->message);
-    g_clear_error (&error);
-    goto error;
-  }
-
-  /* So we don't require an unlreased gst-plugins-bad mimenc */
-  if (self->priv->conference->max_direction == FS_DIRECTION_SEND)
-  {
-    GstElement *mimenc = gst_bin_get_by_name (GST_BIN (codecbin), "enc");
-    if (g_object_class_find_property (
-            G_OBJECT_GET_CLASS (mimenc), "paused-mode"))
-      g_object_set (mimenc, "paused-mode", TRUE, NULL);
-    gst_object_unref (mimenc);
-  }
-
-  if (self->priv->conference->max_direction == FS_DIRECTION_RECV)
-  {
-    fdelem = gst_bin_get_by_name (GST_BIN (codecbin), "fdsrc");
-    gst_base_src_set_format (GST_BASE_SRC (fdelem), GST_FORMAT_TIME);
-  }
-  else
-  {
-    fdelem = gst_bin_get_by_name (GST_BIN (codecbin), "fdsink");
-  }
-
-  if (!fdelem)
-  {
-    fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-        "Could not get fd element");
-    goto error;
-  }
-
-  g_object_set (fdelem, "fd", fd, NULL);
-  g_object_get (fdelem, "fd", &checkfd, NULL);
-  gst_object_unref (fdelem);
-
-  if (fd != checkfd)
-  {
-    fs_stream_emit_error (FS_STREAM (self), FS_ERROR_INTERNAL,
-        "Could not set file descriptor");
-    goto error;
-  }
-
-
-  if (self->priv->conference->max_direction == FS_DIRECTION_RECV)
-    pad = gst_element_get_static_pad (codecbin, "src");
-  else
-    pad = gst_element_get_static_pad (codecbin, "sink");
-
-  if (!pad)
-  {
-    fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-        "Could not get codecbin pad");
-    goto error;
-  }
-
-  if (!gst_bin_add (GST_BIN (conference), codecbin))
-  {
-    gst_object_unref (pad);
-    fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-        "Could not add codecbin to the conference");
-    goto error;
-  }
-
-  GST_OBJECT_LOCK (conference);
-  self->priv->fd = fd;
-  self->priv->codecbin = gst_object_ref (codecbin);
-  GST_OBJECT_UNLOCK (conference);
-
-  if (self->priv->conference->max_direction == FS_DIRECTION_RECV)
-  {
-    FsCodec *mimic_codec;
-    GstPad *src_pad;
-
-    src_pad = gst_ghost_pad_new ("src_1_1_1", pad);
-    gst_object_unref (pad);
-
-    GST_OBJECT_LOCK (conference);
-    self->priv->src_pad =  gst_object_ref (src_pad);
-    GST_OBJECT_UNLOCK (conference);
-
-    gst_pad_set_active (src_pad, TRUE);
-    if (!gst_element_add_pad (GST_ELEMENT (conference), src_pad))
-    {
-      fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-          "Could not add src_1_1_1 pad");
-      gst_object_unref (src_pad);
-      goto error;
-    }
-
-    recv_valve = gst_bin_get_by_name (GST_BIN (codecbin), "recv_valve");
-
-    if (!recv_valve)
-    {
-       fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-           "Could not get recv_valve");
-       gst_object_unref (src_pad);
-       goto error;
-    }
-
-    GST_OBJECT_LOCK (conference);
-    self->priv->recv_valve = gst_object_ref (recv_valve);
-    drop = !(self->priv->direction & FS_DIRECTION_RECV);
-    GST_OBJECT_UNLOCK (conference);
-
-    g_object_set (recv_valve, "drop", drop, NULL);
-
-
-    mimic_codec = fs_codec_new (0, "mimic",
-        FS_MEDIA_TYPE_VIDEO, 0);
-    fs_stream_emit_src_pad_added (FS_STREAM (self), src_pad, mimic_codec);
-    fs_codec_destroy (mimic_codec);
-    gst_object_unref (src_pad);
-
-  }
-  else
-  {
-    GstPad *valvepad;
-
-    GST_OBJECT_LOCK (conference);
-    if (self->priv->session->valve)
-      send_valve = gst_object_ref (self->priv->session->valve);
-    GST_OBJECT_UNLOCK (conference);
-
-    if (!send_valve)
-    {
-      fs_stream_emit_error (FS_STREAM (self), FS_ERROR_DISPOSED,
-          "Session was disposed");
-      goto error;
-    }
-
-    valvepad = gst_element_get_static_pad (send_valve, "src");
-
-    if (!valvepad)
-    {
-      gst_object_unref (pad);
-      fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-          "Could not get valve sink pad");
-      goto error;
-    }
-
-    if (GST_PAD_LINK_FAILED (gst_pad_link (valvepad, pad)))
-    {
-      gst_object_unref (valvepad);
-      gst_object_unref (pad);
-      fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-          "Could not link valve to codec bin");
-      goto error;
-    }
-    gst_object_unref (valvepad);
-    gst_object_unref (pad);
-  }
-
-  if (!gst_element_sync_state_with_parent (codecbin))
-  {
-    fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
-        "Could not start codec bin");
-    goto error;
-  }
-
-  if (self->priv->conference->max_direction == FS_DIRECTION_SEND)
-  {
-    GST_OBJECT_LOCK (conference);
-    fs_msn_stream_set_tos_locked (self, self->priv->tos);
-    drop = !(self->priv->direction & FS_DIRECTION_SEND);
-    GST_OBJECT_UNLOCK (conference);
-    g_object_set (send_valve, "drop", drop, NULL);
-  }
-
- error:
-
-  if (send_valve)
-    gst_object_unref (send_valve);
-  if (recv_valve)
-    gst_object_unref (recv_valve);
-  if (codecbin)
-    gst_object_unref (codecbin);
-  if (conference)
-    gst_object_unref (conference);
-}
-
-static void
-_connection_failed (FsMsnConnection *connection, FsMsnStream *self)
-{
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
-
-  if (!conference)
-    return;
-
-  GST_OBJECT_LOCK (conference);
-  self->priv->fd = -1;
-  GST_OBJECT_UNLOCK (conference);
-
-  gst_element_post_message (GST_ELEMENT (conference),
-      gst_message_new_element (GST_OBJECT (conference),
-          gst_structure_new ("farstream-component-state-changed",
-              "stream", FS_TYPE_STREAM, self,
-              "component", G_TYPE_UINT, 1,
-              "state", FS_TYPE_STREAM_STATE, FS_STREAM_STATE_FAILED,
-              NULL)));
-
-  fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONNECTION_FAILED,
-      "Could not establish streaming connection");
-
-  gst_object_unref (conference);
-}
-
-/**
- * fs_msn_stream_add_remote_candidate:
- */
-static gboolean
-fs_msn_stream_add_remote_candidates (FsStream *stream, GList *candidates,
-                                     GError **error)
-{
-  FsMsnStream *self = FS_MSN_STREAM (stream);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, error);
-  FsMsnConnection *conn = NULL;
-  gboolean ret = FALSE;
-
-  if (!conference)
-    return FALSE;
-
-  GST_OBJECT_LOCK (conference);
-  if (self->priv->connection)
-    conn = g_object_ref (self->priv->connection);
-  GST_OBJECT_UNLOCK (conference);
-
-  if (conn)
-  {
-    ret = fs_msn_connection_add_remote_candidates (conn, candidates, error);
-    g_object_unref (conn);
-  }
-
-  if (ret)
-    gst_element_post_message (GST_ELEMENT (conference),
-        gst_message_new_element (GST_OBJECT (conference),
-            gst_structure_new ("farstream-component-state-changed",
-                "stream", FS_TYPE_STREAM, self,
-                "component", G_TYPE_UINT, 1,
-                "state", FS_TYPE_STREAM_STATE, FS_STREAM_STATE_CONNECTING,
-                NULL)));
-
-  gst_object_unref (conference);
-
-  return ret;
-}
-
-
-/**
- * fs_msn_stream_new:
- * @session: The #FsMsnSession this stream is a child of
- * @participant: The #FsMsnParticipant this stream is for
- * @direction: the initial #FsDirection for this stream
- *
- *
- * This function create a new stream
- *
- * Returns: the newly created string or NULL on error
- */
-
-FsMsnStream *
-fs_msn_stream_new (FsMsnSession *session,
-    FsMsnParticipant *participant,
-    FsStreamDirection direction,
-    FsMsnConference *conference)
-{
-  FsMsnStream *self;
-
-  self = g_object_new (FS_TYPE_MSN_STREAM,
-      "session", session,
-      "participant", participant,
-      "direction", direction,
-      "conference", conference,
-      NULL);
-
-  return self;
-}
-
-void
-fs_msn_stream_set_tos_locked (FsMsnStream *self, gint tos)
-{
-  self->priv->tos = tos;
-
-  if (self->priv->fd < 0)
-    return;
-
-  if (setsockopt (self->priv->fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0)
-    GST_WARNING ( "could not set socket ToS: %s", g_strerror (errno));
-
-#ifdef IPV6_TCLASS
-  if (setsockopt (self->priv->fd, IPPROTO_IPV6, IPV6_TCLASS,
-          &tos, sizeof (tos)) < 0)
-    GST_WARNING ("could not set TCLASS: %s", g_strerror (errno));
-#endif
-}
-
-
-static gboolean
-fs_msn_stream_set_transmitter (FsStream *stream,
-    const gchar *transmitter,
-    GParameter *stream_transmitter_parameters,
-    guint stream_transmitter_n_parameters,
-    GError **error)
-{
-  FsMsnStream *self = FS_MSN_STREAM (stream);
-  FsMsnConference *conference = fs_msn_stream_get_conference (self, error);
-  gboolean producer;
-  guint i;
-
-  if (!conference)
-    return FALSE;
-
-  for (i = 0; i < stream_transmitter_n_parameters; i++)
-  {
-    if (!g_ascii_strcasecmp (stream_transmitter_parameters[i].name,
-            "session-id"))
-    {
-      if (g_value_get_uint (&stream_transmitter_parameters[i].value) >= 1025 &&
-          g_value_get_uint (&stream_transmitter_parameters[i].value) < 65536)
-        self->priv->session_id =
-            g_value_get_uint (&stream_transmitter_parameters[i].value);
-    }
-    else if (!g_ascii_strcasecmp (stream_transmitter_parameters[i].name,
-            "initial-port"))
-    {
-      if (g_value_get_uint (&stream_transmitter_parameters[i].value) < 10000)
-        self->priv->initial_port =
-            g_value_get_uint (&stream_transmitter_parameters[i].value);
-    }
-  }
-
-  if (self->priv->conference->max_direction == FS_DIRECTION_RECV)
-    producer = FALSE;
-  else if (self->priv->conference->max_direction == FS_DIRECTION_SEND)
-    producer = TRUE;
-  else
-    g_assert_not_reached ();
-
-
-  self->priv->connection = fs_msn_connection_new (self->priv->session_id,
-      producer, self->priv->initial_port);
-
-  g_signal_connect (self->priv->connection,
-      "new-local-candidate",
-      G_CALLBACK (_new_local_candidate), self);
-  g_signal_connect (self->priv->connection,
-      "local-candidates-prepared",
-      G_CALLBACK (_local_candidates_prepared), self);
-  g_signal_connect (self->priv->connection,
-      "connected",
-      G_CALLBACK (_connected), self);
-  g_signal_connect (self->priv->connection,
-      "connection-failed",
-      G_CALLBACK (_connection_failed), self);
-
-  if (!fs_msn_connection_gather_local_candidates (self->priv->connection,
-          error))
-  {
-    g_object_unref (self->priv->connection);
-    self->priv->connection = NULL;
-    g_object_unref (conference);
-    return FALSE;
-  }
-
-  g_object_unref (conference);
-
-  return TRUE;
-}
diff --git a/gst/fsmsnconference/fs-msn-stream.h b/gst/fsmsnconference/fs-msn-stream.h
deleted file mode 100644
index 725c8968..00000000
--- a/gst/fsmsnconference/fs-msn-stream.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Farstream - Farstream MSN Stream
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007 Collabora Ltd.
- *  @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * fs-msn-stream.h - A Farstream MSN Stream
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- */
-
-#ifndef __FS_MSN_STREAM_H__
-#define __FS_MSN_STREAM_H__
-
-#include <farstream/fs-stream.h>
-
-#include "fs-msn-participant.h"
-#include "fs-msn-session.h"
-
-G_BEGIN_DECLS
-
-/* TYPE MACROS */
-#define FS_TYPE_MSN_STREAM \
-  (fs_msn_stream_get_type ())
-#define FS_MSN_STREAM(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST((obj), FS_TYPE_MSN_STREAM, FsMsnStream))
-#define FS_MSN_STREAM_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST((klass), FS_TYPE_MSN_STREAM, FsMsnStreamClass))
-#define FS_IS_MSN_STREAM(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE((obj), FS_TYPE_MSN_STREAM))
-#define FS_IS_MSN_STREAM_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE((klass), FS_TYPE_MSN_STREAM))
-#define FS_MSN_STREAM_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), FS_TYPE_MSN_STREAM, FsMsnStreamClass))
-#define FS_MSN_STREAM_CAST(obj) ((FsMsnStream*) (obj))
-
-typedef struct _FsMsnStream FsMsnStream;
-typedef struct _FsMsnStreamClass FsMsnStreamClass;
-typedef struct _FsMsnStreamPrivate FsMsnStreamPrivate;
-
-
-struct _FsMsnStreamClass
-{
-  FsStreamClass parent_class;
-
-};
-
-/**
- * FsMsnStream:
- *
- */
-struct _FsMsnStream
-{
-  FsStream parent;
-
-  /*< private >*/
-  FsMsnStreamPrivate *priv;
-};
-
-GType fs_msn_stream_get_type (void);
-
-FsMsnStream *fs_msn_stream_new (FsMsnSession *session,
-    FsMsnParticipant *participant,
-    FsStreamDirection direction,
-    FsMsnConference *conference);
-
-void fs_msn_stream_set_tos_locked (FsMsnStream *self, gint tos);
-
-
-G_END_DECLS
-
-#endif /* __FS_MSN_STREAM_H__ */
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index a963967b..d50fc264 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -55,7 +55,6 @@ check_PROGRAMS = \
 	rtp/sendcodecs \
 	rtp/conference \
 	rtp/recvcodecs \
-	msn/conference \
 	utils/binadded
 
 AM_CFLAGS = \
@@ -156,10 +155,6 @@ rtp_sendcodecs_SOURCES = \
 rtp_recvcodecs_CFLAGS = $(AM_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
 rtp_recvcodecs_LDADD = $(LDADD) -lgstrtp-@GST_API_VERSION@
 
-msn_conference_CFLAGS = $(AM_CFLAGS)
-msn_conference_SOURCES = \
-	msn/conference.c
-
 utils_binadded_CFLAGS = $(AM_CFLAGS)
 utils_binadded_SOURCES = \
 	testutils.c \
diff --git a/tests/check/msn/conference.c b/tests/check/msn/conference.c
deleted file mode 100644
index 1e3a209e..00000000
--- a/tests/check/msn/conference.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/* Farstream unit tests for FsMsnConference
- *
- * Copyright (C) 2009 Collabora
- * @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
-*/
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <gst/check/gstcheck.h>
-#include <farstream/fs-conference.h>
-
-#include "check-threadsafe.h"
-
-GMainLoop *loop;
-int count = 0;
-
-#define WAITING_ON_LAST_CODEC   (1<<0)
-#define SHOULD_BE_LAST_CODEC    (1<<1)
-#define HAS_BEEN_RESET          (1<<2)
-
-gint max_buffer_count = 20;
-
-
-struct SimpleMsnConference {
-  GstElement *pipeline;
-  FsConference *conf;
-  FsSession *session;
-  FsParticipant *part;
-  FsStream *stream;
-
-  struct SimpleMsnConference *target;
-  FsStreamDirection direction;
-};
-
-static gboolean
-bus_watch (GstBus *bus, GstMessage *message, gpointer user_data)
-{
-  struct SimpleMsnConference *dat = user_data;
-
-  switch (GST_MESSAGE_TYPE (message))
-  {
-    case GST_MESSAGE_ELEMENT:
-      {
-        const GstStructure *s = gst_message_get_structure (message);
-        ts_fail_if (s==NULL, "NULL structure in element message");
-        if (gst_structure_has_name (s, "farstream-error"))
-        {
-          const GValue *value;
-          FsError errorno;
-          const gchar *error;
-
-          ts_fail_unless (
-              gst_structure_has_field_typed (s, "src-object", G_TYPE_OBJECT),
-              "farstream-error structure has no src-object field");
-          ts_fail_unless (
-              gst_structure_has_field_typed (s, "error-no", FS_TYPE_ERROR),
-              "farstream-error structure has no src-object field");
-          ts_fail_unless (
-              gst_structure_has_field_typed (s, "error-msg", G_TYPE_STRING),
-              "farstream-error structure has no src-object field");
-
-          value = gst_structure_get_value (s, "error-no");
-          errorno = g_value_get_enum (value);
-          error = gst_structure_get_string (s, "error-msg");
-
-          ts_fail ("Error on BUS (%d) %s", errorno, error);
-        }
-        else if (gst_structure_has_name (s, "farstream-new-local-candidate"))
-        {
-          FsStream *stream;
-          FsCandidate *candidate;
-          const GValue *value;
-
-          ts_fail_unless (
-              gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM),
-              "farstream-new-local-candidate structure has no stream field");
-          ts_fail_unless (
-              gst_structure_has_field_typed (s, "candidate", FS_TYPE_CANDIDATE),
-              "farstream-new-local-candidate structure has no candidate field");
-
-          value = gst_structure_get_value (s, "stream");
-          stream = g_value_get_object (value);
-
-          value = gst_structure_get_value (s, "candidate");
-          candidate = g_value_get_boxed (value);
-
-          ts_fail_unless (stream && candidate, "new-local-candidate with NULL"
-              " stream(%p) or candidate(%p)", stream, candidate);
-
-          if (dat->target)
-          {
-            GError *error = NULL;
-            GList *list = g_list_append (NULL, candidate);
-            gboolean add_remote_candidates_res;
-
-            GST_DEBUG ("Setting candidate: %s %d",
-                candidate->ip, candidate->port);
-            add_remote_candidates_res = fs_stream_add_remote_candidates (
-                dat->target->stream, list, &error);
-            ts_fail_unless (add_remote_candidates_res,
-                "Could not set remote candidate: %s",
-                error ? error->message : "No GError");
-            ts_fail_unless (error == NULL);
-            g_list_free (list);
-          }
-        }
-      }
-      break;
-    case GST_MESSAGE_ERROR:
-      {
-        GError *error = NULL;
-        gchar *debug = NULL;
-        gst_message_parse_error (message, &error, &debug);
-
-        ts_fail ("Got an error on the BUS (%d): %s (%s)", error->code,
-            error->message, debug);
-        g_error_free (error);
-        g_free (debug);
-      }
-      break;
-    case GST_MESSAGE_WARNING:
-      {
-        GError *error = NULL;
-        gchar *debug = NULL;
-        gst_message_parse_warning (message, &error, &debug);
-
-        GST_DEBUG ("%d: Got a warning on the BUS: %s (%s)",
-            error->code,
-            error->message, debug);
-        g_error_free (error);
-        g_free (debug);
-      }
-      break;
-    default:
-      break;
-  }
-
-  return TRUE;
-}
-
-static GstPadProbeReturn
-pad_probe_cb (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
-{
-  count++;
-
-  if (count > 20)
-    g_main_loop_quit (loop);
-
-  return GST_PAD_PROBE_OK;
-}
-
-static void
-stream_src_pad_added (FsStream *stream, GstPad *pad, FsCodec *codec,
-    struct SimpleMsnConference *dat)
-{
-  GstElement *sink = gst_element_factory_make ("fakesink", NULL);
-  GstPad *sinkpad;
-
-  GST_DEBUG ("pad added");
-
-  ts_fail_unless (sink != NULL);
-
-  ts_fail_unless (gst_bin_add (GST_BIN (dat->pipeline), sink));
-
-  sinkpad = gst_element_get_static_pad (sink, "sink");
-  ts_fail_unless (sinkpad != NULL);
-
-  gst_pad_add_probe (sinkpad, GST_PAD_PROBE_TYPE_BUFFER, pad_probe_cb, dat,
-    NULL);
-
-  ts_fail_if (GST_PAD_LINK_FAILED (gst_pad_link (pad, sinkpad)));
-
-  gst_object_unref (sinkpad);
-
-  ts_fail_if (gst_element_set_state (sink, GST_STATE_PLAYING) ==
-      GST_STATE_CHANGE_FAILURE);
-
-}
-
-struct SimpleMsnConference *
-setup_conference (FsStreamDirection dir, struct SimpleMsnConference *target)
-{
-  struct SimpleMsnConference *dat = g_new0 (struct SimpleMsnConference, 1);
-  GError *error = NULL;
-  GstBus *bus;
-  GParameter param = {NULL, {0}};
-  gint n_params = 0;
-  guint tos;
-
-  dat->target = target;
-  dat->direction = dir;
-
-  dat->pipeline = gst_pipeline_new (NULL);
-
-  bus = gst_element_get_bus (dat->pipeline);
-  gst_bus_add_watch (bus, bus_watch, dat);
-  gst_object_unref (bus);
-
-  if (dir == FS_DIRECTION_SEND)
-    dat->conf = FS_CONFERENCE (
-        gst_element_factory_make ("fsmsncamsendconference", NULL));
-  else
-    dat->conf = FS_CONFERENCE (
-        gst_element_factory_make ("fsmsncamrecvconference", NULL));
-  ts_fail_unless (dat->conf != NULL);
-
-  ts_fail_unless (gst_bin_add (GST_BIN (dat->pipeline),
-          GST_ELEMENT (dat->conf)));
-
-  dat->part = fs_conference_new_participant (dat->conf, &error);
-  ts_fail_unless (error == NULL, "Error: %s", error ? error->message: "");
-  ts_fail_unless (dat->part != NULL);
-
-  dat->session = fs_conference_new_session (dat->conf, FS_MEDIA_TYPE_VIDEO,
-      &error);
-  ts_fail_unless (dat->session != NULL, "Session create error: %s:",
-      error ? error->message : "No GError");
-  ts_fail_unless (error == NULL);
-
-  g_object_set (dat->session, "tos", 2, NULL);
-  g_object_get (dat->session, "tos", &tos, NULL);
-  ts_fail_unless (tos == 2);
-
-  if (dir == FS_DIRECTION_SEND)
-  {
-    GstPad *sinkpad, *srcpad;
-    GstElement *src;
-    src = gst_element_factory_make ("videotestsrc", NULL);
-    ts_fail_unless (src != NULL);
-    g_object_set (src, "is-live", TRUE, NULL);
-    ts_fail_unless (gst_bin_add (GST_BIN (dat->pipeline),
-            GST_ELEMENT (src)));
-
-    g_object_get (dat->session, "sink-pad", &sinkpad, NULL);
-    ts_fail_if (sinkpad == NULL);
-    srcpad = gst_element_get_static_pad (src, "src");
-    ts_fail_if (srcpad == NULL);
-
-    ts_fail_if (GST_PAD_LINK_FAILED (gst_pad_link ( srcpad, sinkpad)));
-    gst_object_unref (srcpad);
-    gst_object_unref (sinkpad);
-  }
-
-  if (target)
-  {
-    guint session_id = 0;
-    n_params = 1;
-    g_object_get (target->stream, "session-id", &session_id, NULL);
-    ts_fail_unless (session_id >= 9000 && session_id < 10000);
-    param.name = "session-id";
-    g_value_init (&param.value, G_TYPE_UINT);
-    g_value_set_uint (&param.value, session_id);
-  }
-
-  dat->stream = fs_session_new_stream (dat->session, dat->part, dir, &error);
-  ts_fail_unless (dat->stream != NULL);
-  ts_fail_unless (error == NULL);
-
-  fail_unless (fs_stream_set_transmitter (dat->stream, NULL, &param, n_params,
-          &error));
-  fail_unless (error == NULL);
-
-  g_signal_connect (dat->stream, "src-pad-added",
-      G_CALLBACK (stream_src_pad_added), dat);
-
-  ts_fail_if (gst_element_set_state (dat->pipeline, GST_STATE_PLAYING) ==
-      GST_STATE_CHANGE_FAILURE);
-
-  return dat;
-}
-
-static void
-free_conference (struct SimpleMsnConference *dat)
-{
-  ts_fail_if (gst_element_set_state (dat->pipeline, GST_STATE_NULL) ==
-      GST_STATE_CHANGE_FAILURE);
-
-  fs_session_destroy (dat->session);
-  gst_object_unref (dat->stream);
-  gst_object_unref (dat->session);
-  gst_object_unref (dat->part);
-  gst_object_unref (dat->pipeline);
-
-  free (dat);
-}
-
-
-GST_START_TEST (test_msnconference_new)
-{
-  struct SimpleMsnConference *senddat = setup_conference (FS_DIRECTION_SEND,
-      NULL);
-  struct SimpleMsnConference *recvdat = setup_conference (FS_DIRECTION_RECV,
-      NULL);
-
-
-  free_conference (senddat);
-  free_conference (recvdat);
-}
-GST_END_TEST;
-
-
-
-GST_START_TEST (test_msnconference_send_to_recv)
-{
-  struct SimpleMsnConference *senddat = setup_conference (FS_DIRECTION_SEND,
-      NULL);
-  struct SimpleMsnConference *recvdat = setup_conference (FS_DIRECTION_RECV,
-      senddat);
-
-  loop = g_main_loop_new (NULL, FALSE);
-
-  g_main_loop_run (loop);
-
-  free_conference (senddat);
-  free_conference (recvdat);
-  g_main_loop_unref (loop);
-}
-GST_END_TEST;
-
-
-GST_START_TEST (test_msnconference_recv_to_send)
-{
-  struct SimpleMsnConference *recvdat = setup_conference (FS_DIRECTION_RECV,
-      NULL);
-  struct SimpleMsnConference *senddat = setup_conference (FS_DIRECTION_SEND,
-      recvdat);
-
-  loop = g_main_loop_new (NULL, FALSE);
-
-  g_main_loop_run (loop);
-
-  free_conference (senddat);
-  free_conference (recvdat);
-  g_main_loop_unref (loop);
-}
-GST_END_TEST;
-
-
-GST_START_TEST (test_msnconference_error)
-{
-  struct SimpleMsnConference *dat = setup_conference (FS_DIRECTION_SEND,
-      NULL);
-  GError *error = NULL;
-
-  ts_fail_unless (
-      fs_conference_new_participant (dat->conf, &error) == NULL);
-  ts_fail_unless (error->domain == FS_ERROR &&
-      error->code == FS_ERROR_ALREADY_EXISTS);
-  g_clear_error (&error);
-
-
-  ts_fail_unless (
-      fs_conference_new_session (dat->conf, FS_MEDIA_TYPE_VIDEO, &error) == NULL);
-  ts_fail_unless (error->domain == FS_ERROR &&
-      error->code == FS_ERROR_ALREADY_EXISTS);
-  g_clear_error (&error);
-
-
-  ts_fail_unless (
-      fs_session_new_stream (dat->session, dat->part, FS_DIRECTION_SEND,
-          &error) == NULL);
-  ts_fail_unless (error->domain == FS_ERROR &&
-      error->code == FS_ERROR_ALREADY_EXISTS);
-  g_clear_error (&error);
-
-  fail_unless (fs_stream_set_transmitter (dat->stream, NULL, NULL, 0,
-          &error));
-  fail_unless (error == NULL);
-
-
-  free_conference (dat);
-}
-GST_END_TEST;
-
-static Suite *
-fsmsnconference_suite (void)
-{
-  Suite *s = suite_create ("fsmsnconference");
-  TCase *tc_chain;
-  GLogLevelFlags fatal_mask;
-
-  fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
-  fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
-  g_log_set_always_fatal (fatal_mask);
-
-  tc_chain = tcase_create ("fsmsnconference_new");
-  tcase_add_test (tc_chain, test_msnconference_new);
-  suite_add_tcase (s, tc_chain);
-
-
-  tc_chain = tcase_create ("fsmsnconference_send_to_recv");
-  tcase_add_test (tc_chain, test_msnconference_send_to_recv);
-  suite_add_tcase (s, tc_chain);
-
-  tc_chain = tcase_create ("fsmsnconference_recv_to_send");
-  tcase_add_test (tc_chain, test_msnconference_recv_to_send);
-  suite_add_tcase (s, tc_chain);
-
-
-  tc_chain = tcase_create ("fsmsnconference_error");
-  tcase_add_test (tc_chain, test_msnconference_error);
-  suite_add_tcase (s, tc_chain);
-
-
-  return s;
-}
-
-GST_CHECK_MAIN (fsmsnconference);
-- 
2.21.0

From b8751b8ee7cd2a8fab2a61a79443a8d287412c8d Mon Sep 17 00:00:00 2001
From: Philip Withnall <philip.withnall@collabora.co.uk>
Date: Thu, 1 Oct 2015 08:34:31 +0100
Subject: [PATCH 13/30] nice: Port away from deprecated libnice signals

The NiceAgent::new-candidate and ::new-selected-pair signals have been
deprecated since 0.1.8 (which we depend on). Port them to use the
replacement ::*-full signals.

https://bugs.freedesktop.org/show_bug.cgi?id=92208
---
 .../nice/fs-nice-stream-transmitter.c         | 163 +++++-------------
 1 file changed, 46 insertions(+), 117 deletions(-)

diff --git a/transmitters/nice/fs-nice-stream-transmitter.c b/transmitters/nice/fs-nice-stream-transmitter.c
index 5dbff443..5e27127d 100644
--- a/transmitters/nice/fs-nice-stream-transmitter.c
+++ b/transmitters/nice/fs-nice-stream-transmitter.c
@@ -176,13 +176,11 @@ static void agent_gathering_done (NiceAgent *agent, guint stream_id,
 static void agent_new_selected_pair (NiceAgent *agent,
     guint stream_id,
     guint component_id,
-    const gchar *lfoundation,
-    const gchar *rfoundation,
+    NiceCandidate *l_candidate,
+    NiceCandidate *r_candidate,
     gpointer user_data);
 static void agent_new_candidate (NiceAgent *agent,
-    guint stream_id,
-    guint component_id,
-    const gchar *foundation,
+    NiceCandidate *candidate,
     gpointer user_data);
 
 static GstPadProbeReturn known_buffer_have_buffer_handler (GstPad *pad,
@@ -1528,10 +1526,11 @@ fs_nice_stream_transmitter_build (FsNiceStreamTransmitter *self,
   self->priv->gathering_done_handler_id = g_signal_connect_object (agent->agent,
       "candidate-gathering-done", G_CALLBACK (agent_gathering_done), self, 0);
   self->priv->new_selected_pair_handler_id = g_signal_connect_object (
-      agent->agent, "new-selected-pair", G_CALLBACK (agent_new_selected_pair),
+      agent->agent, "new-selected-pair-full",
+      G_CALLBACK (agent_new_selected_pair),
       self, 0);
   self->priv->new_candidate_handler_id = g_signal_connect_object (agent->agent,
-      "new-candidate", G_CALLBACK (agent_new_candidate), self, 0);
+      "new-candidate-full", G_CALLBACK (agent_new_candidate), self, 0);
   self->priv->tos_changed_handler_id = g_signal_connect_object (
       self->priv->transmitter, "notify::tos", G_CALLBACK (tos_changed), self,
       0);
@@ -1703,142 +1702,72 @@ static void
 agent_new_selected_pair (NiceAgent *agent,
     guint stream_id,
     guint component_id,
-    const gchar *lfoundation,
-    const gchar *rfoundation,
+    NiceCandidate *l_candidate,
+    NiceCandidate *r_candidate,
     gpointer user_data)
 {
   FsNiceStreamTransmitter *self = FS_NICE_STREAM_TRANSMITTER (user_data);
-  GSList *candidates, *item;
   FsCandidate *local = NULL;
   FsCandidate *remote = NULL;
+  struct candidate_signal_data *data;
 
   if (stream_id != self->priv->stream_id)
     return;
 
-  candidates = nice_agent_get_local_candidates (agent,
-      self->priv->stream_id, component_id);
-
-  for (item = candidates; item; item = g_slist_next (item))
-  {
-    NiceCandidate *candidate = item->data;
-
-    if (!strcmp (candidate->foundation, lfoundation))
-    {
-      local = nice_candidate_to_fs_candidate (agent, candidate, TRUE);
-      break;
-    }
-  }
-  g_slist_foreach (candidates, (GFunc)nice_candidate_free, NULL);
-  g_slist_free (candidates);
-
-  candidates = nice_agent_get_remote_candidates (agent,
-      self->priv->stream_id, component_id);
-
-  for (item = candidates; item; item = g_slist_next (item))
-  {
-    NiceCandidate *candidate = item->data;
-
-    if (!strcmp (candidate->foundation, rfoundation))
-    {
-      remote = nice_candidate_to_fs_candidate (agent, candidate, FALSE);
-      break;
-    }
-  }
-  g_slist_foreach (candidates, (GFunc)nice_candidate_free, NULL);
-  g_slist_free (candidates);
-
+  local = nice_candidate_to_fs_candidate (agent, l_candidate, TRUE);
+  remote = nice_candidate_to_fs_candidate (agent, r_candidate, FALSE);
 
-  if (local && remote)
-  {
-    struct candidate_signal_data *data =
-      g_slice_new (struct candidate_signal_data);
-    data->self = g_object_ref (self);
-    data->signal_name = "new-active-candidate-pair";
-    data->candidate1 = local;
-    data->candidate2 = remote;
-    fs_nice_agent_add_idle (self->priv->agent, agent_candidate_signal_idle,
-        data, free_candidate_signal_data);
-  }
-  else
-  {
-    if (local)
-      fs_candidate_destroy (local);
-    if (remote)
-      fs_candidate_destroy (remote);
-  }
+  data = g_slice_new (struct candidate_signal_data);
+  data->self = g_object_ref (self);
+  data->signal_name = "new-active-candidate-pair";
+  data->candidate1 = local;
+  data->candidate2 = remote;
+  fs_nice_agent_add_idle (self->priv->agent, agent_candidate_signal_idle,
+      data, free_candidate_signal_data);
 }
 
 static void
 agent_new_candidate (NiceAgent *agent,
-    guint stream_id,
-    guint component_id,
-    const gchar *foundation,
+    NiceCandidate *candidate,
     gpointer user_data)
 {
   FsNiceStreamTransmitter *self = FS_NICE_STREAM_TRANSMITTER (user_data);
   FsCandidate *fscandidate = NULL;
-  GSList *candidates, *item;
 
-  if (stream_id != self->priv->stream_id)
-    return;
-
-  GST_DEBUG ("New candidate found for stream %u component %u",
-      stream_id, component_id);
-
-  candidates = nice_agent_get_local_candidates (agent, stream_id, component_id);
+  GST_DEBUG ("New candidate found");
 
-  for (item = candidates; item; item = g_slist_next (item))
-  {
-    NiceCandidate *candidate = item->data;
+  fscandidate = nice_candidate_to_fs_candidate (agent, candidate, TRUE);
 
-    if (!strcmp (candidate->foundation, foundation))
-    {
-      fscandidate = nice_candidate_to_fs_candidate (agent, candidate, TRUE);
-      break;
-    }
-  }
-  g_slist_foreach (candidates, (GFunc) nice_candidate_free, NULL);
-  g_slist_free (candidates);
-
-  if (fscandidate)
+  FS_NICE_STREAM_TRANSMITTER_LOCK (self);
+  if (!self->priv->gathered)
   {
-    FS_NICE_STREAM_TRANSMITTER_LOCK (self);
-    if (!self->priv->gathered)
-    {
-      /* Nice doesn't do connchecks while gathering, so don't tell the upper
-       * layers about the candidates untill gathering is finished.
-       * Also older versions of farstream would fail the connection right away
-       * when the first candidate given failed immediately (e.g. ipv6 on a
-       * non-ipv6 capable host, so we order ipv6 candidates after ipv4 ones */
-
-       if (strchr (fscandidate->ip, ':'))
-        self->priv->local_candidates = g_list_append
-          (self->priv->local_candidates, fscandidate);
-      else
-        self->priv->local_candidates = g_list_prepend
-          (self->priv->local_candidates, fscandidate);
-      FS_NICE_STREAM_TRANSMITTER_UNLOCK (self);
-    }
+    /* Nice doesn't do connchecks while gathering, so don't tell the upper
+     * layers about the candidates untill gathering is finished.
+     * Also older versions of farstream would fail the connection right away
+     * when the first candidate given failed immediately (e.g. ipv6 on a
+     * non-ipv6 capable host, so we order ipv6 candidates after ipv4 ones */
+
+     if (strchr (fscandidate->ip, ':'))
+      self->priv->local_candidates = g_list_append
+        (self->priv->local_candidates, fscandidate);
     else
-    {
-      struct candidate_signal_data *data =
-        g_slice_new (struct candidate_signal_data);
-
-      FS_NICE_STREAM_TRANSMITTER_UNLOCK (self);
-
-      data->self = g_object_ref (self);
-      data->signal_name = "new-local-candidate";
-      data->candidate1 = fscandidate;
-      data->candidate2 = NULL;
-      fs_nice_agent_add_idle (self->priv->agent, agent_candidate_signal_idle,
-        data, free_candidate_signal_data);
-    }
+      self->priv->local_candidates = g_list_prepend
+        (self->priv->local_candidates, fscandidate);
+    FS_NICE_STREAM_TRANSMITTER_UNLOCK (self);
   }
   else
   {
-    GST_WARNING ("Could not find local candidate with foundation %s"
-        " for component %d in stream %d", foundation, component_id,
-        stream_id);
+    struct candidate_signal_data *data =
+      g_slice_new (struct candidate_signal_data);
+
+    FS_NICE_STREAM_TRANSMITTER_UNLOCK (self);
+
+    data->self = g_object_ref (self);
+    data->signal_name = "new-local-candidate";
+    data->candidate1 = fscandidate;
+    data->candidate2 = NULL;
+    fs_nice_agent_add_idle (self->priv->agent, agent_candidate_signal_idle,
+      data, free_candidate_signal_data);
   }
 }
 
-- 
2.21.0

From 484306ea21db9086d860e3e21ec7b41174c9cf15 Mon Sep 17 00:00:00 2001
From: Fabrice Bellet <fabrice@bellet.info>
Date: Fri, 21 Apr 2017 10:01:15 +0200
Subject: [PATCH 14/30] rtp: test the session conference property before using
 it

This may happen when the rtp session object is calling its dispose
function in another thread. The disposed flag is set, and it prevents
the fs_rtp_session_get_property() function to return its conference
object.

https://bugs.freedesktop.org/show_bug.cgi?id=101169
---
 gst/fsrtpconference/fs-rtp-stream.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/gst/fsrtpconference/fs-rtp-stream.c b/gst/fsrtpconference/fs-rtp-stream.c
index b2d59f2c..1ef6b2e8 100644
--- a/gst/fsrtpconference/fs-rtp-stream.c
+++ b/gst/fsrtpconference/fs-rtp-stream.c
@@ -826,6 +826,11 @@ _local_candidates_prepared (FsStreamTransmitter *stream_transmitter,
 
   g_object_get (session, "conference", &conf, NULL);
 
+  if (!conf) {
+    g_object_unref (session);
+    return;
+  }
+
   gst_element_post_message (conf,
       gst_message_new_element (GST_OBJECT (conf),
           gst_structure_new ("farstream-local-candidates-prepared",
@@ -853,6 +858,11 @@ _new_active_candidate_pair (
 
   g_object_get (session, "conference", &conf, NULL);
 
+  if (!conf) {
+    g_object_unref (session);
+    return;
+  }
+
   gst_element_post_message (conf,
       gst_message_new_element (GST_OBJECT (conf),
           gst_structure_new ("farstream-new-active-candidate-pair",
@@ -881,6 +891,11 @@ _new_local_candidate (
 
   g_object_get (session, "conference", &conf, NULL);
 
+  if (!conf) {
+    g_object_unref (session);
+    return;
+  }
+
   gst_element_post_message (conf,
       gst_message_new_element (GST_OBJECT (conf),
           gst_structure_new ("farstream-new-local-candidate",
@@ -929,6 +944,11 @@ _state_changed (FsStreamTransmitter *stream_transmitter,
 
   g_object_get (session, "conference", &conf, NULL);
 
+  if (!conf) {
+    g_object_unref (session);
+    return;
+  }
+
   gst_element_post_message (conf,
       gst_message_new_element (GST_OBJECT (conf),
           gst_structure_new ("farstream-component-state-changed",
-- 
2.21.0

From 3123a5be03190c55fe1401d9dbb90c09078b2dee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Mon, 5 Jun 2017 18:41:54 -0400
Subject: [PATCH 15/30] rawudp tests: Increase timeout

As we increased the default timeout in libnice's libstun,
also increase it here.
---
 tests/check/transmitter/rawudp.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tests/check/transmitter/rawudp.c b/tests/check/transmitter/rawudp.c
index 71e38f37..e1936ac0 100644
--- a/tests/check/transmitter/rawudp.c
+++ b/tests/check/transmitter/rawudp.c
@@ -949,7 +949,7 @@ rawudptransmitter_suite (void)
   suite_add_tcase (s, tc_chain);
 
   tc_chain = tcase_create ("rawudptransmitter-stun-timeout");
-  tcase_set_timeout (tc_chain, 5);
+  tcase_set_timeout (tc_chain, 10);
   tcase_add_test (tc_chain, test_rawudptransmitter_run_invalid_stun);
   suite_add_tcase (s, tc_chain);
 
@@ -1004,14 +1004,14 @@ rawudptransmitter_suite (void)
   suite_add_tcase (s, tc_chain);
 
   tc_chain = tcase_create ("rawudptransmitter-stunalternd-to-nowhere");
-  tcase_set_timeout (tc_chain, 12);
+  tcase_set_timeout (tc_chain, 20);
   tcase_add_checked_fixture (tc_chain, setup_stunalternd_valid,
       teardown_stunalternd);
   tcase_add_test (tc_chain, test_rawudptransmitter_run_stun_altern_to_nowhere);
   suite_add_tcase (s, tc_chain);
 
   tc_chain = tcase_create ("rawudptransmitter-stunalternd-loop");
-  tcase_set_timeout (tc_chain, 12);
+  tcase_set_timeout (tc_chain, 20);
   tcase_add_checked_fixture (tc_chain, setup_stunalternd_loop,
       teardown_stunalternd);
   tcase_add_test (tc_chain, test_rawudptransmitter_run_stun_altern_to_nowhere);
-- 
2.21.0

From c5c0427aa055852f2de9f7d0273d3e994ac91df4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Mon, 5 Jun 2017 19:05:15 -0400
Subject: [PATCH 16/30] stream: Stop substreams before removing them

https://bugs.freedesktop.org/show_bug.cgi?id=100644
---
 gst/fsrtpconference/fs-rtp-stream.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/gst/fsrtpconference/fs-rtp-stream.c b/gst/fsrtpconference/fs-rtp-stream.c
index 1ef6b2e8..593af4d8 100644
--- a/gst/fsrtpconference/fs-rtp-stream.c
+++ b/gst/fsrtpconference/fs-rtp-stream.c
@@ -359,6 +359,7 @@ fs_rtp_stream_dispose (GObject *object)
     FsRtpSubStream *substream = self->substreams->data;
     self->substreams = g_list_remove (self->substreams, substream);
     FS_RTP_SESSION_UNLOCK (session);
+    fs_rtp_sub_stream_stop (substream);
     g_object_unref (substream);
     FS_RTP_SESSION_LOCK (session);
   }
-- 
2.21.0

From 5eeb7ad22bdbff1b78b0c518247644feb7e9c806 Mon Sep 17 00:00:00 2001
From: Fabrice Bellet <fabrice@bellet.info>
Date: Tue, 14 Feb 2017 20:40:03 +0100
Subject: [PATCH 17/30] rtptfrc: Fix reference counting

https://bugs.freedesktop.org/show_bug.cgi?id=99823
---
 gst/fsrtpconference/fs-rtp-tfrc.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/gst/fsrtpconference/fs-rtp-tfrc.c b/gst/fsrtpconference/fs-rtp-tfrc.c
index f1435519..7c92218e 100644
--- a/gst/fsrtpconference/fs-rtp-tfrc.c
+++ b/gst/fsrtpconference/fs-rtp-tfrc.c
@@ -1354,9 +1354,11 @@ fs_rtp_tfrc_new (FsRtpSession *fsrtpsession)
   gst_object_unref (rtpmuxer);
 
   self->in_rtp_probe_id = gst_pad_add_probe (self->in_rtp_pad,
-      GST_PAD_PROBE_TYPE_BUFFER, incoming_rtp_probe, self, NULL);
+      GST_PAD_PROBE_TYPE_BUFFER, incoming_rtp_probe,
+      g_object_ref (self), (GDestroyNotify) g_object_unref);
   self->in_rtcp_probe_id = gst_pad_add_probe (self->in_rtcp_pad,
-      GST_PAD_PROBE_TYPE_BUFFER, incoming_rtcp_probe, self, NULL);
+      GST_PAD_PROBE_TYPE_BUFFER, incoming_rtcp_probe,
+      g_object_ref (self), (GDestroyNotify) g_object_unref);
 
 
   self->on_ssrc_validated_id = g_signal_connect_object (self->rtpsession,
-- 
2.21.0

From 0ff6a4eda899461aa21a876033edc42f5b048bc7 Mon Sep 17 00:00:00 2001
From: Sergey Mamonov <samamonov@gmail.com>
Date: Mon, 27 Mar 2017 19:08:09 +0000
Subject: [PATCH 18/30] fsrtpsession: Set discovery valve to dropping on
 creation

Although it should do nothing, it seems to improve CPU usage.

https://bugs.freedesktop.org/show_bug.cgi?id=100412
---
 gst/fsrtpconference/fs-rtp-session.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index ee0225f2..86eefbb4 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -1454,6 +1454,8 @@ fs_rtp_session_constructed (GObject *object)
     return;
   }
 
+  g_object_set (self->priv->discovery_valve, "drop", TRUE, NULL);
+
   if (!gst_bin_add (GST_BIN (self->priv->conference),
           self->priv->discovery_valve))
   {
-- 
2.21.0

From cc577d4828fee3d3e5e4d3e2afcbb9c4538556aa Mon Sep 17 00:00:00 2001
From: Fabrice Bellet <fabrice@bellet.info>
Date: Wed, 7 Jun 2017 16:47:48 +0200
Subject: [PATCH 19/30] nice: select the candidate with the correct stream id

This selection based on the stream_id has been lost in commit b8751b8

https://bugs.freedesktop.org/show_bug.cgi?id=92208
---
 transmitters/nice/fs-nice-stream-transmitter.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/transmitters/nice/fs-nice-stream-transmitter.c b/transmitters/nice/fs-nice-stream-transmitter.c
index 5e27127d..dac87c6b 100644
--- a/transmitters/nice/fs-nice-stream-transmitter.c
+++ b/transmitters/nice/fs-nice-stream-transmitter.c
@@ -1734,6 +1734,9 @@ agent_new_candidate (NiceAgent *agent,
   FsNiceStreamTransmitter *self = FS_NICE_STREAM_TRANSMITTER (user_data);
   FsCandidate *fscandidate = NULL;
 
+  if (candidate->stream_id != self->priv->stream_id)
+    return;
+
   GST_DEBUG ("New candidate found");
 
   fscandidate = nice_candidate_to_fs_candidate (agent, candidate, TRUE);
-- 
2.21.0

From 8d1d8349c5b67255c0e00b19b02b0db1db7fe769 Mon Sep 17 00:00:00 2001
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Date: Wed, 21 Jun 2017 14:04:19 -0400
Subject: [PATCH 20/30] rtpconference: Move link flags to convenience library

This way unit test will inherit from all the required flags.

https://bugs.freedesktop.org/show_bug.cgi?id=101544
---
 gst/fsrtpconference/Makefile.am | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/gst/fsrtpconference/Makefile.am b/gst/fsrtpconference/Makefile.am
index c9e8ae18..18ecee36 100644
--- a/gst/fsrtpconference/Makefile.am
+++ b/gst/fsrtpconference/Makefile.am
@@ -23,6 +23,13 @@ libfsrtpconference_convenience_la_SOURCES = \
 	fs-rtp-tfrc.c \
 	fs-rtp-packet-modder.c \
 	tfrc.c
+libfsrtpconference_convenience_la_LIBADD = \
+	$(top_builddir)/farstream/libfarstream-@FS_APIVERSION@.la \
+	$(FS_LIBS) \
+	$(GST_PLUGINS_BASE_LIBS) \
+	$(GST_LIBS) \
+	-lgstrtp-@GST_API_VERSION@ \
+	-lm
 
 noinst_HEADERS = \
 	fs-rtp-conference.h \
@@ -55,13 +62,7 @@ AM_CFLAGS = \
 libfsrtpconference_la_SOURCES = fs-rtp-conference-plugin.c
 
 libfsrtpconference_la_LIBADD = \
-	libfsrtpconference-convenience.la \
-	$(top_builddir)/farstream/libfarstream-@FS_APIVERSION@.la \
-	$(FS_LIBS) \
-	$(GST_PLUGINS_BASE_LIBS) \
-	$(GST_LIBS) \
-	-lgstrtp-@GST_API_VERSION@ \
-	-lm
+	libfsrtpconference-convenience.la
 
 libfsrtpconference_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libfsrtpconference_la_LIBTOOLFLAGS = $(PLUGIN_LIBTOOLFLAGS)
-- 
2.21.0

From 782bf607e49cc1eba15eb9def1d0596c74405a47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 12 Oct 2017 17:02:57 -0400
Subject: [PATCH 21/30] Update autogen.sh to match common/

---
 autogen.sh | 77 ++++++++++++++++++++++++++----------------------------
 1 file changed, 37 insertions(+), 40 deletions(-)

diff --git a/autogen.sh b/autogen.sh
index b2653248..ceb92578 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,9 +1,11 @@
-#!/bin/sh
-# Run this to generate all the initial makefiles, etc.
+test -n "$srcdir" || srcdir=`dirname "$0"`
+test -n "$srcdir" || srcdir=.
+
+olddir=`pwd`
+cd "$srcdir"
 
-DIE=0
 package=farstream
-srcfile=farstream/fs-candidate.c
+srcfile=farstream/fs-conference.c
 
 # Make sure we have common
 if test ! -f common/gst-autogen.sh;
@@ -22,30 +24,33 @@ then
 fi
 . common/gst-autogen.sh
 
-CONFIGURE_DEF_OPT='--enable-gtk-doc --enable-introspection'
+CONFIGURE_DEF_OPT='--enable-gtk-doc'
 
 autogen_options $@
 
-echo -n "+ check for build tools"
-if test ! -z "$NOCHECK"; then echo ": skipped version checks"; else  echo; fi
-version_check "autoconf" "$AUTOCONF autoconf autoconf259 autoconf257 autoconf-2.54 autoconf-2.53 autoconf253 autoconf-2.52 autoconf252" \
-              "ftp://ftp.gnu.org/pub/gnu/autoconf/" 2 52 || DIE=1
-version_check "automake" "$AUTOMAKE automake automake-1.9 automake19 automake-1.8 automake18 automake-1.7 automake17 automake-1.6 automake16" \
-              "ftp://ftp.gnu.org/pub/gnu/automake/" 1 7 || DIE=1
-version_check "libtoolize" "libtoolize libtoolize15 glibtoolize" \
-              "ftp://ftp.gnu.org/pub/gnu/libtool/" 1 5 0 || DIE=1
-version_check "pkg-config" "" \
-              "http://www.freedesktop.org/software/pkgconfig" 0 8 0 || DIE=1
-
-die_check $DIE
-
-aclocal_check || DIE=1
-autoheader_check || DIE=1
-
-die_check $DIE
+printf "+ check for build tools"
+if test -z "$NOCHECK"; then
+  echo
+
+  printf "  checking for autoreconf ... "
+  echo
+  which "autoreconf" 2>/dev/null || {
+    echo "not found! Please install the autoconf package."
+    exit 1
+  }
+
+  printf "  checking for pkg-config ... "
+  echo
+  which "pkg-config" 2>/dev/null || {
+    echo "not found! Please install pkg-config."
+    exit 1
+  }
+else
+  echo ": skipped version checks"
+fi
 
 # if no arguments specified then this will be printed
-if test -z "$*"; then
+if test -z "$*" && test -z "$NOCONFIGURE"; then
   echo "+ checking for autogen.sh options"
   echo "  This autogen script will automatically run ./configure as:"
   echo "  ./configure $CONFIGURE_DEF_OPT"
@@ -57,34 +62,26 @@ toplevel_check $srcfile
 
 # aclocal
 if test -f acinclude.m4; then rm acinclude.m4; fi
-tool_run "$aclocal" "-I m4 -I common/m4 $ACLOCAL_FLAGS"
 
-tool_run "$libtoolize" "--copy --force"
-tool_run "$autoheader"
-
-# touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode -- wingo
-echo timestamp > stamp-h.in 2> /dev/null
-
-tool_run "$autoconf"
-debug "automake: $automake"
-tool_run "$automake" "--add-missing --copy -Wno-portability"
+autoreconf --force --install || exit 1
 
 test -n "$NOCONFIGURE" && {
-  echo "skipping configure stage for package $package, as requested."
-  echo "autogen.sh done."
+  echo "+ skipping configure stage for package $package, as requested."
+  echo "+ autogen.sh done."
   exit 0
 }
 
+cd "$olddir"
+
 echo "+ running configure ... "
-test ! -z "$CONFIGURE_DEF_OPT" && echo "  ./configure default flags: $CONFIGURE_DEF_OPT"
-test ! -z "$CONFIGURE_EXT_OPT" && echo "  ./configure external flags: $CONFIGURE_EXT_OPT"
+test ! -z "$CONFIGURE_DEF_OPT" && echo "  default flags:  $CONFIGURE_DEF_OPT"
+test ! -z "$CONFIGURE_EXT_OPT" && echo "  external flags: $CONFIGURE_EXT_OPT"
 echo
 
-echo ./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT
-./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT || {
+echo "$srcdir/configure" $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT
+"$srcdir/configure" $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT || {
         echo "  configure failed"
         exit 1
 }
 
 echo "Now type 'make' to compile $package."
-
-- 
2.21.0

From 01f01a59cf6e39dd37c22caf3166e63a508903e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 12 Oct 2017 17:04:40 -0400
Subject: [PATCH 22/30] Update INSTALL file

---
 INSTALL | 250 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 192 insertions(+), 58 deletions(-)

diff --git a/INSTALL b/INSTALL
index 23e5f25d..20998407 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,16 +1,25 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
-Software Foundation, Inc.
+Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
+Inc.
 
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
 
 Basic Installation
 ==================
 
-These are generic installation instructions.
+   Briefly, the shell command `./configure && make && make install'
+should configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
 
    The `configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
@@ -23,9 +32,9 @@ debugging `configure').
 
    It can also use an optional file (typically called `config.cache'
 and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
+the results of its tests to speed up reconfiguring.  Caching is
 disabled by default to prevent problems with accidental use of stale
-cache files.)
+cache files.
 
    If you need to do unusual things to compile the package, please try
 to figure out how `configure' could check whether to do them, and mail
@@ -35,30 +44,37 @@ some point `config.cache' contains results you don't want to keep, you
 may remove or edit it.
 
    The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
 
-The simplest way to compile this package is:
+   The simplest way to compile this package is:
 
   1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
+     `./configure' to configure the package for your system.
 
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
 
   2. Type `make' to compile the package.
 
   3. Optionally, type `make check' to run any self-tests that come with
-     the package.
+     the package, generally using the just-built uninstalled binaries.
 
   4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
      source code directory by typing `make clean'.  To also remove the
      files that `configure' created (so you can compile the package for
      a different kind of computer), type `make distclean'.  There is
@@ -67,45 +83,69 @@ The simplest way to compile this package is:
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
+
 Compilers and Options
 =====================
 
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
 
    You can give `configure' initial values for configuration parameters
 by setting variables in the command line or in the environment.  Here
 is an example:
 
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 
    *Note Defining Variables::, for more details.
 
 Compiling For Multiple Architectures
 ====================================
 
-You can compile the package for more than one kind of computer at the
+   You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+own directory.  To do this, you can use GNU `make'.  `cd' to the
 directory where you want the object files and executables to go and run
 the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
 
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
 
 Installation Names
 ==================
 
-By default, `make install' installs the package's commands under
+   By default, `make install' installs the package's commands under
 `/usr/local/bin', include files under `/usr/local/include', etc.  You
 can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
@@ -116,16 +156,47 @@ Documentation and other data files still use the regular prefix.
    In addition, if you use an unusual directory layout you can give
 options like `--bindir=DIR' to specify different values for particular
 kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
+you can set and what kinds of files go in them.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
 
    If the package supports it, you can cause programs to be installed
 with an extra prefix or suffix on their names by giving `configure' the
 option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
 
-Optional Features
-=================
-
-Some packages pay attention to `--enable-FEATURE' options to
+   Some packages pay attention to `--enable-FEATURE' options to
 `configure', where FEATURE indicates an optional part of the package.
 They may also pay attention to `--with-PACKAGE' options, where PACKAGE
 is something like `gnu-as' or `x' (for the X Window System).  The
@@ -137,14 +208,58 @@ find the X include and library files automatically, but if it doesn't,
 you can use the `configure' options `--x-includes=DIR' and
 `--x-libraries=DIR' to specify their locations.
 
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
 Specifying the System Type
 ==========================
 
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
 `--build=TYPE' option.  TYPE can either be a short name for the system
 type, such as `sun4', or a canonical name which has the form:
 
@@ -152,7 +267,8 @@ type, such as `sun4', or a canonical name which has the form:
 
 where SYSTEM can have one of these forms:
 
-     OS KERNEL-OS
+     OS
+     KERNEL-OS
 
    See the file `config.sub' for the possible values of each field.  If
 `config.sub' isn't included in this package, then this package doesn't
@@ -170,9 +286,9 @@ eventually be run) with `--host=TYPE'.
 Sharing Defaults
 ================
 
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
 `configure' looks for `PREFIX/share/config.site' if it exists, then
 `PREFIX/etc/config.site' if it exists.  Or, you can set the
 `CONFIG_SITE' environment variable to the location of the site script.
@@ -181,7 +297,7 @@ A warning: not all `configure' scripts look for a site script.
 Defining Variables
 ==================
 
-Variables not defined in a site shell script can be set in the
+   Variables not defined in a site shell script can be set in the
 environment passed to `configure'.  However, some packages may run
 configure again during the build, and the customized values of these
 variables may be lost.  In order to avoid this problem, you should set
@@ -190,21 +306,30 @@ them in the `configure' command line, using `VAR=value'.  For example:
      ./configure CC=/usr/local2/bin/gcc
 
 causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).  Here is a another example:
+overridden in the site shell script).
 
-     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf limitation.  Until the limitation is lifted, you can use
+this workaround:
 
-Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
-configuration-related scripts to be executed by `/bin/bash'.
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
 
 `configure' Invocation
 ======================
 
-`configure' recognizes the following options to control how it operates.
+   `configure' recognizes the following options to control how it
+operates.
 
 `--help'
 `-h'
-     Print a summary of the options to `configure', and exit.
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
 
 `--version'
 `-V'
@@ -231,6 +356,15 @@ configuration-related scripts to be executed by `/bin/bash'.
      Look for the package's source code in directory DIR.  Usually
      `configure' can determine that directory automatically.
 
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
 `configure' also accepts some other, not widely useful, options.  Run
 `configure --help' for more details.
-
-- 
2.21.0

From 6c3ded360addb03c75634adb521526f23028a85b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Tue, 14 Nov 2017 17:31:03 -0500
Subject: [PATCH 23/30] fs-gui: Use accessor functions to parse messages

Getting boxed types from GstMessage manually is just too error prone.
---
 examples/gui/fs-gui.py | 61 +++++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 25 deletions(-)

diff --git a/examples/gui/fs-gui.py b/examples/gui/fs-gui.py
index 0ec16ac9..7ce937cc 100755
--- a/examples/gui/fs-gui.py
+++ b/examples/gui/fs-gui.py
@@ -140,34 +140,45 @@ class FsUIPipeline (GObject.Object):
         elif message.type == Gst.MessageType.LATENCY:
             self.pipeline.recalculate_latency()
         elif message.type == Gst.MessageType.ELEMENT:
+            sessions = []
+            if AUDIO:
+                sessions += [self.audiosession]
+            if VIDEO:
+                sessions += [self.videosession]
+            for session in sessions:
+                (changed, codec, sec_codecs) = session.fssession.parse_send_codec_changed(message)
+                if changed:
+                    print "Send codec changed: " + codec.to_string()
+                if changed or session.fssession.parse_codecs_changed(message):
+                    print "Codecs changed"
+
+                    if self.audiosession == session:
+                        self.codecs_changed_audio()
+                    if self.videosession == session:
+                        self.codecs_changed_video()
+                    return True
+
+                for stream in session.streams:
+                    (res, candidate) = stream.fsstream.parse_new_local_candidate(message)
+                    if res:
+                        print "New Local candidate"
+                        stream.new_local_candidate(candidate)
+                        return True
+
+                    (res, codecs) = stream.fsstream.parse_recv_codecs_changed(message)
+                    if res:
+                        print "Receive codecs changed"
+                        stream.recv_codecs_changed(codecs)
+                        return True
+
+                    if stream.fsstream.parse_local_candidates_prepared(message):
+                        print "Local candidates prepared"
+                        stream.local_candidates_prepared()
+                        return True
+
             if message.get_structure().has_name("dtmf-event"):
                 print "dtmf-event: %d" % message.get_structure().get_int("number")
-            elif message.get_structure().has_name("farstream-local-candidates-prepared"):
-                message.get_structure().get_value("stream").uistream.local_candidates_prepared()
 
-            elif message.get_structure().has_name("farstream-new-local-candidate"):
-                message.get_structure().get_value("stream").uistream.new_local_candidate(
-                    message.get_structure().get_value("candidate"))
-            elif message.get_structure().has_name("farstream-codecs-changed"):
-                print message.src.get_name(), ": ", message.get_structure().get_name()
-                message.get_structure().get_value("session").uisession.codecs_changed()
-                if AUDIO and message.get_structure().get_value("session") == self.audiosession.fssession:
-                    self.codecs_changed_audio()
-                if VIDEO and  message.get_structure().get_value("session") == self.videosession.fssession:
-                    self.codecs_changed_video()
-            elif message.get_structure().has_name("farstream-send-codec-changed"):
-                print message.src.get_name(), ": ", message.get_structure().get_name()
-                print "send codec changed: " + message.get_structure().get_value("codec").to_string()
-                if AUDIO and message.get_structure().get_value("session") == self.audiosession.fssession:
-                    self.codecs_changed_audio()
-                if VIDEO and message.get_structure().get_value("session") == self.videosession.fssession:
-                    self.codecs_changed_video()
-            elif message.get_structure().has_name("farstream-recv-codecs-changed"):
-                print message.src.get_name(), ": ", message.get_structure().get_name()
-                message.get_structure().get_value("stream").uistream.recv_codecs_changed( \
-                    message.get_structure().get_value("codecs"))
-                
-                
             elif message.get_structure().has_name("farstream-error"):
                 print "Async error ("+ str(message.get_structure().get_int("error-no")) +"): " + message.get_structure().get_string("error-msg")
             elif message.get_structure().has_name("level"):
-- 
2.21.0

From 5bcf5578a70f16f87c595560b0793e208b823c6c Mon Sep 17 00:00:00 2001
From: Laurent Bigonville <bigon@bigon.be>
Date: Thu, 1 Feb 2018 16:13:33 +0100
Subject: [PATCH 24/30] Fix the name of the generated .devhelp2 files

https://bugs.freedesktop.org/show_bug.cgi?id=104903
---
 common-modified/gtk-doc-plugins.mak | 2 +-
 common-modified/gtk-doc.mak         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/common-modified/gtk-doc-plugins.mak b/common-modified/gtk-doc-plugins.mak
index 82dbad46..a50107f0 100644
--- a/common-modified/gtk-doc-plugins.mak
+++ b/common-modified/gtk-doc-plugins.mak
@@ -212,7 +212,7 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
 	    mkhtml_options="$$mkhtml_options --verbose"; \
 	  fi; \
 	fi; \
-	cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE)-@GST_API_VERSION@ $(DOC_MAIN_SGML_FILE)
+	cd html && gtkdoc-mkhtml $$mkhtml_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE)
 	@rm -f html/$(DOC_MAIN_SGML_FILE)
 	@rm -rf html/xml
 	@rm -f html/version.entities
diff --git a/common-modified/gtk-doc.mak b/common-modified/gtk-doc.mak
index 37542ec2..7caeb8bf 100644
--- a/common-modified/gtk-doc.mak
+++ b/common-modified/gtk-doc.mak
@@ -147,7 +147,7 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
 	if test "$(?)" = "0"; then \
 	  mkhtml_options=--path="$(abs_srcdir)"; \
 	fi; \
-	cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE)-@GST_API_VERSION@ ../$(DOC_MAIN_SGML_FILE)
+	cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
 	@rm -rf html/xml
 	@rm -f version.entities
 	@test "x$(HTML_IMAGES)" = "x" ||  ( cd $(srcdir) && cp $(HTML_IMAGES) $(abs_builddir)/html )
-- 
2.21.0

From 73891c28fa27d5e65a71762e826f13747d743588 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Wed, 19 Sep 2018 13:31:49 +0200
Subject: [PATCH 25/30] Remove Python dependency

Farstream 0.2 never depended on Python directly
---
 Makefile.am                   |  4 +---
 configure.ac                  |  1 -
 m4/Makefile.am                |  2 --
 m4/as-check-python-headers.m4 | 30 ------------------------------
 4 files changed, 1 insertion(+), 36 deletions(-)
 delete mode 100644 m4/Makefile.am
 delete mode 100644 m4/as-check-python-headers.m4

diff --git a/Makefile.am b/Makefile.am
index f81f6885..0bf9e861 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -10,7 +10,6 @@ SUBDIRS = 			\
 	docs			\
 	common			\
 	common-modified		\
-	m4			\
 	examples
 #	pkgconfig
 
@@ -22,7 +21,6 @@ DIST_SUBDIRS = 			\
 	docs			\
 	common			\
 	common-modified		\
-	m4			\
 	examples
 #	pkgconfig
 
@@ -30,7 +28,7 @@ EXTRA_DIST = \
 	AUTHORS COPYING NEWS README ChangeLog autogen.sh \
 	$(pcinfiles)
 
-ACLOCAL_AMFLAGS = -I m4 -I common/m4
+ACLOCAL_AMFLAGS = -I common/m4
 
 check-valgrind:
 	cd tests/check && make check-valgrind
diff --git a/configure.ac b/configure.ac
index 38c49807..c0747192 100644
--- a/configure.ac
+++ b/configure.ac
@@ -200,7 +200,6 @@ GOBJECT_INTROSPECTION_CHECK([0.10.1])
 
 dnl check for documentation tools
 GTK_DOC_CHECK([1.18])
-AS_PATH_PYTHON([2.1])
 AG_GST_PLUGIN_DOCS([1.8],[2.1])
 
 dnl Make automake happy with per-target flags
diff --git a/m4/Makefile.am b/m4/Makefile.am
deleted file mode 100644
index ad0c1aec..00000000
--- a/m4/Makefile.am
+++ /dev/null
@@ -1,2 +0,0 @@
-EXTRA_DIST = \
-	as-check-python-headers.m4
diff --git a/m4/as-check-python-headers.m4 b/m4/as-check-python-headers.m4
deleted file mode 100644
index 585455fd..00000000
--- a/m4/as-check-python-headers.m4
+++ /dev/null
@@ -1,30 +0,0 @@
-dnl Copy pasted from gst-python's acinclude.m4 file
-
-dnl a macro to check for ability to create python extensions
-dnl  AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
-dnl function also defines PYTHON_INCLUDES
-AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
-[AC_REQUIRE([AM_PATH_PYTHON])
-AC_MSG_CHECKING(for headers required to compile python extensions)
-dnl deduce PYTHON_INCLUDES
-py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
-py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
-if $PYTHON-config --help 2>/dev/null; then
-  PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null`
-else
-  PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
-  if test "$py_prefix" != "$py_exec_prefix"; then
-    PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
-  fi
-fi
-AC_SUBST(PYTHON_INCLUDES)
-dnl check if the headers exist:
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
-AC_TRY_CPP([#include <Python.h>],dnl
-[AC_MSG_RESULT(found)
-$1],dnl
-[AC_MSG_RESULT(not found)
-$2])
-CPPFLAGS="$save_CPPFLAGS"
-])
-- 
2.21.0

From 73625a038f308160375bef5ded796fae1a903265 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Wed, 19 Sep 2018 14:11:27 +0200
Subject: [PATCH 26/30] Update common/ to latest

---
 common                           | 2 +-
 common-modified/gst-glib-gen.mak | 6 +++---
 common-modified/gtk-doc.mak      | 6 +++++-
 configure.ac                     | 3 +--
 docs/libs/Makefile.am            | 4 ++--
 docs/plugins/Makefile.am         | 4 ++--
 farstream/Makefile.am            | 7 ++++---
 7 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/common-modified/gst-glib-gen.mak b/common-modified/gst-glib-gen.mak
index d14f5c64..14f1ba37 100644
--- a/common-modified/gst-glib-gen.mak
+++ b/common-modified/gst-glib-gen.mak
@@ -11,16 +11,16 @@ enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
 # these are all the rules generating the relevant files
 $(glib_gen_basename)-enumtypes.h: $(glib_enum_headers)
 	$(AM_V_GEN)$(GLIB_MKENUMS) \
-	--fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
+	--fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n$(glib_gen_decl_include)\n\nG_BEGIN_DECLS\n" \
 	--fprod "\n/* enumerations from \"@filename@\" */\n" \
-	--vhead "GType @enum_name@_get_type (void);\n#define FS_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n"         \
+	--vhead "$(glib_gen_decl_banner)\nGType @enum_name@_get_type (void);\n#define FS_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n"         \
 	--ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \
 	$^ > $@
 
 $(glib_gen_basename)-enumtypes.c: $(glib_enum_headers)
 	@if test "x$(glib_enum_headers)" = "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi
 	$(AM_V_GEN)$(GLIB_MKENUMS) \
-	--fhead "#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \
+	--fhead "#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"$(glib_gen_basename)-enumtypes.h\"\n$(enum_headers)" \
 	--fprod "\n/* enumerations from \"@filename@\" */" \
 	--vhead "GType\n@enum_name@_get_type (void)\n{\n  static volatile gsize g_define_type_id__volatile = 0;\n  if (g_once_init_enter (&g_define_type_id__volatile)) {\n    static const G@Type@Value values[] = {"     \
 	--vprod "      { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
diff --git a/common-modified/gtk-doc.mak b/common-modified/gtk-doc.mak
index 7caeb8bf..a973b8d7 100644
--- a/common-modified/gtk-doc.mak
+++ b/common-modified/gtk-doc.mak
@@ -121,7 +121,11 @@ $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)
 
 sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(expand_content_files)
 	@echo '  DOC   Building XML'
-	@gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR)  --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS)
+	@_source_dir='' ;						\
+	for i in $(DOC_SOURCE_DIR) ; do					\
+	    _source_dir="$${_source_dir} --source-dir=$$i" ;	        \
+	done ;							        \
+	gtkdoc-mkdb --module=$(DOC_MODULE) $${_source_dir}  --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS)
 	@cp ../version.entities xml
 	@touch sgml-build.stamp
 
diff --git a/configure.ac b/configure.ac
index c0747192..31be2770 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,7 +75,7 @@ dnl allow for different autotools
 AS_AUTOTOOLS_ALTERNATE
 
 dnl Add parameters for aclocal
-AC_SUBST(ACLOCAL_AMFLAGS, "-I m4 -I common/m4")
+AC_SUBST(ACLOCAL_AMFLAGS, "-I common/m4")
 
 dnl *** check for arguments to configure ***
 
@@ -422,7 +422,6 @@ docs/Makefile
 docs/libs/Makefile
 docs/plugins/Makefile
 docs/version.entities
-m4/Makefile
 dnl docs/plugins/Makefile
 )
 AC_OUTPUT
diff --git a/docs/libs/Makefile.am b/docs/libs/Makefile.am
index 0f6d2654..4b22d992 100644
--- a/docs/libs/Makefile.am
+++ b/docs/libs/Makefile.am
@@ -68,8 +68,8 @@ GTKDOC_LIBS = -static \
 	$(GST_BASE_LIBS) \
 	$(GCOV_LIBS)
 
-GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
-GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
+#GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
+#GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
 
 # If you need to override some of the declarations, place them in this file
 # and uncomment this line.
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index 7b4913fb..629291b8 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -125,8 +125,8 @@ GTKDOC_LIBS = \
 	$(top_builddir)/gst/fsrawconference/libfsrawconference_doc.la \
 	$(GST_BASE_LIBS) 
 
-GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
-GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
+#GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
+#GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
 
 # If you need to override some of the declarations, place them in this file
 # and uncomment this line.
diff --git a/farstream/Makefile.am b/farstream/Makefile.am
index 510c39c2..36a820d1 100644
--- a/farstream/Makefile.am
+++ b/farstream/Makefile.am
@@ -73,6 +73,7 @@ glib_enum_headers=$(public_headers)
 glib_enum_define=FS
 glib_gen_prefix=_fs
 glib_gen_basename=fs
+glib_gen_decl_include=\#include <glib-object.h>
 
 include $(top_srcdir)/common-modified/gst-glib-gen.mak
 
@@ -83,8 +84,9 @@ introspection_sources = \
 	$(nodist_libfarstreaminclude_HEADERS) \
 	$(libfarstreaminclude_HEADERS)
 
+
 INTROSPECTION_GIRS = Farstream-@FS_APIVERSION@.gir
-Farstream-@FS_APIVERSION@.gir: libfarstream-@FS_APIVERSION@.la
+Farstream_@FS_API_VERSION@_gir: libfarstream_@FS_APIVERSION@.la
 Farstream_@FS_API_VERSION@_gir_NAMESPACE = Farstream
 Farstream_@FS_API_VERSION@_gir_VERSION = @FS_APIVERSION@
 Farstream_@FS_API_VERSION@_gir_LIBS = libfarstream-@FS_APIVERSION@.la
@@ -94,8 +96,7 @@ Farstream_@FS_API_VERSION@_gir_CFLAGS = $(FS_INTERNAL_CFLAGS)
 Farstream_@FS_API_VERSION@_gir_SCANNERFLAGS = --symbol-prefix=fs \
 	--identifier-prefix=Fs --add-init-section="gst_init(NULL,NULL);" \
 	--pkg-export=farstream-@FS_APIVERSION@ \
-	$(foreach hdr,$(public_headers),--c-include=$(hdr))
-Farstream_@FS_API_VERSION@_gir_LDFLAGS = $(GST_LIBS)
+	$(foreach hdr,$(public_headers),--c-include=$(hdr)) --include-last-in-header=gst/gst.h
 
 girdir = $(datadir)/gir-1.0
 dist_gir_DATA = Farstream-@FS_APIVERSION@.gir
-- 
2.21.0

From a7de59c359349b47419880699b2e48e132eec5bb Mon Sep 17 00:00:00 2001
From: Fabrice Bellet <fabrice@bellet.info>
Date: Tue, 23 May 2017 16:06:47 +0200
Subject: [PATCH 27/30] rtp: fix a double locking issue on the session

The session value used in fs_rtp_stream_add_substream_unlock(), taken
from the stream struct may be null, while the session value from
fs_rtp_session_new_recv_pad() is not. However these two function depend
on the same session value to properly lock and unlock it: the first
function will unlock the session previously locked by the second
function.
---
 gst/fsrtpconference/fs-rtp-session.c |  6 +++---
 gst/fsrtpconference/fs-rtp-stream.c  | 12 ++++++++----
 gst/fsrtpconference/fs-rtp-stream.h  |  1 +
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index 86eefbb4..bcee5909 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -3290,7 +3290,7 @@ fs_rtp_session_new_recv_pad (FsRtpSession *session, GstPad *new_pad,
 
   if (stream)
   {
-    if (!fs_rtp_stream_add_substream_unlock (stream, substream, &error))
+    if (!fs_rtp_stream_add_substream_unlock (stream, substream, session, &error))
     {
       g_prefix_error (&error,
           "Could not add the output ghostpad to the new substream: ");
@@ -4363,7 +4363,7 @@ fs_rtp_session_associate_free_substreams (FsRtpSession *session,
         g_signal_handlers_disconnect_by_func (substream, "no-rtcp-timedout",
             session) > 0);
 
-    if (fs_rtp_stream_add_substream_unlock (stream, substream, &error))
+    if (fs_rtp_stream_add_substream_unlock (stream, substream, session, &error))
     {
       GST_DEBUG ("Associated SSRC %x in session %u", ssrc, session->id);
     }
@@ -4488,7 +4488,7 @@ _substream_no_rtcp_timedout_cb (FsRtpSubStream *substream,
 
   first_stream = g_list_first (session->priv->streams)->data;
   g_object_ref (first_stream);
-  if (!fs_rtp_stream_add_substream_unlock (first_stream, substream, &error))
+  if (!fs_rtp_stream_add_substream_unlock (first_stream, substream, session, &error))
   {
     g_prefix_error (&error,
         "Could not link the substream to a stream: ");
diff --git a/gst/fsrtpconference/fs-rtp-stream.c b/gst/fsrtpconference/fs-rtp-stream.c
index 593af4d8..c2b96922 100644
--- a/gst/fsrtpconference/fs-rtp-stream.c
+++ b/gst/fsrtpconference/fs-rtp-stream.c
@@ -1013,6 +1013,7 @@ _substream_unlinked (FsRtpSubStream *substream, gpointer user_data)
  * fs_rtp_stream_add_substream_unlock:
  * @stream: a #FsRtpStream
  * @substream: the #FsRtpSubStream to associate with this stream
+ * @session: the #FsRtpSession to be unlocked
  *
  * This functions associates a substream with this stream
  *
@@ -1024,13 +1025,18 @@ _substream_unlinked (FsRtpSubStream *substream, gpointer user_data)
 gboolean
 fs_rtp_stream_add_substream_unlock (FsRtpStream *stream,
     FsRtpSubStream *substream,
+    FsRtpSession *session,
     GError **error)
 {
   gboolean ret = TRUE;
-  FsRtpSession *session = fs_rtp_stream_get_session (stream, error);
+  FsRtpSession *mysession = fs_rtp_stream_get_session (stream, error);
 
-  if (!session)
+  if (!mysession) {
+    FS_RTP_SESSION_UNLOCK (session);
     return FALSE;
+  }
+
+  g_object_unref (mysession);
 
   stream->substreams = g_list_prepend (stream->substreams,
       substream);
@@ -1056,8 +1062,6 @@ fs_rtp_stream_add_substream_unlock (FsRtpStream *stream,
   else
     FS_RTP_SESSION_UNLOCK (session);
 
-  g_object_unref (session);
-
   return ret;
 }
 
diff --git a/gst/fsrtpconference/fs-rtp-stream.h b/gst/fsrtpconference/fs-rtp-stream.h
index a4b3fb23..86674c3b 100644
--- a/gst/fsrtpconference/fs-rtp-stream.h
+++ b/gst/fsrtpconference/fs-rtp-stream.h
@@ -117,6 +117,7 @@ FsRtpStream *fs_rtp_stream_new (FsRtpSession *session,
 
 gboolean fs_rtp_stream_add_substream_unlock (FsRtpStream *stream,
     FsRtpSubStream *substream,
+    FsRtpSession *session,
     GError **error);
 
 void
-- 
2.21.0

From 2cbbbca4f1855997b559f2da3d16ad896260407a Mon Sep 17 00:00:00 2001
From: Fabrice Bellet <fabrice@bellet.info>
Date: Wed, 14 Jun 2017 12:22:32 +0200
Subject: [PATCH 28/30] rtp: stop the transmitter src before unlinking its
 funnel

This patch tweaks the order the elements are stopped and unlinked to
prevent the transmitter source to fail on a not-linked to any sinkpads
error. The pipeline is transmitter-src -> funnel -> rtpbin -> substream.

The funnel is stopped, then the transmitter-src, and thereafter the
funnel is unlinked.

https://bugs.freedesktop.org/show_bug.cgi?id=100586
---
 gst/fsrtpconference/fs-rtp-session.c | 31 +++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index bcee5909..a9d7c950 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -574,19 +574,27 @@ _stop_transmitter_elem (gpointer key, gpointer value, gpointer elem_name)
 }
 
 static void
-stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
+stop_element (GstElement *element)
 {
-  if (*element == NULL)
+  if (element == NULL)
     return;
 
-  gst_element_set_locked_state (*element, TRUE);
-  if (gst_element_set_state (*element, GST_STATE_NULL) !=
+  gst_element_set_locked_state (element, TRUE);
+  if (gst_element_set_state (element, GST_STATE_NULL) !=
       GST_STATE_CHANGE_SUCCESS)
   {
-    gchar *elemname = gst_element_get_name (*element);
+    gchar *elemname = gst_element_get_name (element);
     GST_WARNING ("Could not set %s to GST_STATE_NULL", elemname);
     g_free (elemname);
   }
+}
+
+static void
+remove_element (GstBin *conf, GstElement **element, gboolean unref)
+{
+  if (*element == NULL)
+    return;
+
   if (!gst_bin_remove (conf, *element))
   {
     gchar *binname = gst_element_get_name (conf);
@@ -600,6 +608,12 @@ stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
   *element = NULL;
 }
 
+static void
+stop_and_remove (GstBin *conf, GstElement **element, gboolean unref)
+{
+  stop_element (*element);
+  remove_element (conf, element, unref);
+}
 
 static void
 fs_rtp_session_dispose (GObject *obj)
@@ -748,13 +762,16 @@ fs_rtp_session_dispose (GObject *obj)
   if (self->priv->rtpbin_recv_rtcp_sink)
     gst_pad_set_active (self->priv->rtpbin_recv_rtcp_sink, FALSE);
 
-  stop_and_remove (conferencebin, &self->priv->transmitter_rtp_funnel, TRUE);
-  stop_and_remove (conferencebin, &self->priv->transmitter_rtcp_funnel, TRUE);
+  stop_element (self->priv->transmitter_rtp_funnel);
+  stop_element (self->priv->transmitter_rtcp_funnel);
 
   if (self->priv->transmitters)
     g_hash_table_foreach (self->priv->transmitters, _stop_transmitter_elem,
       "gst-src");
 
+  remove_element (conferencebin, &self->priv->transmitter_rtp_funnel, TRUE);
+  remove_element (conferencebin, &self->priv->transmitter_rtcp_funnel, TRUE);
+
   self->priv->extra_sources =
     fs_rtp_special_sources_destroy (self->priv->extra_sources);
 
-- 
2.21.0

From 0d3d4bf20285f4fe8c9e3222afee62042147601d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 1 Nov 2018 18:31:28 -0400
Subject: [PATCH 29/30] farstream: Quell warning in interspection generation

---
 farstream/Makefile.am | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/farstream/Makefile.am b/farstream/Makefile.am
index 36a820d1..ec32682b 100644
--- a/farstream/Makefile.am
+++ b/farstream/Makefile.am
@@ -96,7 +96,8 @@ Farstream_@FS_API_VERSION@_gir_CFLAGS = $(FS_INTERNAL_CFLAGS)
 Farstream_@FS_API_VERSION@_gir_SCANNERFLAGS = --symbol-prefix=fs \
 	--identifier-prefix=Fs --add-init-section="gst_init(NULL,NULL);" \
 	--pkg-export=farstream-@FS_APIVERSION@ \
-	$(foreach hdr,$(public_headers),--c-include=$(hdr)) --include-last-in-header=gst/gst.h
+	$(foreach hdr,$(public_headers),--c-include=$(hdr)) \
+	--cflags-begin -include gst/gst.h --cflags-end
 
 girdir = $(datadir)/gir-1.0
 dist_gir_DATA = Farstream-@FS_APIVERSION@.gir
-- 
2.21.0

From 092d884da4c91967692dcaddaf583413a39d59d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com>
Date: Thu, 1 Nov 2018 18:57:46 -0400
Subject: [PATCH 30/30] gir: Add package deps to ensure the GIR build works

---
 farstream/Makefile.am | 1 +
 1 file changed, 1 insertion(+)

diff --git a/farstream/Makefile.am b/farstream/Makefile.am
index ec32682b..e6b509c1 100644
--- a/farstream/Makefile.am
+++ b/farstream/Makefile.am
@@ -93,6 +93,7 @@ Farstream_@FS_API_VERSION@_gir_LIBS = libfarstream-@FS_APIVERSION@.la
 Farstream_@FS_API_VERSION@_gir_FILES = $(introspection_sources)
 Farstream_@FS_API_VERSION@_gir_INCLUDES = GObject-2.0 Gst-@GST_API_VERSION@
 Farstream_@FS_API_VERSION@_gir_CFLAGS = $(FS_INTERNAL_CFLAGS)
+Farstream_@FS_API_VERSION@_gir_PACKAGES = gstreamer-@GST_API_VERSION@
 Farstream_@FS_API_VERSION@_gir_SCANNERFLAGS = --symbol-prefix=fs \
 	--identifier-prefix=Fs --add-init-section="gst_init(NULL,NULL);" \
 	--pkg-export=farstream-@FS_APIVERSION@ \
-- 
2.21.0