summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am6
-rw-r--r--configure.ac40
-rw-r--r--docs/plugins/Makefile.am2
-rw-r--r--docs/plugins/farstream-plugins-docs.sgml1
-rw-r--r--docs/plugins/farstream-plugins-sections.txt14
-rw-r--r--example.py (renamed from python/example.py)2
-rwxr-xr-xexamples/gui/fs-gui.py4
-rw-r--r--farstream/fs-conference.c17
-rw-r--r--farstream/fs-element-added-notifier.c85
-rw-r--r--farstream/fs-plugin.c2
-rw-r--r--farstream/fs-stream.c39
-rw-r--r--farstream/fs-transmitter.c8
-rw-r--r--gst/fsfunnel/Makefile.am14
-rw-r--r--gst/fsfunnel/fs-funnel.c443
-rw-r--r--gst/fsfunnel/fs-funnel.h69
-rw-r--r--gst/fsmsnconference/Makefile.am17
-rw-r--r--gst/fsmsnconference/fs-msn-cam-recv-conference.c53
-rw-r--r--gst/fsmsnconference/fs-msn-cam-send-conference.c54
-rw-r--r--gst/fsmsnconference/fs-msn-conference.c53
-rw-r--r--gst/fsmsnconference/fs-msn-stream.c2
-rw-r--r--gst/fsrawconference/Makefile.am8
-rw-r--r--gst/fsrawconference/fs-raw-conference-plugin.c12
-rw-r--r--gst/fsrawconference/fs-raw-conference.c43
-rw-r--r--gst/fsrawconference/fs-raw-session.c32
-rw-r--r--gst/fsrtcpfilter/fs-rtcp-filter.c80
-rw-r--r--gst/fsrtpconference/Makefile.am9
-rw-r--r--gst/fsrtpconference/default-element-properties2
-rw-r--r--gst/fsrtpconference/fs-rtp-bitrate-adapter.c154
-rw-r--r--gst/fsrtpconference/fs-rtp-codec-negotiation.c15
-rw-r--r--gst/fsrtpconference/fs-rtp-conference-plugin.c12
-rw-r--r--gst/fsrtpconference/fs-rtp-conference.c138
-rw-r--r--gst/fsrtpconference/fs-rtp-conference.h2
-rw-r--r--gst/fsrtpconference/fs-rtp-discover-codecs.c4
-rw-r--r--gst/fsrtpconference/fs-rtp-keyunit-manager.c19
-rw-r--r--gst/fsrtpconference/fs-rtp-packet-modder.c157
-rw-r--r--gst/fsrtpconference/fs-rtp-session.c255
-rw-r--r--gst/fsrtpconference/fs-rtp-special-source.c4
-rw-r--r--gst/fsrtpconference/fs-rtp-substream.c235
-rw-r--r--gst/fsrtpconference/fs-rtp-tfrc.c155
-rw-r--r--gst/fsrtpconference/fs-rtp-tfrc.h1
-rw-r--r--gst/fsvideoanyrate/videoanyrate.c69
-rw-r--r--python/Makefile.am45
-rw-r--r--python/pyfarstream-filter.defs15
-rw-r--r--python/pyfarstream.defs970
-rw-r--r--python/pyfarstream.override975
-rw-r--r--python/pyfarstreammodule.c30
-rwxr-xr-xpython/rebuild-defs.sh39
-rw-r--r--tests/check/Makefile.am11
-rw-r--r--tests/check/elements/funnel.c184
-rw-r--r--tests/check/elements/rtcpfilter.c36
-rw-r--r--tests/check/msn/conference.c19
-rw-r--r--tests/check/raw/conference.c44
-rw-r--r--tests/check/rtp/conference.c29
-rw-r--r--tests/check/rtp/generic.c4
-rw-r--r--tests/check/rtp/recvcodecs.c21
-rw-r--r--tests/check/rtp/sendcodecs.c58
-rw-r--r--tests/check/transmitter/fake-filter.c69
-rw-r--r--tests/check/transmitter/generic.c8
-rw-r--r--tests/check/transmitter/multicast.c6
-rw-r--r--tests/check/transmitter/nice.c6
-rw-r--r--tests/check/transmitter/rawudp.c6
-rw-r--r--tests/check/transmitter/shm.c9
-rw-r--r--transmitters/multicast/Makefile.am6
-rw-r--r--transmitters/multicast/fs-multicast-transmitter.c36
-rw-r--r--transmitters/nice/fs-nice-stream-transmitter.c11
-rw-r--r--transmitters/nice/fs-nice-transmitter.c33
-rw-r--r--transmitters/nice/fs-nice-transmitter.h2
-rw-r--r--transmitters/rawudp/Makefile.am9
-rw-r--r--transmitters/rawudp/fs-rawudp-component.c102
-rw-r--r--transmitters/rawudp/fs-rawudp-transmitter.c105
-rw-r--r--transmitters/rawudp/fs-rawudp-transmitter.h14
-rw-r--r--transmitters/shm/fs-shm-transmitter.c30
72 files changed, 1146 insertions, 4117 deletions
diff --git a/Makefile.am b/Makefile.am
index 6bca1c12..4d1bbade 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,15 +2,10 @@ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc --enable-introspection
SUBDIRS_EXT =
-if WANT_PYTHON
-PYTHON_SUBDIR = python
-endif
-
SUBDIRS = \
farstream \
gst $(SUBDIRS_EXT) \
transmitters \
- $(PYTHON_SUBDIR) \
tests \
docs \
common \
@@ -23,7 +18,6 @@ DIST_SUBDIRS = \
farstream \
gst $(SUBDIRS_EXT) \
transmitters \
- python \
tests \
docs \
common \
diff --git a/configure.ac b/configure.ac
index 78d48266..4a2bcd2d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,7 +44,7 @@ AC_DEFINE_UNQUOTED(FS_MAJORMINOR, "$FS_MAJORMINOR",
AC_DEFINE_UNQUOTED(FS_MAJOR_MINOR, "$FS_MAJORMINOR",
[Farstream major_minor version])
-GST_MAJORMINOR=0.10
+GST_MAJORMINOR=0.11
AC_SUBST(GST_MAJORMINOR)
AC_DEFINE_UNQUOTED(GST_MAJORMINOR, "$GST_MAJORMINOR",
[GStreamer major.minor version])
@@ -66,8 +66,8 @@ dnl AS_LIBTOOL_TAGS
AM_PROG_LIBTOOL
dnl *** required versions of GStreamer stuff ***
-GST_REQ=0.10.33
-GSTPB_REQ=0.10.33
+GST_REQ=0.11.1
+GSTPB_REQ=0.11.1
dnl *** autotools stuff ****
@@ -114,7 +114,6 @@ FS_PLUGINS_ALL=" \
fsrawconference \
fsrtpconference \
fsmsnconference \
- fsfunnel \
fsrtcpfilter \
fsvideoanyrate
"
@@ -202,7 +201,6 @@ GOBJECT_INTROSPECTION_CHECK([0.10.1])
dnl check for documentation tools
GTK_DOC_CHECK([1.8])
-AM_PATH_PYTHON([2.4])
LT_AC_PROG_SED
AG_GST_PLUGIN_DOCS([1.8],[2.1])
AC_SUBST(SED)
@@ -305,7 +303,7 @@ fi
AC_SUBST(PROFILE_CFLAGS)
dnl every flag in FS_OPTION_CFLAGS can be overridden at make time
-FS_OPTION_CFLAGS="\$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS)"
+FS_OPTION_CFLAGS="-DGST_USE_UNSTABLE_API \$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) -Wno-error=deprecated-declarations "
AC_SUBST(FS_OPTION_CFLAGS)
dnl our libraries need to be versioned correctly
@@ -314,7 +312,7 @@ AC_SUBST(FS_LT_LDFLAGS)
dnl FS_INTERNAL_CFLAGS
dnl prefer internal headers to already installed ones
dnl also add builddir include for enumtypes and marshal
-FS_INTERNAL_CFLAGS="-I\$(top_srcdir) -I\$(top_builddir)"
+FS_INTERNAL_CFLAGS="-I\$(top_srcdir) -I\$(top_builddir) -DGST_USE_UNSTABLE_API"
AC_SUBST(FS_INTERNAL_CFLAGS)
dnl FIXME: do we want to rename to GST_ALL_* ?
@@ -347,26 +345,6 @@ dnl whatevertarget_LIBS and -L flags here affect the rest of the linking
GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^[_]*gst_plugin_desc\$\$' $FS_ALL_LDFLAGS"
AC_SUBST(GST_PLUGIN_LDFLAGS)
-
-AC_ARG_ENABLE([python],
- AC_HELP_STRING([--disable-python], [Disable Python bindings]),
- [case "${enableval}" in
- yes) WANT_PYTHON=yes ;;
- no) WANT_PYTHON=no ;;
- *) AC_MSG_ERROR(bad value ${enableval} for --enable-python) ;;
- esac],
- WANT_PYTHON=yes)
-if test "x$WANT_PYTHON" = "xyes"; then
- AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
- PKG_CHECK_MODULES(PYFARSTREAM, [ pygobject-2.0 >= 2.12.0
- gst-python-0.10 >= 0.10.10] )
- PKG_CHECK_MODULES(PYCODEGEN, [ pygobject-2.0 >= 2.16.0 ],
- PYCODEGEN=pygobject-codegen-2.0,
- AC_MSG_ERROR([You need pygobject 2.16+ for the codegen]))
-fi
-AC_SUBST(PYCODEGEN)
-AM_CONDITIONAL(WANT_PYTHON, test "x$WANT_PYTHON" = "xyes")
-
AC_ARG_ENABLE([gupnp],
AC_HELP_STRING([--disable-gupnp], [Disable GUPnP IGD support]),
[case "${enableval}" in
@@ -378,7 +356,7 @@ AC_ARG_ENABLE([gupnp],
HAVE_GUPNP=no
if test "x$WANT_GUPNP" != "xno"; then
- PKG_CHECK_MODULES(GUPNP, [ gupnp-igd-1.0 ],
+ PKG_CHECK_MODULES(GUPNP, [ gupnp-igd-1.0 >= 0.2 ],
[ HAVE_GUPNP=yes ],
[ HAVE_GUPNP=no ])
fi
@@ -386,6 +364,10 @@ if test "x$WANT_GUPNP" = "xyes" && test "x$HAVE_GUPNP" = "xno"; then
AC_ERROR([Requested GUPnP IGD, but it is not available])
fi
+if test "x$HAVE_GUPNP" = "xyes"; then
+ AC_DEFINE(HAVE_GUPNP,,[Have the GUPnP IGD library])
+fi
+
dnl *** output files ***
AC_CONFIG_FILES(
@@ -398,7 +380,6 @@ gst/Makefile
gst/fsrawconference/Makefile
gst/fsrtpconference/Makefile
gst/fsmsnconference/Makefile
-gst/fsfunnel/Makefile
gst/fsrtcpfilter/Makefile
gst/fsvideoanyrate/Makefile
farstream/Makefile
@@ -420,7 +401,6 @@ docs/Makefile
docs/libs/Makefile
docs/plugins/Makefile
docs/version.entities
-python/Makefile
m4/Makefile
dnl docs/plugins/Makefile
)
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index ae9df02e..0643ca00 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -62,7 +62,6 @@ SCANOBJ_DEPS = \
$(top_builddir)/gst/fsrtpconference/libfsrtpconference_doc.la \
$(top_builddir)/gst/fsmsnconference/libfsmsnconference_doc.la \
$(top_builddir)/gst/fsrawconference/libfsrawconference_doc.la \
- $(top_builddir)/gst/fsfunnel/libfsfunnel.la \
$(top_builddir)/gst/fsvideoanyrate/libfsvideoanyrate.la
# Header files to ignore when scanning.
@@ -78,7 +77,6 @@ IGNORE_CFILES =
# the registry won't have the element
EXTRA_HFILES = \
- $(top_srcdir)/gst/fsfunnel/fs-funnel.h \
$(top_srcdir)/gst/fsvideoanyrate/videoanyrate.h \
$(top_srcdir)/gst/fsrtpconference/fs-rtp-conference.h \
$(top_srcdir)/gst/fsrtpconference/fs-rtp-session.h \
diff --git a/docs/plugins/farstream-plugins-docs.sgml b/docs/plugins/farstream-plugins-docs.sgml
index 9495f3a0..cd6d1f7b 100644
--- a/docs/plugins/farstream-plugins-docs.sgml
+++ b/docs/plugins/farstream-plugins-docs.sgml
@@ -54,7 +54,6 @@
<part>
<title>Utility elements</title>
- <xi:include href="xml/element-fsfunnel.xml"/>
<xi:include href="xml/element-fsvideoanyrate.xml"/>
</part>
</book>
diff --git a/docs/plugins/farstream-plugins-sections.txt b/docs/plugins/farstream-plugins-sections.txt
index 210bdb6f..8594e6c4 100644
--- a/docs/plugins/farstream-plugins-sections.txt
+++ b/docs/plugins/farstream-plugins-sections.txt
@@ -1,18 +1,4 @@
<SECTION>
-<FILE>element-fsfunnel</FILE>
-<TITLE>FsFunnel</TITLE>
-FsFunnel
-<SUBSECTION Standard>
-FsFunnelClass
-FS_FUNNEL
-FS_IS_FUNNEL
-FS_TYPE_FUNNEL
-fs_funnel_get_type
-FS_FUNNEL_CLASS
-FS_IS_FUNNEL_CLASS
-</SECTION>
-
-<SECTION>
<FILE>element-fsvideoanyrate</FILE>
<TITLE>GstVideoanyrate</TITLE>
GstVideoanyrate
diff --git a/python/example.py b/example.py
index c16d5c4d..e0076e5a 100644
--- a/python/example.py
+++ b/example.py
@@ -40,7 +40,7 @@ def _src_pad_added (stream, pad, codec, pipeline):
global funnel
print "src pad %s added for stream %s %s" % (pad.get_name(), stream.get_property("participant").get_property("cname"), codec.to_string())
if not funnel:
- funnel = gst.element_factory_make("fsfunnel")
+ funnel = gst.element_factory_make("funnel")
videosink = gst.element_factory_make ("xvimagesink")
pipeline.add(funnel)
pipeline.add(videosink)
diff --git a/examples/gui/fs-gui.py b/examples/gui/fs-gui.py
index 522aad2f..e29f02b8 100755
--- a/examples/gui/fs-gui.py
+++ b/examples/gui/fs-gui.py
@@ -245,7 +245,7 @@ class FsUIPipeline:
element.set_property("speed-preset", 2)
element.set_property("profile", "baseline")
element.set_property("tune", "zerolatency")
- elif element.get_factory().get_name() == "gstrtpbin":
+ elif element.get_factory().get_name() == "rtpbin":
element.set_property("latency", 100)
@@ -638,7 +638,7 @@ class FsUIParticipant:
widget.window.xid,
"uservideosink")
self.pipeline.pipeline.add(self.videosink)
- self.funnel = gst.element_factory_make("fsfunnel")
+ self.funnel = gst.element_factory_make("funnel")
self.pipeline.pipeline.add(self.funnel)
self.funnel.link(self.videosink)
self.havesize = self.videosink.get_pad("sink").add_buffer_probe(self.have_size)
diff --git a/farstream/fs-conference.c b/farstream/fs-conference.c
index 160c69cf..58edb776 100644
--- a/farstream/fs-conference.c
+++ b/farstream/fs-conference.c
@@ -62,9 +62,7 @@ GST_DEBUG_CATEGORY (fs_conference_debug);
#define GST_CAT_DEFAULT fs_conference_debug
-GST_BOILERPLATE (
- FsConference, fs_conference,
- GstBin, GST_TYPE_BIN)
+G_DEFINE_ABSTRACT_TYPE (FsConference, fs_conference,GST_TYPE_BIN)
GQuark
@@ -81,22 +79,15 @@ _fs_conference_init_debug (void)
}
static void
-fs_conference_base_init (gpointer g_class)
-{
- _fs_conference_init_debug ();
-}
-
-
-
-static void
fs_conference_class_init (FsConferenceClass * klass)
{
+ _fs_conference_init_debug ();
}
static void
-fs_conference_init (FsConference *conf, FsConferenceClass *bclass)
+fs_conference_init (FsConference *conf)
{
- GST_DEBUG ("fs_conference_init");
+ GST_DEBUG_OBJECT (conf, "fs_conference_init");
}
diff --git a/farstream/fs-element-added-notifier.c b/farstream/fs-element-added-notifier.c
index 637a3937..aac3da63 100644
--- a/farstream/fs-element-added-notifier.c
+++ b/farstream/fs-element-added-notifier.c
@@ -158,45 +158,53 @@ fs_element_added_notifier_add (FsElementAddedNotifier *notifier,
}
+
static void
-_bin_unparented_cb (GstObject *object, GstObject *parent, gpointer user_data)
+_element_removed_callback (GstBin *bin, GstElement *element,
+ FsElementAddedNotifier *notifier)
{
- GstIterator *iter = NULL;
- gboolean done;
/* Return if there was no handler connected */
- if (g_signal_handlers_disconnect_by_func (object, _element_added_callback,
- user_data) == 0)
+ if (g_signal_handlers_disconnect_by_func (element, _element_added_callback,
+ notifier) == 0 ||
+ g_signal_handlers_disconnect_by_func (element, _element_removed_callback,
+ notifier) == 0)
return;
- iter = gst_bin_iterate_elements (GST_BIN (object));
-
- done = FALSE;
- while (!done)
+ if (GST_IS_BIN (element))
{
- gpointer item;
-
- switch (gst_iterator_next (iter, &item)) {
- case GST_ITERATOR_OK:
- if (GST_IS_BIN (item))
- _bin_unparented_cb (GST_OBJECT (item), object, user_data);
- gst_object_unref (item);
- break;
- case GST_ITERATOR_RESYNC:
- // We don't rollback anything, we just ignore already processed ones
- gst_iterator_resync (iter);
- break;
- case GST_ITERATOR_ERROR:
- g_error ("Wrong parameters were given?");
- done = TRUE;
- break;
- case GST_ITERATOR_DONE:
- done = TRUE;
- break;
+ GstIterator *iter = NULL;
+ gboolean done;
+ iter = gst_bin_iterate_elements (GST_BIN (element));
+
+ done = FALSE;
+ while (!done)
+ {
+ GValue item = {0,};
+
+ switch (gst_iterator_next (iter, &item)) {
+ case GST_ITERATOR_OK:
+ _element_removed_callback (GST_BIN (element),
+ GST_ELEMENT (g_value_get_object (&item)),
+ notifier);
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ // We don't rollback anything, we just ignore already processed ones
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ g_error ("Wrong parameters were given?");
+ done = TRUE;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
}
- }
- gst_iterator_free (iter);
+ gst_iterator_free (iter);
+ }
}
@@ -222,7 +230,7 @@ fs_element_added_notifier_remove (FsElementAddedNotifier *notifier,
0, 0, NULL, /* id, detail, closure */
_element_added_callback, notifier) != 0)
{
- _bin_unparented_cb (GST_OBJECT (bin), NULL, notifier);
+ _element_removed_callback (NULL, GST_ELEMENT (bin), notifier);
return TRUE;
}
else
@@ -380,26 +388,27 @@ _element_added_callback (GstBin *parent, GstElement *element,
g_signal_connect_object (element, "element-added",
G_CALLBACK (_element_added_callback), notifier, 0);
- if (parent)
- g_signal_connect_object (element, "parent-unset",
- G_CALLBACK (_bin_unparented_cb), notifier, 0);
+
+ g_signal_connect_object (element, "element-removed",
+ G_CALLBACK (_element_removed_callback), notifier, 0);
iter = gst_bin_iterate_elements (GST_BIN (element));
done = FALSE;
while (!done)
{
- gpointer item = NULL;
+ GValue item = {0,};
switch (gst_iterator_next (iter, &item)) {
case GST_ITERATOR_OK:
/* We make sure the callback has not already been added */
- if (g_signal_handler_find (item,
+ if (g_signal_handler_find (g_value_get_object (&item),
G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
0, 0, NULL, /* id, detail, closure */
_element_added_callback, notifier) == 0)
- _element_added_callback (GST_BIN_CAST (element), item, notifier);
- gst_object_unref (item);
+ _element_added_callback (GST_BIN_CAST (element),
+ g_value_get_object (&item), notifier);
+ g_value_reset (&item);
break;
case GST_ITERATOR_RESYNC:
// We don't rollback anything, we just ignore already processed ones
diff --git a/farstream/fs-plugin.c b/farstream/fs-plugin.c
index 423cf719..578a15e3 100644
--- a/farstream/fs-plugin.c
+++ b/farstream/fs-plugin.c
@@ -315,6 +315,8 @@ fs_plugin_list_available (const gchar *type_suffix)
GError *error = NULL;
gchar *tmp1, *tmp2, *tmp3;
+ _fs_conference_init_debug ();
+
g_static_mutex_lock (&mutex);
fs_plugin_search_path_init ();
diff --git a/farstream/fs-stream.c b/farstream/fs-stream.c
index 110641d8..28a101fc 100644
--- a/farstream/fs-stream.c
+++ b/farstream/fs-stream.c
@@ -147,6 +147,7 @@ struct _FsStreamPrivate
G_DEFINE_ABSTRACT_TYPE(FsStream, fs_stream, GST_TYPE_OBJECT);
+static void fs_stream_constructed (GObject *obj);
static void fs_stream_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -157,6 +158,8 @@ static void fs_stream_set_property (GObject *object,
GParamSpec *pspec);
static void fs_stream_finalize (GObject *obj);
+static void fs_stream_pad_removed (FsStream *stream, GstPad *pad);
+
static guint signals[LAST_SIGNAL] = { 0 };
#define FS_STREAM_LOCK(self) g_mutex_lock((self)->priv->mutex)
@@ -172,6 +175,8 @@ fs_stream_class_init (FsStreamClass *klass)
gobject_class->set_property = fs_stream_set_property;
gobject_class->get_property = fs_stream_get_property;
gobject_class->finalize = fs_stream_finalize;
+ gobject_class->constructed = fs_stream_constructed;
+
/**
* FsStream:remote-codecs:
@@ -336,6 +341,22 @@ fs_stream_init (FsStream *self)
}
static void
+fs_stream_constructed (GObject *obj)
+{
+ FsStream *stream = FS_STREAM (obj);
+ FsSession *session;
+ FsConference *conference;
+
+ g_object_get (stream, "session", &session, NULL);
+ g_object_get (session, "conference", &conference, NULL);
+
+ g_signal_connect_object (conference, "pad-removed",
+ G_CALLBACK (fs_stream_pad_removed), obj, G_CONNECT_SWAPPED);
+ g_object_unref (session);
+ g_object_unref (conference);
+}
+
+static void
fs_stream_finalize (GObject *obj)
{
FsStream *stream = FS_STREAM (obj);
@@ -529,12 +550,10 @@ fs_stream_emit_error (FsStream *stream,
static void
-src_pad_parent_unset (GstObject *srcpad, GstObject *parent, gpointer user_data)
+fs_stream_pad_removed (FsStream *stream, GstPad *pad)
{
- FsStream *stream = FS_STREAM (user_data);
-
FS_STREAM_LOCK (stream);
- stream->priv->src_pads = g_list_remove (stream->priv->src_pads, srcpad);
+ stream->priv->src_pads = g_list_remove (stream->priv->src_pads, pad);
stream->priv->src_pads_cookie++;
FS_STREAM_UNLOCK (stream);
}
@@ -558,21 +577,11 @@ fs_stream_emit_src_pad_added (FsStream *stream,
g_assert (!g_list_find (stream->priv->src_pads, pad));
stream->priv->src_pads = g_list_append (stream->priv->src_pads, pad);
stream->priv->src_pads_cookie++;
- g_signal_connect_object (pad, "parent-unset",
- G_CALLBACK (src_pad_parent_unset), stream, 0);
FS_STREAM_UNLOCK (stream);
g_signal_emit (stream, signals[SRC_PAD_ADDED], 0, pad, codec);
}
-static GstIteratorItem
-src_pad_iterator_item_func (GstIterator*iter, gpointer item)
-{
- gst_object_ref (item);
-
- return GST_ITERATOR_ITEM_PASS;
-}
-
/**
* fs_stream_iterate_src_pads:
* @stream: a #FsStream
@@ -589,7 +598,7 @@ fs_stream_iterate_src_pads (FsStream *stream)
{
return gst_iterator_new_list (GST_TYPE_PAD, stream->priv->mutex,
&stream->priv->src_pads_cookie, &stream->priv->src_pads,
- g_object_ref (stream), src_pad_iterator_item_func, g_object_unref);
+ g_object_ref (stream), NULL);
}
diff --git a/farstream/fs-transmitter.c b/farstream/fs-transmitter.c
index d0c52c18..419ac65c 100644
--- a/farstream/fs-transmitter.c
+++ b/farstream/fs-transmitter.c
@@ -107,8 +107,8 @@ fs_transmitter_class_init (FsTransmitterClass *klass)
* FsTransmitter:gst-src:
*
* A network source #GstElement to be used by the #FsSession
- * This element MUST provide a source pad named "src%d" per component.
- * These pads number must start at 1 (the %d corresponds to the component
+ * This element MUST provide a source pad named "src_%u" per component.
+ * These pads number must start at 1 (the %u corresponds to the component
* number).
* These pads MUST be static pads.
*
@@ -126,8 +126,8 @@ fs_transmitter_class_init (FsTransmitterClass *klass)
*
* A network source #GstElement to be used by the #FsSession
* These element's sink must have async=FALSE
- * This element MUST provide a pad named "sink\%d" per component.
- * These pads number must start at 1 (the \%d corresponds to the component
+ * This element MUST provide a pad named "sink_\%u" per component.
+ * These pads number must start at 1 (the \%u corresponds to the component
* number).
* These pads MUST be static pads.
*
diff --git a/gst/fsfunnel/Makefile.am b/gst/fsfunnel/Makefile.am
deleted file mode 100644
index d469a433..00000000
--- a/gst/fsfunnel/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-plugin_LTLIBRARIES = libfsfunnel.la
-
-libfsfunnel_la_SOURCES = fs-funnel.c
-libfsfunnel_la_CFLAGS = \
- $(FS_CFLAGS) \
- $(GST_BASE_CFLAGS) \
- $(GST_CFLAGS)
-libfsfunnel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libfsfunnel_la_LIBADD = \
- $(FS_LIBS) \
- $(GST_BASE_LIBS) \
- $(GST_LIBS)
-
-noinst_HEADERS = fs-funnel.h
diff --git a/gst/fsfunnel/fs-funnel.c b/gst/fsfunnel/fs-funnel.c
deleted file mode 100644
index 9d09c5aa..00000000
--- a/gst/fsfunnel/fs-funnel.c
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- * Farstream - Farstream Funnel element
- *
- * Copyright 2007 Collabora Ltd.
- * @author: Olivier Crete <olivier.crete@collabora.co.uk>
- * Copyright 2007 Nokia Corp.
- *
- * fs-funnel.c: Simple Funnel element
- *
- * 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-fsfunnel
- * @short_description: N-to-1 simple funnel
- *
- * Takes packets from various input sinks into one output source
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "fs-funnel.h"
-
-GST_DEBUG_CATEGORY_STATIC (fs_funnel_debug);
-#define GST_CAT_DEFAULT fs_funnel_debug
-
-static const GstElementDetails fs_funnel_details =
-GST_ELEMENT_DETAILS(
- "Farstream Funnel pipe fitting",
- "Generic",
- "N-to-1 pipe fitting",
- "Olivier Crete <olivier.crete@collabora.co.uk>");
-
-static GstStaticPadTemplate funnel_sink_template =
- GST_STATIC_PAD_TEMPLATE ("sink%d",
- GST_PAD_SINK,
- GST_PAD_REQUEST,
- GST_STATIC_CAPS_ANY);
-
-static GstStaticPadTemplate funnel_src_template =
- GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS_ANY);
-
-
-static void
-_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT
- (fs_funnel_debug, "fsfunnel", 0, "fsfunnel element");
-}
-
-GST_BOILERPLATE_FULL (FsFunnel, fs_funnel, GstElement, GST_TYPE_ELEMENT,
- _do_init);
-
-
-
-static GstStateChangeReturn fs_funnel_change_state (GstElement *element,
- GstStateChange transition);
-
-static GstPad *fs_funnel_request_new_pad (GstElement * element,
- GstPadTemplate * templ, const gchar * name);
-static void fs_funnel_release_pad (GstElement * element, GstPad * pad);
-
-static GstFlowReturn fs_funnel_buffer_alloc (GstPad * pad, guint64 offset,
- guint size, GstCaps * caps, GstBuffer ** buf);
-static GstFlowReturn fs_funnel_chain (GstPad * pad, GstBuffer * buffer);
-static gboolean fs_funnel_event (GstPad * pad, GstEvent * event);
-static gboolean fs_funnel_src_event (GstPad * pad, GstEvent * event);
-static GstCaps* fs_funnel_getcaps (GstPad * pad);
-
-
-typedef struct {
- GstSegment segment;
-} FsFunnelPadPrivate;
-
-static void
-fs_funnel_base_init (gpointer g_class)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_set_details (gstelement_class, &fs_funnel_details);
-
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&funnel_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&funnel_src_template));
-}
-
-
-static void
-fs_funnel_dispose (GObject * object)
-{
- GList *item;
-
- restart:
- for (item = GST_ELEMENT_PADS (object); item; item = g_list_next (item))
- {
- GstPad *pad = GST_PAD (item->data);
-
- if (GST_PAD_IS_SINK (pad))
- {
- gst_element_release_request_pad (GST_ELEMENT (object), pad);
- goto restart;
- }
- }
-
- G_OBJECT_CLASS (parent_class)->dispose (object);
-}
-
-static void
-fs_funnel_class_init (FsFunnelClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-
- gobject_class->dispose = GST_DEBUG_FUNCPTR (fs_funnel_dispose);
-
- gstelement_class->request_new_pad =
- GST_DEBUG_FUNCPTR (fs_funnel_request_new_pad);
- gstelement_class->release_pad = GST_DEBUG_FUNCPTR (fs_funnel_release_pad);
- gstelement_class->change_state = GST_DEBUG_FUNCPTR (fs_funnel_change_state);
-}
-
-static void
-fs_funnel_init (FsFunnel * funnel, FsFunnelClass * g_class)
-{
- funnel->srcpad = gst_pad_new_from_static_template (&funnel_src_template,
- "src");
- gst_pad_set_event_function (funnel->srcpad, fs_funnel_src_event);
- gst_pad_use_fixed_caps (funnel->srcpad);
- gst_element_add_pad (GST_ELEMENT (funnel), funnel->srcpad);
-}
-
-static GstFlowReturn
-fs_funnel_buffer_alloc (GstPad * pad, guint64 offset, guint size,
- GstCaps * caps, GstBuffer ** buf)
-{
- FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent_element (pad));
- GstFlowReturn ret = GST_FLOW_OK;
-
- ret = gst_pad_alloc_buffer (funnel->srcpad, offset, size, caps, buf);
-
- gst_object_unref (funnel);
-
- return ret;
-}
-
-
-static GstPad *
-fs_funnel_request_new_pad (GstElement * element, GstPadTemplate * templ,
- const gchar * name)
-{
- GstPad *sinkpad;
- FsFunnelPadPrivate *priv = g_slice_alloc0 (sizeof(FsFunnelPadPrivate));
-
- GST_DEBUG_OBJECT (element, "requesting pad");
-
- sinkpad = gst_pad_new_from_template (templ, name);
-
- gst_pad_set_chain_function (sinkpad, GST_DEBUG_FUNCPTR (fs_funnel_chain));
- gst_pad_set_event_function (sinkpad, GST_DEBUG_FUNCPTR (fs_funnel_event));
- gst_pad_set_getcaps_function (sinkpad, GST_DEBUG_FUNCPTR (fs_funnel_getcaps));
- gst_pad_set_bufferalloc_function (sinkpad,
- GST_DEBUG_FUNCPTR (fs_funnel_buffer_alloc));
-
- gst_segment_init (&priv->segment, GST_FORMAT_UNDEFINED);
- gst_pad_set_element_private (sinkpad, priv);
-
- gst_pad_set_active (sinkpad, TRUE);
-
- gst_element_add_pad (element, sinkpad);
-
- return sinkpad;
-}
-
-static void
-fs_funnel_release_pad (GstElement * element, GstPad * pad)
-{
- FsFunnel *funnel = FS_FUNNEL (element);
- FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);
-
- GST_DEBUG_OBJECT (funnel, "releasing pad");
-
- gst_pad_set_active (pad, FALSE);
-
- if (priv)
- g_slice_free1 (sizeof(FsFunnelPadPrivate), priv);
-
- gst_element_remove_pad (GST_ELEMENT_CAST (funnel), pad);
-}
-
-static GstCaps*
-fs_funnel_getcaps (GstPad * pad)
-{
- FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent (pad));
- GstCaps *caps;
-
- caps = gst_pad_peer_get_caps_reffed (funnel->srcpad);
- if (caps == NULL)
- caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
-
- gst_object_unref (funnel);
-
- return caps;
-}
-
-static GstFlowReturn
-fs_funnel_chain (GstPad * pad, GstBuffer * buffer)
-{
- GstFlowReturn res;
- FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent (pad));
- FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);
- GstEvent *event = NULL;
- GstClockTime newts;
- GstCaps *padcaps;
-
- GST_DEBUG_OBJECT (funnel, "received buffer %p", buffer);
-
- GST_OBJECT_LOCK (funnel);
- if (priv->segment.format == GST_FORMAT_UNDEFINED) {
- GST_WARNING_OBJECT (funnel, "Got buffer without segment,"
- " setting segment [0,inf[");
- gst_segment_set_newsegment_full (&priv->segment, FALSE, 1.0, 1.0,
- GST_FORMAT_TIME, 0, -1, 0);
- }
-
- if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)))
- gst_segment_set_last_stop (&priv->segment, priv->segment.format,
- GST_BUFFER_TIMESTAMP (buffer));
-
- newts = gst_segment_to_running_time (&priv->segment,
- priv->segment.format, GST_BUFFER_TIMESTAMP (buffer));
- if (newts != GST_BUFFER_TIMESTAMP (buffer)) {
- buffer = gst_buffer_make_metadata_writable (buffer);
- GST_BUFFER_TIMESTAMP (buffer) = newts;
- }
-
- if (!funnel->has_segment)
- {
- event = gst_event_new_new_segment_full (FALSE, 1.0, 1.0, GST_FORMAT_TIME,
- 0, -1, 0);
- funnel->has_segment = TRUE;
- }
- GST_OBJECT_UNLOCK (funnel);
-
- if (event) {
- if (!gst_pad_push_event (funnel->srcpad, event))
- GST_WARNING_OBJECT (funnel, "Could not push out newsegment event");
- }
-
-
- GST_OBJECT_LOCK (pad);
- padcaps = GST_PAD_CAPS (funnel->srcpad);
- GST_OBJECT_UNLOCK (pad);
-
- if (GST_BUFFER_CAPS (buffer) && GST_BUFFER_CAPS (buffer) != padcaps) {
- if (!gst_pad_set_caps (funnel->srcpad, GST_BUFFER_CAPS (buffer))) {
- res = GST_FLOW_NOT_NEGOTIATED;
- goto out;
- }
- }
-
- res = gst_pad_push (funnel->srcpad, buffer);
-
- GST_LOG_OBJECT (funnel, "handled buffer %s", gst_flow_get_name (res));
-
- out:
- gst_object_unref (funnel);
-
- return res;
-}
-
-static gboolean
-fs_funnel_event (GstPad * pad, GstEvent * event)
-{
- FsFunnel *funnel = FS_FUNNEL (gst_pad_get_parent (pad));
- FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);
- gboolean forward = TRUE;
- gboolean res = TRUE;
-
- switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NEWSEGMENT:
- {
- gboolean update;
- gdouble rate, arate;
- GstFormat format;
- gint64 start;
- gint64 stop;
- gint64 time;
-
- gst_event_parse_new_segment_full (event, &update, &rate, &arate,
- &format, &start, &stop, &time);
-
-
- GST_OBJECT_LOCK (funnel);
- gst_segment_set_newsegment_full (&priv->segment, update, rate, arate,
- format, start, stop, time);
- GST_OBJECT_UNLOCK (funnel);
-
- forward = FALSE;
- gst_event_unref (event);
- }
- break;
- case GST_EVENT_FLUSH_STOP:
- {
- GST_OBJECT_LOCK (funnel);
- gst_segment_init (&priv->segment, GST_FORMAT_UNDEFINED);
- GST_OBJECT_UNLOCK (funnel);
- }
- break;
- default:
- break;
- }
-
-
- if (forward)
- res = gst_pad_push_event (funnel->srcpad, event);
-
- gst_object_unref (funnel);
-
- return res;
-}
-
-static gboolean
-fs_funnel_src_event (GstPad * pad, GstEvent * event)
-{
- GstElement *funnel;
- GstIterator *iter;
- GstPad *sinkpad;
- gboolean result = FALSE;
- gboolean done = FALSE;
-
- funnel = gst_pad_get_parent_element (pad);
- g_return_val_if_fail (funnel != NULL, FALSE);
-
- iter = gst_element_iterate_sink_pads (funnel);
-
- while (!done) {
- switch (gst_iterator_next (iter, (gpointer) &sinkpad)) {
- case GST_ITERATOR_OK:
- gst_event_ref (event);
- result |= gst_pad_push_event (sinkpad, event);
- gst_object_unref (sinkpad);
- break;
- case GST_ITERATOR_RESYNC:
- gst_iterator_resync (iter);
- result = FALSE;
- break;
- case GST_ITERATOR_ERROR:
- GST_WARNING_OBJECT (funnel, "Error iterating sinkpads");
- case GST_ITERATOR_DONE:
- done = TRUE;
- break;
- }
- }
- gst_iterator_free (iter);
- gst_object_unref (funnel);
- gst_event_unref (event);
-
- return result;
-}
-
-static void
-reset_pad (gpointer data, gpointer user_data)
-{
- GstPad *pad = data;
- FsFunnelPadPrivate *priv = gst_pad_get_element_private (pad);
-
- GST_OBJECT_LOCK (pad);
- gst_segment_init (&priv->segment, GST_FORMAT_UNDEFINED);
- GST_OBJECT_UNLOCK (pad);
- gst_object_unref (pad);
-}
-
-static GstStateChangeReturn
-fs_funnel_change_state (GstElement *element, GstStateChange transition)
-{
- FsFunnel *funnel = FS_FUNNEL (element);
- GstStateChangeReturn ret;
-
- switch (transition) {
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- {
- GstIterator *iter = gst_element_iterate_sink_pads (element);
- GstIteratorResult res;
-
- do {
- res = gst_iterator_foreach (iter, reset_pad, NULL);
- } while (res == GST_ITERATOR_RESYNC);
-
- gst_iterator_free (iter);
-
- if (res == GST_ITERATOR_ERROR)
- return GST_STATE_CHANGE_FAILURE;
-
- GST_OBJECT_LOCK (funnel);
- funnel->has_segment = FALSE;
- GST_OBJECT_UNLOCK (funnel);
- }
- break;
- default:
- break;
- }
-
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
- return ret;
-}
-
-
-static gboolean plugin_init (GstPlugin * plugin)
-{
- return gst_element_register (plugin, "fsfunnel",
- GST_RANK_NONE, FS_TYPE_FUNNEL);
-}
-
-GST_PLUGIN_DEFINE (
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "fsfunnel",
- "Farstream Funnel plugin",
- plugin_init,
- VERSION,
- "LGPL",
- "Farstream",
- "http://farstream.freedesktop.org/"
-)
diff --git a/gst/fsfunnel/fs-funnel.h b/gst/fsfunnel/fs-funnel.h
deleted file mode 100644
index e56df015..00000000
--- a/gst/fsfunnel/fs-funnel.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Farstream - Farstream Funnel element
- *
- * Copyright 2007 Collabora Ltd.
- * @author: Olivier Crete <olivier.crete@collabora.co.uk>
- * Copyright 2007 Nokia Corp.
- *
- * fs-funnel.h: Simple Funnel element
- *
- * 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_FUNNEL_H__
-#define __FS_FUNNEL_H__
-
-#include <gst/gst.h>
-
-G_BEGIN_DECLS
-
-#define FS_TYPE_FUNNEL \
- (fs_funnel_get_type ())
-#define FS_FUNNEL(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),FS_TYPE_FUNNEL,FsFunnel))
-#define FS_FUNNEL_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),FS_TYPE_FUNNEL,FsFunnelClass))
-#define FS_IS_FUNNEL(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),FS_TYPE_FUNNEL))
-#define FS_IS_FUNNEL_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),FS_TYPE_FUNNEL))
-
-typedef struct _FsFunnel FsFunnel;
-typedef struct _FsFunnelClass FsFunnelClass;
-
-/**
- * FsFunnel:
- *
- * Opaque #FsFunnel data structure.
- */
-struct _FsFunnel {
- GstElement element;
-
- /*< private >*/
- GstPad *srcpad;
-
- gboolean has_segment;
-};
-
-struct _FsFunnelClass {
- GstElementClass parent_class;
-};
-
-GType fs_funnel_get_type (void);
-
-G_END_DECLS
-
-#endif /* __FS_FUNNEL_H__ */
diff --git a/gst/fsmsnconference/Makefile.am b/gst/fsmsnconference/Makefile.am
index 740180d3..2ed110df 100644
--- a/gst/fsmsnconference/Makefile.am
+++ b/gst/fsmsnconference/Makefile.am
@@ -6,7 +6,8 @@ plugin_LTLIBRARIES = libfsmsnconference.la
noinst_LTLIBRARIES = libfsmsnconference-convenience.la
libfsmsnconference_convenience_la_SOURCES = \
- fs-msn-conference.c \
+ fs-msn-cam-recv-conference.c \
+ fs-msn-cam-send-conference.c \
fs-msn-participant.c \
fs-msn-session.c \
fs-msn-connection.c \
@@ -32,8 +33,7 @@ AM_CFLAGS = \
# Build the main plugin
libfsmsnconference_la_SOURCES = \
- fs-msn-cam-recv-conference.c \
- fs-msn-cam-send-conference.c
+ fs-msn-conference.c
libfsmsnconference_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libfsmsnconference_la_LIBADD = \
@@ -51,16 +51,13 @@ libfsmsnconference_la_LIBADD = \
if ENABLE_GTK_DOC
noinst_LTLIBRARIES += libfsmsnconference_doc.la
-nodist_libfsmsnconference_doc_la_SOURCES = \
- fs-msn-cam-recv-conference.doc.c \
- fs-msn-cam-send-conference.doc.c
+nodist_libfsmsnconference_doc_la_CFLAGS = -DBUILD_GTK_DOC
-libfsmsnconference_doc_la_LIBADD = $(libfsmsnconference_la_LIBADD)
+nodist_libfsmsnconference_doc_la_SOURCES = $(libfsmsnconference_la_SOURCES)
-%.doc.c: %.c
- $(AM_V_GEN)sed -e 's:GST_PLUGIN_DEFINE:GST_PLUGIN_DEFINE_STATIC:' $< > $@
-BUILT_SOURCES = $(nodist_libfsmsnconference_doc_la_SOURCES)
+libfsmsnconference_doc_la_LIBADD = libfsmsnconference-convenience.la \
+ $(libfsmsnconference_la_LIBADD)
CLEANFILES = $(BUILT_SOURCES)
diff --git a/gst/fsmsnconference/fs-msn-cam-recv-conference.c b/gst/fsmsnconference/fs-msn-cam-recv-conference.c
index b0cdb987..462bc4dc 100644
--- a/gst/fsmsnconference/fs-msn-cam-recv-conference.c
+++ b/gst/fsmsnconference/fs-msn-cam-recv-conference.c
@@ -46,56 +46,27 @@
#define GST_CAT_DEFAULT fsmsnconference_debug
-/* Signals */
-enum
-{
- LAST_SIGNAL
-};
-
-/* Properties */
-enum
-{
- PROP_0
-};
-
-
-static GstElementDetails fs_msn_cam_recv_conference_details =
-{
- "Farstream MSN Reception Conference",
- "Generic/Bin/MSN",
- "A Farstream MSN Reception 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_recv_conference_do_init (GType type);
-GST_BOILERPLATE_FULL (FsMsnCamRecvConference, fs_msn_cam_recv_conference,
- FsMsnConference, FS_TYPE_MSN_CONFERENCE, fs_msn_cam_recv_conference_do_init);
+G_DEFINE_TYPE (FsMsnCamRecvConference, fs_msn_cam_recv_conference,
+ FS_TYPE_MSN_CONFERENCE);
-static void
-fs_msn_cam_recv_conference_do_init (GType type)
-{
-}
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_base_init (gpointer g_class)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_set_details (gstelement_class, &fs_msn_cam_recv_conference_details);
-}
-
-static void
-fs_msn_cam_recv_conference_init (FsMsnCamRecvConference *self,
- FsMsnCamRecvConferenceClass *bclass)
+fs_msn_cam_recv_conference_init (FsMsnCamRecvConference *self)
{
FsMsnConference *conf = FS_MSN_CONFERENCE (self);
GstElementFactory *fact = NULL;
diff --git a/gst/fsmsnconference/fs-msn-cam-send-conference.c b/gst/fsmsnconference/fs-msn-cam-send-conference.c
index 86c6dbff..12d3ec70 100644
--- a/gst/fsmsnconference/fs-msn-cam-send-conference.c
+++ b/gst/fsmsnconference/fs-msn-cam-send-conference.c
@@ -46,56 +46,26 @@
#define GST_CAT_DEFAULT fsmsnconference_debug
-/* Signals */
-enum
-{
- LAST_SIGNAL
-};
-
-/* Properties */
-enum
-{
- PROP_0
-};
-
-static GstElementDetails fs_msn_cam_send_conference_details =
-{
- "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_do_init (GType type);
-
-GST_BOILERPLATE_FULL (FsMsnCamSendConference, fs_msn_cam_send_conference,
- FsMsnConference, FS_TYPE_MSN_CONFERENCE, fs_msn_cam_send_conference_do_init);
-
-static void
-fs_msn_cam_send_conference_do_init (GType type)
-{
-}
+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_base_init (gpointer g_class)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_set_details (gstelement_class, &fs_msn_cam_send_conference_details);
-}
-
-static void
-fs_msn_cam_send_conference_init (FsMsnCamSendConference *self,
- FsMsnCamSendConferenceClass *bclass)
+fs_msn_cam_send_conference_init (FsMsnCamSendConference *self)
{
FsMsnConference *conf = FS_MSN_CONFERENCE (self);
GstElementFactory *fact = NULL;
diff --git a/gst/fsmsnconference/fs-msn-conference.c b/gst/fsmsnconference/fs-msn-conference.c
index 20e0dd8d..aaa0586d 100644
--- a/gst/fsmsnconference/fs-msn-conference.c
+++ b/gst/fsmsnconference/fs-msn-conference.c
@@ -88,11 +88,8 @@ struct _FsMsnConferencePrivate
FsMsnSession *session;
};
-static void fs_msn_conference_do_init (GType type);
-
-
-GST_BOILERPLATE_FULL (FsMsnConference, fs_msn_conference, FsConference,
- FS_TYPE_CONFERENCE, fs_msn_conference_do_init);
+G_DEFINE_ABSTRACT_TYPE (FsMsnConference, fs_msn_conference,
+ FS_TYPE_CONFERENCE);
static FsSession *fs_msn_conference_new_session (FsConference *conf,
FsMediaType media_type,
@@ -107,13 +104,6 @@ static void _remove_participant (gpointer user_data,
GObject *where_the_object_was);
static void
-fs_msn_conference_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT (fsmsnconference_debug, "fsmsnconference", 0,
- "Farstream MSN Conference Element");
-}
-
-static void
fs_msn_conference_dispose (GObject * object)
{
FsMsnConference *self = FS_MSN_CONFERENCE (object);
@@ -136,17 +126,26 @@ fs_msn_conference_dispose (GObject * object)
g_clear_error (&self->missing_element_error);
- G_OBJECT_CLASS (parent_class)->dispose (object);
+ 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 =
@@ -155,20 +154,9 @@ fs_msn_conference_class_init (FsMsnConferenceClass * klass)
gobject_class->dispose = GST_DEBUG_FUNCPTR (fs_msn_conference_dispose);
}
-static void
-fs_msn_conference_base_init (gpointer g_class)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
-
- 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));
-}
static void
-fs_msn_conference_init (FsMsnConference *conf,
- FsMsnConferenceClass *bclass)
+fs_msn_conference_init (FsMsnConference *conf)
{
GST_DEBUG_OBJECT (conf, "fs_msn_conference_init");
@@ -295,7 +283,16 @@ static gboolean plugin_init (GstPlugin * plugin)
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",
@@ -305,4 +302,10 @@ GST_PLUGIN_DEFINE (
"LGPL",
"Farstream",
"http://farstream.freedesktop.org/"
+#ifdef BUILD_GTK_DOC
+ );
+}
+#else
)
+#endif
+
diff --git a/gst/fsmsnconference/fs-msn-stream.c b/gst/fsmsnconference/fs-msn-stream.c
index 10dad020..e7ecd637 100644
--- a/gst/fsmsnconference/fs-msn-stream.c
+++ b/gst/fsmsnconference/fs-msn-stream.c
@@ -531,7 +531,7 @@ _connected (
"fdsrc name=fdsrc do-timestamp=true ! mimdec ! valve name=recv_valve", TRUE, &error);
else
codecbin = gst_parse_bin_from_description (
- "ffmpegcolorspace ! videoscale ! mimenc name=enc !"
+ "videoconvert ! videoscale ! mimenc name=enc !"
" fdsink name=fdsink sync=false async=false",
TRUE, &error);
diff --git a/gst/fsrawconference/Makefile.am b/gst/fsrawconference/Makefile.am
index 38c233a8..c2881a76 100644
--- a/gst/fsrawconference/Makefile.am
+++ b/gst/fsrawconference/Makefile.am
@@ -47,17 +47,13 @@ EXTRA_DIST = $(preferences_DATA)
if ENABLE_GTK_DOC
noinst_LTLIBRARIES += libfsrawconference_doc.la
+nodist_libfsrawconference_doc_la_CFLAGS = -DBUILD_GTK_DOC
+
nodist_libfsrawconference_doc_la_SOURCES = \
- fs-raw-conference-plugin.doc.c \
$(libfsrawconference_la_SOURCES)
libfsrawconference_doc_la_LIBADD = $(libfsrawconference_la_LIBADD)
-%.doc.c: %.c
- $(AM_V_GEN)sed -e 's:GST_PLUGIN_DEFINE:GST_PLUGIN_DEFINE_STATIC:' $< > $@
-
-BUILT_SOURCES = fs-raw-conference-plugin.doc.c
-
CLEANFILES = $(BUILT_SOURCES)
endif
diff --git a/gst/fsrawconference/fs-raw-conference-plugin.c b/gst/fsrawconference/fs-raw-conference-plugin.c
index e5b5084e..f00afa9c 100644
--- a/gst/fsrawconference/fs-raw-conference-plugin.c
+++ b/gst/fsrawconference/fs-raw-conference-plugin.c
@@ -38,7 +38,14 @@ static gboolean plugin_init (GstPlugin * plugin)
GST_RANK_NONE, FS_TYPE_RAW_CONFERENCE);
}
+#ifdef BUILD_GTK_DOC
+void
+fs_raw_plugin_init_real (void)
+{
+ gst_plugin_register_static (
+#else
GST_PLUGIN_DEFINE (
+#endif
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"fsrawconference",
@@ -48,4 +55,9 @@ GST_PLUGIN_DEFINE (
"LGPL",
"Farstream",
"http://farstream.freedesktop.org/"
+#ifdef BUILD_GTK_DOC
+ );
+}
+#else
)
+#endif
diff --git a/gst/fsrawconference/fs-raw-conference.c b/gst/fsrawconference/fs-raw-conference.c
index cb31b177..06330e79 100644
--- a/gst/fsrawconference/fs-raw-conference.c
+++ b/gst/fsrawconference/fs-raw-conference.c
@@ -89,11 +89,7 @@ struct _FsRawConferencePrivate
GPtrArray *threads;
};
-static void fs_raw_conference_do_init (GType type);
-
-
-GST_BOILERPLATE_FULL (FsRawConference, fs_raw_conference, FsConference,
- FS_TYPE_CONFERENCE, fs_raw_conference_do_init);
+G_DEFINE_TYPE (FsRawConference, fs_raw_conference, FS_TYPE_CONFERENCE);
static FsSession *fs_raw_conference_new_session (FsConference *conf,
FsMediaType media_type,
@@ -112,14 +108,6 @@ static void fs_raw_conference_handle_message (
GstBin * bin,
GstMessage * message);
-
-static void
-fs_raw_conference_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT (fsrawconference_debug, "fsrawconference", 0,
- "Farstream Raw Conference Element");
-}
-
static void
fs_raw_conference_dispose (GObject * object)
{
@@ -138,7 +126,7 @@ fs_raw_conference_dispose (GObject * object)
self->priv->disposed = TRUE;
- G_OBJECT_CLASS (parent_class)->dispose (object);
+ G_OBJECT_CLASS (fs_raw_conference_parent_class)->dispose (object);
}
static void
@@ -148,18 +136,27 @@ fs_raw_conference_finalize (GObject * object)
g_ptr_array_free (self->priv->threads, TRUE);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (fs_raw_conference_parent_class)->finalize (object);
}
static void
fs_raw_conference_class_init (FsRawConferenceClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
FsConferenceClass *baseconf_class = FS_CONFERENCE_CLASS (klass);
GstBinClass *gstbin_class = GST_BIN_CLASS (klass);
g_type_class_add_private (klass, sizeof (FsRawConferencePrivate));
+ GST_DEBUG_CATEGORY_INIT (fsrawconference_debug, "fsrawconference", 0,
+ "Farstream Raw Conference Element");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fs_raw_conference_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fs_raw_conference_src_template));
+
baseconf_class->new_session =
GST_DEBUG_FUNCPTR (fs_raw_conference_new_session);
baseconf_class->new_participant =
@@ -172,20 +169,9 @@ fs_raw_conference_class_init (FsRawConferenceClass * klass)
gobject_class->dispose = GST_DEBUG_FUNCPTR (fs_raw_conference_dispose);
}
-static void
-fs_raw_conference_base_init (gpointer g_class)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&fs_raw_conference_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&fs_raw_conference_src_template));
-}
static void
-fs_raw_conference_init (FsRawConference *conf,
- FsRawConferenceClass *bclass)
+fs_raw_conference_init (FsRawConference *conf)
{
GST_DEBUG_OBJECT (conf, "fs_raw_conference_init");
@@ -350,7 +336,8 @@ fs_raw_conference_handle_message (
}
/* forward all messages to the parent */
- GST_BIN_CLASS (parent_class)->handle_message (bin, message);
+ GST_BIN_CLASS (fs_raw_conference_parent_class)->handle_message (bin,
+ message);
}
/**
diff --git a/gst/fsrawconference/fs-raw-session.c b/gst/fsrawconference/fs-raw-session.c
index 42fdf807..f243e2a3 100644
--- a/gst/fsrawconference/fs-raw-session.c
+++ b/gst/fsrawconference/fs-raw-session.c
@@ -610,7 +610,7 @@ fs_raw_session_constructed (GObject *object)
}
self->priv->send_tee_pad = gst_element_get_request_pad (self->priv->send_tee,
- "src%d");
+ "src_%u");
if (self->priv->send_tee_pad == NULL)
{
@@ -663,7 +663,7 @@ fs_raw_session_constructed (GObject *object)
return;
}
- if (!gst_element_link_pads (self->priv->send_tee, "src%d",
+ if (!gst_element_link_pads (self->priv->send_tee, "src_%u",
self->priv->fakesink, "sink"))
{
self->priv->construction_error = g_error_new (FS_ERROR,
@@ -770,7 +770,7 @@ _create_transform_bin (FsRawSession *self, GError **error)
"audioconvert ! audioresample ! audioconvert", TRUE, NULL,
GST_PARSE_FLAG_NONE, error);
else if (mtype == FS_MEDIA_TYPE_VIDEO)
- return gst_parse_bin_from_description_full ("ffmpegcolorspace ! videoscale",
+ return gst_parse_bin_from_description_full ("videoconvert ! videoscale",
TRUE, NULL, GST_PARSE_FLAG_NONE, error);
g_set_error (error, FS_ERROR, FS_ERROR_NOT_IMPLEMENTED,
@@ -949,7 +949,7 @@ fs_raw_session_remove_stream (FsRawSession *self,
if (self->priv->transmitter_recv_probe_id)
{
if (self->priv->transmitter_src_pad)
- gst_pad_remove_data_probe (self->priv->transmitter_src_pad,
+ gst_pad_remove_probe (self->priv->transmitter_src_pad,
self->priv->transmitter_recv_probe_id);
self->priv->transmitter_recv_probe_id = 0;
}
@@ -1239,8 +1239,8 @@ fs_raw_session_get_stream_transmitter_type (FsSession *session,
return transmitter_type;
}
-static gboolean
-_transmitter_pad_have_data_callback (GstPad *pad, GstBuffer *buffer,
+static GstPadProbeReturn
+_transmitter_pad_have_data_callback (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data)
{
FsRawSession *self = FS_RAW_SESSION (user_data);
@@ -1253,7 +1253,7 @@ _transmitter_pad_have_data_callback (GstPad *pad, GstBuffer *buffer,
FsCodec *codec;
if (!conference)
- return FALSE;
+ return GST_PAD_PROBE_REMOVE;
GST_OBJECT_LOCK (conference);
if (!self->priv->codecs ||
@@ -1262,11 +1262,10 @@ _transmitter_pad_have_data_callback (GstPad *pad, GstBuffer *buffer,
{
GST_OBJECT_UNLOCK (conference);
gst_object_unref (conference);
- return FALSE;
+ return GST_PAD_PROBE_DROP;
}
recv_capsfilter = gst_object_ref (self->priv->recv_capsfilter);
- gst_pad_remove_data_probe (pad, self->priv->transmitter_recv_probe_id);
self->priv->transmitter_recv_probe_id = 0;
codec = fs_codec_copy (self->priv->codecs->data);
GST_OBJECT_UNLOCK (conference);
@@ -1314,14 +1313,14 @@ _transmitter_pad_have_data_callback (GstPad *pad, GstBuffer *buffer,
gst_object_unref (conference);
gst_object_unref (recv_capsfilter);
- return TRUE;
+ return GST_PAD_PROBE_REMOVE;
error:
fs_codec_destroy (codec);
gst_object_unref (conference);
gst_object_unref (recv_capsfilter);
- return FALSE;
+ return GST_PAD_PROBE_REMOVE;
}
@@ -1450,7 +1449,7 @@ static FsStreamTransmitter *_stream_get_stream_transmitter (FsRawStream *stream,
goto error;
}
- if (!gst_element_link_pads (transmitter_src, "src1",
+ if (!gst_element_link_pads (transmitter_src, "src_1",
valve, "sink"))
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
@@ -1458,16 +1457,17 @@ static FsStreamTransmitter *_stream_get_stream_transmitter (FsRawStream *stream,
goto error;
}
- transmitter_src_pad = gst_element_get_static_pad (transmitter_src, "src1");
+ transmitter_src_pad = gst_element_get_static_pad (transmitter_src, "src_1");
GST_OBJECT_LOCK (conference);
self->priv->transmitter = fstransmitter;
self->priv->transmitter_src_pad = transmitter_src_pad;
GST_OBJECT_UNLOCK (conference);
- self->priv->transmitter_recv_probe_id = gst_pad_add_data_probe (
- self->priv->transmitter_src_pad,
- G_CALLBACK (_transmitter_pad_have_data_callback), self);
+ self->priv->transmitter_recv_probe_id = gst_pad_add_probe (
+ self->priv->transmitter_src_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ _transmitter_pad_have_data_callback, g_object_ref (self),
+ g_object_unref);
if (!gst_element_sync_state_with_parent (transmitter_src))
{
diff --git a/gst/fsrtcpfilter/fs-rtcp-filter.c b/gst/fsrtcpfilter/fs-rtcp-filter.c
index 8660c382..8a314188 100644
--- a/gst/fsrtcpfilter/fs-rtcp-filter.c
+++ b/gst/fsrtcpfilter/fs-rtcp-filter.c
@@ -1,7 +1,7 @@
/*
* Farstream Voice+Video library
*
- * Copyright 2008 Collabora Ltd,
+ * Copyright 2008-2012 Collabora Ltd,
* Copyright 2008 Nokia Corporation
* @author: Olivier Crete <olivier.crete@collabora.co.uk>
*
@@ -43,15 +43,6 @@
GST_DEBUG_CATEGORY (rtcp_filter_debug);
#define GST_CAT_DEFAULT (rtcp_filter_debug)
-/* elementfactory information */
-static const GstElementDetails fs_rtcp_filter_details =
-GST_ELEMENT_DETAILS (
- "RTCP Filter element",
- "Filter",
- "This element removes unneeded parts of rtcp buffers",
- "Olivier Crete <olivier.crete@collabora.co.uk>");
-
-
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -87,40 +78,34 @@ static void fs_rtcp_filter_set_property (GObject *object,
static GstFlowReturn
fs_rtcp_filter_transform_ip (GstBaseTransform *transform, GstBuffer *buf);
-static void
-_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT
- (rtcp_filter_debug, "fsrtcpfilter", 0, "fsrtcpfilter");
-}
-
-GST_BOILERPLATE_FULL (FsRtcpFilter, fs_rtcp_filter, GstBaseTransform,
- GST_TYPE_BASE_TRANSFORM, _do_init);
-
-static void
-fs_rtcp_filter_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
-
- gst_element_class_set_details (element_class, &fs_rtcp_filter_details);
-}
+G_DEFINE_TYPE (FsRtcpFilter, fs_rtcp_filter, GST_TYPE_BASE_TRANSFORM);
static void
fs_rtcp_filter_class_init (FsRtcpFilterClass *klass)
{
GObjectClass *gobject_class;
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
GstBaseTransformClass *gstbasetransform_class;
gobject_class = (GObjectClass *) klass;
gstbasetransform_class = (GstBaseTransformClass *) klass;
- gobject_class->set_property = GST_DEBUG_FUNCPTR (fs_rtcp_filter_set_property);
- gobject_class->get_property = GST_DEBUG_FUNCPTR (fs_rtcp_filter_get_property);
+ GST_DEBUG_CATEGORY_INIT
+ (rtcp_filter_debug, "fsrtcpfilter", 0, "fsrtcpfilter");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gst_element_class_set_metadata (gstelement_class,
+ "RTCP Filter element",
+ "Filter",
+ "This element removes unneeded parts of rtcp buffers",
+ "Olivier Crete <olivier.crete@collabora.com>");
+
+ gobject_class->set_property = fs_rtcp_filter_set_property;
+ gobject_class->get_property = fs_rtcp_filter_get_property;
gstbasetransform_class->transform_ip = fs_rtcp_filter_transform_ip;
@@ -134,8 +119,7 @@ fs_rtcp_filter_class_init (FsRtcpFilterClass *klass)
}
static void
-fs_rtcp_filter_init (FsRtcpFilter *rtcpfilter,
- FsRtcpFilterClass *klass)
+fs_rtcp_filter_init (FsRtcpFilter *rtcpfilter)
{
rtcpfilter->sending = FALSE;
}
@@ -196,10 +180,12 @@ fs_rtcp_filter_transform_ip (GstBaseTransform *transform, GstBuffer *buf)
if (!filter->sending)
{
+ GstRTCPBuffer rtcpbuffer = GST_RTCP_BUFFER_INIT;
GstRTCPPacket packet;
- gboolean modified = FALSE;
- if (gst_rtcp_buffer_get_first_packet (buf, &packet))
+ gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcpbuffer);
+
+ if (gst_rtcp_buffer_get_first_packet (&rtcpbuffer, &packet))
{
for (;;)
{
@@ -207,7 +193,6 @@ fs_rtcp_filter_transform_ip (GstBaseTransform *transform, GstBuffer *buf)
{
GstRTCPPacket nextpacket = packet;
- modified = TRUE;
if (gst_rtcp_packet_move_to_next (&nextpacket) &&
gst_rtcp_packet_get_type (&nextpacket) == GST_RTCP_TYPE_RR)
{
@@ -216,19 +201,20 @@ fs_rtcp_filter_transform_ip (GstBaseTransform *transform, GstBuffer *buf)
}
else
{
- guchar *data = GST_BUFFER_DATA (buf) + packet.offset;
+ guchar *data = rtcpbuffer.map.data + packet.offset;
/* If there is no RR, lets add an empty one */
data[0] = (GST_RTCP_VERSION << 6);
data[1] = GST_RTCP_TYPE_RR;
data[2] = 0;
data[3] = 1;
- memmove (GST_BUFFER_DATA (buf) + packet.offset + 8,
- GST_BUFFER_DATA (buf) + nextpacket.offset,
- GST_BUFFER_SIZE (buf) - nextpacket.offset);
- GST_BUFFER_SIZE (buf) -= nextpacket.offset - packet.offset - 8;
+ memmove (rtcpbuffer.map.data + packet.offset + 8,
+ rtcpbuffer.map.data + nextpacket.offset,
+ rtcpbuffer.map.size - nextpacket.offset);
+
+ rtcpbuffer.map.size -= nextpacket.offset - packet.offset - 8 ;
- if (!gst_rtcp_buffer_get_first_packet (buf, &packet))
+ if (!gst_rtcp_buffer_get_first_packet (&rtcpbuffer, &packet))
break;
}
@@ -240,9 +226,7 @@ fs_rtcp_filter_transform_ip (GstBaseTransform *transform, GstBuffer *buf)
}
}
}
-
- if (modified)
- gst_rtcp_buffer_end (buf);
+ gst_rtcp_buffer_unmap (&rtcpbuffer);
}
GST_OBJECT_UNLOCK (filter);
diff --git a/gst/fsrtpconference/Makefile.am b/gst/fsrtpconference/Makefile.am
index f2d5ec11..37d1901f 100644
--- a/gst/fsrtpconference/Makefile.am
+++ b/gst/fsrtpconference/Makefile.am
@@ -83,15 +83,12 @@ EXTRA_DIST = $(preferences_DATA)
if ENABLE_GTK_DOC
noinst_LTLIBRARIES += libfsrtpconference_doc.la
+nodist_libfsrtpconference_doc_la_CFLAGS = -DBUILD_GTK_DOC
+
nodist_libfsrtpconference_doc_la_SOURCES = \
- fs-rtp-conference-plugin.doc.c \
- $(nodist_libfsrtpconference_la_SOURCES)
+ $(libfsrtpconference_la_SOURCES)
libfsrtpconference_doc_la_LIBADD = $(libfsrtpconference_la_LIBADD)
-%.doc.c: %.c
- $(AM_V_GEN)sed -e 's:GST_PLUGIN_DEFINE:GST_PLUGIN_DEFINE_STATIC:' $< > $@
-
-BUILT_SOURCES += fs-rtp-conference-plugin.doc.c
endif
# Build the build sources
diff --git a/gst/fsrtpconference/default-element-properties b/gst/fsrtpconference/default-element-properties
index 2267fe5b..aad237d4 100644
--- a/gst/fsrtpconference/default-element-properties
+++ b/gst/fsrtpconference/default-element-properties
@@ -8,7 +8,7 @@
#
# 100ms for the jitterbuffer is a good tradeoff
-[gstrtpbin]
+[rtpbin]
latency=100
[x264enc]
diff --git a/gst/fsrtpconference/fs-rtp-bitrate-adapter.c b/gst/fsrtpconference/fs-rtp-bitrate-adapter.c
index cbc6fe95..186c8b32 100644
--- a/gst/fsrtpconference/fs-rtp-bitrate-adapter.c
+++ b/gst/fsrtpconference/fs-rtp-bitrate-adapter.c
@@ -79,14 +79,6 @@ enum
PROP_CAPS,
};
-enum
-{
- SIGNAL_RENEGOTIATE,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
#define PROP_INTERVAL_DEFAULT (10 * GST_SECOND)
static void fs_rtp_bitrate_adapter_finalize (GObject *object);
@@ -100,22 +92,31 @@ static void fs_rtp_bitrate_adapter_set_property (GObject *object,
GParamSpec *pspec);
-GST_BOILERPLATE (FsRtpBitrateAdapter, fs_rtp_bitrate_adapter, GstElement,
- GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (FsRtpBitrateAdapter, fs_rtp_bitrate_adapter, GST_TYPE_ELEMENT);
static GstFlowReturn fs_rtp_bitrate_adapter_chain (GstPad *pad,
- GstBuffer *buffer);
-static GstCaps *fs_rtp_bitrate_adapter_getcaps (GstPad *pad);
+ GstObject *parent, GstBuffer *buffer);
+static gboolean fs_rtp_bitrate_adapter_query (GstPad *pad, GstObject *parent,
+ GstQuery *query);
static GstStateChangeReturn
fs_rtp_bitrate_adapter_change_state (GstElement *element,
GstStateChange transition);
+static GParamSpec *caps_pspec;
+
static void
-fs_rtp_bitrate_adapter_base_init (gpointer klass)
+fs_rtp_bitrate_adapter_class_init (FsRtpBitrateAdapterClass *klass)
{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ gobject_class->get_property = fs_rtp_bitrate_adapter_get_property;
+ gobject_class->set_property = fs_rtp_bitrate_adapter_set_property;
+ gobject_class->finalize = fs_rtp_bitrate_adapter_finalize;
+
+ gstelement_class->change_state = fs_rtp_bitrate_adapter_change_state;
+
GST_DEBUG_CATEGORY_INIT
(fs_rtp_bitrate_adapter_debug, "fsrtpbitrateadapter", 0,
"fsrtpbitrateadapter element");
@@ -132,30 +133,6 @@ fs_rtp_bitrate_adapter_base_init (gpointer klass)
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&fs_rtp_bitrate_adapter_src_template));
- signals[SIGNAL_RENEGOTIATE] = g_signal_new ("renegotiate",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- 0,
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-}
-
-static GParamSpec *caps_pspec;
-
-static void
-fs_rtp_bitrate_adapter_class_init (FsRtpBitrateAdapterClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
-
- gobject_class->get_property = fs_rtp_bitrate_adapter_get_property;
- gobject_class->set_property = fs_rtp_bitrate_adapter_set_property;
- gobject_class->finalize = fs_rtp_bitrate_adapter_finalize;
-
- gstelement_class->change_state = fs_rtp_bitrate_adapter_change_state;
-
g_object_class_install_property (gobject_class,
PROP_BITRATE,
g_param_spec_uint ("bitrate",
@@ -205,21 +182,18 @@ bitrate_point_free (struct BitratePoint *bp)
static void
-fs_rtp_bitrate_adapter_init (FsRtpBitrateAdapter *self,
- FsRtpBitrateAdapterClass *klass)
+fs_rtp_bitrate_adapter_init (FsRtpBitrateAdapter *self)
{
self->sinkpad = gst_pad_new_from_static_template (
&fs_rtp_bitrate_adapter_sink_template, "sink");
gst_pad_set_chain_function (self->sinkpad, fs_rtp_bitrate_adapter_chain);
- gst_pad_set_setcaps_function (self->sinkpad, gst_pad_proxy_setcaps);
- gst_pad_set_getcaps_function (self->sinkpad,
- fs_rtp_bitrate_adapter_getcaps);
+ gst_pad_set_query_function (self->sinkpad, fs_rtp_bitrate_adapter_query);
+ GST_PAD_SET_PROXY_CAPS (self->sinkpad);
gst_element_add_pad (GST_ELEMENT (self), self->sinkpad);
self->srcpad = gst_pad_new_from_static_template (
&fs_rtp_bitrate_adapter_src_template, "src");
- gst_pad_set_getcaps_function (self->srcpad,
- fs_rtp_bitrate_adapter_getcaps);
+ gst_pad_set_query_function (self->sinkpad, fs_rtp_bitrate_adapter_query);
gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
g_queue_init (&self->bitrate_history);
@@ -241,7 +215,7 @@ fs_rtp_bitrate_adapter_finalize (GObject *object)
g_queue_foreach (&self->bitrate_history, (GFunc) bitrate_point_free, NULL);
g_queue_clear(&self->bitrate_history);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (fs_rtp_bitrate_adapter_parent_class)->finalize (object);
}
struct Resolution {
@@ -432,63 +406,71 @@ fs_rtp_bitrate_adapter_get_suggested_caps (FsRtpBitrateAdapter *self)
gst_caps_unref (allowed_caps);
gst_caps_unref (caps);
- gst_pad_fixate_caps (self->srcpad, wanted_caps);
+ gst_caps_fixate (wanted_caps);
return wanted_caps;
}
static GstCaps *
-fs_rtp_bitrate_adapter_getcaps (GstPad *pad)
+fs_rtp_bitrate_adapter_getcaps (FsRtpBitrateAdapter *self, GstPad *pad,
+ GstCaps *filter)
{
- FsRtpBitrateAdapter *self = FS_RTP_BITRATE_ADAPTER (
- gst_pad_get_parent_element (pad));
GstCaps *caps;
GstPad *otherpad;
GstCaps *peer_caps;
- if (!self)
- return gst_caps_new_empty ();
-
if (pad == self->srcpad)
otherpad = self->sinkpad;
else
otherpad = self->srcpad;
- peer_caps = gst_pad_peer_get_caps_reffed (otherpad);
+ peer_caps = gst_pad_peer_query_caps (otherpad, filter);
GST_OBJECT_LOCK (self);
- if (peer_caps)
- {
- if (self->caps)
- caps = gst_caps_intersect_full (self->caps, peer_caps,
- GST_CAPS_INTERSECT_FIRST);
- else
- caps = gst_caps_intersect (peer_caps,
- gst_pad_get_pad_template_caps (pad));
-
- gst_caps_unref (peer_caps);
- }
+ if (self->caps)
+ caps = gst_caps_intersect_full (self->caps, peer_caps,
+ GST_CAPS_INTERSECT_FIRST);
else
- {
- if (self->caps)
- caps = gst_caps_intersect (self->caps,
- gst_pad_get_pad_template_caps (pad));
- else
- caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
- }
+ caps = gst_caps_intersect (peer_caps,
+ gst_pad_get_pad_template_caps (pad));
+ gst_caps_unref (peer_caps);
GST_OBJECT_UNLOCK (self);
- gst_object_unref (self);
-
return caps;
}
+static gboolean
+fs_rtp_bitrate_adapter_query (GstPad *pad, GstObject *parent, GstQuery *query)
+{
+ FsRtpBitrateAdapter *self = FS_RTP_BITRATE_ADAPTER (parent);
+ gboolean res;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CAPS:
+ {
+ GstCaps *caps, *filter;
+
+ gst_query_parse_caps (query, &filter);
+ caps = fs_rtp_bitrate_adapter_getcaps (self, pad, filter);
+ gst_query_set_caps_result (query, caps);
+ gst_caps_unref (caps);
+ res = TRUE;
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, parent, query);
+ break;
+ }
+
+ return res;
+}
+
static GstFlowReturn
-fs_rtp_bitrate_adapter_chain (GstPad *pad, GstBuffer *buffer)
+fs_rtp_bitrate_adapter_chain (GstPad *pad, GstObject *parent,
+ GstBuffer *buffer)
{
- FsRtpBitrateAdapter *self = FS_RTP_BITRATE_ADAPTER (
- gst_pad_get_parent_element (pad));
+ FsRtpBitrateAdapter *self = FS_RTP_BITRATE_ADAPTER (parent);
GstFlowReturn ret;
if (!self)
@@ -496,7 +478,6 @@ fs_rtp_bitrate_adapter_chain (GstPad *pad, GstBuffer *buffer)
ret = gst_pad_push (self->srcpad, buffer);
- gst_object_unref (self);
return ret;
}
@@ -537,7 +518,7 @@ fs_rtp_bitrate_adapter_updated_unlock (FsRtpBitrateAdapter *self)
{
GstCaps *wanted_caps;
guint bitrate;
- GstCaps *negotiated_caps;
+ GstCaps *current_caps;
bitrate = fs_rtp_bitrate_adapter_get_bitrate_locked (self);
if (self->caps)
@@ -553,20 +534,21 @@ fs_rtp_bitrate_adapter_updated_unlock (FsRtpBitrateAdapter *self)
self->caps = caps_from_bitrate (bitrate);
GST_OBJECT_UNLOCK (self);
- negotiated_caps = gst_pad_get_negotiated_caps (self->sinkpad);
- if (!negotiated_caps)
+ current_caps = gst_pad_get_current_caps (self->sinkpad);
+ if (!current_caps)
return;
wanted_caps = fs_rtp_bitrate_adapter_get_suggested_caps (self);
GST_DEBUG ("wanted: %s", gst_caps_to_string (wanted_caps));
- GST_DEBUG ("current: %s", gst_caps_to_string (negotiated_caps));
+ GST_DEBUG ("current: %s", gst_caps_to_string (current_caps));
- if (!gst_caps_is_equal_fixed (negotiated_caps, wanted_caps))
- g_signal_emit (self, signals[SIGNAL_RENEGOTIATE], 0);
+ if (!gst_caps_is_equal_fixed (current_caps, wanted_caps))
+ gst_pad_push_event (self->sinkpad,
+ gst_event_new_reconfigure ());
gst_caps_unref (wanted_caps);
- gst_caps_unref (negotiated_caps);
+ gst_caps_unref (current_caps);
}
static void
@@ -726,8 +708,8 @@ fs_rtp_bitrate_adapter_change_state (GstElement *element,
}
if ((result =
- GST_ELEMENT_CLASS (parent_class)->change_state (element,
- transition)) == GST_STATE_CHANGE_FAILURE)
+ GST_ELEMENT_CLASS (fs_rtp_bitrate_adapter_parent_class)->change_state
+ (element, transition)) == GST_STATE_CHANGE_FAILURE)
goto failure;
return result;
diff --git a/gst/fsrtpconference/fs-rtp-codec-negotiation.c b/gst/fsrtpconference/fs-rtp-codec-negotiation.c
index d09a1fb2..80b0eebb 100644
--- a/gst/fsrtpconference/fs-rtp-codec-negotiation.c
+++ b/gst/fsrtpconference/fs-rtp-codec-negotiation.c
@@ -127,18 +127,18 @@ parse_bin_from_description_all_linked (const gchar *bin_description,
static gint
find_matching_pad (gconstpointer a, gconstpointer b)
{
- GstPad *pad = GST_PAD (a);
+ const GValue *val = a;
+ GstPad *pad = GST_PAD (g_value_get_object (val));
GstCaps *caps = GST_CAPS (b);
GstCaps *padcaps = NULL;
gint ret = 1;
- padcaps = gst_pad_get_caps_reffed (pad);
+ padcaps = gst_pad_query_caps (pad, NULL);
if (gst_caps_can_intersect (caps, padcaps))
ret = 0;
gst_caps_unref (padcaps);
- gst_object_unref (pad);
return ret;
}
@@ -151,8 +151,9 @@ validate_codec_profile (FsCodec *codec,const gchar *bin_description,
GstElement *bin = NULL;
guint src_pad_count = 0, sink_pad_count = 0;
GstCaps *caps;
- gpointer matching_pad = NULL;
GstIterator *iter;
+ gboolean has_matching_pad = FALSE;
+ GValue val = {0,};
bin = parse_bin_from_description_all_linked (bin_description,
&src_pad_count, &sink_pad_count, &error);
@@ -174,10 +175,12 @@ validate_codec_profile (FsCodec *codec,const gchar *bin_description,
else
iter = gst_element_iterate_sink_pads (bin);
- matching_pad = gst_iterator_find_custom (iter, find_matching_pad, caps);
+ has_matching_pad = gst_iterator_find_custom (iter, find_matching_pad,
+ &val, caps);
+ g_value_unset (&val);
gst_iterator_free (iter);
- if (!matching_pad)
+ if (!has_matching_pad)
{
GST_WARNING ("Invalid profile (%s), has no %s pad that matches the codec"
" details", is_send ? "src" : "sink", bin_description);
diff --git a/gst/fsrtpconference/fs-rtp-conference-plugin.c b/gst/fsrtpconference/fs-rtp-conference-plugin.c
index d1606b83..812d662a 100644
--- a/gst/fsrtpconference/fs-rtp-conference-plugin.c
+++ b/gst/fsrtpconference/fs-rtp-conference-plugin.c
@@ -37,7 +37,14 @@ static gboolean plugin_init (GstPlugin * plugin)
GST_RANK_NONE, FS_TYPE_RTP_CONFERENCE);
}
+#ifdef BUILD_GTK_DOC
+void
+fs_rtp_plugin_init_real (void)
+{
+ gst_plugin_register_static (
+#else
GST_PLUGIN_DEFINE (
+#endif
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"fsrtpconference",
@@ -47,4 +54,9 @@ GST_PLUGIN_DEFINE (
"LGPL",
"Farstream",
"http://farstream.freedesktop.org/"
+#ifdef BUILD_GTK_DOC
+ );
+}
+#else
)
+#endif
diff --git a/gst/fsrtpconference/fs-rtp-conference.c b/gst/fsrtpconference/fs-rtp-conference.c
index 3fb25ef2..4aad65d6 100644
--- a/gst/fsrtpconference/fs-rtp-conference.c
+++ b/gst/fsrtpconference/fs-rtp-conference.c
@@ -69,22 +69,14 @@ enum
};
-static const GstElementDetails fs_rtp_conference_details =
-GST_ELEMENT_DETAILS (
- "Farstream RTP Conference",
- "Generic/Bin/RTP",
- "A Farstream RTP Conference",
- "Olivier Crete <olivier.crete@collabora.co.uk>");
-
-
static GstStaticPadTemplate fs_rtp_conference_sink_template =
- GST_STATIC_PAD_TEMPLATE ("sink_%d",
+ GST_STATIC_PAD_TEMPLATE ("sink_%u",
GST_PAD_SINK,
GST_PAD_SOMETIMES,
GST_STATIC_CAPS_ANY);
static GstStaticPadTemplate fs_rtp_conference_src_template =
- GST_STATIC_PAD_TEMPLATE ("src_%d_%d_%d",
+ GST_STATIC_PAD_TEMPLATE ("src_%u_%u_%u",
GST_PAD_SRC,
GST_PAD_SOMETIMES,
GST_STATIC_CAPS_ANY);
@@ -108,11 +100,7 @@ struct _FsRtpConferencePrivate
GPtrArray *threads;
};
-static void fs_rtp_conference_do_init (GType type);
-
-
-GST_BOILERPLATE_FULL (FsRtpConference, fs_rtp_conference, FsConference,
- FS_TYPE_CONFERENCE, fs_rtp_conference_do_init);
+G_DEFINE_TYPE (FsRtpConference, fs_rtp_conference, FS_TYPE_CONFERENCE);
static void fs_rtp_conference_get_property (GObject *object,
guint prop_id,
@@ -168,16 +156,6 @@ static GstStateChangeReturn fs_rtp_conference_change_state (
GstStateChange transition);
-static void
-fs_rtp_conference_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT (fsrtpconference_debug, "fsrtpconference", 0,
- "Farstream RTP Conference Element");
- GST_DEBUG_CATEGORY_INIT (fsrtpconference_disco, "fsrtpconference_disco",
- 0, "Farstream RTP Codec Discovery");
- GST_DEBUG_CATEGORY_INIT (fsrtpconference_nego, "fsrtpconference_nego",
- 0, "Farstream RTP Codec Negotiation");
-}
static void
fs_rtp_conference_dispose (GObject * object)
@@ -188,9 +166,9 @@ fs_rtp_conference_dispose (GObject * object)
if (self->priv->disposed)
return;
- if (self->gstrtpbin) {
- gst_object_unref (self->gstrtpbin);
- self->gstrtpbin = NULL;
+ if (self->rtpbin) {
+ gst_object_unref (self->rtpbin);
+ self->rtpbin = NULL;
}
for (item = g_list_first (self->priv->sessions);
@@ -210,7 +188,7 @@ fs_rtp_conference_dispose (GObject * object)
self->priv->disposed = TRUE;
- G_OBJECT_CLASS (parent_class)->dispose (object);
+ G_OBJECT_CLASS (fs_rtp_conference_parent_class)->dispose (object);
}
@@ -224,7 +202,7 @@ fs_rtp_conference_finalize (GObject * object)
g_ptr_array_free (self->priv->threads, TRUE);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (fs_rtp_conference_parent_class)->finalize (object);
}
static void
@@ -237,6 +215,24 @@ fs_rtp_conference_class_init (FsRtpConferenceClass * klass)
g_type_class_add_private (klass, sizeof (FsRtpConferencePrivate));
+ GST_DEBUG_CATEGORY_INIT (fsrtpconference_debug, "fsrtpconference", 0,
+ "Farstream RTP Conference Element");
+ GST_DEBUG_CATEGORY_INIT (fsrtpconference_disco, "fsrtpconference_disco",
+ 0, "Farstream RTP Codec Discovery");
+ GST_DEBUG_CATEGORY_INIT (fsrtpconference_nego, "fsrtpconference_nego",
+ 0, "Farstream RTP Codec Negotiation");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fs_rtp_conference_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fs_rtp_conference_src_template));
+
+ gst_element_class_set_metadata (gstelement_class,
+ "Farstream RTP Conference",
+ "Generic/Bin/RTP",
+ "A Farstream RTP Conference",
+ "Olivier Crete <olivier.crete@collabora.co.uk>");
+
baseconf_class->new_session =
GST_DEBUG_FUNCPTR (fs_rtp_conference_new_session);
baseconf_class->new_participant =
@@ -262,21 +258,7 @@ fs_rtp_conference_class_init (FsRtpConferenceClass * klass)
}
static void
-fs_rtp_conference_base_init (gpointer g_class)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
-
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&fs_rtp_conference_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&fs_rtp_conference_src_template));
-
- gst_element_class_set_details (gstelement_class, &fs_rtp_conference_details);
-}
-
-static void
-fs_rtp_conference_init (FsRtpConference *conf,
- FsRtpConferenceClass *bclass)
+fs_rtp_conference_init (FsRtpConference *conf)
{
GST_DEBUG_OBJECT (conf, "fs_rtp_conference_init");
@@ -287,29 +269,29 @@ fs_rtp_conference_init (FsRtpConference *conf,
conf->priv->threads = g_ptr_array_new ();
- conf->gstrtpbin = gst_element_factory_make ("gstrtpbin", "rtpbin");
+ conf->rtpbin = gst_element_factory_make ("rtpbin", NULL);
- if (!conf->gstrtpbin) {
- GST_ERROR_OBJECT (conf, "Could not create GstRtpBin element");
+ if (!conf->rtpbin) {
+ GST_ERROR_OBJECT (conf, "Could not create Rtpbin element");
return;
}
- if (!gst_bin_add (GST_BIN (conf), conf->gstrtpbin)) {
- GST_ERROR_OBJECT (conf, "Could not add GstRtpBin element");
- gst_object_unref (conf->gstrtpbin);
- conf->gstrtpbin = NULL;
+ if (!gst_bin_add (GST_BIN (conf), conf->rtpbin)) {
+ GST_ERROR_OBJECT (conf, "Could not add Rtpbin element");
+ gst_object_unref (conf->rtpbin);
+ conf->rtpbin = NULL;
return;
}
- gst_object_ref (conf->gstrtpbin);
+ gst_object_ref (conf->rtpbin);
- g_signal_connect (conf->gstrtpbin, "request-pt-map",
+ g_signal_connect (conf->rtpbin, "request-pt-map",
G_CALLBACK (_rtpbin_request_pt_map), conf);
- g_signal_connect (conf->gstrtpbin, "pad-added",
+ g_signal_connect (conf->rtpbin, "pad-added",
G_CALLBACK (_rtpbin_pad_added), conf);
- g_signal_connect (conf->gstrtpbin, "on-bye-ssrc",
+ g_signal_connect (conf->rtpbin, "on-bye-ssrc",
G_CALLBACK (_rtpbin_on_bye_ssrc), conf);
- g_signal_connect (conf->gstrtpbin, "on-ssrc-validated",
+ g_signal_connect (conf->rtpbin, "on-ssrc-validated",
G_CALLBACK (_rtpbin_on_ssrc_validated), conf);
/* We have to ref the class here because the class initialization
@@ -328,13 +310,13 @@ fs_rtp_conference_get_property (GObject *object,
{
FsRtpConference *self = FS_RTP_CONFERENCE (object);
- if (!self->gstrtpbin)
+ if (!self->rtpbin)
return;
switch (prop_id)
{
case PROP_SDES:
- g_object_get_property (G_OBJECT (self->gstrtpbin), "sdes", value);
+ g_object_get_property (G_OBJECT (self->rtpbin), "sdes", value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -350,13 +332,13 @@ fs_rtp_conference_set_property (GObject *object,
{
FsRtpConference *self = FS_RTP_CONFERENCE (object);
- if (!self->gstrtpbin)
+ if (!self->rtpbin)
return;
switch (prop_id)
{
case PROP_SDES:
- g_object_set_property (G_OBJECT (self->gstrtpbin), "sdes", value);
+ g_object_set_property (G_OBJECT (self->rtpbin), "sdes", value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -378,7 +360,7 @@ _rtpbin_request_pt_map (GstElement *element, guint session_id,
caps = fs_rtp_session_request_pt_map (session, pt);
g_object_unref (session);
} else {
- GST_WARNING_OBJECT (self,"GstRtpBin %p tried to request the caps for "
+ GST_WARNING_OBJECT (self,"Rtpbin %p tried to request the caps for "
" payload type %u for non-existent session %u",
element, pt, session_id);
}
@@ -393,8 +375,8 @@ _rtpbin_pad_added (GstElement *rtpbin, GstPad *new_pad,
FsRtpConference *self = FS_RTP_CONFERENCE (user_data);
gchar *name;
- GST_DEBUG_OBJECT (self, "pad %s added %" GST_PTR_FORMAT,
- GST_PAD_NAME (new_pad), GST_PAD_CAPS (new_pad));
+ GST_DEBUG_OBJECT (self, "pad %s added" GST_PTR_FORMAT,
+ GST_PAD_NAME (new_pad));
name = gst_pad_get_name (new_pad);
@@ -526,10 +508,10 @@ fs_rtp_conference_new_session (FsConference *conf,
FsSession *new_session = NULL;
guint id;
- if (!self->gstrtpbin)
+ if (!self->rtpbin)
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
- "Could not create GstRtpBin");
+ "Could not create Rtpbin");
return NULL;
}
@@ -564,10 +546,10 @@ fs_rtp_conference_new_participant (FsConference *conf,
FsRtpConference *self = FS_RTP_CONFERENCE (conf);
FsParticipant *new_participant = NULL;
- if (!self->gstrtpbin)
+ if (!self->rtpbin)
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
- "Could not create GstRtpBin");
+ "Could not create Rtpbin");
return NULL;
}
@@ -591,7 +573,7 @@ fs_rtp_conference_handle_message (
{
FsRtpConference *self = FS_RTP_CONFERENCE (bin);
- if (!self->gstrtpbin)
+ if (!self->rtpbin)
goto out;
switch (GST_MESSAGE_TYPE (message)) {
@@ -633,7 +615,7 @@ fs_rtp_conference_handle_message (
fs_rtp_session_associate_ssrc_cname (session, ssrc, cname);
g_object_unref (session);
} else {
- GST_WARNING_OBJECT (self,"Our GstRtpBin announced a new association"
+ GST_WARNING_OBJECT (self,"Our RtpBin announced a new association"
"for non-existent session %u for ssrc: %u and cname %s",
session_id, ssrc, cname);
}
@@ -708,7 +690,8 @@ fs_rtp_conference_handle_message (
out:
/* forward all messages to the parent */
if (message)
- GST_BIN_CLASS (parent_class)->handle_message (bin, message);
+ GST_BIN_CLASS (fs_rtp_conference_parent_class)->handle_message (bin,
+ message);
}
static GstStateChangeReturn
@@ -719,9 +702,9 @@ fs_rtp_conference_change_state (GstElement *element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- if (!self->gstrtpbin)
+ if (!self->rtpbin)
{
- GST_ERROR_OBJECT (element, "Could not create the GstRtpBin subelement");
+ GST_ERROR_OBJECT (element, "Could not create the RtpBin subelement");
result = GST_STATE_CHANGE_FAILURE;
goto failure;
}
@@ -731,8 +714,8 @@ fs_rtp_conference_change_state (GstElement *element, GstStateChange transition)
}
if ((result =
- GST_ELEMENT_CLASS (parent_class)->change_state (element,
- transition)) == GST_STATE_CHANGE_FAILURE)
+ GST_ELEMENT_CLASS (fs_rtp_conference_parent_class)->change_state (
+ element, transition)) == GST_STATE_CHANGE_FAILURE)
goto failure;
return result;
@@ -766,7 +749,8 @@ fs_codec_to_gst_caps (const FsCodec *codec)
if (codec == NULL)
return NULL;
- structure = gst_structure_new ("application/x-rtp", NULL);
+ caps = gst_caps_new_empty_simple ("application/x-rtp");
+ structure = gst_caps_get_structure (caps, 0);
if (codec->encoding_name)
{
@@ -834,8 +818,6 @@ fs_codec_to_gst_caps (const FsCodec *codec)
g_free (rtcpfb_name);
}
- caps = gst_caps_new_full (structure, NULL);
-
return caps;
}
diff --git a/gst/fsrtpconference/fs-rtp-conference.h b/gst/fsrtpconference/fs-rtp-conference.h
index fe2209b0..610ea506 100644
--- a/gst/fsrtpconference/fs-rtp-conference.h
+++ b/gst/fsrtpconference/fs-rtp-conference.h
@@ -58,7 +58,7 @@ struct _FsRtpConference
FsRtpConferencePrivate *priv;
/* Do not modify the pointer */
- GstElement *gstrtpbin;
+ GstElement *rtpbin;
};
struct _FsRtpConferenceClass
diff --git a/gst/fsrtpconference/fs-rtp-discover-codecs.c b/gst/fsrtpconference/fs-rtp-discover-codecs.c
index d128e849..2aeeb0ea 100644
--- a/gst/fsrtpconference/fs-rtp-discover-codecs.c
+++ b/gst/fsrtpconference/fs-rtp-discover-codecs.c
@@ -639,7 +639,7 @@ parse_codec_cap_list (GList *list, FsMediaType media_type)
codec_blueprint->send_pipeline_factory,
g_list_append (NULL, tmpfact));
}
- tmpfact = gst_element_factory_find ("ffmpegcolorspace");
+ tmpfact = gst_element_factory_find ("videoconvert");
if (tmpfact)
{
codec_blueprint->send_pipeline_factory = g_list_append (
@@ -1286,7 +1286,7 @@ get_plugins_filtered_from_caps (FilterFunc filter,
GList *list = NULL;
GstCaps *matched_caps = NULL;
- result = gst_registry_get_feature_list (gst_registry_get_default (),
+ result = gst_registry_get_feature_list (gst_registry_get (),
GST_TYPE_ELEMENT_FACTORY);
result = g_list_sort (result, (GCompareFunc) compare_ranks);
diff --git a/gst/fsrtpconference/fs-rtp-keyunit-manager.c b/gst/fsrtpconference/fs-rtp-keyunit-manager.c
index 02660d65..084bdfa6 100644
--- a/gst/fsrtpconference/fs-rtp-keyunit-manager.c
+++ b/gst/fsrtpconference/fs-rtp-keyunit-manager.c
@@ -121,28 +121,26 @@ static const struct ElementProperty no_keyframe_property[] = {
};
static void
-disable_keyframes (gpointer data, gpointer user_data)
+disable_keyframes (const GValue *item, gpointer user_data)
{
- GstElement *element = data;
+ GstElement *element = g_value_get_object (item);
GstElementFactory *factory;
const gchar *factory_name;
guint i;
factory = gst_element_get_factory (element);
if (!factory)
- goto out;
+ return;
factory_name = gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory));
if (!factory_name)
- goto out;
+ return;
for (i = 0; no_keyframe_property[i].element; i++)
if (!strcmp (no_keyframe_property[i].element, factory_name))
g_object_set (element, no_keyframe_property[i].property,
no_keyframe_property[i].value, NULL);
-out:
- gst_object_unref (element);
}
static void
@@ -183,9 +181,13 @@ on_feedback_rtcp (GObject *rtpsession, GstRTCPType type, GstRTCPFBType fbtype,
{
guint position = 0;
gboolean our_request = FALSE;
+ GstMapInfo mapinfo;
+
+ if (!gst_buffer_map (fci, &mapinfo, GST_MAP_READ))
+ return;
- for (position = 0; position < GST_BUFFER_SIZE (fci); position += 8) {
- guint8 *data = GST_BUFFER_DATA (fci) + position;
+ for (position = 0; position < mapinfo.size ; position += 8) {
+ guint8 *data = mapinfo.data + position;
guint32 ssrc;
ssrc = GST_READ_UINT32_BE (data);
@@ -194,6 +196,7 @@ on_feedback_rtcp (GObject *rtpsession, GstRTCPType type, GstRTCPFBType fbtype,
our_request = TRUE;
break;
}
+ gst_buffer_unmap (fci, &mapinfo);
if (!our_request)
return;
}
diff --git a/gst/fsrtpconference/fs-rtp-packet-modder.c b/gst/fsrtpconference/fs-rtp-packet-modder.c
index 21fcb34a..42707676 100644
--- a/gst/fsrtpconference/fs-rtp-packet-modder.c
+++ b/gst/fsrtpconference/fs-rtp-packet-modder.c
@@ -44,25 +44,26 @@ static GstStaticPadTemplate fs_rtp_packet_modder_src_template =
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("application/x-rtp"));
-GST_BOILERPLATE (FsRtpPacketModder, fs_rtp_packet_modder, GstElement,
- GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (FsRtpPacketModder, fs_rtp_packet_modder, GST_TYPE_ELEMENT);
static GstFlowReturn fs_rtp_packet_modder_chain (GstPad *pad,
- GstBuffer *buffer);
-static GstCaps *fs_rtp_packet_modder_getcaps (GstPad *pad);
-static GstFlowReturn fs_rtp_packet_modder_bufferalloc (GstPad *pad,
- guint64 offset, guint size, GstCaps *caps, GstBuffer **buf);
-static gboolean fs_rtp_packet_modder_sink_event (GstPad *pad, GstEvent *event);
-static gboolean fs_rtp_packet_modder_query (GstPad *pad, GstQuery *query);
+ GstObject *parent, GstBuffer *buffer);
+static GstCaps *fs_rtp_packet_modder_getcaps (FsRtpPacketModder *self,
+ GstPad *pad, GstCaps *filter);
+static gboolean fs_rtp_packet_modder_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event);
+static gboolean fs_rtp_packet_modder_query (GstPad *pad,
+ GstObject *parent,
+ GstQuery *query);
static GstStateChangeReturn fs_rtp_packet_modder_change_state (
GstElement *element, GstStateChange transition);
-
static void
-fs_rtp_packet_modder_base_init (gpointer g_class)
+fs_rtp_packet_modder_class_init (FsRtpPacketModderClass *klass)
{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
GST_DEBUG_CATEGORY_INIT
(fs_rtp_packet_modder_debug, "fsrtppacketmodder", 0,
@@ -78,35 +79,25 @@ fs_rtp_packet_modder_base_init (gpointer g_class)
gst_static_pad_template_get (&fs_rtp_packet_modder_sink_template));
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&fs_rtp_packet_modder_src_template));
-}
-
-
-
-static void
-fs_rtp_packet_modder_class_init (FsRtpPacketModderClass *klass)
-{
- GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
gstelement_class->change_state = fs_rtp_packet_modder_change_state;
}
static void
-fs_rtp_packet_modder_init (FsRtpPacketModder *self,
- FsRtpPacketModderClass *g_class)
+fs_rtp_packet_modder_init (FsRtpPacketModder *self)
{
+ gst_segment_init (&self->segment, GST_FORMAT_TIME);
+
self->sinkpad = gst_pad_new_from_static_template (
&fs_rtp_packet_modder_sink_template, "sink");
gst_pad_set_chain_function (self->sinkpad, fs_rtp_packet_modder_chain);
- gst_pad_set_setcaps_function (self->sinkpad, gst_pad_proxy_setcaps);
- gst_pad_set_getcaps_function (self->sinkpad, fs_rtp_packet_modder_getcaps);
- gst_pad_set_bufferalloc_function (self->sinkpad,
- fs_rtp_packet_modder_bufferalloc);
+ gst_pad_set_query_function (self->sinkpad, fs_rtp_packet_modder_query);
gst_pad_set_event_function (self->sinkpad, fs_rtp_packet_modder_sink_event);
+ GST_PAD_SET_PROXY_CAPS (self->sinkpad);
gst_element_add_pad (GST_ELEMENT (self), self->sinkpad);
self->srcpad = gst_pad_new_from_static_template (
&fs_rtp_packet_modder_src_template, "src");
- gst_pad_set_getcaps_function (self->srcpad, fs_rtp_packet_modder_getcaps);
gst_pad_set_query_function (self->srcpad, fs_rtp_packet_modder_query);
gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
}
@@ -141,7 +132,7 @@ fs_rtp_packet_modder_sync_to_clock (FsRtpPacketModder *self,
GstClockReturn clockret;
GST_OBJECT_LOCK (self);
- running_time = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME,
+ running_time = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME,
buffer_ts);
do {
@@ -174,9 +165,9 @@ fs_rtp_packet_modder_sync_to_clock (FsRtpPacketModder *self,
}
static GstFlowReturn
-fs_rtp_packet_modder_chain (GstPad *pad, GstBuffer *buffer)
+fs_rtp_packet_modder_chain (GstPad *pad, GstObject *parent, GstBuffer *buffer)
{
- FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (gst_pad_get_parent (pad));
+ FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (parent);
GstFlowReturn ret = GST_FLOW_ERROR;
GstClockTime buffer_ts = GST_BUFFER_TIMESTAMP (buffer);
@@ -198,84 +189,49 @@ fs_rtp_packet_modder_chain (GstPad *pad, GstBuffer *buffer)
invalid:
- gst_object_unref (self);
-
return ret;
}
static GstCaps *
-fs_rtp_packet_modder_getcaps (GstPad *pad)
+fs_rtp_packet_modder_getcaps (FsRtpPacketModder *self, GstPad *pad,
+ GstCaps *filter)
{
- FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (gst_pad_get_parent (pad));
- GstCaps *peercaps;
+ GstPad *peer;
GstCaps *caps;
GstPad *otherpad = self->sinkpad == pad ? self->srcpad : self->sinkpad;
- peercaps = gst_pad_peer_get_caps_reffed (otherpad);
+ peer = gst_pad_get_peer (otherpad);
- if (peercaps)
+ if (peer)
{
+ GstCaps *peercaps;
+ peercaps = gst_pad_query_caps (peer, filter);
caps = gst_caps_intersect (peercaps, gst_pad_get_pad_template_caps (pad));
gst_caps_unref (peercaps);
+ gst_object_unref (peer);
}
else
{
- caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+ caps = gst_caps_intersect (gst_pad_get_pad_template_caps (pad), filter);
}
- gst_object_unref (self);
return caps;
}
-static GstFlowReturn
-fs_rtp_packet_modder_bufferalloc (GstPad *pad, guint64 offset, guint size,
- GstCaps *caps, GstBuffer **buf)
-{
- FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (gst_pad_get_parent (pad));
- GstFlowReturn ret;
-
- ret = gst_pad_alloc_buffer (self->srcpad, offset, size, caps, buf);
-
- gst_object_unref (self);
-
- return ret;
-}
-
static gboolean
-fs_rtp_packet_modder_sink_event (GstPad *pad, GstEvent *event)
+fs_rtp_packet_modder_sink_event (GstPad *pad, GstObject *parent,
+ GstEvent *event)
{
- FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (gst_pad_get_parent (pad));
- gboolean ret;
+ FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (parent);
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NEWSEGMENT:
+ case GST_EVENT_SEGMENT:
{
- GstFormat format;
- gdouble rate, arate;
- gint64 start, stop, time;
- gboolean update;
+ gst_event_copy_segment (event, &self->segment);
- gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
- &start, &stop, &time);
-
- /* we need time for now */
- if (format != GST_FORMAT_TIME)
+ if (self->segment.format != GST_FORMAT_TIME)
goto newseg_wrong_format;
-
- GST_DEBUG_OBJECT (self,
- "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT
- ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT,
- update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
- GST_TIME_ARGS (time));
-
- /* now configure the values, we need these to time the release of the
- * buffers on the srcpad. */
- gst_segment_set_newsegment_full (&self->segment, update,
- rate, arate, format, start, stop, time);
-
- /* FIXME, push SEGMENT in the queue. Sorting order might be difficult. */
- ret = gst_pad_push_event (self->srcpad, event);
break;
}
case GST_EVENT_FLUSH_START:
@@ -286,28 +242,18 @@ fs_rtp_packet_modder_sink_event (GstPad *pad, GstEvent *event)
self->unscheduled = TRUE;
}
GST_OBJECT_UNLOCK (self);
- ret = gst_pad_push_event (self->srcpad, event);
- break;
- case GST_EVENT_FLUSH_STOP:
- ret = gst_pad_push_event (self->srcpad, event);
- gst_segment_init (&self->segment, GST_FORMAT_TIME);
break;
default:
- ret = gst_pad_push_event (self->srcpad, event);
break;
}
-done:
- gst_object_unref (self);
- return ret;
+ return gst_pad_push_event (self->srcpad, event);
newseg_wrong_format:
- {
- GST_DEBUG_OBJECT (self, "received non TIME newsegment");
- ret = FALSE;
- gst_event_unref (event);
- goto done;
- }
+
+ GST_DEBUG_OBJECT (self, "received non TIME segment");
+ gst_event_unref (event);
+ return FALSE;
}
static GstStateChangeReturn
@@ -324,14 +270,14 @@ fs_rtp_packet_modder_change_state (GstElement *element,
GST_OBJECT_LOCK (self);
/* reset negotiated values */
self->peer_latency = 0;
- gst_segment_init (&self->segment, GST_FORMAT_TIME);
GST_OBJECT_UNLOCK (self);
break;
default:
break;
}
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ ret = GST_ELEMENT_CLASS (fs_rtp_packet_modder_parent_class)->change_state (
+ element, transition);
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
@@ -358,12 +304,23 @@ fs_rtp_packet_modder_change_state (GstElement *element,
static gboolean
-fs_rtp_packet_modder_query (GstPad *pad, GstQuery *query)
+fs_rtp_packet_modder_query (GstPad *pad, GstObject *parent, GstQuery *query)
{
- FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (gst_pad_get_parent (pad));
+ FsRtpPacketModder *self = FS_RTP_PACKET_MODDER (parent);
gboolean res = FALSE;
switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CAPS:
+ {
+ GstCaps *caps, *filter;
+
+ gst_query_parse_caps (query, &filter);
+ caps = fs_rtp_packet_modder_getcaps (self, pad, filter);
+ gst_query_set_caps_result (query, caps);
+ gst_caps_unref (caps);
+ res = TRUE;
+ break;
+ }
case GST_QUERY_LATENCY:
{
/* We need to send the query upstream and add the returned latency to our
@@ -396,11 +353,9 @@ fs_rtp_packet_modder_query (GstPad *pad, GstQuery *query)
break;
}
default:
- res = gst_pad_query_default (pad, query);
+ res = gst_pad_query_default (pad, parent, query);
break;
}
- gst_object_unref (self);
-
return res;
}
diff --git a/gst/fsrtpconference/fs-rtp-session.c b/gst/fsrtpconference/fs-rtp-session.c
index e634a77a..72fddf9c 100644
--- a/gst/fsrtpconference/fs-rtp-session.c
+++ b/gst/fsrtpconference/fs-rtp-session.c
@@ -205,8 +205,8 @@ struct _FsRtpSessionPrivate
GError *construction_error;
- GMutex *send_pad_blocked_mutex;
- GMutex *discovery_pad_blocked_mutex;
+ gulong send_pad_block_id;
+ gulong discovery_pad_block_id;
/* IP Type of Service, protext by session mutex */
guint tos;
@@ -256,7 +256,7 @@ static gboolean fs_rtp_session_set_send_codec (FsSession *session,
static gboolean fs_rtp_session_set_codec_preferences (FsSession *session,
GList *codec_preferences,
GError **error);
-static void fs_rtp_session_verify_send_codec_bin (FsRtpSession *self);
+static void fs_rtp_session_verify_send_codec_bin_locked (FsRtpSession *self);
static gchar **fs_rtp_session_list_transmitters (FsSession *session);
static GType fs_rtp_session_get_stream_transmitter_type (FsSession *session,
@@ -312,8 +312,8 @@ fs_rtp_session_associate_free_substreams (FsRtpSession *session,
static void
_send_caps_changed (GstPad *pad, GParamSpec *pspec, FsRtpSession *session);
-static void
-_discovery_pad_blocked_callback (GstPad *pad, gboolean blocked,
+static GstPadProbeReturn
+_discovery_pad_blocked_callback (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data);
static void
@@ -430,8 +430,6 @@ fs_rtp_session_init (FsRtpSession *self)
self->mutex = g_mutex_new ();
- self->priv->send_pad_blocked_mutex = g_mutex_new ();
- self->priv->discovery_pad_blocked_mutex = g_mutex_new ();
g_static_rw_lock_init (&self->priv->disposed_lock);
self->priv->media_type = FS_MEDIA_TYPE_LAST + 1;
@@ -679,7 +677,7 @@ fs_rtp_session_dispose (GObject *obj)
if (self->priv->rtpbin_send_rtcp_src)
{
gst_pad_set_active (self->priv->rtpbin_send_rtcp_src, FALSE);
- gst_element_release_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_release_request_pad (self->priv->conference->rtpbin,
self->priv->rtpbin_send_rtcp_src);
gst_object_unref (self->priv->rtpbin_send_rtcp_src);
self->priv->rtpbin_send_rtcp_src = NULL;
@@ -688,7 +686,7 @@ fs_rtp_session_dispose (GObject *obj)
if (self->priv->rtpbin_send_rtp_sink)
{
gst_pad_set_active (self->priv->rtpbin_send_rtp_sink, FALSE);
- gst_element_release_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_release_request_pad (self->priv->conference->rtpbin,
self->priv->rtpbin_send_rtp_sink);
gst_object_unref (self->priv->rtpbin_send_rtp_sink);
self->priv->rtpbin_send_rtp_sink = NULL;
@@ -697,7 +695,7 @@ fs_rtp_session_dispose (GObject *obj)
if (self->priv->rtpbin_recv_rtp_sink)
{
gst_pad_set_active (self->priv->rtpbin_recv_rtp_sink, FALSE);
- gst_element_release_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_release_request_pad (self->priv->conference->rtpbin,
self->priv->rtpbin_recv_rtp_sink);
gst_object_unref (self->priv->rtpbin_recv_rtp_sink);
self->priv->rtpbin_recv_rtp_sink = NULL;
@@ -706,7 +704,7 @@ fs_rtp_session_dispose (GObject *obj)
if (self->priv->rtpbin_recv_rtcp_sink)
{
gst_pad_set_active (self->priv->rtpbin_recv_rtcp_sink, FALSE);
- gst_element_release_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_release_request_pad (self->priv->conference->rtpbin,
self->priv->rtpbin_recv_rtcp_sink);
gst_object_unref (self->priv->rtpbin_recv_rtcp_sink);
self->priv->rtpbin_recv_rtcp_sink = NULL;
@@ -785,9 +783,6 @@ fs_rtp_session_finalize (GObject *object)
if (self->priv->ssrc_streams_manual)
g_hash_table_destroy (self->priv->ssrc_streams_manual);
- g_mutex_free (self->priv->send_pad_blocked_mutex);
- g_mutex_free (self->priv->discovery_pad_blocked_mutex);
-
g_queue_foreach (&self->priv->telephony_events, (GFunc) gst_event_unref,
NULL);
@@ -1006,17 +1001,6 @@ _rtp_tfrc_bitrate_changed (GObject *rtp_tfrc, GParamSpec *pspec,
}
static void
-_rtp_bitrate_adapter_renegotiate (GstElement *bitrate_adapter,
- FsRtpSession *self)
-{
- gst_element_post_message (GST_ELEMENT (self->priv->conference),
- gst_message_new_element (GST_OBJECT (self->priv->conference),
- gst_structure_new ("farstream-renegotiate",
- "session", FS_TYPE_SESSION, self,
- NULL)));
-}
-
-static void
fs_rtp_session_constructed (GObject *object)
{
FsRtpSession *self = FS_RTP_SESSION_CAST (object);
@@ -1082,9 +1066,6 @@ fs_rtp_session_constructed (GObject *object)
{
GstElement *bitrate_adapter = fs_rtp_bitrate_adapter_new ();
- g_signal_connect_object (bitrate_adapter, "renegotiate",
- G_CALLBACK (_rtp_bitrate_adapter_renegotiate), self, 0);
-
if (!gst_bin_add (GST_BIN (self->priv->conference), bitrate_adapter))
{
self->priv->construction_error = g_error_new (FS_ERROR,
@@ -1140,9 +1121,9 @@ fs_rtp_session_constructed (GObject *object)
gst_object_unref (tee_sink_pad);
self->priv->send_tee_discovery_pad = gst_element_get_request_pad (tee,
- "src%d");
+ "src_%u");
self->priv->send_tee_media_pad = gst_element_get_request_pad (tee,
- "src%d");
+ "src_%u");
if (!self->priv->send_tee_discovery_pad || !self->priv->send_tee_media_pad)
{
@@ -1198,7 +1179,7 @@ fs_rtp_session_constructed (GObject *object)
/* Now create the transmitter RTP funnel */
tmp = g_strdup_printf ("recv_rtp_funnel_%u", self->id);
- funnel = gst_element_factory_make ("fsfunnel", tmp);
+ funnel = gst_element_factory_make ("funnel", tmp);
g_free (tmp);
if (!funnel)
@@ -1222,7 +1203,7 @@ fs_rtp_session_constructed (GObject *object)
tmp = g_strdup_printf ("recv_rtp_sink_%u", self->id);
self->priv->rtpbin_recv_rtp_sink =
- gst_element_get_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_get_request_pad (self->priv->conference->rtpbin,
tmp);
g_free (tmp);
@@ -1233,11 +1214,10 @@ fs_rtp_session_constructed (GObject *object)
if (GST_PAD_LINK_FAILED (ret))
{
self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION,
- "Could not link pad %s (%p) with pad %s (%p)",
- GST_PAD_NAME (funnel_src_pad), GST_PAD_CAPS (funnel_src_pad),
- GST_PAD_NAME (self->priv->rtpbin_recv_rtp_sink),
- GST_PAD_CAPS (self->priv->rtpbin_recv_rtp_sink));
+ FS_ERROR_CONSTRUCTION,
+ "Could not link pad %s with pad %s",
+ GST_PAD_NAME (funnel_src_pad),
+ GST_PAD_NAME (self->priv->rtpbin_recv_rtp_sink));
gst_object_unref (funnel_src_pad);
return;
@@ -1250,7 +1230,7 @@ fs_rtp_session_constructed (GObject *object)
/* Now create the transmitter RTCP funnel */
tmp = g_strdup_printf ("recv_rtcp_funnel_%u", self->id);
- funnel = gst_element_factory_make ("fsfunnel", tmp);
+ funnel = gst_element_factory_make ("funnel", tmp);
g_free (tmp);
if (!funnel)
@@ -1274,7 +1254,7 @@ fs_rtp_session_constructed (GObject *object)
tmp = g_strdup_printf ("recv_rtcp_sink_%u", self->id);
self->priv->rtpbin_recv_rtcp_sink =
- gst_element_get_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_get_request_pad (self->priv->conference->rtpbin,
tmp);
g_free (tmp);
@@ -1285,11 +1265,10 @@ fs_rtp_session_constructed (GObject *object)
if (GST_PAD_LINK_FAILED (ret))
{
self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION,
- "Could not link pad %s (%p) with pad %s (%p)",
- GST_PAD_NAME (funnel_src_pad), GST_PAD_CAPS (funnel_src_pad),
- GST_PAD_NAME (self->priv->rtpbin_recv_rtcp_sink),
- GST_PAD_CAPS (self->priv->rtpbin_recv_rtcp_sink));
+ FS_ERROR_CONSTRUCTION,
+ "Could not link pad %s with pad %s",
+ GST_PAD_NAME (funnel_src_pad),
+ GST_PAD_NAME (self->priv->rtpbin_recv_rtcp_sink));
gst_object_unref (funnel_src_pad);
return;
@@ -1302,7 +1281,7 @@ fs_rtp_session_constructed (GObject *object)
/* Lets get the internal RTP session */
- g_signal_emit_by_name (self->priv->conference->gstrtpbin,
+ g_signal_emit_by_name (self->priv->conference->rtpbin,
"get-internal-session", self->id, &self->priv->rtpbin_internal_session);
if (!self->priv->rtpbin_internal_session)
@@ -1350,7 +1329,7 @@ fs_rtp_session_constructed (GObject *object)
tmp = g_strdup_printf ("send_rtp_sink_%u", self->id);
self->priv->rtpbin_send_rtp_sink =
- gst_element_get_request_pad (self->priv->conference->gstrtpbin,
+ gst_element_get_request_pad (self->priv->conference->rtpbin,
tmp);
g_free (tmp);
@@ -1361,11 +1340,10 @@ fs_rtp_session_constructed (GObject *object)
if (GST_PAD_LINK_FAILED (ret))
{
self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION,
- "Could not link pad %s (%p) with pad %s (%p)",
- GST_PAD_NAME (muxer_src_pad), GST_PAD_CAPS (muxer_src_pad),
- GST_PAD_NAME (self->priv->rtpbin_send_rtp_sink),
- GST_PAD_CAPS (self->priv->rtpbin_send_rtp_sink));
+ FS_ERROR_CONSTRUCTION,
+ "Could not link pad %s with pad %s",
+ GST_PAD_NAME (muxer_src_pad),
+ GST_PAD_NAME (self->priv->rtpbin_send_rtp_sink));
gst_object_unref (muxer_src_pad);
return;
@@ -1416,7 +1394,7 @@ fs_rtp_session_constructed (GObject *object)
tmp = g_strdup_printf ("send_rtp_src_%u", self->id);
if (!gst_element_link_pads (
- self->priv->conference->gstrtpbin, tmp,
+ self->priv->conference->rtpbin, tmp,
self->priv->transmitter_rtp_tee, "sink"))
{
self->priv->construction_error = g_error_new (FS_ERROR,
@@ -1456,13 +1434,13 @@ fs_rtp_session_constructed (GObject *object)
tmp = g_strdup_printf ("send_rtcp_src_%u", self->id);
self->priv->rtpbin_send_rtcp_src =
- gst_element_get_request_pad (self->priv->conference->gstrtpbin, tmp);
+ gst_element_get_request_pad (self->priv->conference->rtpbin, tmp);
if (!self->priv->rtpbin_send_rtcp_src)
{
self->priv->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not get %s request pad from the gstrtpbin", tmp);
+ "Could not get %s request pad from the rtpbin", tmp);
g_free (tmp);
return;
}
@@ -1516,7 +1494,7 @@ fs_rtp_session_constructed (GObject *object)
self->priv->send_capsfilter = gst_object_ref (capsfilter);
- if (!gst_element_link_pads (capsfilter, "src", muxer, "sink_%d"))
+ if (!gst_element_link_pads (capsfilter, "src", muxer, "sink_%u"))
{
self->priv->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
@@ -1560,16 +1538,23 @@ _stream_known_source_packet_received (FsRtpStream *stream, guint component,
{
guint32 ssrc;
FsRtpSession *self = FS_RTP_SESSION_CAST (user_data);
+ gboolean valid = FALSE;
if (fs_rtp_session_has_disposed_enter (self, NULL))
return;
+
if (component == 1)
{
if (gst_rtp_buffer_validate (buffer))
{
- ssrc = gst_rtp_buffer_get_ssrc (buffer);
- goto ok;
+ GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT;
+
+ gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer);
+ ssrc = gst_rtp_buffer_get_ssrc (&rtpbuffer);
+ gst_rtp_buffer_unmap (&rtpbuffer);
+
+ valid = TRUE;
}
}
else if (component == 2)
@@ -1578,24 +1563,30 @@ _stream_known_source_packet_received (FsRtpStream *stream, guint component,
if (gst_rtcp_buffer_validate (buffer))
{
- if (gst_rtcp_buffer_get_first_packet (buffer, &rtcppacket))
+ GstRTCPBuffer rtcpbuffer = GST_RTCP_BUFFER_INIT;
+
+ gst_rtcp_buffer_map (buffer, GST_MAP_READ, &rtcpbuffer);
+
+ if (gst_rtcp_buffer_get_first_packet (&rtcpbuffer, &rtcppacket))
{
do {
if (gst_rtcp_packet_get_type (&rtcppacket) == GST_RTCP_TYPE_SDES)
{
ssrc = gst_rtcp_packet_sdes_get_ssrc (&rtcppacket);
- goto ok;
+ valid = TRUE;
+ break;
}
} while (gst_rtcp_packet_move_to_next (&rtcppacket));
}
+ gst_rtcp_buffer_unmap (&rtcpbuffer);
}
}
- /* We would have jumped to OK if we had a valid packet */
- fs_rtp_session_has_disposed_exit (self);
- return;
-
- ok:
+ if (!valid)
+ {
+ fs_rtp_session_has_disposed_exit (self);
+ return;
+ }
FS_RTP_SESSION_LOCK (self);
@@ -1998,7 +1989,7 @@ fs_rtp_session_set_send_codec (FsSession *session, FsCodec *send_codec,
self->priv->requested_send_codec = fs_codec_copy (send_codec);
- fs_rtp_session_verify_send_codec_bin (self);
+ fs_rtp_session_verify_send_codec_bin_locked (self);
ret = TRUE;
}
else
@@ -2136,7 +2127,7 @@ _get_request_pad_and_link (GstElement *tee_funnel, const gchar *tee_funnel_name,
GstPad *requestpad = NULL;
GstPad *transpad = NULL;
GstPadLinkReturn ret;
- gchar *requestpad_name = (direction == GST_PAD_SINK) ? "src%d" : "sink%d";
+ gchar *requestpad_name = (direction == GST_PAD_SINK) ? "src_%u" : "sink_%u";
/* The transmitter will only be removed when the whole session is disposed,
* then the
@@ -2215,11 +2206,11 @@ fs_rtp_session_add_transmitter_gst_sink (FsRtpSession *self,
gst_element_sync_state_with_parent (sink);
if (!_get_request_pad_and_link (self->priv->transmitter_rtp_tee,
- "rtp tee", sink, "sink1", GST_PAD_SINK, error))
+ "rtp tee", sink, "sink_1", GST_PAD_SINK, error))
goto error;
if (!_get_request_pad_and_link (self->priv->transmitter_rtcp_tee,
- "rtcp tee", sink, "sink2", GST_PAD_SINK, error))
+ "rtcp tee", sink, "sink_2", GST_PAD_SINK, error))
goto error;
gst_object_unref (sink);
@@ -2289,11 +2280,11 @@ fs_rtp_session_get_transmitter (FsRtpSession *self,
}
if (!_get_request_pad_and_link (self->priv->transmitter_rtp_funnel,
- "rtp funnel", src, "src1", GST_PAD_SRC, error))
+ "rtp funnel", src, "src_1", GST_PAD_SRC, error))
goto error;
if (!_get_request_pad_and_link (self->priv->transmitter_rtcp_funnel,
- "rtcp funnel", src, "src2", GST_PAD_SRC, error))
+ "rtcp funnel", src, "src_2", GST_PAD_SRC, error))
goto error;
gst_element_sync_state_with_parent (src);
@@ -2717,18 +2708,18 @@ fs_rtp_session_update_codecs (FsRtpSession *session,
fs_rtp_session_verify_recv_codecs_locked (session);
if (is_new)
- g_signal_emit_by_name (session->priv->conference->gstrtpbin,
+ g_signal_emit_by_name (session->priv->conference->rtpbin,
"clear-pt-map");
fs_rtp_session_start_codec_param_gathering_locked (session);
- FS_RTP_SESSION_UNLOCK (session);
-
if (has_remotes)
{
- fs_rtp_session_verify_send_codec_bin (session);
+ fs_rtp_session_verify_send_codec_bin_locked (session);
}
+ FS_RTP_SESSION_UNLOCK (session);
+
if (is_new)
{
g_object_notify (G_OBJECT (session), "codecs");
@@ -2992,15 +2983,15 @@ fs_rtp_session_new_recv_pad (FsRtpSession *session, GstPad *new_pad,
}
static gboolean
-validate_src_pads (gpointer item, GValue *ret, gpointer user_data)
+validate_src_pads (const GValue *item, GValue *ret, gpointer user_data)
{
- GstPad *pad = item;
+ GstPad *pad = g_value_get_object (item);
GList *codecs = user_data;
GstCaps *caps;
GList *listitem = NULL;
gboolean retval = FALSE;
- caps = gst_pad_get_caps_reffed (pad);
+ caps = gst_pad_query_caps (pad, NULL);
if (gst_caps_is_empty (caps))
{
@@ -3027,7 +3018,6 @@ validate_src_pads (gpointer item, GValue *ret, gpointer user_data)
error:
- gst_object_unref (pad);
gst_caps_unref (caps);
if (!retval)
g_value_set_boolean (ret, FALSE);
@@ -3301,19 +3291,18 @@ struct link_data {
*/
static gboolean
-link_main_pad (gpointer item, GValue *ret, gpointer user_data)
+link_main_pad (const GValue *item, GValue *ret, gpointer user_data)
{
- GstPad *pad = item;
+ GstPad *pad = g_value_get_object (item);
struct link_data *data = user_data;
GstCaps *caps;
GstPad *other_pad;
- caps = gst_pad_get_caps_reffed (pad);
+ caps = gst_pad_query_caps (pad, data->caps);
if (!gst_caps_can_intersect (caps, data->caps))
{
gst_caps_unref (caps);
- gst_object_unref (pad);
return TRUE;
}
gst_caps_unref (caps);
@@ -3338,7 +3327,6 @@ link_main_pad (gpointer item, GValue *ret, gpointer user_data)
error:
gst_object_unref (other_pad);
- gst_object_unref (pad);
return FALSE;
}
@@ -3350,9 +3338,9 @@ link_main_pad (gpointer item, GValue *ret, gpointer user_data)
*/
static gboolean
-link_other_pads (gpointer item, GValue *ret, gpointer user_data)
+link_other_pads (const GValue *item, GValue *ret, gpointer user_data)
{
- GstPad *pad = item;
+ GstPad *pad = g_value_get_object (item);
struct link_data *data = user_data;
GstCaps *caps;
GstCaps *filter_caps = NULL;
@@ -3362,11 +3350,10 @@ link_other_pads (gpointer item, GValue *ret, gpointer user_data)
if (gst_pad_is_linked (pad))
{
- gst_object_unref (pad);
return TRUE;
}
- caps = gst_pad_get_caps_reffed (pad);
+ caps = gst_pad_query_caps (pad, NULL);
if (gst_caps_is_empty (caps))
{
@@ -3397,7 +3384,6 @@ link_other_pads (gpointer item, GValue *ret, gpointer user_data)
g_set_error (data->error, FS_ERROR, FS_ERROR_INTERNAL,
"Could not find codec that matches the src pad");
g_value_set_boolean (ret, FALSE);
- gst_object_unref (pad);
return FALSE;
}
@@ -3433,11 +3419,9 @@ link_other_pads (gpointer item, GValue *ret, gpointer user_data)
goto error;
}
gst_object_unref (otherpad);
- gst_object_unref (pad);
- pad = NULL;
if (!gst_element_link_pads (capsfilter, NULL,
- data->session->priv->rtpmuxer, "sink_%d"))
+ data->session->priv->rtpmuxer, "sink_%u"))
{
g_set_error (data->error, FS_ERROR, FS_ERROR_CONSTRUCTION,
"Could not an extra capsfilter to the muxer");
@@ -3464,7 +3448,6 @@ link_other_pads (gpointer item, GValue *ret, gpointer user_data)
data->session->priv->extra_send_capsfilters =
g_list_remove (data->session->priv->extra_send_capsfilters,
capsfilter);
- gst_object_unref (pad);
gst_caps_unref (filter_caps);
return FALSE;
@@ -3599,7 +3582,7 @@ fs_rtp_session_add_send_codec_bin_unlock (FsRtpSession *session,
GST_DEBUG ("Trying to add send codecbin for " FS_CODEC_FORMAT,
FS_CODEC_ARGS (ca->send_codec));
- name = g_strdup_printf ("send_%d_%d", session->id, ca->send_codec->id);
+ name = g_strdup_printf ("send_%u_%u", session->id, ca->send_codec->id);
codecs = codec_associations_to_send_codecs (
session->priv->codec_associations);
codecbin = _create_codec_bin (ca, ca->send_codec, name, TRUE, codecs,
@@ -3765,11 +3748,6 @@ fs_rtp_session_add_send_codec_bin_unlock (FsRtpSession *session,
return NULL;
}
-static void
-pad_block_do_nothing (GstPad *pad, gboolean blocked, gpointer user_data)
-{
-}
-
/**
* _send_src_pad_blocked_callback:
*
@@ -3777,8 +3755,8 @@ pad_block_do_nothing (GstPad *pad, gboolean blocked, gpointer user_data)
* It is used to replace the codec bin when the send codec has been changed.
*/
-static void
-_send_src_pad_blocked_callback (GstPad *pad, gboolean blocked,
+static GstPadProbeReturn
+_send_src_pad_blocked_callback (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data)
{
FsRtpSession *self = FS_RTP_SESSION (user_data);
@@ -3791,13 +3769,15 @@ _send_src_pad_blocked_callback (GstPad *pad, gboolean blocked,
if (fs_rtp_session_has_disposed_enter (self, NULL))
{
- gst_pad_set_blocked_async (pad, FALSE, pad_block_do_nothing, NULL);
- return;
+ FS_RTP_SESSION_LOCK (self);
+ self->priv->send_pad_block_id = 0;
+ FS_RTP_SESSION_UNLOCK (self);
+ return GST_PAD_PROBE_REMOVE;
}
- g_mutex_lock (self->priv->send_pad_blocked_mutex);
-
FS_RTP_SESSION_LOCK (self);
+ self->priv->send_pad_block_id = 0;
+
ca = fs_rtp_session_select_send_codec_locked (self, &error);
if (!ca)
@@ -3912,11 +3892,8 @@ _send_src_pad_blocked_callback (GstPad *pad, gboolean blocked,
* with the right caps to come in. Only then can we drop the pad block
*/
- gst_pad_set_blocked_async (pad, FALSE, pad_block_do_nothing, NULL);
-
- g_mutex_unlock (self->priv->send_pad_blocked_mutex);
fs_rtp_session_has_disposed_exit (self);
- return;
+ return GST_PAD_PROBE_REMOVE;
done_locked:
FS_RTP_SESSION_UNLOCK (self);
@@ -3924,7 +3901,7 @@ _send_src_pad_blocked_callback (GstPad *pad, gboolean blocked,
}
/**
- * fs_rtp_session_verify_send_codec_bin:
+ * fs_rtp_session_verify_send_codec_bin_locked:
*
* Verify that the current send codec is still valid and if it is not
* do whats required to have the right one be used.
@@ -3934,10 +3911,13 @@ _send_src_pad_blocked_callback (GstPad *pad, gboolean blocked,
*/
static void
-fs_rtp_session_verify_send_codec_bin (FsRtpSession *self)
+fs_rtp_session_verify_send_codec_bin_locked (FsRtpSession *self)
{
- gst_pad_set_blocked_async (self->priv->send_tee_media_pad, TRUE,
- _send_src_pad_blocked_callback, self);
+ if (self->priv->send_pad_block_id == 0)
+ self->priv->send_pad_block_id =
+ gst_pad_add_probe (self->priv->send_tee_media_pad,
+ GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ _send_src_pad_blocked_callback, g_object_ref (self), g_object_unref);
}
/*
@@ -3968,7 +3948,7 @@ _substream_get_codec_bin (FsRtpSubStream *substream,
if (!ca)
goto out;
- name = g_strdup_printf ("recv_%d_%u_%d", session->id, substream->ssrc,
+ name = g_strdup_printf ("recv_%u_%u_%u", session->id, substream->ssrc,
substream->pt);
codecbin = _create_codec_bin (ca, *new_codec, name, FALSE, NULL,
current_builder_hash, new_builder_hash, error);
@@ -4374,13 +4354,16 @@ _discovery_caps_changed (GstPad *pad, GParamSpec *pspec, FsRtpSession *session)
out:
- FS_RTP_SESSION_UNLOCK (session);
-
gst_caps_unref (caps);
- if (block)
- gst_pad_set_blocked_async (session->priv->send_tee_discovery_pad, TRUE,
- _discovery_pad_blocked_callback, session);
+ if (block && session->priv->discovery_pad_block_id == 0)
+ session->priv->discovery_pad_block_id =
+ gst_pad_add_probe (session->priv->send_tee_discovery_pad,
+ GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ _discovery_pad_blocked_callback,
+ g_object_ref (session), g_object_unref);
+
+ FS_RTP_SESSION_UNLOCK (session);
fs_rtp_session_has_disposed_exit (session);
}
@@ -4411,7 +4394,7 @@ fs_rtp_session_get_codec_params_unlock (FsRtpSession *session,
fs_codec_destroy (session->priv->discovery_codec);
session->priv->discovery_codec = NULL;
- tmp = g_strdup_printf ("discover_%d_%d", session->id, ca->send_codec->id);
+ tmp = g_strdup_printf ("discover_%u_%u", session->id, ca->send_codec->id);
codecbin = _create_codec_bin (ca, ca->send_codec, tmp, TRUE, NULL,
0, NULL, error);
g_free (tmp);
@@ -4445,7 +4428,7 @@ fs_rtp_session_get_codec_params_unlock (FsRtpSession *session,
session->priv->discovery_capsfilter == NULL)
{
- tmp = g_strdup_printf ("discovery_fakesink_%d", session->id);
+ tmp = g_strdup_printf ("discovery_fakesink_%u", session->id);
session->priv->discovery_fakesink =
gst_element_factory_make ("fakesink", tmp);
g_free (tmp);
@@ -4475,7 +4458,7 @@ fs_rtp_session_get_codec_params_unlock (FsRtpSession *session,
goto error;
}
- tmp = g_strdup_printf ("discovery_capsfilter_%d", session->id);
+ tmp = g_strdup_printf ("discovery_capsfilter_%u", session->id);
session->priv->discovery_capsfilter =
gst_element_factory_make ("capsfilter", tmp);
g_free (tmp);
@@ -4615,8 +4598,8 @@ fs_rtp_session_get_codec_params_unlock (FsRtpSession *session,
* This is the callback to change the discovery codecbin
*/
-static void
-_discovery_pad_blocked_callback (GstPad *pad, gboolean blocked,
+static GstPadProbeReturn
+_discovery_pad_blocked_callback (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data)
{
FsRtpSession *session = user_data;
@@ -4626,13 +4609,14 @@ _discovery_pad_blocked_callback (GstPad *pad, gboolean blocked,
if (fs_rtp_session_has_disposed_enter (session, NULL))
{
- gst_pad_set_blocked_async (pad, FALSE, pad_block_do_nothing, NULL);
- return;
+ FS_RTP_SESSION_LOCK (session);
+ session->priv->discovery_pad_block_id = 0;
+ FS_RTP_SESSION_UNLOCK (session);
+ return GST_PAD_PROBE_REMOVE;
}
- g_mutex_lock (session->priv->discovery_pad_blocked_mutex);
-
FS_RTP_SESSION_LOCK (session);
+ session->priv->discovery_pad_block_id = 0;
/* Find out if there is a codec that needs the config to be fetched */
for (item = g_list_first (session->priv->codec_associations);
@@ -4673,10 +4657,8 @@ _discovery_pad_blocked_callback (GstPad *pad, gboolean blocked,
g_clear_error (&error);
out_unlocked:
- gst_pad_set_blocked_async (pad, FALSE, pad_block_do_nothing, NULL);
- g_mutex_unlock (session->priv->discovery_pad_blocked_mutex);
fs_rtp_session_has_disposed_exit (session);
- return;
+ return GST_PAD_PROBE_REMOVE;
out_locked:
FS_RTP_SESSION_UNLOCK (session);
@@ -4711,8 +4693,11 @@ fs_rtp_session_start_codec_param_gathering_locked (FsRtpSession *session)
GST_DEBUG ("Starting Codec Param discovery for session %d", session->id);
- gst_pad_set_blocked_async (session->priv->send_tee_discovery_pad, TRUE,
- _discovery_pad_blocked_callback, session);
+ if (session->priv->discovery_pad_block_id == 0)
+ session->priv->discovery_pad_block_id =
+ gst_pad_add_probe (session->priv->send_tee_discovery_pad,
+ GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ _discovery_pad_blocked_callback, g_object_ref (session), g_object_unref);
}
@@ -4823,9 +4808,9 @@ struct CodecBinSetBitrateData
};
static void
-codecbin_set_bitrate_func (gpointer e, gpointer user_data)
+codecbin_set_bitrate_func (const GValue *item, gpointer user_data)
{
- GstElement *elem = e;
+ GstElement *elem = g_value_get_object (item);
struct CodecBinSetBitrateData *data = user_data;
if (g_object_class_find_property (G_OBJECT_GET_CLASS (elem), "bitrate"))
@@ -4833,8 +4818,6 @@ codecbin_set_bitrate_func (gpointer e, gpointer user_data)
fs_utils_set_bitrate (elem, data->bitrate);
data->ret = TRUE;
}
-
- gst_object_unref (elem);
}
static gboolean
diff --git a/gst/fsrtpconference/fs-rtp-special-source.c b/gst/fsrtpconference/fs-rtp-special-source.c
index 5c7a69bb..dbe1a13c 100644
--- a/gst/fsrtpconference/fs-rtp-special-source.c
+++ b/gst/fsrtpconference/fs-rtp-special-source.c
@@ -612,10 +612,10 @@ fs_rtp_special_source_new (FsRtpSpecialSourceClass *klass,
}
source->priv->muxer_request_pad = gst_element_get_request_pad (rtpmuxer,
- "priority_sink_%d");
+ "priority_sink_%u");
if (!source->priv->muxer_request_pad)
source->priv->muxer_request_pad = gst_element_get_request_pad (rtpmuxer,
- "sink_%d");
+ "sink_%u");
if (!source->priv->muxer_request_pad)
{
diff --git a/gst/fsrtpconference/fs-rtp-substream.c b/gst/fsrtpconference/fs-rtp-substream.c
index 0feaa791..79c70a97 100644
--- a/gst/fsrtpconference/fs-rtp-substream.c
+++ b/gst/fsrtpconference/fs-rtp-substream.c
@@ -112,8 +112,7 @@ struct _FsRtpSubStreamPrivate {
* Protected by the session mutex
*/
gulong blocking_id;
- /* Pointer to last buffer caps, protected by the session lock */
- GstCaps *last_buffer_caps;
+ gulong check_caps_id;
/* This is protected by the session lock... the caller takes the lock
* before updating the property.. yea nasty I know
@@ -160,9 +159,6 @@ static void fs_rtp_sub_stream_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec);
static void
-fs_rtp_sub_stream_add_probe_locked (FsRtpSubStream *substream);
-
-static void
fs_rtp_sub_stream_emit_error (FsRtpSubStream *substream,
gint error_no,
gchar *error_msg,
@@ -570,7 +566,7 @@ fs_rtp_sub_stream_constructed (GObject *object)
self->priv->rtpbin_pad, "unlinked", G_CALLBACK (rtpbin_pad_unlinked),
self, 0);
- tmp = g_strdup_printf ("output_recv_valve_%d_%d_%d", self->priv->session->id,
+ tmp = g_strdup_printf ("output_recv_valve_%u_%u_%u", self->priv->session->id,
self->ssrc, self->pt);
self->priv->output_valve = gst_element_factory_make ("valve", tmp);
g_free (tmp);
@@ -604,7 +600,7 @@ fs_rtp_sub_stream_constructed (GObject *object)
return;
}
- tmp = g_strdup_printf ("recv_capsfilter_%d_%d_%d", self->priv->session->id,
+ tmp = g_strdup_printf ("recv_capsfilter_%u_%u_%u", self->priv->session->id,
self->ssrc, self->pt);
self->priv->capsfilter = gst_element_factory_make ("capsfilter", tmp);
g_free (tmp);
@@ -634,7 +630,7 @@ fs_rtp_sub_stream_constructed (GObject *object)
return;
}
- tmp = g_strdup_printf ("input_recv_valve_%d_%d_%d", self->priv->session->id,
+ tmp = g_strdup_printf ("input_recv_valve_%u_%u_%u", self->priv->session->id,
self->ssrc, self->pt);
self->priv->input_valve = gst_element_factory_make ("valve", tmp);
g_free (tmp);
@@ -709,8 +705,6 @@ fs_rtp_sub_stream_dispose (GObject *object)
{
FsRtpSubStream *self = FS_RTP_SUB_STREAM (object);
- fs_rtp_sub_stream_stop (self);
-
fs_rtp_sub_stream_stop_no_rtcp_timeout_thread (self);
if (self->priv->output_ghostpad) {
@@ -747,13 +741,6 @@ fs_rtp_sub_stream_dispose (GObject *object)
self->priv->input_valve = NULL;
}
- if (self->priv->blocking_id)
- {
- gst_pad_remove_data_probe (self->priv->rtpbin_pad,
- self->priv->blocking_id);
- self->priv->blocking_id = 0;
- }
-
if (self->priv->rtpbin_pad) {
gst_object_unref (self->priv->rtpbin_pad);
self->priv->rtpbin_pad = NULL;
@@ -770,9 +757,6 @@ fs_rtp_sub_stream_finalize (GObject *object)
if (self->codec)
fs_codec_destroy (self->codec);
- if (self->priv->last_buffer_caps)
- gst_caps_unref (self->priv->last_buffer_caps);
-
if (self->priv->mutex)
g_mutex_free (self->priv->mutex);
@@ -971,13 +955,6 @@ fs_rtp_sub_stream_set_codecbin (FsRtpSubStream *substream,
goto error;
}
- /* This is a non-error error
- * Some codecs require config data to start.. so we should just ignore them
- */
- fs_rtp_sub_stream_add_probe_locked (substream);
-
- GST_DEBUG ("New recv codec accepted");
-
gst_object_unref (pad);
FS_RTP_SESSION_LOCK (substream->priv->session);
@@ -1037,11 +1014,6 @@ fs_rtp_sub_stream_new (FsRtpConference *conference,
return substream;
}
-static void
-do_nothing_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
-{
-}
-
/**
* fs_rtp_sub_stream_stop:
@@ -1063,8 +1035,21 @@ fs_rtp_sub_stream_stop (FsRtpSubStream *substream)
substream->priv->rtpbin_unlinked_sig = 0;
}
- gst_pad_set_blocked_async (substream->priv->rtpbin_pad, FALSE,
- do_nothing_blocked_callback, NULL);
+ FS_RTP_SESSION_LOCK (substream->priv->session);
+ if (substream->priv->blocking_id != 0)
+ {
+ gst_pad_remove_probe (substream->priv->rtpbin_pad,
+ substream->priv->blocking_id);
+ substream->priv->blocking_id = 0;
+ }
+ FS_RTP_SESSION_UNLOCK (substream->priv->session);
+
+ if (substream->priv->check_caps_id != 0)
+ {
+ gst_pad_remove_probe (substream->priv->rtpbin_pad,
+ substream->priv->check_caps_id);
+ substream->priv->check_caps_id = 0;
+ }
if (substream->priv->output_ghostpad)
gst_pad_set_active (substream->priv->output_ghostpad, FALSE);
@@ -1094,34 +1079,6 @@ fs_rtp_sub_stream_stop (FsRtpSubStream *substream)
}
}
-static gboolean
-event_probe_drop_newsegment (GstPad *pad, GstEvent *event, gpointer user_data)
-{
- if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT)
- {
- gboolean update;
- GstFormat format;
- gint64 start;
- gint64 stop;
-
- gst_event_parse_new_segment (event, &update, NULL, &format, &start, &stop,
- NULL);
-
- /* Drop this one is assumed, so lets drop it to prevent accumulation
- * If somethign sends something else, lets assume they now
- * what they are doing
- */
- if (!update && format == GST_FORMAT_TIME && start == 0 && stop == -1)
- {
- GST_DEBUG ("Dropping newsegment event to prevent accumulation");
- return FALSE;
- }
- GST_INFO ("Letting newsegment event through, be careful what you wish for");
- }
-
- return TRUE;
-}
-
/**
* fs_rtp_sub_stream_add_output_ghostpad_unlock:
*
@@ -1157,7 +1114,7 @@ fs_rtp_sub_stream_add_output_ghostpad_unlock (FsRtpSubStream *substream,
substream->priv->adding_output_ghostpad = TRUE;
- padname = g_strdup_printf ("src_%u_%u_%d", substream->priv->session->id,
+ padname = g_strdup_printf ("src_%u_%u_%u", substream->priv->session->id,
substream->ssrc,
substream->pt);
@@ -1170,7 +1127,7 @@ fs_rtp_sub_stream_add_output_ghostpad_unlock (FsRtpSubStream *substream,
ghostpad = gst_ghost_pad_new_from_template (padname, valve_srcpad,
gst_element_class_get_pad_template (
GST_ELEMENT_GET_CLASS (substream->priv->conference),
- "src_%d_%d_%d"));
+ "src_%u_%u_%u"));
gst_object_unref (valve_srcpad);
g_free (padname);
@@ -1178,18 +1135,15 @@ fs_rtp_sub_stream_add_output_ghostpad_unlock (FsRtpSubStream *substream,
if (!ghostpad)
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
- "Could not build ghostpad src_%u_%u_%d", substream->priv->session->id,
+ "Could not build ghostpad src_%u_%u_%u", substream->priv->session->id,
substream->ssrc, substream->pt);
goto error;
}
- gst_pad_add_event_probe (ghostpad, G_CALLBACK (event_probe_drop_newsegment),
- NULL);
-
if (!gst_pad_set_active (ghostpad, TRUE))
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
- "Could not activate the src_%u_%u_%d", substream->priv->session->id,
+ "Could not activate the src_%u_%u_%u", substream->priv->session->id,
substream->ssrc, substream->pt);
gst_object_unref (ghostpad);
goto error;
@@ -1199,7 +1153,7 @@ fs_rtp_sub_stream_add_output_ghostpad_unlock (FsRtpSubStream *substream,
ghostpad))
{
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
- "Could add build ghostpad src_%u_%u_%d to the conference",
+ "Could add build ghostpad src_%u_%u_%u to the conference",
substream->priv->session->id, substream->ssrc, substream->pt);
gst_object_unref (ghostpad);
goto error;
@@ -1236,79 +1190,57 @@ fs_rtp_sub_stream_add_output_ghostpad_unlock (FsRtpSubStream *substream,
return FALSE;
}
-/**
- *_rtpbin_pad_have_data_callback:
- *
- * This is the pad probe callback on the sink pad of the rtpbin.
- * It is used to replace the codec bin when the recv codec has been changed.
- *
- * Its a callback, it returns TRUE to let the data through and FALSE to drop it
- * (See the "have-data" signal documentation of #GstPad).
- */
-static gboolean
-_rtpbin_pad_have_data_callback (GstPad *pad, GstMiniObject *miniobj,
- gpointer user_data)
+static GstPadProbeReturn
+_probe_check_caps (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
FsRtpSubStream *self = FS_RTP_SUB_STREAM (user_data);
- gboolean ret = TRUE;
- FsRtpSession *session;
+ GstEvent *event;
+ GstPadProbeReturn ret = GST_PAD_PROBE_DROP;
+
+
+ /* drop buffers before we have the right caps */
+ if (!(GST_PAD_PROBE_INFO_TYPE(info) & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM))
+ return GST_PAD_PROBE_DROP;
+
+ event = GST_PAD_PROBE_INFO_EVENT (info);
+
+ /* let other events like segments through before the caps we like */
+ if (GST_EVENT_TYPE (event) != GST_EVENT_CAPS)
+ return GST_PAD_PROBE_PASS;
if (fs_rtp_session_has_disposed_enter (self->priv->session, NULL))
- return FALSE;
+ return GST_PAD_PROBE_REMOVE;
if (fs_rtp_sub_stream_has_stopped_enter (self))
{
fs_rtp_session_has_disposed_exit (self->priv->session);
- return FALSE;
+ return GST_PAD_PROBE_REMOVE;
}
- g_object_ref (self);
- session = g_object_ref (self->priv->session);
-
FS_RTP_SESSION_LOCK (self->priv->session);
- if (!self->priv->codecbin || !self->codec)
+ if (self->priv->codecbin && self->codec)
{
- ret = FALSE;
- }
- else if (GST_IS_BUFFER (miniobj))
- {
- if (self->priv->last_buffer_caps == GST_BUFFER_CAPS (miniobj))
- {
- ret = FALSE;
- }
- else
- {
- ret = gst_pad_set_caps (pad, GST_BUFFER_CAPS (miniobj));
- self->priv->last_buffer_caps = gst_caps_ref (GST_BUFFER_CAPS (miniobj));
-
- if (!ret)
- GST_WARNING ("Caps rejected by codecbin,"
- " not letting any buffer through");
-
- if (ret && self->priv->blocking_id)
- {
- gst_pad_remove_data_probe (pad, self->priv->blocking_id);
- self->priv->blocking_id = 0;
- }
- }
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+
+ if (gst_pad_set_caps (pad, caps))
+ ret = GST_PAD_PROBE_REMOVE;
}
FS_RTP_SESSION_UNLOCK (self->priv->session);
fs_rtp_sub_stream_has_stopped_exit (self);
-
fs_rtp_session_has_disposed_exit (self->priv->session);
- g_object_unref (self);
- g_object_unref (session);
-
return ret;
}
-static void
-_rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
+static GstPadProbeReturn
+_rtpbin_pad_blocked_callback (GstPad *pad, GstPadProbeInfo *info,
+ gpointer user_data)
{
FsRtpSubStream *substream = user_data;
GError *error = NULL;
@@ -1316,18 +1248,22 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
guint new_builder_hash = 0;
FsCodec *codec = NULL;
FsRtpSession *session;
+ GstCaps *caps = NULL;
+
+ FS_RTP_SESSION_LOCK (substream->priv->session);
+ substream->priv->blocking_id = 0;
+ FS_RTP_SESSION_UNLOCK (substream->priv->session);
+
if (fs_rtp_session_has_disposed_enter (substream->priv->session, NULL))
{
- gst_pad_set_blocked_async (pad, FALSE, do_nothing_blocked_callback, NULL);
- return;
+ return GST_PAD_PROBE_REMOVE;
}
if (fs_rtp_sub_stream_has_stopped_enter (substream))
{
- gst_pad_set_blocked_async (pad, FALSE, do_nothing_blocked_callback, NULL);
fs_rtp_session_has_disposed_exit (substream->priv->session);
- return;
+ return GST_PAD_PROBE_REMOVE;
}
g_object_ref (substream);
@@ -1336,8 +1272,6 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
GST_DEBUG ("Substream blocked for codec change (session:%d SSRC:%x pt:%d)",
substream->priv->session->id, substream->ssrc, substream->pt);
- gst_pad_set_blocked_async (pad, FALSE, do_nothing_blocked_callback, NULL);
-
g_signal_emit (substream, signals[GET_CODEC_BIN], 0,
substream->priv->stream, &codec,
substream->priv->builder_hash, &new_builder_hash, &error, &codecbin);
@@ -1349,7 +1283,6 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
if (codec &&
(!substream->codec || !fs_codec_are_equal (codec, substream->codec)))
{
- GstCaps *caps;
gchar *tmp;
if (substream->codec)
@@ -1361,15 +1294,30 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
GST_DEBUG ("Setting caps %s on recv substream", tmp);
g_free (tmp);
g_object_set (substream->priv->capsfilter, "caps", caps, NULL);
-
- fs_rtp_sub_stream_add_probe_locked (substream);
}
FS_RTP_SESSION_UNLOCK (substream->priv->session);
if (codecbin)
+ {
if (!fs_rtp_sub_stream_set_codecbin (substream, codec, codecbin,
new_builder_hash, &error))
goto error;
+ }
+
+ if (caps)
+ {
+
+ if (!gst_pad_set_caps (substream->priv->rtpbin_pad, caps))
+ {
+ if (substream->priv->check_caps_id == 0)
+ substream->priv->check_caps_id =
+ gst_pad_add_probe (substream->priv->rtpbin_pad,
+ GST_PAD_PROBE_TYPE_DATA_DOWNSTREAM,
+ _probe_check_caps, g_object_ref (substream), g_object_unref);
+ }
+
+ gst_caps_unref (caps);
+ }
out:
@@ -1382,12 +1330,12 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
g_object_unref (substream);
g_object_unref (session);
- return;
+ return GST_PAD_PROBE_REMOVE;
error:
g_prefix_error (&error, "Could not add the new recv codec bin for"
- " ssrc %u and payload type %d to the state NULL", substream->ssrc,
+ " ssrc %u and payload type %d to the state NULL: ", substream->ssrc,
substream->pt);
if (substream->priv->stream)
@@ -1400,24 +1348,6 @@ _rtpbin_pad_blocked_callback (GstPad *pad, gboolean blocked, gpointer user_data)
goto out;
}
-static void
-fs_rtp_sub_stream_add_probe_locked (FsRtpSubStream *substream)
-{
- if (fs_rtp_sub_stream_has_stopped_enter (substream))
- return;
-
- if (substream->priv->last_buffer_caps)
- gst_caps_unref (substream->priv->last_buffer_caps);
- substream->priv->last_buffer_caps = NULL;
-
- if (!substream->priv->blocking_id)
- substream->priv->blocking_id = gst_pad_add_data_probe (
- substream->priv->rtpbin_pad,
- G_CALLBACK (_rtpbin_pad_have_data_callback), substream);
-
- fs_rtp_sub_stream_has_stopped_exit (substream);
-}
-
/**
* fs_rtp_sub_stream_verify_codec_locked:
* @substream: A #FsRtpSubStream
@@ -1437,11 +1367,10 @@ fs_rtp_sub_stream_verify_codec_locked (FsRtpSubStream *substream)
GST_LOG ("Starting codec verification process for substream with"
" SSRC:%x pt:%d", substream->ssrc, substream->pt);
-
- fs_rtp_sub_stream_add_probe_locked (substream);
-
- gst_pad_set_blocked_async (substream->priv->rtpbin_pad, TRUE,
- _rtpbin_pad_blocked_callback, substream);
+ if (!substream->priv->blocking_id)
+ substream->priv->blocking_id = gst_pad_add_probe (
+ substream->priv->rtpbin_pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ _rtpbin_pad_blocked_callback, g_object_ref (substream), g_object_unref);
fs_rtp_sub_stream_has_stopped_exit (substream);
}
diff --git a/gst/fsrtpconference/fs-rtp-tfrc.c b/gst/fsrtpconference/fs-rtp-tfrc.c
index 1800c564..2da0594d 100644
--- a/gst/fsrtpconference/fs-rtp-tfrc.c
+++ b/gst/fsrtpconference/fs-rtp-tfrc.c
@@ -168,11 +168,15 @@ fs_rtp_tfrc_destroy (FsRtpTfrc *self)
{
GST_OBJECT_LOCK (self);
+ if (self->modder_check_probe_id)
+ gst_pad_remove_probe (self->in_rtp_pad, self->modder_check_probe_id);
+ self->modder_check_probe_id = 0;
+
if (self->in_rtp_probe_id)
- g_signal_handler_disconnect (self->in_rtp_pad, self->in_rtp_probe_id);
+ gst_pad_remove_probe (self->in_rtp_pad, self->in_rtp_probe_id);
self->in_rtp_probe_id = 0;
if (self->in_rtcp_probe_id)
- g_signal_handler_disconnect (self->in_rtcp_pad, self->in_rtcp_probe_id);
+ gst_pad_remove_probe (self->in_rtcp_pad, self->in_rtcp_probe_id);
self->in_rtcp_probe_id = 0;
@@ -534,7 +538,7 @@ feedback_timer_expired (GstClock *clock, GstClockTime time, GstClockID id,
struct SendingRtcpData {
FsRtpTfrc *self;
- GstBuffer *buffer;
+ GstRTCPBuffer rtcpbuffer;
gboolean ret;
guint32 ssrc;
gboolean have_ssrc;
@@ -562,7 +566,8 @@ tfrc_sources_process (gpointer key, gpointer value, gpointer user_data)
if (!src->send_feedback)
goto done;
- if (!gst_rtcp_buffer_add_packet (data->buffer, GST_RTCP_TYPE_RTPFB, &packet))
+ if (!gst_rtcp_buffer_add_packet (&data->rtcpbuffer, GST_RTCP_TYPE_RTPFB,
+ &packet))
goto done;
if (!gst_rtcp_packet_fb_set_fci_length (&packet, 4))
@@ -609,24 +614,30 @@ static gboolean
rtpsession_sending_rtcp (GObject *rtpsession, GstBuffer *buffer,
gboolean is_early, FsRtpTfrc *self)
{
- struct SendingRtcpData data;
+ struct SendingRtcpData data = {NULL, GST_RTCP_BUFFER_INIT};
+
+ gst_rtcp_buffer_map (buffer, GST_MAP_READWRITE, &data.rtcpbuffer);
data.self = self;
data.ret = FALSE;
- data.buffer = buffer;
data.have_ssrc = FALSE;
+
GST_OBJECT_LOCK (self);
g_hash_table_foreach (self->tfrc_sources, tfrc_sources_process, &data);
GST_OBJECT_UNLOCK (self);
+ gst_rtcp_buffer_unmap (&data.rtcpbuffer);
+
/* Return TRUE if something was added */
return data.ret;
}
-static gboolean
-incoming_rtp_probe (GstPad *pad, GstBuffer *buffer, FsRtpTfrc *self)
+static GstPadProbeReturn
+incoming_rtp_probe (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
+ FsRtpTfrc *self = FS_RTP_TFRC (user_data);
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
guint32 ssrc;
guint8 *data;
guint size;
@@ -639,32 +650,35 @@ incoming_rtp_probe (GstPad *pad, GstBuffer *buffer, FsRtpTfrc *self)
guint64 now;
guint8 pt;
gint seq_delta;
+ GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT;
if (!gst_rtp_buffer_validate (buffer))
- return TRUE;
+ return GST_PAD_PROBE_OK;
GST_OBJECT_LOCK (self);
+
if (!self->fsrtpsession)
goto out_no_header;
- ssrc = gst_rtp_buffer_get_ssrc (buffer);
-
- pt = gst_rtp_buffer_get_payload_type (buffer);
+ gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer);
+ ssrc = gst_rtp_buffer_get_ssrc (&rtpbuffer);
+ pt = gst_rtp_buffer_get_payload_type (&rtpbuffer);
+ seq = gst_rtp_buffer_get_seq (&rtpbuffer);
if (pt > 128 || !self->pts[pt])
- goto out_no_header;
+ goto out_no_header_unmap;
if (self->extension_type == EXTENSION_NONE)
- goto out_no_header;
+ goto out_no_header_unmap;
else if (self->extension_type == EXTENSION_ONE_BYTE)
- got_header = gst_rtp_buffer_get_extension_onebyte_header (buffer,
+ got_header = gst_rtp_buffer_get_extension_onebyte_header (&rtpbuffer,
self->extension_id, 0, (gpointer *) &data, &size);
else if (self->extension_type == EXTENSION_TWO_BYTES)
- got_header = gst_rtp_buffer_get_extension_twobytes_header (buffer,
+ got_header = gst_rtp_buffer_get_extension_twobytes_header (&rtpbuffer,
NULL, self->extension_id, 0, (gpointer *) &data, &size);
- seq = gst_rtp_buffer_get_seq (buffer);
+ gst_rtp_buffer_unmap (&rtpbuffer);
src = fs_rtp_tfrc_get_remote_ssrc_locked (self, ssrc, NULL);
@@ -723,7 +737,7 @@ incoming_rtp_probe (GstPad *pad, GstBuffer *buffer, FsRtpTfrc *self)
ts += src->ts_cycles;
send_rtcp = tfrc_receiver_got_packet (src->receiver, ts, now, seq, rtt,
- GST_BUFFER_SIZE (buffer));
+ rtpbuffer.map.size);
GST_LOG_OBJECT (self, "Got RTP packet");
@@ -746,7 +760,11 @@ out:
GST_OBJECT_UNLOCK (self);
}
- return TRUE;
+ return GST_PAD_PROBE_OK;
+
+out_no_header_unmap:
+
+ gst_rtp_buffer_unmap (&rtpbuffer);
out_no_header:
if (src)
@@ -844,16 +862,21 @@ tracked_src_add_sender (struct TrackedSource *src, guint64 now,
src->send_ts_base = now;
}
-static gboolean
-incoming_rtcp_probe (GstPad *pad, GstBuffer *buffer, FsRtpTfrc *self)
+static GstPadProbeReturn
+incoming_rtcp_probe (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
+ FsRtpTfrc *self = FS_RTP_TFRC (user_data);
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+ GstRTCPBuffer rtcpbuffer = GST_RTCP_BUFFER_INIT;
GstRTCPPacket packet;
gboolean notify = FALSE;
if (!gst_rtcp_buffer_validate (buffer))
- goto out;
+ return GST_PAD_PROBE_OK;
- if (!gst_rtcp_buffer_get_first_packet (buffer, &packet))
+ gst_rtcp_buffer_map (buffer, GST_MAP_READ, &rtcpbuffer);
+
+ if (!gst_rtcp_buffer_get_first_packet (&rtcpbuffer, &packet))
goto out;
do {
@@ -868,7 +891,7 @@ incoming_rtcp_probe (GstPad *pad, GstBuffer *buffer, FsRtpTfrc *self)
guint32 delay;
guint32 x_recv;
gdouble loss_event_rate;
- guint8 *buf = GST_BUFFER_DATA (packet.buffer) + packet.offset;
+ guint8 *buf = rtcpbuffer.map.data + packet.offset;
struct TrackedSource *src;
guint64 now;
guint64 rtt;
@@ -982,7 +1005,10 @@ incoming_rtcp_probe (GstPad *pad, GstBuffer *buffer, FsRtpTfrc *self)
g_object_notify (G_OBJECT (self), "bitrate");
out:
- return TRUE;
+
+ gst_rtcp_buffer_unmap (&rtcpbuffer);
+
+ return GST_PAD_PROBE_OK;
}
static GstClockTime
@@ -1015,7 +1041,7 @@ fs_rtp_tfrc_get_sync_time (FsRtpPacketModder *modder,
bytes_for_one_rtt = 0;
}
- size = GST_BUFFER_SIZE (buffer) + 10;
+ size = gst_buffer_get_size (buffer) + 10;
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
{
@@ -1067,8 +1093,13 @@ fs_rtp_tfrc_outgoing_packets (FsRtpPacketModder *modder,
FsRtpTfrc *self = FS_RTP_TFRC (user_data);
gchar data[7];
guint64 now;
+ GstBuffer *headerbuf;
+ GstBuffer *databuf;
GstBuffer *newbuf;
gboolean is_data_limited;
+ gsize header_size;
+ gsize new_header_size;
+ GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT;
if (!GST_CLOCK_TIME_IS_VALID (buffer_ts))
return buffer;
@@ -1101,39 +1132,48 @@ fs_rtp_tfrc_outgoing_packets (FsRtpPacketModder *modder,
ONE_32BIT_CYCLE)
self->last_src->send_ts_cycles += ONE_32BIT_CYCLE;
- is_data_limited = (GST_BUFFER_TIMESTAMP (buffer) == buffer_ts);
+ is_data_limited = (GST_BUFFER_PTS (buffer) == buffer_ts);
+
+ gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer);
+ header_size = gst_rtp_buffer_get_header_len (&rtpbuffer);
+ gst_rtp_buffer_unmap (&rtpbuffer);
- newbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (buffer) + 16);
- gst_buffer_copy_metadata (newbuf, buffer, GST_BUFFER_COPY_ALL);
+ headerbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_METADATA, 0,
+ header_size);
+ headerbuf = gst_buffer_make_writable (headerbuf);
+ gst_buffer_set_size (headerbuf, header_size + 16);
- memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (buffer),
- gst_rtp_buffer_get_header_len (buffer));
+ gst_rtp_buffer_map (headerbuf, GST_MAP_READWRITE, &rtpbuffer);
if (self->extension_type == EXTENSION_ONE_BYTE)
{
- if (!gst_rtp_buffer_add_extension_onebyte_header (newbuf,
+ if (!gst_rtp_buffer_add_extension_onebyte_header (&rtpbuffer,
self->extension_id, data, 7))
GST_WARNING_OBJECT (self,
- "Could not add extension to RTP header buf %p", newbuf);
+ "Could not add extension to RTP header buf %p", headerbuf);
}
else if (self->extension_type == EXTENSION_TWO_BYTES)
{
- if (!gst_rtp_buffer_add_extension_twobytes_header (newbuf, 0,
+ if (!gst_rtp_buffer_add_extension_twobytes_header (&rtpbuffer, 0,
self->extension_id, data, 7))
GST_WARNING_OBJECT (self,
- "Could not add extension to RTP header in list %p", newbuf);
+ "Could not add extension to RTP header in list %p", headerbuf);
}
/* FIXME:
* This will break if any padding is applied
*/
+ new_header_size = gst_rtp_buffer_get_header_len (&rtpbuffer);
+
+ gst_rtp_buffer_unmap (&rtpbuffer);
- GST_BUFFER_SIZE (newbuf) = gst_rtp_buffer_get_header_len (newbuf) +
- gst_rtp_buffer_get_payload_len (buffer);
+ databuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, header_size,
+ gst_buffer_get_size (buffer) - header_size);
- memcpy (gst_rtp_buffer_get_payload (newbuf),
- gst_rtp_buffer_get_payload (buffer),
- gst_rtp_buffer_get_payload_len (buffer));
+ newbuf = gst_buffer_span (headerbuf, new_header_size, databuf,
+ gst_buffer_get_size (buffer) + new_header_size - header_size);
+ gst_buffer_unref (headerbuf);
+ gst_buffer_unref (databuf);
GST_LOG_OBJECT (self, "Sending RTP");
@@ -1152,7 +1192,7 @@ fs_rtp_tfrc_outgoing_packets (FsRtpPacketModder *modder,
{
if (!is_data_limited)
tfrc_is_data_limited_not_limited_now (src->idl, now);
- tfrc_sender_sending_packet (src->sender, GST_BUFFER_SIZE (newbuf));
+ tfrc_sender_sending_packet (src->sender, gst_buffer_get_size (newbuf));
}
}
}
@@ -1161,7 +1201,7 @@ fs_rtp_tfrc_outgoing_packets (FsRtpPacketModder *modder,
if (!is_data_limited)
tfrc_is_data_limited_not_limited_now (self->initial_src->idl, now);
tfrc_sender_sending_packet (self->initial_src->sender,
- GST_BUFFER_SIZE (newbuf));
+ gst_buffer_get_size (newbuf));
}
@@ -1172,19 +1212,15 @@ fs_rtp_tfrc_outgoing_packets (FsRtpPacketModder *modder,
return newbuf;
}
-static void
-pad_block_do_nothing (GstPad *pad, gboolean blocked, gpointer user_data)
-{
-}
-
-static void
-send_rtp_pad_blocked (GstPad *pad, gboolean blocked, gpointer user_data)
+static GstPadProbeReturn
+send_rtp_pad_blocked (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
FsRtpTfrc *self = user_data;
gboolean need_modder;
GstPad *peer = NULL;
GST_OBJECT_LOCK (self);
+ self->modder_check_probe_id = 0;
need_modder = self->extension_type != EXTENSION_NONE;
if (!self->fsrtpsession || !!self->packet_modder == need_modder)
@@ -1269,8 +1305,7 @@ out:
gst_object_unref (peer);
GST_OBJECT_UNLOCK (self);
- gst_pad_set_blocked_async (pad, FALSE, pad_block_do_nothing, NULL);
- return;
+ return GST_PAD_PROBE_REMOVE;
linking_failed:
gst_bin_remove (self->parent_bin, self->packet_modder);
@@ -1291,8 +1326,14 @@ fs_rtp_tfrc_check_modder_locked (FsRtpTfrc *self)
if (!!self->packet_modder == need_modder)
return;
- gst_pad_set_blocked_async_full (self->out_rtp_pad, TRUE, send_rtp_pad_blocked,
- g_object_ref (self), (GDestroyNotify) g_object_unref);
+ if (self->modder_check_probe_id != 0)
+ return;
+
+ self->modder_check_probe_id =
+ gst_pad_add_probe (self->out_rtp_pad,
+ GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ send_rtp_pad_blocked,
+ g_object_ref (self), (GDestroyNotify) g_object_unref);
}
@@ -1318,10 +1359,10 @@ fs_rtp_tfrc_new (FsRtpSession *fsrtpsession)
self->out_rtp_pad = gst_element_get_static_pad (rtpmuxer, "src");
gst_object_unref (rtpmuxer);
- self->in_rtp_probe_id = gst_pad_add_buffer_probe (self->in_rtp_pad,
- G_CALLBACK (incoming_rtp_probe), self);
- self->in_rtcp_probe_id = gst_pad_add_buffer_probe (self->in_rtcp_pad,
- G_CALLBACK (incoming_rtcp_probe), self);
+ self->in_rtp_probe_id = gst_pad_add_probe (self->in_rtp_pad,
+ GST_PAD_PROBE_TYPE_BUFFER, incoming_rtp_probe, self, NULL);
+ self->in_rtcp_probe_id = gst_pad_add_probe (self->in_rtcp_pad,
+ GST_PAD_PROBE_TYPE_BUFFER, incoming_rtcp_probe, self, NULL);
self->on_ssrc_validated_id = g_signal_connect_object (self->rtpsession,
diff --git a/gst/fsrtpconference/fs-rtp-tfrc.h b/gst/fsrtpconference/fs-rtp-tfrc.h
index 5e723d9f..453a088f 100644
--- a/gst/fsrtpconference/fs-rtp-tfrc.h
+++ b/gst/fsrtpconference/fs-rtp-tfrc.h
@@ -113,6 +113,7 @@ struct _FsRtpTfrc
gulong on_ssrc_validated_id;
gulong on_sending_rtcp_id;
+ gulong modder_check_probe_id;
GstElement *packet_modder;
GHashTable *tfrc_sources;
diff --git a/gst/fsvideoanyrate/videoanyrate.c b/gst/fsvideoanyrate/videoanyrate.c
index a6b773cc..7781332f 100644
--- a/gst/fsvideoanyrate/videoanyrate.c
+++ b/gst/fsvideoanyrate/videoanyrate.c
@@ -1,7 +1,7 @@
/*
* Farstream Voice+Video library
*
- * Copyright 2007 Collabora Ltd,
+ * Copyright 2007-2012 Collabora Ltd,
* Copyright 2007 Nokia Corporation
* @author: Olivier Crete <olivier.crete@collabora.co.uk>
*
@@ -41,15 +41,6 @@
GST_DEBUG_CATEGORY (videoanyrate_debug);
#define GST_CAT_DEFAULT (videoanyrate_debug)
-/* elementfactory information */
-static const GstElementDetails gst_videoanyrate_details =
-GST_ELEMENT_DETAILS (
- "Videoanyrate element",
- "Filter",
- "This element removes the framerate from caps",
- "Olivier Crete <olivier.crete@collabora.co.uk>");
-
-
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -76,41 +67,39 @@ enum
static GstCaps *
gst_videoanyrate_transform_caps (GstBaseTransform *trans,
GstPadDirection direction,
- GstCaps *caps);
+ GstCaps *caps,
+ GstCaps *filter);
static void
gst_videoanyrate_fixate_caps (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
-static void
-_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT
- (videoanyrate_debug, "fsvideoanyrate", 0, "fsvideoanyrate");
-}
+G_DEFINE_TYPE (GstVideoanyrate, gst_videoanyrate, GST_TYPE_BASE_TRANSFORM);
-GST_BOILERPLATE_FULL (GstVideoanyrate, gst_videoanyrate, GstBaseTransform,
- GST_TYPE_BASE_TRANSFORM, _do_init);
static void
-gst_videoanyrate_base_init (gpointer klass)
+gst_videoanyrate_class_init (GstVideoanyrateClass *klass)
{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstElementClass *element_class;
+ GstBaseTransformClass *gstbasetransform_class;
+
+ element_class = GST_ELEMENT_CLASS (klass);
+ gstbasetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
+
+
+ GST_DEBUG_CATEGORY_INIT
+ (videoanyrate_debug, "fsvideoanyrate", 0, "fsvideoanyrate");
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&srctemplate));
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&sinktemplate));
- gst_element_class_set_details (element_class, &gst_videoanyrate_details);
-}
-
-static void
-gst_videoanyrate_class_init (GstVideoanyrateClass *klass)
-{
- GstBaseTransformClass *gstbasetransform_class;
-
- gstbasetransform_class = (GstBaseTransformClass *) klass;
+ gst_element_class_set_metadata (element_class,
+ "Videoanyrate element",
+ "Filter",
+ "This element removes the framerate from caps",
+ "Olivier Crete <olivier.crete@collabora.com>");
gstbasetransform_class->transform_caps =
GST_DEBUG_FUNCPTR(gst_videoanyrate_transform_caps);
@@ -119,28 +108,34 @@ gst_videoanyrate_class_init (GstVideoanyrateClass *klass)
}
static void
-gst_videoanyrate_init (GstVideoanyrate *videoanyrate,
- GstVideoanyrateClass *klass)
+gst_videoanyrate_init (GstVideoanyrate *videoanyrate)
{
}
static GstCaps *
gst_videoanyrate_transform_caps (GstBaseTransform *trans,
GstPadDirection direction,
- GstCaps *caps)
+ GstCaps *caps,
+ GstCaps *filter)
{
GstCaps *mycaps = gst_caps_copy (caps);
- GstStructure *s;
+ guint i;
if (gst_caps_get_size (mycaps) == 0)
return mycaps;
GST_DEBUG_OBJECT (trans, "Transforming caps");
- s = gst_caps_get_structure (mycaps, 0);
+ for (i = 0; i < gst_caps_get_size (mycaps); i++)
+ {
+ GstStructure *s;
- gst_structure_set (s,
- "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+ s = gst_caps_get_structure (mycaps, i);
+
+ if (gst_structure_has_field (s, "framerate"))
+ gst_structure_set (s,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
+ }
return mycaps;
}
diff --git a/python/Makefile.am b/python/Makefile.am
deleted file mode 100644
index bcdb19fd..00000000
--- a/python/Makefile.am
+++ /dev/null
@@ -1,45 +0,0 @@
-PYDEFS=`pkg-config --variable=defsdir pygobject-2.0`
-GSTPYDEFS=`pkg-config --variable=defsdir gst-python-0.10`
-
-AM_CPPFLAGS = \
- -I. \
- -I$(top_srcdir)/gst-libs/ \
- -DDATADIR=\""$(datadir)"\" \
- $(PYFARSTREAM_CFLAGS) \
- $(PYTHON_INCLUDES) \
- $(FS_INTERNAL_CFLAGS) \
- $(FS_CFLAGS) \
- $(WARN_CFLAGS)
-
-BUILT_SOURCES = \
- pyfarstream.c
-
-pyfarstreamdir = $(pyexecdir)
-pyfarstream_LTLIBRARIES = farstream.la
-
-farstream_la_SOURCES = \
- pyfarstreammodule.c
-
-nodist_farstream_la_SOURCES = pyfarstream.c
-
-farstream_la_LIBADD = \
- $(PYFARSTREAM_LIBS) \
- $(top_builddir)/farstream/libfarstream-@FS_MAJORMINOR@.la
-
-farstream_la_LDFLAGS = -module -avoid-version
-
-pyfarstream.c: pyfarstream.override pyfarstream.defs
- $(PYCODEGEN) \
- --prefix fs \
- --register $(GSTPYDEFS)/gst-types.defs \
- --override $(srcdir)/pyfarstream.override \
- $(srcdir)/pyfarstream.defs > $@
-
-EXTRA_DIST = \
- pyfarstream.override \
- pyfarstream.defs \
- example.py \
- pyfarstream-filter.defs \
- rebuild-defs.sh
-
-CLEANFILES = $(BUILT_SOURCES)
diff --git a/python/pyfarstream-filter.defs b/python/pyfarstream-filter.defs
deleted file mode 100644
index b606d872..00000000
--- a/python/pyfarstream-filter.defs
+++ /dev/null
@@ -1,15 +0,0 @@
-(define-boxed Codec
- (in-module "Fs")
- (c-name "FsCodec")
- (gtype-id "FS_TYPE_CODEC")
- (copy-func fs_codec_copy)
- (release-func fs_codec_destroy)
-)
-
-(define-boxed Candidate
- (in-module "Fs")
- (c-name "FsCandidate")
- (gtype-id "FS_TYPE_CANDIDATE")
- (copy-func fs_candidate_copy)
- (release-func fs_candidate_destroy)
-)
diff --git a/python/pyfarstream.defs b/python/pyfarstream.defs
deleted file mode 100644
index 49380774..00000000
--- a/python/pyfarstream.defs
+++ /dev/null
@@ -1,970 +0,0 @@
-(define-boxed Codec
- (in-module "Fs")
- (c-name "FsCodec")
- (gtype-id "FS_TYPE_CODEC")
- (copy-func fs_codec_copy)
- (release-func fs_codec_destroy)
-)
-
-(define-boxed Candidate
- (in-module "Fs")
- (c-name "FsCandidate")
- (gtype-id "FS_TYPE_CANDIDATE")
- (copy-func fs_candidate_copy)
- (release-func fs_candidate_destroy)
-)
-;; -*- scheme -*-
-; object definitions ...
-;; Enumerations and flags ...
-
-(define-enum MediaType
- (in-module "Fs")
- (c-name "FsMediaType")
- (gtype-id "FS_TYPE_MEDIA_TYPE")
- (values
- '("audio" "FS_MEDIA_TYPE_AUDIO")
- '("video" "FS_MEDIA_TYPE_VIDEO")
- '("last" "FS_MEDIA_TYPE_LAST")
- )
-)
-
-
-;; From fs-codec.h
-
-(define-function fs_codec_get_type
- (c-name "fs_codec_get_type")
- (return-type "GType")
-)
-
-(define-function fs_codec_list_get_type
- (c-name "fs_codec_list_get_type")
- (return-type "GType")
-)
-
-(define-function fs_codec_new
- (c-name "fs_codec_new")
- (is-constructor-of "FsCodec")
- (return-type "FsCodec*")
- (parameters
- '("int" "id")
- '("const-char*" "encoding_name")
- '("FsMediaType" "media_type")
- '("guint" "clock_rate")
- )
-)
-
-(define-method destroy
- (of-object "FsCodec")
- (c-name "fs_codec_destroy")
- (return-type "none")
-)
-
-(define-method copy
- (of-object "FsCodec")
- (c-name "fs_codec_copy")
- (return-type "FsCodec*")
-)
-
-(define-function fs_codec_list_destroy
- (c-name "fs_codec_list_destroy")
- (return-type "none")
- (parameters
- '("GList*" "codec_list")
- )
-)
-
-(define-function fs_codec_list_copy
- (c-name "fs_codec_list_copy")
- (return-type "GList*")
- (parameters
- '("const-GList*" "codec_list")
- )
-)
-
-(define-function fs_codec_list_from_keyfile
- (c-name "fs_codec_list_from_keyfile")
- (return-type "GList*")
- (parameters
- '("const-gchar*" "filename")
- '("GError**" "error")
- )
-)
-
-(define-method to_string
- (of-object "FsCodec")
- (c-name "fs_codec_to_string")
- (return-type "gchar*")
-)
-
-(define-method to_string
- (of-object "FsMediaType")
- (c-name "fs_media_type_to_string")
- (return-type "const-gchar*")
-)
-
-(define-method are_equal
- (of-object "FsCodec")
- (c-name "fs_codec_are_equal")
- (return-type "gboolean")
- (parameters
- '("const-FsCodec*" "codec2")
- )
-)
-
-(define-function fs_codec_list_are_equal
- (c-name "fs_codec_list_are_equal")
- (return-type "gboolean")
- (parameters
- '("GList*" "list1")
- '("GList*" "list2")
- )
-)
-
-(define-method add_optional_parameter
- (of-object "FsCodec")
- (c-name "fs_codec_add_optional_parameter")
- (return-type "none")
- (parameters
- '("const-gchar*" "name")
- '("const-gchar*" "value")
- )
-)
-
-(define-method remove_optional_parameter
- (of-object "FsCodec")
- (c-name "fs_codec_remove_optional_parameter")
- (return-type "none")
- (parameters
- '("FsCodecParameter*" "param")
- )
-)
-
-(define-method get_optional_parameter
- (of-object "FsCodec")
- (c-name "fs_codec_get_optional_parameter")
- (return-type "FsCodecParameter*")
- (parameters
- '("const-gchar*" "name")
- '("const-gchar*" "value")
- )
-)
-
-(define-function fs_codec_parameter_get_type
- (c-name "fs_codec_parameter_get_type")
- (return-type "GType")
-)
-
-(define-method copy
- (of-object "FsCodecParameter")
- (c-name "fs_codec_parameter_copy")
- (return-type "FsCodecParameter*")
-)
-
-(define-method free
- (of-object "FsCodecParameter")
- (c-name "fs_codec_parameter_free")
- (return-type "none")
-)
-
-(define-method add_feedback_parameter
- (of-object "FsCodec")
- (c-name "fs_codec_add_feedback_parameter")
- (return-type "none")
- (parameters
- '("const-gchar*" "type")
- '("const-gchar*" "subtype")
- '("const-gchar*" "extra_params")
- )
-)
-
-(define-method get_feedback_parameter
- (of-object "FsCodec")
- (c-name "fs_codec_get_feedback_parameter")
- (return-type "FsFeedbackParameter*")
- (parameters
- '("const-gchar*" "type")
- '("const-gchar*" "subtype")
- '("const-gchar*" "extra_params")
- )
-)
-
-(define-method remove_feedback_parameter
- (of-object "FsCodec")
- (c-name "fs_codec_remove_feedback_parameter")
- (return-type "none")
- (parameters
- '("GList*" "item")
- )
-)
-
-(define-function fs_feedback_parameter_get_type
- (c-name "fs_feedback_parameter_get_type")
- (return-type "GType")
-)
-
-(define-method copy
- (of-object "FsFeedbackParameter")
- (c-name "fs_feedback_parameter_copy")
- (return-type "FsFeedbackParameter*")
-)
-
-(define-method free
- (of-object "FsFeedbackParameter")
- (c-name "fs_feedback_parameter_free")
- (return-type "none")
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-;; Enumerations and flags ...
-
-(define-enum CandidateType
- (in-module "Fs")
- (c-name "FsCandidateType")
- (gtype-id "FS_TYPE_CANDIDATE_TYPE")
- (values
- '("host" "FS_CANDIDATE_TYPE_HOST")
- '("srflx" "FS_CANDIDATE_TYPE_SRFLX")
- '("prflx" "FS_CANDIDATE_TYPE_PRFLX")
- '("relay" "FS_CANDIDATE_TYPE_RELAY")
- '("multicast" "FS_CANDIDATE_TYPE_MULTICAST")
- )
-)
-
-(define-enum NetworkProtocol
- (in-module "Fs")
- (c-name "FsNetworkProtocol")
- (gtype-id "FS_TYPE_NETWORK_PROTOCOL")
- (values
- '("udp" "FS_NETWORK_PROTOCOL_UDP")
- '("tcp" "FS_NETWORK_PROTOCOL_TCP")
- )
-)
-
-(define-enum ComponentType
- (in-module "Fs")
- (c-name "FsComponentType")
- (gtype-id "FS_TYPE_COMPONENT_TYPE")
- (values
- '("none" "FS_COMPONENT_NONE")
- '("rtp" "FS_COMPONENT_RTP")
- '("rtcp" "FS_COMPONENT_RTCP")
- )
-)
-
-
-;; From fs-candidate.h
-
-(define-function fs_candidate_get_type
- (c-name "fs_candidate_get_type")
- (return-type "GType")
-)
-
-(define-function fs_candidate_list_get_type
- (c-name "fs_candidate_list_get_type")
- (return-type "GType")
-)
-
-(define-method destroy
- (of-object "FsCandidate")
- (c-name "fs_candidate_destroy")
- (return-type "none")
-)
-
-(define-method copy
- (of-object "FsCandidate")
- (c-name "fs_candidate_copy")
- (return-type "FsCandidate*")
-)
-
-(define-function fs_candidate_list_destroy
- (c-name "fs_candidate_list_destroy")
- (return-type "none")
- (parameters
- '("GList*" "candidate_list")
- )
-)
-
-(define-function fs_candidate_list_copy
- (c-name "fs_candidate_list_copy")
- (return-type "GList*")
- (parameters
- '("const-GList*" "candidate_list")
- )
-)
-
-(define-function fs_candidate_new
- (c-name "fs_candidate_new")
- (is-constructor-of "FsCandidate")
- (return-type "FsCandidate*")
- (parameters
- '("const-gchar*" "foundation")
- '("guint" "component_id")
- '("FsCandidateType" "type")
- '("FsNetworkProtocol" "proto")
- '("const-gchar*" "ip")
- '("guint" "port")
- )
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-(define-object Conference
- (in-module "Fs")
- (parent "GstBin")
- (c-name "FsConference")
- (gtype-id "FS_TYPE_CONFERENCE")
-)
-
-;; Enumerations and flags ...
-
-(define-enum Error
- (in-module "Fs")
- (c-name "FsError")
- (gtype-id "FS_TYPE_ERROR")
- (values
- '("construction" "FS_ERROR_CONSTRUCTION")
- '("internal" "FS_ERROR_INTERNAL")
- '("invalid-arguments" "FS_ERROR_INVALID_ARGUMENTS")
- '("network" "FS_ERROR_NETWORK")
- '("not-implemented" "FS_ERROR_NOT_IMPLEMENTED")
- '("negotiation-failed" "FS_ERROR_NEGOTIATION_FAILED")
- '("unknown-codec" "FS_ERROR_UNKNOWN_CODEC")
- '("no-codecs" "FS_ERROR_NO_CODECS")
- '("no-codecs-left" "FS_ERROR_NO_CODECS_LEFT")
- '("connection-failed" "FS_ERROR_CONNECTION_FAILED")
- '("disposed" "FS_ERROR_DISPOSED")
- '("already-exists" "FS_ERROR_ALREADY_EXISTS")
- )
-)
-
-
-;; From fs-conference.h
-
-(define-function fs_conference_get_type
- (c-name "fs_conference_get_type")
- (return-type "GType")
-)
-
-(define-function fs_error_quark
- (c-name "fs_error_quark")
- (return-type "GQuark")
-)
-
-(define-method new_session
- (caller-owns-return t)
- (of-object "FsConference")
- (unblock-threads t)
- (c-name "fs_conference_new_session")
- (return-type "FsSession*")
- (parameters
- '("FsMediaType" "media_type")
- '("GError**" "error")
- )
-)
-
-(define-method new_participant
- (caller-owns-return t)
- (of-object "FsConference")
- (unblock-threads t)
- (c-name "fs_conference_new_participant")
- (return-type "FsParticipant*")
- (parameters
- '("GError**" "error")
- )
-)
-
-(define-function fs_parse_error
- (c-name "fs_parse_error")
- (return-type "gboolean")
- (parameters
- '("GObject*" "object")
- '("GstMessage*" "message")
- '("FsError*" "error")
- '("const-gchar**" "error_msg")
- )
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-(define-object Session
- (in-module "Fs")
- (parent "GstObject")
- (c-name "FsSession")
- (gtype-id "FS_TYPE_SESSION")
-)
-
-;; Enumerations and flags ...
-
-
-;; From fs-session.h
-
-(define-function fs_session_get_type
- (c-name "fs_session_get_type")
- (return-type "GType")
-)
-
-(define-method new_stream
- (caller-owns-return t)
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_new_stream")
- (return-type "FsStream*")
- (parameters
- '("FsParticipant*" "participant")
- '("FsStreamDirection" "direction")
- '("GError**" "error")
- )
-)
-
-(define-method start_telephony_event
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_start_telephony_event")
- (return-type "gboolean")
- (parameters
- '("guint8" "event")
- '("guint8" "volume")
- )
-)
-
-(define-method stop_telephony_event
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_stop_telephony_event")
- (return-type "gboolean")
-)
-
-(define-method set_send_codec
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_set_send_codec")
- (return-type "gboolean")
- (parameters
- '("FsCodec*" "send_codec")
- '("GError**" "error")
- )
-)
-
-(define-method set_codec_preferences
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_set_codec_preferences")
- (return-type "gboolean")
- (parameters
- '("GList*" "codec_preferences")
- '("GError**" "error")
- )
-)
-
-(define-method list_transmitters
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_list_transmitters")
- (return-type "gchar**")
-)
-
-(define-method emit_error
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_emit_error")
- (return-type "none")
- (parameters
- '("gint" "error_no")
- '("const-gchar*" "error_msg")
- )
-)
-
-(define-method get_stream_transmitter_type
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_get_stream_transmitter_type")
- (return-type "GType")
- (parameters
- '("const-gchar*" "transmitter")
- )
-)
-
-(define-method codecs_need_resend
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_codecs_need_resend")
- (return-type "GList*")
- (parameters
- '("GList*" "old_codecs")
- '("GList*" "new_codecs")
- )
-)
-
-(define-method destroy
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_destroy")
- (return-type "none")
-)
-
-(define-method parse_send_codec_changed
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_parse_send_codec_changed")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("FsCodec**" "codec")
- '("GList**" "secondary_codecs")
- )
-)
-
-(define-method parse_codecs_changed
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_parse_codecs_changed")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- )
-)
-
-(define-method parse_telephony_event_started
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_parse_telephony_event_started")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("FsDTMFMethod*" "method")
- '("FsDTMFEvent*" "event")
- '("guint8*" "volume")
- )
-)
-
-(define-method parse_telephony_event_stopped
- (of-object "FsSession")
- (unblock-threads t)
- (c-name "fs_session_parse_telephony_event_stopped")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("FsDTMFMethod*" "method")
- )
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-(define-object Participant
- (in-module "Fs")
- (parent "GstObject")
- (c-name "FsParticipant")
- (gtype-id "FS_TYPE_PARTICIPANT")
-)
-
-;; Enumerations and flags ...
-
-
-;; From fs-participant.h
-
-(define-function fs_participant_get_type
- (c-name "fs_participant_get_type")
- (return-type "GType")
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-(define-object Stream
- (in-module "Fs")
- (parent "GstObject")
- (c-name "FsStream")
- (gtype-id "FS_TYPE_STREAM")
-)
-
-;; Enumerations and flags ...
-
-(define-flags StreamDirection
- (in-module "Fs")
- (c-name "FsStreamDirection")
- (gtype-id "FS_TYPE_STREAM_DIRECTION")
- (values
- '("none" "FS_DIRECTION_NONE")
- '("send" "FS_DIRECTION_SEND")
- '("recv" "FS_DIRECTION_RECV")
- '("both" "FS_DIRECTION_BOTH")
- )
-)
-
-(define-enum StreamState
- (in-module "Fs")
- (c-name "FsStreamState")
- (gtype-id "FS_TYPE_STREAM_STATE")
- (values
- '("failed" "FS_STREAM_STATE_FAILED")
- '("disconnected" "FS_STREAM_STATE_DISCONNECTED")
- '("gathering" "FS_STREAM_STATE_GATHERING")
- '("connecting" "FS_STREAM_STATE_CONNECTING")
- '("connected" "FS_STREAM_STATE_CONNECTED")
- '("ready" "FS_STREAM_STATE_READY")
- )
-)
-
-
-;; From fs-stream.h
-
-(define-function fs_stream_get_type
- (c-name "fs_stream_get_type")
- (return-type "GType")
-)
-
-(define-method add_remote_candidates
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_add_remote_candidates")
- (return-type "gboolean")
- (parameters
- '("GList*" "candidates")
- '("GError**" "error")
- )
-)
-
-(define-method force_remote_candidates
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_force_remote_candidates")
- (return-type "gboolean")
- (parameters
- '("GList*" "remote_candidates")
- '("GError**" "error")
- )
-)
-
-(define-method set_remote_codecs
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_set_remote_codecs")
- (return-type "gboolean")
- (parameters
- '("GList*" "remote_codecs")
- '("GError**" "error")
- )
-)
-
-(define-method add_id
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_add_id")
- (return-type "none")
- (parameters
- '("guint" "id")
- )
-)
-
-(define-method emit_error
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_emit_error")
- (return-type "none")
- (parameters
- '("gint" "error_no")
- '("const-gchar*" "error_msg")
- )
-)
-
-(define-method emit_src_pad_added
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_emit_src_pad_added")
- (return-type "none")
- (parameters
- '("GstPad*" "pad")
- '("FsCodec*" "codec")
- )
-)
-
-(define-method iterate_src_pads
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_iterate_src_pads")
- (return-type "GstIterator*")
-)
-
-(define-method set_transmitter
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_set_transmitter")
- (return-type "gboolean")
- (parameters
- '("const-gchar*" "transmitter")
- '("GParameter*" "stream_transmitter_parameters")
- '("guint" "stream_transmitter_n_parameters")
- '("GError**" "error")
- )
-)
-
-(define-method destroy
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_destroy")
- (return-type "none")
-)
-
-(define-method parse_new_local_candidate
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_parse_new_local_candidate")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("FsCandidate**" "candidate")
- )
-)
-
-(define-method parse_local_candidates_prepared
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_parse_local_candidates_prepared")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- )
-)
-
-(define-method parse_new_active_candidate_pair
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_parse_new_active_candidate_pair")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("FsCandidate**" "local_candidate")
- '("FsCandidate**" "remote_candidate")
- )
-)
-
-(define-method parse_recv_codecs_changed
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_parse_recv_codecs_changed")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("GList**" "codecs")
- )
-)
-
-(define-method parse_component_state_changed
- (of-object "FsStream")
- (unblock-threads t)
- (c-name "fs_stream_parse_component_state_changed")
- (return-type "gboolean")
- (parameters
- '("GstMessage*" "message")
- '("guint*" "component")
- '("FsStreamState*" "state")
- )
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-;; Enumerations and flags ...
-
-
-;; From fs-rtp.h
-
-(define-function fs_rtp_header_extension_get_type
- (c-name "fs_rtp_header_extension_get_type")
- (return-type "GType")
-)
-
-(define-function fs_rtp_header_extension_list_get_type
- (c-name "fs_rtp_header_extension_list_get_type")
- (return-type "GType")
-)
-
-(define-function fs_rtp_header_extension_new
- (c-name "fs_rtp_header_extension_new")
- (is-constructor-of "FsRtpHeaderExtension")
- (return-type "FsRtpHeaderExtension*")
- (parameters
- '("guint" "id")
- '("FsStreamDirection" "direction")
- '("const-gchar*" "uri")
- )
-)
-
-(define-method copy
- (of-object "FsRtpHeaderExtension")
- (c-name "fs_rtp_header_extension_copy")
- (return-type "FsRtpHeaderExtension*")
-)
-
-(define-method destroy
- (of-object "FsRtpHeaderExtension")
- (c-name "fs_rtp_header_extension_destroy")
- (return-type "none")
-)
-
-(define-method are_equal
- (of-object "FsRtpHeaderExtension")
- (c-name "fs_rtp_header_extension_are_equal")
- (return-type "gboolean")
- (parameters
- '("FsRtpHeaderExtension*" "extension2")
- )
-)
-
-(define-function fs_rtp_header_extension_list_copy
- (c-name "fs_rtp_header_extension_list_copy")
- (return-type "GList*")
- (parameters
- '("GList*" "extensions")
- )
-)
-
-(define-function fs_rtp_header_extension_list_destroy
- (c-name "fs_rtp_header_extension_list_destroy")
- (return-type "none")
- (parameters
- '("GList*" "extensions")
- )
-)
-
-(define-function fs_rtp_header_extension_list_from_keyfile
- (c-name "fs_rtp_header_extension_list_from_keyfile")
- (return-type "GList*")
- (parameters
- '("const-gchar*" "filename")
- '("FsMediaType" "media_type")
- '("GError**" "error")
- )
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-(define-object ElementAddedNotifier
- (in-module "Fs")
- (parent "GObject")
- (c-name "FsElementAddedNotifier")
- (gtype-id "FS_TYPE_ELEMENT_ADDED_NOTIFIER")
-)
-
-;; Enumerations and flags ...
-
-
-;; From fs-element-added-notifier.h
-
-(define-function fs_element_added_notifier_get_type
- (c-name "fs_element_added_notifier_get_type")
- (return-type "GType")
-)
-
-(define-function fs_element_added_notifier_new
- (c-name "fs_element_added_notifier_new")
- (is-constructor-of "FsElementAddedNotifier")
- (return-type "FsElementAddedNotifier*")
-)
-
-(define-method add
- (of-object "FsElementAddedNotifier")
- (c-name "fs_element_added_notifier_add")
- (return-type "none")
- (parameters
- '("GstBin*" "bin")
- )
-)
-
-(define-method remove
- (of-object "FsElementAddedNotifier")
- (c-name "fs_element_added_notifier_remove")
- (return-type "gboolean")
- (parameters
- '("GstBin*" "bin")
- )
-)
-
-(define-method set_properties_from_keyfile
- (of-object "FsElementAddedNotifier")
- (c-name "fs_element_added_notifier_set_properties_from_keyfile")
- (return-type "none")
- (parameters
- '("GKeyFile*" "keyfile")
- )
-)
-
-(define-method set_properties_from_file
- (of-object "FsElementAddedNotifier")
- (c-name "fs_element_added_notifier_set_properties_from_file")
- (return-type "gboolean")
- (parameters
- '("const-gchar*" "filename")
- '("GError**" "error")
- )
-)
-
-(define-method set_default_properties
- (of-object "FsElementAddedNotifier")
- (c-name "fs_element_added_notifier_set_default_properties")
- (return-type "none")
- (parameters
- '("GstElement*" "element")
- )
-)
-
-
-;; -*- scheme -*-
-; object definitions ...
-;; Enumerations and flags ...
-
-
-;; From fs-enumtypes.h
-
-(define-function fs_candidate_type_get_type
- (c-name "fs_candidate_type_get_type")
- (return-type "GType")
-)
-
-(define-function fs_network_protocol_get_type
- (c-name "fs_network_protocol_get_type")
- (return-type "GType")
-)
-
-(define-function fs_component_type_get_type
- (c-name "fs_component_type_get_type")
- (return-type "GType")
-)
-
-(define-function fs_media_type_get_type
- (c-name "fs_media_type_get_type")
- (return-type "GType")
-)
-
-(define-function fs_dtmf_event_get_type
- (c-name "fs_dtmf_event_get_type")
- (return-type "GType")
-)
-
-(define-function fs_dtmf_method_get_type
- (c-name "fs_dtmf_method_get_type")
- (return-type "GType")
-)
-
-(define-function fs_stream_direction_get_type
- (c-name "fs_stream_direction_get_type")
- (return-type "GType")
-)
-
-(define-function fs_stream_state_get_type
- (c-name "fs_stream_state_get_type")
- (return-type "GType")
-)
-
-(define-function fs_error_get_type
- (c-name "fs_error_get_type")
- (return-type "GType")
-)
-
-
diff --git a/python/pyfarstream.override b/python/pyfarstream.override
deleted file mode 100644
index e60911d1..00000000
--- a/python/pyfarstream.override
+++ /dev/null
@@ -1,975 +0,0 @@
-%%
-headers
-#include <Python.h>
-#include <pygobject.h>
-
-#include <gst/gst.h>
-
-#include <farstream/fs-conference.h>
-
-#include <farstream/fs-element-added-notifier.h>
-
-/* This is new in python 2.5 */
-#if PYTHON_API_VERSION < 1013
-typedef int Py_ssize_t;
-#endif
-
-static PyObject *
-_fs_boxed_list_from_value (const GValue *value, GType listtype, GType type)
-{
- PyObject *list = PyList_New (0);
- GList *item;
-
- if (G_VALUE_TYPE(value) != listtype)
- {
- PyErr_Format(PyExc_TypeError, "Must be a List of %s", g_type_name (type));
- return NULL;
- }
-
- for (item = g_list_first (g_value_get_boxed (value));
- item;
- item = g_list_next (item))
- PyList_Append (list, pyg_boxed_new (type, item->data, TRUE, TRUE));
-
- return list;
-}
-
-typedef void* (*StructCopyFunc) (void*);
-
-static int
-_fs_boxed_list_to_value (GValue *value, PyObject *obj, GType type,
- StructCopyFunc copy_func)
-{
- Py_ssize_t i;
- GList *boxed = NULL;
-
- if (!PySequence_Check (obj)) {
- PyErr_Format(PyExc_TypeError, "Must be a Sequence of %s", g_type_name (type));
- return -1;
- }
-
- for (i = 0; i < PySequence_Size (obj); i++)
- {
- PyObject *item = PySequence_GetItem (obj, i);
-
- if (!pyg_boxed_check (item, type))
- {
- PyErr_Format(PyExc_TypeError,
- "The parameter must be a Sequence of %s", g_type_name (type));
- return -1;
- }
- }
-
- for (i = 0; i < PySequence_Size (obj); i++)
- {
- PyObject *item = PySequence_GetItem (obj, i);
-
- boxed = g_list_append (boxed,
- copy_func (
- pyg_boxed_get (item, void*)));
- }
-
- g_value_take_boxed (value, boxed);
-
- return 0;
-}
-
-static PyObject *
-_fs_codec_list_from_value (const GValue *value)
-{
- return _fs_boxed_list_from_value (value,
- FS_TYPE_CODEC_LIST,
- FS_TYPE_CODEC);
-}
-
-static int
-_fs_codec_list_to_value (GValue *value, PyObject *obj)
-{
- return _fs_boxed_list_to_value (value, obj,
- FS_TYPE_CODEC,
- (StructCopyFunc) fs_codec_copy);
-}
-
-static PyObject *
-_fs_candidate_list_from_value (const GValue *value)
-{
- return _fs_boxed_list_from_value (value,
- FS_TYPE_CANDIDATE_LIST,
- FS_TYPE_CANDIDATE);
-}
-
-static int
-_fs_candidate_list_to_value (GValue *value, PyObject *obj)
-{
- return _fs_boxed_list_to_value (value, obj,
- FS_TYPE_CANDIDATE,
- (StructCopyFunc) fs_candidate_copy);
-}
-
-static gboolean
-_fs_codec_list_from_pysequence (PyObject *obj, GList **list)
-{
- GList *codecs = NULL;
- Py_ssize_t i;
-
- if (!PySequence_Check (obj))
- {
- PyErr_SetString (PyExc_TypeError,
- "The parameter must be a Sequence of FsCodec");
- return FALSE;
- }
-
- for (i = 0; i < PySequence_Size (obj); i++)
- {
- PyObject *item = PySequence_GetItem (obj, i);
-
- if (!pyg_boxed_check (item, FS_TYPE_CODEC))
- {
- PyErr_SetString(PyExc_TypeError,
- "The parameter must be a Sequence of FsCodec");
- return FALSE;
- }
- }
-
- for (i = 0; i < PySequence_Size (obj); i++)
- {
- PyObject *item = PySequence_GetItem (obj, i);
-
- codecs = g_list_append (codecs, pyg_boxed_get (item, FsCodec));
- }
-
- *list = codecs;
- return TRUE;
-}
-
-%%
-modulename farstream
-%%
-ignore-glob
- *_get_type
- fs_*_list_copy
- fs_*_destroy
- fs_*_from_keyfile
- fs_codec_*_optional_parameter
- fs_codec_*_feedback_parameter
-%%
-ignore
- fs_error_quark
- fs_candidate_get_by_id
- fs_codec_list_are_equal
-%%
-import gobject.GObject as PyGObject_Type
-import gst.Object as PyGstObject_Type
-import gst.Element as PyGstElement_Type
-import gst.Pad as PyGstPad_Type
-import gst.Bin as PyGstBin_Type
-import gst.Iterator as PyGstIterator_Type
-%%
-init
-pyg_register_gtype_custom (FS_TYPE_CODEC_LIST,
- _fs_codec_list_from_value,
- _fs_codec_list_to_value);
-pyg_register_gtype_custom (FS_TYPE_CANDIDATE_LIST,
- _fs_candidate_list_from_value,
- _fs_candidate_list_to_value);
-%%
-dynamicnamespace
-%%
-override-slot FsCodec.tp_setattr
-static int
-_wrap_fs_codec_tp_setattr(PyObject *self, char *attr, PyObject *value)
-{
- FsCodec *codec;
-
- codec = pyg_boxed_get(self, FsCodec);
-
- if (!strcmp (attr, "id"))
- {
- if (!PyInt_Check(value))
- {
- PyErr_Format(PyExc_TypeError, "%s must be an int", attr);
- return -1;
- }
- codec->id = (gint)PyInt_AsLong(value);
- }
- else if (!strcmp (attr, "encoding_name"))
- {
- if (value == NULL || PyString_Check(value))
- {
- g_free (codec->encoding_name);
- codec->encoding_name = g_strdup (PyString_AsString (value));
- }
- else
- {
- PyErr_Format(PyExc_TypeError, "%s must be a string", attr);
- return -1;
- }
- }
- else if (!strcmp (attr, "media_type"))
- {
- gint media_type;
- if (pyg_enum_get_value(FS_TYPE_MEDIA_TYPE, value, &media_type))
- return -1;
- codec->media_type = media_type;
- }
- else if (!strcmp (attr, "clock_rate"))
- {
- if (!PyInt_Check(value) || PyInt_AsLong(value) < 0)
- {
- PyErr_Format(PyExc_TypeError, "%s must be an non-negative int", attr);
- return -1;
- }
- codec->clock_rate = (guint)PyInt_AsLong(value);
- }
- else if (!strcmp (attr, "channels"))
- {
- if (!PyInt_Check(value) || PyInt_AsLong(value) < 0)
- {
- PyErr_Format(PyExc_TypeError, "%s must be an non-negative int", attr);
- return -1;
- }
- codec->channels = (guint)PyInt_AsLong(value);
- }
- else if (!strcmp (attr, "optional_params"))
- {
- GList *p;
- int i = 0;
-
- if (value == NULL)
- goto none;
-
- if (!PySequence_Check (value))
- {
- PyErr_Format(PyExc_TypeError, "%s must be a sequence of (name, value)",
- attr);
- return -1;
- }
-
- for (i = 0; i < PySequence_Size (value); i++)
- {
- PyObject *item = PySequence_GetItem (value, i);
-
- if (!PyTuple_Check (item) ||
- PyTuple_Size (item) != 2 ||
- !PyString_Check (PyTuple_GetItem (item, 0)) ||
- !PyString_Check (PyTuple_GetItem (item, 1)))
- {
- PyErr_Format(PyExc_TypeError,
- "%s must be a list of (string name, string value)",
- attr);
- return -1;
- }
- }
-
- none:
-
- for (p = g_list_first (codec->optional_params); p; p = g_list_next (p))
- {
- FsCodecParameter *param = p->data;
- g_free (param->name);
- g_free (param->value);
- g_slice_free (FsCodecParameter, p->data);
- }
- g_list_free (codec->optional_params);
-
- if (value == NULL)
- return 0;
-
- for (i = 0; i < PySequence_Size (value); i++)
- {
- PyObject *item = PySequence_GetItem (value, i);
- fs_codec_add_optional_parameter(codec,
- PyString_AsString (PyTuple_GetItem (item, 0)),
- PyString_AsString (PyTuple_GetItem (item, 1)));
- }
- }
- else if (!strcmp (attr, "feedback_params"))
- {
- int i = 0;
-
- if (value == NULL)
- goto none2;
-
- if (!PySequence_Check (value))
- {
- PyErr_Format(PyExc_TypeError, "%s must be a sequence of (type), (type, subtype) or (type, subtype, value)",
- attr);
- return -1;
- }
-
- for (i = 0; i < PySequence_Size (value); i++)
- {
- PyObject *item = PySequence_GetItem (value, i);
-
- if (!PyTuple_Check (item) ||
- PyTuple_Size (item) < 1 ||
- PyTuple_Size (item) > 3 ||
- !PyString_Check (PyTuple_GetItem (item, 0)) ||
- (PyTuple_Size (item) > 1 &&
- !PyString_Check (PyTuple_GetItem (item, 1))) ||
- (PyTuple_Size (item) > 2 &&
- !PyString_Check (PyTuple_GetItem (item, 2))))
- {
- PyErr_Format(PyExc_TypeError,
- "%s must be a list of (string type, optional string subtype,"
- " optional string value)",
- attr);
- return -1;
- }
- }
-
- none2:
- while (codec->feedback_params)
- fs_codec_remove_feedback_parameter (codec,
- codec->feedback_params);
-
- if (value == NULL)
- return 0;
-
- for (i = 0; i < PySequence_Size (value); i++)
- {
- PyObject *item = PySequence_GetItem (value, i);
- fs_codec_add_feedback_parameter(codec,
- PyString_AsString (PyTuple_GetItem (item, 0)),
- PyTuple_Size (item) > 1 ?
- PyString_AsString (PyTuple_GetItem (item, 1)) : "",
- PyTuple_Size (item) > 2 ?
- PyString_AsString (PyTuple_GetItem (item, 2)) : "");
- }
- }
- else
- {
- PyErr_Format(PyExc_AttributeError,
- "Attribute %s does not exist for FsCodec", attr);
- return -1;
- }
-
- return 0;
-}
-%%
-override-slot FsCodec.tp_getattr
-static PyObject *
-_wrap_fs_codec_tp_getattr(PyObject *self, char *attr)
-{
- FsCodec *codec;
-
- codec = pyg_boxed_get(self, FsCodec);
-
- if (!strcmp (attr, "id"))
- {
- return PyInt_FromLong(codec->id);
- }
- else if (!strcmp (attr, "encoding_name"))
- {
- return PyString_FromString (codec->encoding_name ? codec->encoding_name : "");
- }
- else if (!strcmp (attr, "media_type"))
- {
- return pyg_enum_from_gtype(FS_TYPE_MEDIA_TYPE, codec->media_type);
- }
- else if (!strcmp (attr, "clock_rate"))
- {
- return PyInt_FromLong(codec->clock_rate);
- }
- else if (!strcmp (attr, "channels"))
- {
- return PyInt_FromLong(codec->channels);
- }
- else if (!strcmp (attr, "optional_params"))
- {
- PyObject *list = PyList_New (0);
- GList *p;
-
- for (p = g_list_first (codec->optional_params); p; p = g_list_next (p))
- {
- PyObject *tuple = PyTuple_New (2);
- FsCodecParameter *param = p->data;
-
- if (PyTuple_SetItem (tuple, 0,
- PyString_FromString (param->name ? param->name : "")) < 0 ||
- PyTuple_SetItem (tuple, 1,
- PyString_FromString (param->value ? param->value : "")) < 0 ||
- PyList_Append (list, tuple) < 0)
- {
- Py_DECREF (list);
- Py_DECREF (tuple);
- Py_INCREF(Py_None);
- return Py_None;
- }
- }
-
- return list;
- }
- else if (!strcmp (attr, "feedback_params"))
- {
- PyObject *list = PyList_New (0);
- GList *p;
-
- for (p = g_list_first (codec->feedback_params); p;
- p = g_list_next (p))
- {
- PyObject *tuple = PyTuple_New (3);
- FsFeedbackParameter *fb = p->data;
-
- if (PyTuple_SetItem (tuple, 0,
- PyString_FromString (fb->type ? fb->type : "")) < 0 ||
- PyTuple_SetItem (tuple, 1,
- PyString_FromString (fb->subtype ? fb->subtype : "")) < 0 ||
- PyTuple_SetItem (tuple, 2,
- PyString_FromString (fb->extra_params ? fb->extra_params : "")) < 0 ||
- PyList_Append (list, tuple) < 0)
- {
- Py_DECREF (list);
- Py_DECREF (tuple);
- Py_INCREF(Py_None);
- return Py_None;
- }
- }
-
- return list;
- }
- else
- {
- return Py_FindMethod((PyMethodDef*)_PyFsCodec_methods, self, attr);
- }
-}
-%%
-override-slot FsCodec.tp_compare
-static int
-_wrap_fs_codec_tp_compare(PyObject *self, PyGObject *v)
-{
- FsCodec *codec1;
- FsCodec *codec2;
- int cmp;
-
- if (!pyg_boxed_check (v, FS_TYPE_CODEC))
- return 1;
-
- codec1 = pyg_boxed_get(self, FsCodec);
- codec2 = pyg_boxed_get(v, FsCodec);
-
- /* If they're equal, return them as such */
- if (fs_codec_are_equal (codec1, codec2))
- return 0;
-
- /* If their ids are different, return different ids */
- if (codec1->id > codec2->id)
- return -1;
- else if (codec1->id < codec2->id)
- return 1;
-
- /* if one does not have an encoding name.. it goes first */
- if (!codec1->encoding_name)
- return -1;
- if (!codec2->encoding_name)
- return 1;
-
- /* If they name are different, order them that way */
- cmp = strcmp (codec1->encoding_name, codec2->encoding_name);
- if (cmp)
- return cmp;
-
- /* otherwise lets try clock rates */
- if (codec1->clock_rate != codec2->clock_rate)
- return codec2->clock_rate - codec2->clock_rate;
-
- /* maybe channels ? */
- if (codec1->channels != codec2->channels)
- return codec2->channels - codec2->channels;
-
- /* If everything else is identical, lets use use the points to the optional
- * params
- */
- if (codec1->optional_params > codec2->optional_params)
- return -1;
- else
- return 1;
-}
-
-%%
-override fs_candidate_new noargs
-static int
-_wrap_fs_candidate_new(PyGBoxed *self)
-{
- self->gtype = FS_TYPE_CANDIDATE;
- self->free_on_dealloc = FALSE;
- self->boxed = g_slice_new0 (FsCandidate);
-
- if (!self->boxed) {
- PyErr_SetString(PyExc_RuntimeError, "could not create FsCodec object");
- return -1;
- }
- self->free_on_dealloc = TRUE;
-
- return 0;
-}
-%%
-new-constructor FS_TYPE_CANDIDATE
-%%
-override-slot FsCandidate.tp_setattr
-static int
-_wrap_fs_candidate_tp_setattr(PyObject *self, char *attr, PyObject *value)
-{
- FsCandidate *candidate;
-
- candidate = pyg_boxed_get(self, FsCandidate);
-
-#define CHECK_SET_INT(var, min, max) \
- do { \
- if (!PyInt_Check(value) || \
- PyInt_AsLong(value) < (min) || \
- PyInt_AsLong(value) > (max)) \
- { \
- PyErr_Format(PyExc_TypeError, "%s must be an int between %d and %d", \
- attr, min, max); \
- return -1; \
- } \
- candidate->var = PyInt_AsLong(value); \
- } while (0)
-#define CHECK_SET_STR(var) \
- do { \
- if (value && !PyString_Check (value)) \
- { \
- PyErr_Format(PyExc_TypeError, "%s must be a string", attr); \
- return -1; \
- } \
- g_free ((gpointer*)candidate->var); \
- if (value) \
- candidate->var = g_strdup (PyString_AsString (value)); \
- else \
- candidate->var = NULL; \
- } while(0)
-
-
-
- if (!strcmp (attr, "foundation"))
- CHECK_SET_STR (foundation);
- else if (!strcmp (attr, "component_id"))
- CHECK_SET_INT (component_id, 1, 256);
- else if (!strcmp (attr, "ip"))
- CHECK_SET_STR (ip);
- else if (!strcmp (attr, "port"))
- CHECK_SET_INT (port, 0, G_MAXUINT16);
- else if (!strcmp (attr, "base_ip"))
- CHECK_SET_STR (base_ip);
- else if (!strcmp (attr, "base_port"))
- CHECK_SET_INT (base_port, 0, G_MAXUINT16);
- else if (!strcmp (attr, "priority"))
- CHECK_SET_INT (priority, G_MININT, G_MAXINT);
- else if (!strcmp (attr, "ttl"))
- CHECK_SET_INT (ttl, 0, 255);
- else if (!strcmp (attr, "username"))
- CHECK_SET_STR (username);
- else if (!strcmp (attr, "password"))
- CHECK_SET_STR (password);
- else if (!strcmp (attr, "proto"))
- {
- gint proto;
- if (pyg_enum_get_value(FS_TYPE_NETWORK_PROTOCOL, value, &proto))
- return -1;
- candidate->proto = proto;
- }
- else if (!strcmp (attr, "type"))
- {
- gint type;
- if (pyg_enum_get_value(FS_TYPE_CANDIDATE_TYPE, value, &type))
- return -1;
- candidate->type = type;
- }
- else
- {
- PyErr_Format(PyExc_AttributeError,
- "Attribute %s does not exist for FsCandidate", attr);
- return -1;
- }
-
- return 0;
-#undef CHECK_SET_INT
-#undef CHECK_SET_STR
-}
-%%
-override-slot FsCandidate.tp_getattr
-static PyObject *
-_wrap_fs_candidate_tp_getattr(PyObject *self, char *attr)
-{
- FsCandidate *candidate;
-
- candidate = pyg_boxed_get(self, FsCandidate);
-
-#define CHECK_NULL(x) ((x) == NULL ? "" : (x))
-
- if (!strcmp (attr, "foundation"))
- return PyString_FromString (CHECK_NULL(candidate->foundation));
- else if (!strcmp (attr, "component_id"))
- return PyInt_FromLong(candidate->component_id);
- else if (!strcmp (attr, "ip"))
- return PyString_FromString (CHECK_NULL(candidate->ip));
- else if (!strcmp (attr, "port"))
- return PyInt_FromLong(candidate->port);
- else if (!strcmp (attr, "base_ip"))
- return PyString_FromString (CHECK_NULL(candidate->base_ip));
- else if (!strcmp (attr, "base_port"))
- return PyInt_FromLong(candidate->base_port);
- else if (!strcmp (attr, "priority"))
- return PyInt_FromLong(candidate->priority);
- else if (!strcmp (attr, "ttl"))
- return PyInt_FromLong(candidate->ttl);
- else if (!strcmp (attr, "username"))
- return PyString_FromString (CHECK_NULL(candidate->username));
- else if (!strcmp (attr, "password"))
- return PyString_FromString (CHECK_NULL(candidate->password));
- else if (!strcmp (attr, "proto"))
- return pyg_enum_from_gtype(FS_TYPE_NETWORK_PROTOCOL, candidate->proto);
- else if (!strcmp (attr, "type"))
- return pyg_enum_from_gtype(FS_TYPE_CANDIDATE_TYPE, candidate->type);
- else
- return Py_FindMethod((PyMethodDef*)_PyFsCandidate_methods, self, attr);
-
-#undef CHECK_NULL
-}
-%%
-override fs_stream_add_remote_candidates onearg
-static PyObject *
-_wrap_fs_stream_add_remote_candidates (PyGObject *self, PyObject *arg)
-{
- gboolean ret = FALSE;
- GError *error = NULL;
- GList *candidates = NULL;
- Py_ssize_t i;
-
- if (!PySequence_Check (arg))
- {
- PyErr_SetString (PyExc_TypeError,
- "The parameter must be a Sequence of FsCandidate");
- return NULL;
- }
-
- if (PySequence_Size (arg) == 0)
- {
- PyErr_SetString (PyExc_TypeError,
- "Empty list invalid");
- return NULL;
- }
-
- for (i = 0; i < PySequence_Size (arg); i++)
- {
- PyObject *item = PySequence_GetItem (arg, i);
-
- if (!pyg_boxed_check (item, FS_TYPE_CANDIDATE))
- {
- PyErr_SetString(PyExc_TypeError,
- "The parameter must be a Sequence of FsCandidate");
- return NULL;
- }
- }
-
- for (i = 0; i < PySequence_Size (arg); i++)
- {
- PyObject *item = PySequence_GetItem (arg, i);
-
- candidates = g_list_append (candidates, pyg_boxed_get (item, FsCandidate));
- }
-
-
- Py_BEGIN_ALLOW_THREADS
- ret = fs_stream_add_remote_candidates (FS_STREAM(self->obj), candidates,
- &error);
- Py_END_ALLOW_THREADS
-
- g_list_free (candidates);
-
- if (pyg_error_check(&error))
- return NULL;
-
- return PyBool_FromLong (ret);
-}
-%%
-override fs_stream_set_remote_codecs onearg
-static PyObject *
-_wrap_fs_stream_set_remote_codecs (PyGObject *self, PyObject *arg)
-{
- gboolean ret = FALSE;
- GError *error = NULL;
- GList *codecs = NULL;
-
- if (!PySequence_Check (arg))
- {
- PyErr_SetString (PyExc_TypeError,
- "The parameter must be a Sequence of FsCodec");
- return NULL;
- }
-
- if (PySequence_Size (arg) == 0)
- {
- PyErr_SetString (PyExc_TypeError,
- "Empty list invalid");
- return NULL;
- }
-
- if (!_fs_codec_list_from_pysequence (arg, &codecs))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- ret = fs_stream_set_remote_codecs (FS_STREAM(self->obj), codecs, &error);
- Py_END_ALLOW_THREADS
-
- g_list_free (codecs);
-
- if (pyg_error_check(&error))
- return NULL;
-
- return PyBool_FromLong (ret);
-}
-%%
-override fs_session_set_codec_preferences onearg
-static PyObject *
-_wrap_fs_session_set_codec_preferences (PyGObject *self, PyObject *arg)
-{
- gboolean ret = FALSE;
- GError *error = NULL;
- GList *codecs = NULL;
-
- if (!_fs_codec_list_from_pysequence (arg, &codecs))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- ret = fs_session_set_codec_preferences (FS_SESSION(self->obj), codecs,
- &error);
- Py_END_ALLOW_THREADS
-
- g_list_free (codecs);
-
- if (pyg_error_check(&error))
- return NULL;
-
- return PyBool_FromLong (ret);
-}
-%%
-override fs_codec_list_are_equal kwargs
-static PyObject *
-_wrap_fs_codec_list_are_equal(PyGObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = {"list1", "list2", NULL};
- PyObject *pylist1 = NULL, *pylist2 = NULL;
- GList *list1 = NULL, *list2 = NULL;
- gboolean ret;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO",
- kwlist,
- &pylist1,
- &pylist2))
- return NULL;
-
- if (pylist1 == pylist2)
- return PyBool_FromLong (TRUE);
-
- if (!_fs_codec_list_from_pysequence (pylist1, &list1))
- return NULL;
-
- if (!_fs_codec_list_from_pysequence (pylist2, &list2))
- {
- g_list_free (list1);
- return NULL;
- }
-
- ret = fs_codec_list_are_equal (list1, list2);
-
- g_list_free (list1);
- g_list_free (list2);
-
- return PyBool_FromLong (ret);
-}
-%%
-override fs_session_list_transmitters noargs
-static PyObject *
-_wrap_fs_session_list_transmitters (PyGObject *self)
-{
- gchar **strv = NULL;
- gint i;
- PyObject *tuple;
-
- Py_BEGIN_ALLOW_THREADS
- strv = fs_session_list_transmitters (FS_SESSION(self->obj));
- Py_END_ALLOW_THREADS
-
- if (!strv)
- {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- tuple = PyTuple_New (g_strv_length (strv));
-
- for (i=0; strv[i]; i++)
- PyTuple_SET_ITEM (tuple, i, PyString_FromString(strv[i]));
-
- g_strfreev (strv);
-
- return tuple;
-}
-%%
-override fs_stream_force_remote_candidates onearg
-static PyObject *
-_wrap_fs_stream_force_remote_candidates (PyGObject *self, PyObject *arg)
-{
- gboolean ret = FALSE;
- GError *error = NULL;
- GList *candidates = NULL;
- Py_ssize_t i;
-
- if (!PySequence_Check (arg))
- {
- PyErr_SetString (PyExc_TypeError,
- "The parameter must be a Sequence of FsCandidate");
- return NULL;
- }
-
- if (PySequence_Size (arg) == 0)
- {
- PyErr_SetString (PyExc_TypeError,
- "Empty list invalid");
- return NULL;
- }
-
- for (i = 0; i < PySequence_Size (arg); i++)
- {
- PyObject *item = PySequence_GetItem (arg, i);
-
- if (!pyg_boxed_check (item, FS_TYPE_CANDIDATE))
- {
- PyErr_SetString(PyExc_TypeError,
- "The parameter must be a Sequence of FsCandidate");
- return NULL;
- }
- }
-
- for (i = 0; i < PySequence_Size (arg); i++)
- {
- PyObject *item = PySequence_GetItem (arg, i);
-
- candidates = g_list_append (candidates, pyg_boxed_get (item, FsCandidate));
- }
-
-
- Py_BEGIN_ALLOW_THREADS
- ret = fs_stream_force_remote_candidates (FS_STREAM(self->obj), candidates,
- &error);
- Py_END_ALLOW_THREADS
-
- g_list_free (candidates);
-
- if (pyg_error_check(&error))
- return NULL;
-
- return PyBool_FromLong (ret);
-}
-%%
-override fs_stream_set_transmitter kwargs
-static PyObject *
-_wrap_fs_stream_set_transmitter(PyGObject *self, PyObject *args,
- PyObject *kwargs)
-{
- static char *kwlist[] = {"transmitter", "transmitter_parameters", NULL};
- const gchar *transmitter_name = NULL;
- PyObject *st_params = NULL;
- Py_ssize_t pos = 0, i = 0;
- PyObject *key, *value;
- GObjectClass *st_class = NULL;
- GError *error = NULL;
- FsSession *session = NULL;
- guint n_parameters = 0;
- GParameter *parameters = NULL;
- gboolean ret = FALSE;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,
- "z|O!:FsStream.set_transmitter",
- kwlist,
- &transmitter_name,
- &PyDict_Type, &st_params))
- return NULL;
-
- if (!transmitter_name)
- return NULL;
-
- if (st_params)
- {
- GType st_type = 0;
-
- Py_BEGIN_ALLOW_THREADS
- g_object_get (pygobject_get (self), "session", &session, NULL);
- st_type = fs_session_get_stream_transmitter_type (
- FS_SESSION (session), transmitter_name);
- g_object_unref (session);
- Py_END_ALLOW_THREADS
-
- if (!st_type)
- goto error;
-
- st_class = g_type_class_ref (st_type);
-
- n_parameters = PyDict_Size (st_params);
- parameters = g_new0 (GParameter, n_parameters);
- while (PyDict_Next(st_params, &pos, &key, &value))
- {
- GParamSpec *spec;
-
- if (!PyString_Check (key))
- {
- PyErr_SetString (PyExc_TypeError,
- "Expected Stream Parameter key to be a string");
- goto error;
- }
-
- spec = g_object_class_find_property (st_class, PyString_AsString (key));
-
- if (!spec)
- {
- PyErr_Format (PyExc_TypeError, "Received unknown key %s",
- PyString_AsString (key));
- goto error;
- }
-
- g_value_init (&parameters[i].value, G_PARAM_SPEC_VALUE_TYPE(spec));
-
- parameters[i].name = PyString_AsString (key);
-
- if (pyg_value_from_pyobject (&parameters[i].value , value) < 0)
- {
- PyErr_Format (PyExc_TypeError, "Expected parameter %s to be a %s",
- PyString_AsString (key),
- g_type_name (G_PARAM_SPEC_VALUE_TYPE(spec)));
- goto error;
- }
-
- i++;
- }
- }
-
- Py_BEGIN_ALLOW_THREADS
- ret = fs_stream_set_transmitter (FS_STREAM (pygobject_get (self)),
- transmitter_name, parameters, n_parameters, &error);
- Py_END_ALLOW_THREADS
-
- if (!ret)
- goto error;
-
- if (parameters)
- {
- g_type_class_unref (st_class);
- g_free (parameters);
- }
-
- return PyBool_FromLong (ret);
-
- error:
- if (error)
- pyg_error_check (&error);
-
- if (st_class)
- g_type_class_unref (st_class);
- if (parameters)
- g_free (parameters);
-
- return PyBool_FromLong (ret);
-}
-%%
diff --git a/python/pyfarstreammodule.c b/python/pyfarstreammodule.c
deleted file mode 100644
index 8286f61e..00000000
--- a/python/pyfarstreammodule.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <pygobject.h>
-#include <farstream/fs-codec.h>
-
-void fs_register_classes (PyObject *d);
-void fs_add_constants(PyObject *module, const gchar *strip_prefix);
-
-DL_EXPORT(void) initfarstream(void);
-extern PyMethodDef fs_functions[];
-
-DL_EXPORT(void)
-initfarstream(void)
-{
- PyObject *m, *d;
-
- init_pygobject ();
-
- m = Py_InitModule ("farstream", fs_functions);
- d = PyModule_GetDict (m);
-
- PyModule_AddIntConstant (m, "CODEC_ID_ANY", FS_CODEC_ID_ANY);
- PyModule_AddIntConstant (m, "CODEC_ID_DISABLE", FS_CODEC_ID_DISABLE);
-
- fs_register_classes (d);
- fs_add_constants (m, "FS_");
-
- if (PyErr_Occurred ()) {
- PyErr_Print();
- Py_FatalError ("can't initialise module farstream");
- }
-}
diff --git a/python/rebuild-defs.sh b/python/rebuild-defs.sh
deleted file mode 100755
index 71339a42..00000000
--- a/python/rebuild-defs.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-
-HEADERS=" \
- fs-codec.h \
- fs-candidate.h \
- fs-conference.h \
- fs-session.h \
- fs-participant.h \
- fs-stream.h \
- fs-rtp.h \
- fs-element-added-notifier.h \
- fs-enumtypes.h"
-
-srcdir=../farstream/
-
-output=pyfarstream.defs
-filter=pyfarstream-filter.defs
-
-cat ${filter} > ${output}
-
-
-
-H2DEF="$(pkg-config --variable=codegendir pygobject-2.0)/h2def.py"
-[ -z "${H2DEF}" ] && H2DEF="$(pkg-config --variable=codegendir pygtk-2.0)/h2def.py"
-[ -z "${H2DEF}" -a -f /usr/share/pygtk/2.0/codegen/h2def.py ] && H2DEF=/usr/share/pygtk/2.0/codegen/h2def.py
-
-for h in $HEADERS; do
- python ${H2DEF} --defsfilter=${filter} ${srcdir}/$h >> $output
-done
-
-sed -e "/of-object \"FsSession\"/ a \
- \ (unblock-threads t)" \
- -e "/of-object \"FsStream\"/ a \
- \ (unblock-threads t)" \
- -e "/of-object \"FsConference\"/ a \
- \ (unblock-threads t)" \
- -e "/define-method new_/ a \
- \ (caller-owns-return t)" \
- -i $output
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index 55fbc388..662780df 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -48,16 +48,16 @@ check_PROGRAMS = \
transmitter/rawudp \
transmitter/multicast \
transmitter/nice \
- transmitter/shm \
raw/conference \
+ elements/rtcpfilter \
rtp/codecs \
rtp/sendcodecs \
rtp/conference \
rtp/recvcodecs \
msn/conference \
- utils/binadded \
- elements/rtcpfilter \
- elements/funnel
+ utils/binadded
+noinst_PROGRAMS = transmitter/shm
+
AM_CFLAGS = \
$(CFLAGS) \
@@ -172,6 +172,3 @@ utils_binadded_SOURCES = \
elements_rtcpfilter_CFLAGS = $(AM_CFLAGS)
elements_rtcpfilter_SOURCES = elements/rtcpfilter.c
elements_rtcpfilter_LDADD = $(LDADD) -lgstrtp-@GST_MAJORMINOR@
-
-elements_funnel_CFLAGS = $(AM_CFLAGS)
-elements_funnel_SOURCES = elements/funnel.c
diff --git a/tests/check/elements/funnel.c b/tests/check/elements/funnel.c
deleted file mode 100644
index 61f78e2f..00000000
--- a/tests/check/elements/funnel.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Farstream unit tests for the fsfunnel
- *
- * Copyright (C) 2008 Collabora, Nokia
- * @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>
-
-struct TestData {
- GstElement *funnel;
- GstPad *funnelsrc, *funnelsink11, *funnelsink22;
- GstPad *mysink, *mysrc1, *mysrc2;
- GstCaps *mycaps;
-};
-
-static void
-setup_test_objects (struct TestData *td, GstPadChainFunction chain_func, GstPadBufferAllocFunction alloc_func)
-{
- td->mycaps = gst_caps_new_simple ("test/test", NULL);
-
- td->funnel = gst_element_factory_make ("fsfunnel", NULL);
-
- td->funnelsrc = gst_element_get_static_pad (td->funnel, "src");
- fail_unless (td->funnelsrc != NULL);
-
- td->funnelsink11 = gst_element_get_request_pad (td->funnel, "sink11");
- fail_unless (td->funnelsink11 != NULL);
- fail_unless (!strcmp (GST_OBJECT_NAME (td->funnelsink11), "sink11"));
-
- td->funnelsink22 = gst_element_get_request_pad (td->funnel, "sink22");
- fail_unless (td->funnelsink22 != NULL);
- fail_unless (!strcmp (GST_OBJECT_NAME (td->funnelsink22), "sink22"));
-
- fail_unless (gst_element_set_state (td->funnel, GST_STATE_PLAYING) ==
- GST_STATE_CHANGE_SUCCESS);
-
- td->mysink = gst_pad_new ("sink", GST_PAD_SINK);
- gst_pad_set_chain_function (td->mysink, chain_func);
- gst_pad_set_bufferalloc_function (td->mysink, alloc_func);
- gst_pad_set_active (td->mysink, TRUE);
- gst_pad_set_caps (td->mysink, td->mycaps);
-
- td->mysrc1 = gst_pad_new ("src1", GST_PAD_SRC);
- gst_pad_set_active (td->mysrc1, TRUE);
- gst_pad_set_caps (td->mysrc1, td->mycaps);
-
- td->mysrc2 = gst_pad_new ("src2", GST_PAD_SRC);
- gst_pad_set_active (td->mysrc2, TRUE);
- gst_pad_set_caps (td->mysrc2, td->mycaps);
-
- fail_unless (GST_PAD_LINK_SUCCESSFUL(
- gst_pad_link (td->funnelsrc, td->mysink)));
-
- fail_unless (GST_PAD_LINK_SUCCESSFUL(
- gst_pad_link (td->mysrc1, td->funnelsink11)));
-
- fail_unless (GST_PAD_LINK_SUCCESSFUL(
- gst_pad_link (td->mysrc2, td->funnelsink22)));
-
-}
-
-static void
-release_test_objects (struct TestData *td)
-{
- gst_pad_set_active (td->mysink, FALSE);
- gst_pad_set_active (td->mysrc1, FALSE);
- gst_pad_set_active (td->mysrc1, FALSE);
-
- gst_object_unref (td->mysink);
- gst_object_unref (td->mysrc1);
- gst_object_unref (td->mysrc2);
-
- fail_unless (gst_element_set_state (td->funnel, GST_STATE_NULL) ==
- GST_STATE_CHANGE_SUCCESS);
-
- gst_object_unref (td->funnelsrc);
- gst_object_unref (td->funnelsink11);
- gst_element_release_request_pad (td->funnel, td->funnelsink11);
- gst_object_unref (td->funnelsink22);
- gst_element_release_request_pad (td->funnel, td->funnelsink22);
-
- gst_caps_unref (td->mycaps);
- gst_object_unref (td->funnel);
-}
-
-static gint bufcount = 0;
-static gint alloccount = 0;
-
-static GstFlowReturn
-chain_ok (GstPad *pad, GstBuffer *buffer)
-{
- bufcount++;
-
- gst_buffer_unref (buffer);
-
- return GST_FLOW_OK;
-}
-
-static GstFlowReturn
-alloc_ok (GstPad *pad,
- guint64 offset,
- guint size,
- GstCaps *caps,
- GstBuffer **buffer)
-{
- alloccount++;
-
- fail_unless (buffer != NULL);
- fail_unless (*buffer == NULL);
-
- *buffer = gst_buffer_new_and_alloc(size);
- gst_buffer_set_caps (*buffer, caps);
- GST_BUFFER_OFFSET (*buffer) = offset;
-
- return GST_FLOW_OK;
-}
-
-GST_START_TEST (test_funnel_simple)
-{
- struct TestData td;
- GstBuffer *buf1 = NULL;
- GstBuffer *buf2 = NULL;
-
- setup_test_objects (&td, chain_ok, alloc_ok);
-
- bufcount = 0;
- alloccount = 0;
-
- fail_unless (gst_pad_push (td.mysrc1, gst_buffer_new ()) == GST_FLOW_OK);
- fail_unless (gst_pad_push (td.mysrc2, gst_buffer_new ()) == GST_FLOW_OK);
-
- fail_unless (bufcount == 2);
-
- fail_unless (gst_pad_alloc_buffer (td.mysrc1, 0, 1024, td.mycaps, &buf1) == GST_FLOW_OK);
- fail_unless (gst_pad_alloc_buffer (td.mysrc2, 1024, 1024, td.mycaps, &buf2) == GST_FLOW_OK);
-
- fail_unless (alloccount == 2);
-
- gst_buffer_unref (buf1);
- gst_buffer_unref (buf2);
-
- release_test_objects (&td);
-}
-GST_END_TEST;
-
-static Suite *
-funnel_suite (void)
-{
- Suite *s = suite_create ("funnel");
- 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 ("funnel simple");
- tcase_add_test (tc_chain, test_funnel_simple);
- suite_add_tcase (s, tc_chain);
-
- return s;
-}
-
-GST_CHECK_MAIN (funnel);
-
diff --git a/tests/check/elements/rtcpfilter.c b/tests/check/elements/rtcpfilter.c
index 73551edc..f503247f 100644
--- a/tests/check/elements/rtcpfilter.c
+++ b/tests/check/elements/rtcpfilter.c
@@ -28,23 +28,25 @@
#include <gst/rtp/gstrtcpbuffer.h>
static GstBuffer *
-make_buffer (GstCaps *caps, gboolean have_sr, gint rr_count,
+make_buffer (gboolean have_sr, gint rr_count,
gboolean have_sdes, gboolean have_bye)
{
GstRTCPPacket packet;
GstBuffer *buf = gst_rtcp_buffer_new (1024);
gint i;
+ GstRTCPBuffer rtcpbuffer = GST_RTCP_BUFFER_INIT;
+
+ gst_rtcp_buffer_map (buf, GST_MAP_READWRITE, &rtcpbuffer);
- gst_buffer_set_caps (buf, caps);
if (have_sr)
{
- gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_SR, &packet);
+ gst_rtcp_buffer_add_packet (&rtcpbuffer, GST_RTCP_TYPE_SR, &packet);
gst_rtcp_packet_sr_set_sender_info (&packet, 132132, 12, 12, 12, 12);
}
if (rr_count >= 0 || !have_sr)
{
- gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_RR, &packet);
+ gst_rtcp_buffer_add_packet (&rtcpbuffer, GST_RTCP_TYPE_RR, &packet);
gst_rtcp_packet_rr_set_ssrc (&packet, 132132);
for (i = 0; i < rr_count; i++)
gst_rtcp_packet_add_rb (&packet, 123124+i, 12, 12, 21, 31, 41, 12);
@@ -52,7 +54,7 @@ make_buffer (GstCaps *caps, gboolean have_sr, gint rr_count,
if (have_sdes)
{
- gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_SDES, &packet);
+ gst_rtcp_buffer_add_packet (&rtcpbuffer, GST_RTCP_TYPE_SDES, &packet);
gst_rtcp_packet_sdes_add_item (&packet, 123121);
gst_rtcp_packet_sdes_add_entry (&packet, GST_RTCP_SDES_EMAIL,
10, (guint8 *) "aa@aaa.com");
@@ -64,11 +66,11 @@ make_buffer (GstCaps *caps, gboolean have_sr, gint rr_count,
if (have_bye)
{
- gst_rtcp_buffer_add_packet (buf, GST_RTCP_TYPE_BYE, &packet);
+ gst_rtcp_buffer_add_packet (&rtcpbuffer, GST_RTCP_TYPE_BYE, &packet);
gst_rtcp_packet_bye_add_ssrc (&packet, 132123);
gst_rtcp_packet_bye_set_reason (&packet, "allo");
}
- gst_rtcp_buffer_end (buf);
+ gst_rtcp_buffer_unmap (&rtcpbuffer);
return buf;
}
@@ -78,20 +80,20 @@ GST_START_TEST (test_rtcpfilter)
GList *in_buffers = NULL;
GList *out_buffers = NULL;
GstBuffer *buf = NULL;
- GstCaps *caps = gst_caps_new_simple ("application/x-rtcp", NULL);
+ GstCaps *caps = gst_caps_new_empty_simple ("application/x-rtcp");
gint i;
for (i = 0; i < 3; i++)
{
- buf = make_buffer (caps, FALSE, i, FALSE, FALSE);
+ buf = make_buffer (FALSE, i, FALSE, FALSE);
in_buffers = g_list_append (in_buffers, gst_buffer_ref (buf));
out_buffers = g_list_append (out_buffers, buf);
- buf = make_buffer (caps, FALSE, i, TRUE, FALSE);
+ buf = make_buffer (FALSE, i, TRUE, FALSE);
in_buffers = g_list_append (in_buffers, gst_buffer_ref (buf));
out_buffers = g_list_append (out_buffers, buf);
- buf = make_buffer (caps, FALSE, i, TRUE, TRUE);
+ buf = make_buffer (FALSE, i, TRUE, TRUE);
in_buffers = g_list_append (in_buffers, gst_buffer_ref (buf));
out_buffers = g_list_append (out_buffers, buf);
}
@@ -100,20 +102,20 @@ GST_START_TEST (test_rtcpfilter)
{
in_buffers = g_list_append (in_buffers,
- make_buffer (caps, TRUE, i, FALSE, FALSE));
+ make_buffer (TRUE, i, FALSE, FALSE));
out_buffers = g_list_append (out_buffers,
- make_buffer (caps, FALSE, i, FALSE, FALSE));
+ make_buffer (FALSE, i, FALSE, FALSE));
in_buffers = g_list_append (in_buffers,
- make_buffer (caps, TRUE, i, TRUE, FALSE));
+ make_buffer (TRUE, i, TRUE, FALSE));
out_buffers = g_list_append (out_buffers,
- make_buffer (caps, FALSE, i, TRUE, FALSE));
+ make_buffer (FALSE, i, TRUE, FALSE));
in_buffers = g_list_append (in_buffers,
- make_buffer (caps, TRUE, i, TRUE, TRUE));
+ make_buffer (TRUE, i, TRUE, TRUE));
out_buffers = g_list_append (out_buffers,
- make_buffer (caps, FALSE, i, TRUE, TRUE));
+ make_buffer (FALSE, i, TRUE, TRUE));
}
diff --git a/tests/check/msn/conference.c b/tests/check/msn/conference.c
index ec391315..1e3a209e 100644
--- a/tests/check/msn/conference.c
+++ b/tests/check/msn/conference.c
@@ -66,11 +66,6 @@ bus_watch (GstBus *bus, GstMessage *message, gpointer user_data)
const gchar *error;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
-
- 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 (
@@ -93,11 +88,6 @@ bus_watch (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
-
- 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 (
@@ -164,13 +154,15 @@ bus_watch (GstBus *bus, GstMessage *message, gpointer user_data)
return TRUE;
}
-static void
-pad_probe_cb (GstPad *pad, GstBuffer *buf, gpointer user_data)
+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
@@ -189,7 +181,8 @@ stream_src_pad_added (FsStream *stream, GstPad *pad, FsCodec *codec,
sinkpad = gst_element_get_static_pad (sink, "sink");
ts_fail_unless (sinkpad != NULL);
- gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (pad_probe_cb), dat);
+ 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)));
diff --git a/tests/check/raw/conference.c b/tests/check/raw/conference.c
index a0a490c8..69a80b78 100644
--- a/tests/check/raw/conference.c
+++ b/tests/check/raw/conference.c
@@ -23,6 +23,7 @@
# include <config.h>
#endif
+#include <gst/audio/audio.h>
#include <gst/check/gstcheck.h>
#include <farstream/fs-conference.h>
#include <farstream/fs-stream-transmitter.h>
@@ -272,12 +273,10 @@ setup_fakesrc (struct SimpleTestConference *dat)
}
static gboolean
-pad_count_fold (gpointer pad, GValue *val, gpointer user_data)
+pad_count_fold (const GValue *item, GValue *val, gpointer user_data)
{
g_value_set_uint (val, g_value_get_uint (val) + 1);
- gst_object_unref (pad);
-
return TRUE;
}
@@ -329,7 +328,8 @@ GST_START_TEST (test_rawconference_new)
FsStreamDirection dir;
dat = setup_simple_conference (1, "fsrawconference", "bob@127.0.0.1");
- st = simple_conference_add_stream (dat, dat, "shm", 0, NULL);
+ //st = simple_conference_add_stream (dat, dat, "shm", 0, NULL);
+ st = simple_conference_add_stream (dat, dat, "rawudp", 0, NULL);
g_object_get (dat->session,
"id", &id,
@@ -487,9 +487,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const gchar *error, *debug;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
+ FS_IS_CONFERENCE (GST_MESSAGE_SRC (message)),
+ "Received farstream-error from non-farstream element");
ts_fail_unless (
gst_structure_has_field_typed (s, "src-object", G_TYPE_OBJECT),
@@ -518,9 +517,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
+ FS_IS_CONFERENCE (GST_MESSAGE_SRC (message)),
+ "Received farstream-error from non-farstream element");
ts_fail_unless (
gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM),
@@ -548,9 +546,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
+ FS_IS_CONFERENCE (GST_MESSAGE_SRC (message)),
+ "Received farstream-error from non-farstream element");
ts_fail_unless (
gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM),
@@ -587,10 +584,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-current-send-codec-change from non-farstream"
- " element");
+ FS_IS_CONFERENCE (GST_MESSAGE_SRC (message)),
+ "Received farstream-error from non-farstream element");
ts_fail_unless (
gst_structure_has_field_typed (s, "session", FS_TYPE_SESSION),
@@ -619,10 +614,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-local-candidates-prepared from non-farstream"
- " element");
+ FS_IS_CONFERENCE (GST_MESSAGE_SRC (message)),
+ "Received farstream-error from non-farstream element");
ts_fail_unless (
gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM),
@@ -1005,10 +998,9 @@ set_initial_codecs (
ts_fail_unless (codecs == NULL, "Shouldn't generate codecs codecs");
- codec = fs_codec_new (0, "audio/x-raw-int,"
- "endianness=(int)1234, signed=(bool)true, "
- "width=(int)16, depth=(int)16, "
- "rate=(int)44100", FS_MEDIA_TYPE_AUDIO, 0);
+ codec = fs_codec_new (0, "audio/x-raw,"
+ "format=(string)"GST_AUDIO_NE (S16)","
+ "rate=(int)44100, channels=(int)1", FS_MEDIA_TYPE_AUDIO, 0);
codecs = g_list_append (codecs, codec);
filtered_codecs = g_list_append (filtered_codecs, codecs->data);
@@ -1511,7 +1503,7 @@ fsrawconference_suite (void)
tc_chain = tcase_create ("fsrawconference_two_way_shm");
tcase_add_test (tc_chain, test_rawconference_two_way_shm);
- suite_add_tcase (s, tc_chain);
+ //suite_add_tcase (s, tc_chain);
tc_chain = tcase_create ("fsrawconference_errors");
tcase_add_test (tc_chain, test_rawconference_errors);
diff --git a/tests/check/rtp/conference.c b/tests/check/rtp/conference.c
index f2bc9676..b49351e0 100644
--- a/tests/check/rtp/conference.c
+++ b/tests/check/rtp/conference.c
@@ -22,6 +22,8 @@
# include <config.h>
#endif
+#include <stdio.h>
+
#include <gst/check/gstcheck.h>
#include <farstream/fs-conference.h>
#include <farstream/fs-stream-transmitter.h>
@@ -248,11 +250,6 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const gchar *error;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
-
- 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 (
@@ -275,11 +272,6 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
-
- 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 (
@@ -305,11 +297,6 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
-
- ts_fail_unless (
gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM),
"farstream-new-active-candidate-pair structure"
" has no stream field");
@@ -344,12 +331,6 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-current-send-codec-change from non-farstream"
- " element");
-
- ts_fail_unless (
gst_structure_has_field_typed (s, "session", FS_TYPE_SESSION),
"farstream-current-send-codec-changed structure"
" has no session field");
@@ -376,12 +357,6 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
const GValue *value;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-local-candidates-prepared from non-farstream"
- " element");
-
- ts_fail_unless (
gst_structure_has_field_typed (s, "stream", FS_TYPE_STREAM),
"farstream-local-candidates-prepared structure"
" has no stream field");
diff --git a/tests/check/rtp/generic.c b/tests/check/rtp/generic.c
index ca2b246e..c302c78d 100644
--- a/tests/check/rtp/generic.c
+++ b/tests/check/rtp/generic.c
@@ -211,12 +211,10 @@ setup_fakesrc (struct SimpleTestConference *dat)
}
static gboolean
-pad_count_fold (gpointer pad, GValue *val, gpointer user_data)
+pad_count_fold (const GValue *item, GValue *val, gpointer user_data)
{
g_value_set_uint (val, g_value_get_uint (val) + 1);
- gst_object_unref (pad);
-
return TRUE;
}
diff --git a/tests/check/rtp/recvcodecs.c b/tests/check/rtp/recvcodecs.c
index 4450937e..c4842ab8 100644
--- a/tests/check/rtp/recvcodecs.c
+++ b/tests/check/rtp/recvcodecs.c
@@ -125,13 +125,19 @@ caps_changed (GstPad *pad, GParamSpec *spec, FsStream *stream)
fs_codec_list_destroy (codecs);
}
-static gboolean
-drop_theora_config (GstPad *pad, GstBuffer *buffer, gpointer user_data)
+static GstPadProbeReturn
+drop_theora_config (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
- guint8 *payload = gst_rtp_buffer_get_payload (buffer);
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+ GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT;
+ guint8 *payload;
guint32 header;
guchar TDT;
+ gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer);
+
+ payload = gst_rtp_buffer_get_payload (&rtpbuffer);
+
header = GST_READ_UINT32_BE (payload);
/*
* 0 1 2 3
@@ -146,10 +152,12 @@ drop_theora_config (GstPad *pad, GstBuffer *buffer, gpointer user_data)
*/
TDT = (header & 0x30) >> 4;
+ gst_rtp_buffer_unmap (&rtpbuffer);
+
if (TDT == 1)
- return FALSE;
+ return GST_PAD_PROBE_DROP;
else
- return TRUE;
+ return GST_PAD_PROBE_OK;
}
GST_START_TEST (test_rtprecv_inband_config_data)
@@ -300,7 +308,8 @@ GST_START_TEST (test_rtprecv_inband_config_data)
ts_fail_unless (pay != NULL);
pad = gst_element_get_static_pad (pay, "src");
ts_fail_unless (pad != NULL);
- gst_pad_add_buffer_probe (pad, G_CALLBACK (drop_theora_config), NULL);
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
+ drop_theora_config, NULL, NULL);
g_signal_connect (pad, "notify::caps", G_CALLBACK (caps_changed), stream);
caps_changed (pad, NULL, stream);
gst_object_unref (pad);
diff --git a/tests/check/rtp/sendcodecs.c b/tests/check/rtp/sendcodecs.c
index 7771539a..889bd498 100644
--- a/tests/check/rtp/sendcodecs.c
+++ b/tests/check/rtp/sendcodecs.c
@@ -70,9 +70,7 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
{
const GstStructure *s = gst_message_get_structure (message);
- if (gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE) &&
- gst_structure_has_name (s, "farstream-error"))
+ if (gst_structure_has_name (s, "farstream-error"))
{
const GValue *value;
FsError errorno;
@@ -81,9 +79,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
GEnumValue *enumvalue = NULL;
ts_fail_unless (
- gst_implements_interface_check (GST_MESSAGE_SRC (message),
- FS_TYPE_CONFERENCE),
- "Received farstream-error from non-farstream element");
+ FS_IS_CONFERENCE (GST_MESSAGE_SRC (message)),
+ "Received farstream-error from non-farstream element");
ts_fail_unless (
gst_structure_has_field_typed (s, "src-object", G_TYPE_OBJECT),
@@ -176,7 +173,8 @@ _bus_callback (GstBus *bus, GstMessage *message, gpointer user_data)
}
static GstElement *
-build_recv_pipeline (GCallback havedata_handler, gpointer data, gint *port)
+build_recv_pipeline (GstPadProbeCallback buffer_handler, gpointer data,
+ gint *port)
{
GstElement *pipeline;
GstElement *src;
@@ -200,7 +198,8 @@ build_recv_pipeline (GCallback havedata_handler, gpointer data, gint *port)
pad = gst_element_get_static_pad (sink, "sink");
- gst_pad_add_buffer_probe (pad, havedata_handler, data);
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER, buffer_handler, data,
+ NULL);
gst_object_ref (pad);
@@ -332,23 +331,25 @@ one_way (GstElement *recv_pipeline, gint port)
}
-static void
-send_dmtf_havedata_handler (GstPad *pad, GstBuffer *buf, gpointer user_data)
+static GstPadProbeReturn
+send_dmtf_buffer_handler (GstPad *pad, GstPadProbeInfo *info,
+ gpointer user_data)
{
+ GstRTPBuffer rtpbuf = GST_RTP_BUFFER_INIT;
+ GstBuffer *buf = GST_PAD_PROBE_INFO_BUFFER (info);
gchar *data;
ts_fail_unless (gst_rtp_buffer_validate (buf), "Buffer is not valid rtp");
- if (gst_rtp_buffer_get_payload_type (buf) != dtmf_id)
- return;
+ gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf);
+ if (gst_rtp_buffer_get_payload_type (&rtpbuf) != dtmf_id)
+ goto out;
- data = gst_rtp_buffer_get_payload (buf);
+ data = gst_rtp_buffer_get_payload (&rtpbuf);
+ /* Check if still on previous digit */
if (data[0] < digit)
- {
- /* Still on previous digit */
- return;
- }
+ goto out;
GST_LOG ("Got digit %d", data[0]);
@@ -356,6 +357,10 @@ send_dmtf_havedata_handler (GstPad *pad, GstBuffer *buf, gpointer user_data)
" (sending %d, should be %d", data[0], digit);
received = TRUE;
+
+out:
+ gst_rtp_buffer_unmap (&rtpbuf);
+ return GST_PAD_PROBE_OK;
}
@@ -423,7 +428,7 @@ GST_START_TEST (test_senddtmf_event)
{
gint port;
GstElement *recv_pipeline = build_recv_pipeline (
- G_CALLBACK (send_dmtf_havedata_handler), NULL, &port);
+ send_dmtf_buffer_handler, NULL, &port);
g_timeout_add (350, start_stop_sending_dtmf, NULL);
one_way (recv_pipeline, port);
@@ -501,7 +506,7 @@ GST_START_TEST (test_senddtmf_change_auto)
{
gint port;
GstElement *recv_pipeline = build_recv_pipeline (
- G_CALLBACK (send_dmtf_havedata_handler), NULL, &port);
+ send_dmtf_buffer_handler, NULL, &port);
change_codec = TRUE;
g_timeout_add (350, start_stop_sending_dtmf, NULL);
@@ -511,15 +516,20 @@ GST_END_TEST;
gboolean checked = FALSE;
-static void
-change_ssrc_handler (GstPad *pad, GstBuffer *buf, gpointer user_data)
+static GstPadProbeReturn
+change_ssrc_buffer_handler (GstPad *pad, GstPadProbeInfo *info,
+ gpointer user_data)
{
+ GstBuffer *buf = GST_PAD_PROBE_INFO_BUFFER (info);
guint sess_ssrc;
guint buf_ssrc;
+ GstRTPBuffer rtpbuf = GST_RTP_BUFFER_INIT;
ts_fail_unless (gst_rtp_buffer_validate (buf));
- buf_ssrc = gst_rtp_buffer_get_ssrc (buf);
+ gst_rtp_buffer_map (buf, GST_MAP_READ, &rtpbuf);
+ buf_ssrc = gst_rtp_buffer_get_ssrc (&rtpbuf);
+ gst_rtp_buffer_unmap (&rtpbuf);
g_object_get (dat->session, "ssrc", &sess_ssrc, NULL);
@@ -546,13 +556,15 @@ change_ssrc_handler (GstPad *pad, GstBuffer *buf, gpointer user_data)
if (sess_ssrc != 12345)
g_object_set (dat->session, "ssrc", 12345, NULL);
}
+
+ return GST_PAD_PROBE_OK;
}
GST_START_TEST (test_change_ssrc)
{
gint port;
GstElement *recv_pipeline = build_recv_pipeline (
- G_CALLBACK (change_ssrc_handler), NULL, &port);
+ change_ssrc_buffer_handler, NULL, &port);
checked = FALSE;
one_way (recv_pipeline, port);
diff --git a/tests/check/transmitter/fake-filter.c b/tests/check/transmitter/fake-filter.c
index 73e5d125..b4204bd6 100644
--- a/tests/check/transmitter/fake-filter.c
+++ b/tests/check/transmitter/fake-filter.c
@@ -1,7 +1,7 @@
/*
* Farstream Voice+Video library
*
- * Copyright 2008 Collabora Ltd,
+ * Copyright 2008-2012 Collabora Ltd,
* Copyright 2008 Nokia Corporation
* @author: Olivier Crete <olivier.crete@collabora.co.uk>
*
@@ -32,14 +32,6 @@
GST_DEBUG_CATEGORY (fake_filter_debug);
#define GST_CAT_DEFAULT (fake_filter_debug)
-/* elementfactory information */
-static const GstElementDetails fs_fake_filter_details =
-GST_ELEMENT_DETAILS (
- "Fake Filter element",
- "Filter",
- "This element ignores the sending property",
- "Olivier Crete <olivier.crete@collabora.co.uk>");
-
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
@@ -51,19 +43,6 @@ static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
-/* signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- PROP_0,
- PROP_SENDING
-};
-
static void fs_fake_filter_get_property (GObject *object,
guint prop_id,
GValue *value,
@@ -73,38 +52,41 @@ static void fs_fake_filter_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec);
-static void
-_do_init (GType type)
-{
- GST_DEBUG_CATEGORY_INIT
- (fake_filter_debug, "fsfakefilter", 0, "fsfakefilter");
-}
-
-GST_BOILERPLATE_FULL (FsFakeFilter, fs_fake_filter, GstBaseTransform,
- GST_TYPE_BASE_TRANSFORM, _do_init);
+/* signals and args */
-static void
-fs_fake_filter_base_init (gpointer klass)
+enum
{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ PROP_0,
+ PROP_SENDING
+};
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&srctemplate));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sinktemplate));
+G_DEFINE_TYPE (FsFakeFilter, fs_fake_filter, GST_TYPE_BASE_TRANSFORM);
- gst_element_class_set_details (element_class, &fs_fake_filter_details);
-}
static void
fs_fake_filter_class_init (FsFakeFilterClass *klass)
{
GObjectClass *gobject_class;
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
gobject_class = (GObjectClass *) klass;
- gobject_class->set_property = GST_DEBUG_FUNCPTR (fs_fake_filter_set_property);
- gobject_class->get_property = GST_DEBUG_FUNCPTR (fs_fake_filter_get_property);
+ GST_DEBUG_CATEGORY_INIT
+ (fake_filter_debug, "fsfakefilter", 0, "fsfakefilter");
+
+ gobject_class->set_property = fs_fake_filter_set_property;
+ gobject_class->get_property = fs_fake_filter_get_property;
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gst_element_class_set_metadata (gstelement_class,
+ "Fake Filter element",
+ "Filter",
+ "This element ignores the sending property",
+ "Olivier Crete <olivier.crete@collabora.com>");
g_object_class_install_property (gobject_class,
PROP_SENDING,
@@ -116,8 +98,7 @@ fs_fake_filter_class_init (FsFakeFilterClass *klass)
}
static void
-fs_fake_filter_init (FsFakeFilter *fakefilter,
- FsFakeFilterClass *klass)
+fs_fake_filter_init (FsFakeFilter *fakefilter)
{
}
diff --git a/tests/check/transmitter/generic.c b/tests/check/transmitter/generic.c
index 810faa10..797933d4 100644
--- a/tests/check/transmitter/generic.c
+++ b/tests/check/transmitter/generic.c
@@ -56,7 +56,7 @@ setup_fakesrc (FsTransmitter *trans, GstElement *pipeline, guint component_id)
gchar *padname;
gchar *tmp;
- tmp = g_strdup_printf ("fakemediasrc_%d", component_id);
+ tmp = g_strdup_printf ("fakemediasrc_%u", component_id);
src = gst_element_factory_make ("fakesrc", tmp);
g_free (tmp);
g_object_set (src,
@@ -78,7 +78,7 @@ setup_fakesrc (FsTransmitter *trans, GstElement *pipeline, guint component_id)
g_object_get (trans, "gst-sink", &trans_sink, NULL);
- padname = g_strdup_printf ("sink%d", component_id);
+ padname = g_strdup_printf ("sink_%u", component_id);
ts_fail_unless (gst_element_link_pads (src, "src", trans_sink, padname),
"Could not link the fakesrc to %s", padname);
g_free (padname);
@@ -125,10 +125,10 @@ setup_pipeline (FsTransmitter *trans, GCallback cb)
gst_bin_add_many (GST_BIN (pipeline), rtpfakesink, rtcpfakesink,
trans_sink, trans_src, NULL);
- ts_fail_unless (gst_element_link_pads (trans_src, "src1",
+ ts_fail_unless (gst_element_link_pads (trans_src, "src_1",
rtpfakesink, "sink"),
"Coult not link transmitter src and fakesink");
- ts_fail_unless (gst_element_link_pads (trans_src, "src2",
+ ts_fail_unless (gst_element_link_pads (trans_src, "src_2",
rtcpfakesink, "sink"),
"Coult not link transmitter src and fakesink");
diff --git a/tests/check/transmitter/multicast.c b/tests/check/transmitter/multicast.c
index 2ded687b..406bd1ea 100644
--- a/tests/check/transmitter/multicast.c
+++ b/tests/check/transmitter/multicast.c
@@ -57,15 +57,15 @@ _handoff_handler (GstElement *element, GstBuffer *buffer, GstPad *pad,
{
gint component_id = GPOINTER_TO_INT (user_data);
- ts_fail_unless (GST_BUFFER_SIZE (buffer) == component_id * 10,
- "Buffer is size %d but component_id is %d", GST_BUFFER_SIZE (buffer),
+ ts_fail_unless (gst_buffer_get_size (buffer) == component_id * 10,
+ "Buffer is size %d but component_id is %d", gst_buffer_get_size (buffer),
component_id);
buffer_count[component_id-1]++;
/*
GST_DEBUG ("Buffer %d component: %d size: %u", buffer_count[component_id-1],
- component_id, GST_BUFFER_SIZE (buffer));
+ component_id, gst_buffer_get_size (buffer));
*/
ts_fail_if (buffer_count[component_id-1] > 20,
diff --git a/tests/check/transmitter/nice.c b/tests/check/transmitter/nice.c
index 62ed4b1f..931ad711 100644
--- a/tests/check/transmitter/nice.c
+++ b/tests/check/transmitter/nice.c
@@ -196,8 +196,8 @@ static void
_handoff_handler (GstElement *element, GstBuffer *buffer, GstPad *pad,
guint stream, gint component_id)
{
- ts_fail_unless (GST_BUFFER_SIZE (buffer) == component_id * 10,
- "Buffer is size %d but component_id is %d", GST_BUFFER_SIZE (buffer),
+ ts_fail_unless (gst_buffer_get_size (buffer) == component_id * 10,
+ "Buffer is size %d but component_id is %d", gst_buffer_get_size (buffer),
component_id);
g_static_mutex_lock (&count_mutex);
@@ -209,7 +209,7 @@ _handoff_handler (GstElement *element, GstBuffer *buffer, GstPad *pad,
{
GST_DEBUG ("Buffer %d stream: %u component: %d size: %u",
buffer_count[stream][component_id-1], stream,
- component_id, GST_BUFFER_SIZE (buffer));
+ component_id, gst_buffer_get_size (buffer));
GST_DEBUG ("Received %d %d %d %d",
buffer_count[0][0], buffer_count[0][1],
buffer_count[1][0], buffer_count[1][1]);
diff --git a/tests/check/transmitter/rawudp.c b/tests/check/transmitter/rawudp.c
index faae7573..4b9ade94 100644
--- a/tests/check/transmitter/rawudp.c
+++ b/tests/check/transmitter/rawudp.c
@@ -200,14 +200,14 @@ _handoff_handler (GstElement *element, GstBuffer *buffer, GstPad *pad,
{
gint component_id = GPOINTER_TO_INT (user_data);
- ts_fail_unless (GST_BUFFER_SIZE (buffer) == component_id * 10,
- "Buffer is size %d but component_id is %d", GST_BUFFER_SIZE (buffer),
+ ts_fail_unless (gst_buffer_get_size (buffer) == component_id * 10,
+ "Buffer is size %d but component_id is %d", gst_buffer_get_size (buffer),
component_id);
buffer_count[component_id-1]++;
GST_LOG ("Buffer %d component: %d size: %u", buffer_count[component_id-1],
- component_id, GST_BUFFER_SIZE (buffer));
+ component_id, gst_buffer_get_size (buffer));
ts_fail_if (buffer_count[component_id-1] > 20,
"Too many buffers %d > 20 for component",
diff --git a/tests/check/transmitter/shm.c b/tests/check/transmitter/shm.c
index d23ff3d3..3c9257f6 100644
--- a/tests/check/transmitter/shm.c
+++ b/tests/check/transmitter/shm.c
@@ -131,14 +131,14 @@ _handoff_handler (GstElement *element, GstBuffer *buffer, GstPad *pad,
{
gint component_id = GPOINTER_TO_INT (user_data);
- ts_fail_unless (GST_BUFFER_SIZE (buffer) == component_id * 10,
- "Buffer is size %d but component_id is %d", GST_BUFFER_SIZE (buffer),
+ ts_fail_unless (gst_buffer_get_size (buffer) == component_id * 10,
+ "Buffer is size %d but component_id is %d", gst_buffer_get_size (buffer),
component_id);
buffer_count[component_id-1]++;
GST_LOG ("Buffer %d component: %d size: %u", buffer_count[component_id-1],
- component_id, GST_BUFFER_SIZE (buffer));
+ component_id, gst_buffer_get_size (buffer));
ts_fail_if (buffer_count[component_id-1] > 20,
"Too many buffers %d > 20 for component",
@@ -180,7 +180,8 @@ _known_source_packet_received (FsStreamTransmitter *st, guint component_id,
received_known[component_id - 1]++;
GST_LOG ("Known source buffer %d component: %d size: %u",
- received_known[component_id-1], component_id, GST_BUFFER_SIZE (buffer));
+ received_known[component_id-1], component_id,
+ gst_buffer_get_size (buffer));
}
void
diff --git a/transmitters/multicast/Makefile.am b/transmitters/multicast/Makefile.am
index be533540..3baa27bc 100644
--- a/transmitters/multicast/Makefile.am
+++ b/transmitters/multicast/Makefile.am
@@ -13,13 +13,15 @@ libmulticast_transmitter_la_CFLAGS = \
$(FS_INTERNAL_CFLAGS) \
$(FS_CFLAGS) \
$(GST_PLUGINS_BASE_CFLAGS) \
- $(GST_CFLAGS)
+ $(GST_CFLAGS) \
+ $(GIO_CFLAGS)
libmulticast_transmitter_la_LDFLAGS = $(FS_PLUGIN_LDFLAGS)
libmulticast_transmitter_la_LIBADD = \
$(top_builddir)/farstream/libfarstream-@FS_MAJORMINOR@.la \
$(FS_LIBS) \
$(GST_BASE_LIBS) \
- $(GST_LIBS)
+ $(GST_LIBS) \
+ $(GIO_LIBS)
noinst_HEADERS = \
fs-multicast-transmitter.h \
diff --git a/transmitters/multicast/fs-multicast-transmitter.c b/transmitters/multicast/fs-multicast-transmitter.c
index a02046cb..bce74a9c 100644
--- a/transmitters/multicast/fs-multicast-transmitter.c
+++ b/transmitters/multicast/fs-multicast-transmitter.c
@@ -43,6 +43,8 @@
#include <string.h>
#include <sys/types.h>
+#include <gio/gio.h>
+
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
@@ -274,12 +276,12 @@ fs_multicast_transmitter_constructed (GObject *object)
/* Lets create the RTP source funnel */
- self->priv->udpsrc_funnels[c] = gst_element_factory_make ("fsfunnel", NULL);
+ self->priv->udpsrc_funnels[c] = gst_element_factory_make ("funnel", NULL);
if (!self->priv->udpsrc_funnels[c]) {
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not make the fsfunnel element");
+ "Could not make the funnel element");
return;
}
@@ -287,11 +289,11 @@ fs_multicast_transmitter_constructed (GObject *object)
self->priv->udpsrc_funnels[c])) {
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not add the fsfunnel element to the transmitter src bin");
+ "Could not add the funnel element to the transmitter src bin");
}
pad = gst_element_get_static_pad (self->priv->udpsrc_funnels[c], "src");
- padname = g_strdup_printf ("src%d", c);
+ padname = g_strdup_printf ("src_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -319,7 +321,7 @@ fs_multicast_transmitter_constructed (GObject *object)
}
pad = gst_element_get_static_pad (self->priv->udpsink_tees[c], "sink");
- padname = g_strdup_printf ("sink%d", c);
+ padname = g_strdup_printf ("sink_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -350,7 +352,7 @@ fs_multicast_transmitter_constructed (GObject *object)
"sync" , FALSE,
NULL);
- pad = gst_element_get_request_pad (self->priv->udpsink_tees[c], "src%d");
+ pad = gst_element_get_request_pad (self->priv->udpsink_tees[c], "src_%u");
pad2 = gst_element_get_static_pad (fakesink, "sink");
ret = gst_pad_link (pad, pad2);
@@ -525,6 +527,7 @@ struct _UdpSock {
guint8 current_ttl;
gint fd;
+ GSocket *socket;
/* Protected by the transmitter mutex */
GByteArray *ttls;
@@ -698,7 +701,7 @@ _bind_port (
static GstElement *
_create_sinksource (gchar *elementname, GstBin *bin,
- GstElement *teefunnel, GstElement *filter, gint fd,
+ GstElement *teefunnel, GstElement *filter, GSocket *socket,
GstPadDirection direction, GstPad **requested_pad, GError **error)
{
GstElement *elem;
@@ -716,8 +719,8 @@ _create_sinksource (gchar *elementname, GstBin *bin,
}
g_object_set (elem,
- "closefd", FALSE,
- "sockfd", fd,
+ "close-socket", FALSE,
+ "socket", socket,
"auto-multicast", FALSE,
NULL);
@@ -730,9 +733,9 @@ _create_sinksource (gchar *elementname, GstBin *bin,
}
if (direction == GST_PAD_SINK)
- *requested_pad = gst_element_get_request_pad (teefunnel, "src%d");
+ *requested_pad = gst_element_get_request_pad (teefunnel, "src_%u");
else
- *requested_pad = gst_element_get_request_pad (teefunnel, "sink%d");
+ *requested_pad = gst_element_get_request_pad (teefunnel, "sink_%u");
if (!*requested_pad) {
g_set_error (error, FS_ERROR, FS_ERROR_CONSTRUCTION,
@@ -946,13 +949,17 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
if (udpsock->fd < 0)
goto error;
+ udpsock->socket = g_socket_new_from_fd (udpsock->fd, error);
+ if (!udpsock->socket)
+ goto error;
+
/* Now lets create the elements */
udpsock->tee = trans->priv->udpsink_tees[component_id];
udpsock->funnel = trans->priv->udpsrc_funnels[component_id];
udpsock->udpsrc = _create_sinksource ("udpsrc",
- GST_BIN (trans->priv->gst_src), udpsock->funnel, NULL, udpsock->fd,
+ GST_BIN (trans->priv->gst_src), udpsock->funnel, NULL, udpsock->socket,
GST_PAD_SRC, &udpsock->udpsrc_requested_pad, error);
if (!udpsock->udpsrc)
goto error;
@@ -963,7 +970,7 @@ fs_multicast_transmitter_get_udpsock (FsMulticastTransmitter *trans,
udpsock->udpsink = _create_sinksource ("multiudpsink",
GST_BIN (trans->priv->gst_sink), udpsock->tee,
udpsock->udpsink_recvonly_filter,
- udpsock->fd, GST_PAD_SINK, &udpsock->udpsink_requested_pad, error);
+ udpsock->socket, GST_PAD_SINK, &udpsock->udpsink_requested_pad, error);
if (!udpsock->udpsink)
goto error;
@@ -1120,6 +1127,9 @@ fs_multicast_transmitter_put_udpsock (FsMulticastTransmitter *trans,
GST_ERROR ("Could not remove sink filter element from transmitter sink");
}
+ if (udpsock->socket)
+ g_object_unref (udpsock->socket);
+
if (udpsock->fd >= 0)
close (udpsock->fd);
diff --git a/transmitters/nice/fs-nice-stream-transmitter.c b/transmitters/nice/fs-nice-stream-transmitter.c
index 1f0dbefc..697eb568 100644
--- a/transmitters/nice/fs-nice-stream-transmitter.c
+++ b/transmitters/nice/fs-nice-stream-transmitter.c
@@ -172,8 +172,8 @@ static void agent_new_candidate (NiceAgent *agent,
const gchar *foundation,
gpointer user_data);
-static gboolean known_buffer_have_buffer_handler (GstPad *pad,
- GstBuffer *buffer,
+static GstPadProbeReturn known_buffer_have_buffer_handler (GstPad *pad,
+ GstPadProbeInfo *info,
gpointer user_data);
@@ -1398,7 +1398,7 @@ fs_nice_stream_transmitter_build (FsNiceStreamTransmitter *self,
self->priv->transmitter,
self->priv->agent->agent,
self->priv->stream_id,
- G_CALLBACK (known_buffer_have_buffer_handler), self,
+ known_buffer_have_buffer_handler, self,
error);
if (self->priv->gststream == NULL)
return FALSE;
@@ -1833,12 +1833,13 @@ fs_nice_stream_transmitter_newv (FsNiceTransmitter *transmitter,
}
-static gboolean
-known_buffer_have_buffer_handler (GstPad *pad, GstBuffer *buffer,
+static GstPadProbeReturn
+known_buffer_have_buffer_handler (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data)
{
FsNiceStreamTransmitter *self = FS_NICE_STREAM_TRANSMITTER (user_data);
guint component_id;
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
if (!g_atomic_int_get (&self->priv->associate_on_source))
return TRUE;
diff --git a/transmitters/nice/fs-nice-transmitter.c b/transmitters/nice/fs-nice-transmitter.c
index a99b7478..0798dd8e 100644
--- a/transmitters/nice/fs-nice-transmitter.c
+++ b/transmitters/nice/fs-nice-transmitter.c
@@ -255,13 +255,13 @@ fs_nice_transmitter_constructed (GObject *object)
/* Lets create the RTP source funnel */
- self->priv->src_funnels[c] = gst_element_factory_make ("fsfunnel", NULL);
+ self->priv->src_funnels[c] = gst_element_factory_make ("funnel", NULL);
if (!self->priv->src_funnels[c])
{
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not make the fsfunnel element");
+ "Could not make the funnel element");
return;
}
@@ -270,11 +270,11 @@ fs_nice_transmitter_constructed (GObject *object)
{
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not add the fsfunnel element to the transmitter src bin");
+ "Could not add the funnel element to the transmitter src bin");
}
pad = gst_element_get_static_pad (self->priv->src_funnels[c], "src");
- padname = g_strdup_printf ("src%d", c);
+ padname = g_strdup_printf ("src_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -304,7 +304,7 @@ fs_nice_transmitter_constructed (GObject *object)
}
pad = gst_element_get_static_pad (self->priv->sink_tees[c], "sink");
- padname = g_strdup_printf ("sink%d", c);
+ padname = g_strdup_printf ("sink_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -336,7 +336,7 @@ fs_nice_transmitter_constructed (GObject *object)
return;
}
- pad = gst_element_get_request_pad (self->priv->sink_tees[c], "src%d");
+ pad = gst_element_get_request_pad (self->priv->sink_tees[c], "src_%u");
pad2 = gst_element_get_static_pad (fakesink, "sink");
ret = gst_pad_link (pad, pad2);
@@ -495,7 +495,7 @@ _create_sinksource (
guint component_id,
GstPadDirection direction,
gboolean do_timestamp,
- GCallback have_buffer_callback,
+ GstPadProbeCallback have_buffer_callback,
gpointer have_buffer_user_data,
gulong *buffer_probe_id,
GstPad **requested_pad,
@@ -545,9 +545,9 @@ _create_sinksource (
gst_object_ref (elem);
if (direction == GST_PAD_SINK)
- *requested_pad = gst_element_get_request_pad (teefunnel, "src%d");
+ *requested_pad = gst_element_get_request_pad (teefunnel, "src_%u");
else
- *requested_pad = gst_element_get_request_pad (teefunnel, "sink%d");
+ *requested_pad = gst_element_get_request_pad (teefunnel, "sink_%u");
if (!*requested_pad)
{
@@ -626,17 +626,18 @@ _create_sinksource (
{
g_object_set_data (G_OBJECT (*requested_pad), "component-id",
GUINT_TO_POINTER (component_id));
- *buffer_probe_id = gst_pad_add_buffer_probe (*requested_pad,
+ *buffer_probe_id = gst_pad_add_probe (*requested_pad,
+ GST_PAD_PROBE_TYPE_BUFFER,
have_buffer_callback,
- have_buffer_user_data);
+ have_buffer_user_data, NULL);
}
else
{
g_object_set_data (G_OBJECT (elempad), "component-id",
GUINT_TO_POINTER (component_id));
- *buffer_probe_id = gst_pad_add_buffer_probe (elempad,
- have_buffer_callback,
- have_buffer_user_data);
+ *buffer_probe_id = gst_pad_add_probe (elempad,
+ GST_PAD_PROBE_TYPE_BUFFER,
+ have_buffer_callback, have_buffer_user_data, NULL);
}
if (*buffer_probe_id == 0)
@@ -709,7 +710,7 @@ NiceGstStream *
fs_nice_transmitter_add_gst_stream (FsNiceTransmitter *self,
NiceAgent *agent,
guint stream_id,
- GCallback have_buffer_callback,
+ GstPadProbeCallback have_buffer_callback,
gpointer have_buffer_user_data,
GError **error)
{
@@ -920,7 +921,7 @@ fs_nice_transmitter_set_sending (FsNiceTransmitter *self,
ns->requested_tee_pads[c] =
- gst_element_get_request_pad (self->priv->sink_tees[c], "src%d");
+ gst_element_get_request_pad (self->priv->sink_tees[c], "src_%u");
g_assert (ns->requested_tee_pads[c]);
diff --git a/transmitters/nice/fs-nice-transmitter.h b/transmitters/nice/fs-nice-transmitter.h
index e4cbe898..a203ce36 100644
--- a/transmitters/nice/fs-nice-transmitter.h
+++ b/transmitters/nice/fs-nice-transmitter.h
@@ -93,7 +93,7 @@ typedef struct _NiceGstStream NiceGstStream;
NiceGstStream *fs_nice_transmitter_add_gst_stream (FsNiceTransmitter *self,
NiceAgent *agent,
guint stream_id,
- GCallback have_buffer_callback,
+ GstPadProbeCallback have_buffer_callback,
gpointer have_buffer_user_data,
GError **error);
diff --git a/transmitters/rawudp/Makefile.am b/transmitters/rawudp/Makefile.am
index eed9960b..41051de8 100644
--- a/transmitters/rawudp/Makefile.am
+++ b/transmitters/rawudp/Makefile.am
@@ -18,19 +18,20 @@ nodist_librawudp_transmitter_la_SOURCES = \
librawudp_transmitter_la_CFLAGS = \
$(FS_INTERNAL_CFLAGS) \
$(FS_CFLAGS) \
- $(GST_PLUGINS_BASE_CFLAGS) \
$(GST_CFLAGS) \
$(NICE_CFLAGS) \
- $(GUPNP_CFLAGS)
+ $(GUPNP_CFLAGS) \
+ $(GIO_CFLAGS)
+
librawudp_transmitter_la_LDFLAGS = $(FS_PLUGIN_LDFLAGS)
librawudp_transmitter_la_LIBADD = \
$(top_builddir)/farstream/libfarstream-@FS_MAJORMINOR@.la \
$(FS_LIBS) \
- $(GST_PLUGINS_BASE_LIBS) \
$(GST_LIBS) \
$(NICE_LIBS) \
$(GUPNP_LIBS) \
- -lgstnetbuffer-@GST_MAJORMINOR@
+ $(GIO_LIBS) \
+ -lgstnet-@GST_MAJORMINOR@
noinst_HEADERS = \
fs-rawudp-transmitter.h \
diff --git a/transmitters/rawudp/fs-rawudp-component.c b/transmitters/rawudp/fs-rawudp-component.c
index 27f6c8a3..4713b9b3 100644
--- a/transmitters/rawudp/fs-rawudp-component.c
+++ b/transmitters/rawudp/fs-rawudp-component.c
@@ -39,7 +39,7 @@
#include <farstream/fs-conference.h>
-#include <gst/netbuffer/gstnetbuffer.h>
+#include <gst/net/gstnetaddressmeta.h>
#ifdef HAVE_GUPNP
#include <libgupnp-igd/gupnp-simple-igd-thread.h>
@@ -143,7 +143,7 @@ struct _FsRawUdpComponentPrivate
UdpPort *udpport;
FsCandidate *remote_candidate;
- GstNetAddress remote_address;
+ GSocketAddress *remote_address;
FsCandidate *local_active_candidate;
FsCandidate *local_forced_candidate;
@@ -216,16 +216,15 @@ static void
fs_rawudp_component_emit_candidate (FsRawUdpComponent *self,
FsCandidate *candidate);
-static gboolean
-stun_recv_cb (GstPad *pad, GstBuffer *buffer,
- gpointer user_data);
+static GstPadProbeReturn
+stun_recv_cb (GstPad *pad, GstPadProbeInfo *info, gpointer user_data);
static gpointer
stun_timeout_func (gpointer user_data);
-static gboolean
-buffer_recv_cb (GstPad *pad, GstBuffer *buffer, gpointer user_data);
+static GstPadProbeReturn
+buffer_recv_cb (GstPad *pad, GstPadProbeInfo *info, gpointer user_data);
static void
-remote_is_unique_cb (gboolean unique, const GstNetAddress *address,
+remote_is_unique_cb (gboolean unique, GSocketAddress *address,
gpointer user_data);
static gboolean
@@ -261,8 +260,6 @@ fs_rawudp_component_register_type (FsPlugin *module)
/* Required because the GST type registration is not thread safe */
- g_type_class_ref (GST_TYPE_NETBUFFER);
-
type = g_type_module_register_type (G_TYPE_MODULE (module),
G_TYPE_OBJECT, "FsRawUdpComponent", &info, 0);
@@ -572,8 +569,7 @@ fs_rawudp_constructed (GObject *object)
if (self->priv->associate_on_source)
self->priv->buffer_recv_id =
fs_rawudp_transmitter_udpport_connect_recv (
- self->priv->udpport,
- G_CALLBACK (buffer_recv_cb), self);
+ self->priv->udpport, buffer_recv_cb, self);
GST_CALL_PARENT (G_OBJECT_CLASS, constructed, (object));
}
@@ -611,6 +607,8 @@ fs_rawudp_component_dispose (GObject *object)
self->priv->transmitter = NULL;
FS_RAWUDP_COMPONENT_UNLOCK (self);
+ g_clear_object (&self->priv->remote_address);
+
g_object_unref (ts);
parent_class->dispose (object);
@@ -670,7 +668,7 @@ fs_rawudp_component_stop (FsRawUdpComponent *self)
fs_rawudp_transmitter_udpport_remove_known_address (udpport,
- &self->priv->remote_address, remote_is_unique_cb, self);
+ self->priv->remote_address, remote_is_unique_cb, self);
}
FS_RAWUDP_COMPONENT_UNLOCK (self);
@@ -912,14 +910,14 @@ fs_rawudp_component_new (
}
static void
-remote_is_unique_cb (gboolean unique, const GstNetAddress *address,
+remote_is_unique_cb (gboolean unique, GSocketAddress *address,
gpointer user_data)
{
FsRawUdpComponent *self = FS_RAWUDP_COMPONENT (user_data);
FS_RAWUDP_COMPONENT_LOCK (self);
- if (!gst_netaddress_equal (address, &self->priv->remote_address))
+ if (!fs_g_inet_socket_address_equal (address, self->priv->remote_address))
{
GST_ERROR ("Got callback for an address that is not ours");
goto out;
@@ -942,6 +940,7 @@ fs_rawudp_component_set_remote_candidate (FsRawUdpComponent *self,
struct addrinfo hints = {0};
struct addrinfo *res = NULL;
int rv;
+ GInetAddress *addr;
if (candidate->component_id != self->priv->component)
{
@@ -973,30 +972,36 @@ fs_rawudp_component_set_remote_candidate (FsRawUdpComponent *self,
if (self->priv->remote_candidate)
fs_rawudp_transmitter_udpport_remove_known_address (self->priv->udpport,
- &self->priv->remote_address, remote_is_unique_cb, self);
+ self->priv->remote_address, remote_is_unique_cb, self);
old_candidate = self->priv->remote_candidate;
self->priv->remote_candidate = fs_candidate_copy (candidate);
sending = self->priv->sending;
+ g_clear_object (&self->priv->remote_address);
+
switch (res->ai_family)
{
case AF_INET:
- gst_netaddress_set_ip4_address (&self->priv->remote_address,
- ((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr,
- g_htons(candidate->port));
+ addr = g_inet_address_new_from_bytes (
+ (guint8*) &(((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr),
+ G_SOCKET_FAMILY_IPV4);
break;
case AF_INET6:
- gst_netaddress_set_ip6_address (&self->priv->remote_address,
- ((struct sockaddr_in6 *)res->ai_addr)->sin6_addr.s6_addr,
- g_htons(candidate->port));
+ addr = g_inet_address_new_from_bytes (
+ (guint8*) &(((struct sockaddr_in6 *)res->ai_addr)->sin6_addr.s6_addr),
+ G_SOCKET_FAMILY_IPV6);
break;
}
+ self->priv->remote_address = g_inet_socket_address_new (addr,
+ candidate->port);
+ g_object_unref (addr);
+
self->priv->remote_is_unique =
fs_rawudp_transmitter_udpport_add_known_address (self->priv->udpport,
- &self->priv->remote_address, remote_is_unique_cb, self);
+ self->priv->remote_address, remote_is_unique_cb, self);
FS_RAWUDP_COMPONENT_UNLOCK (self);
@@ -1308,8 +1313,7 @@ fs_rawudp_component_start_stun (FsRawUdpComponent *self, GError **error)
FS_RAWUDP_COMPONENT_LOCK (self);
self->priv->stun_recv_id =
fs_rawudp_transmitter_udpport_connect_recv (
- self->priv->udpport,
- G_CALLBACK (stun_recv_cb), self);
+ self->priv->udpport, stun_recv_cb, self);
nice_address_init (&niceaddr);
@@ -1376,11 +1380,11 @@ fs_rawudp_component_stop_stun_locked (FsRawUdpComponent *self)
-static gboolean
-stun_recv_cb (GstPad *pad, GstBuffer *buffer,
- gpointer user_data)
+static GstPadProbeReturn
+stun_recv_cb (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
FsRawUdpComponent *self = FS_RAWUDP_COMPONENT (user_data);
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
FsCandidate *candidate = NULL;
StunMessage msg;
StunValidationStatus stunv;
@@ -1391,26 +1395,30 @@ stun_recv_cb (GstPad *pad, GstBuffer *buffer,
socklen_t alt_addr_len = sizeof(alt_addr);
gchar addr_str[NI_MAXHOST];
NiceAddress niceaddr;
+ GstMapInfo map;
+
+ gst_buffer_map (buffer, &map, GST_MAP_READ);
- if (GST_BUFFER_SIZE (buffer) < 4)
+ if (gst_buffer_get_size (buffer) < 4)
/* Packet is too small to be STUN */
- return TRUE;
+ goto passthrough;
- if (GST_BUFFER_DATA (buffer)[0] >> 6)
+ if (map.data[0] >> 6)
/* Non stun packet */
- return TRUE;
+ goto passthrough;
g_assert (fs_rawudp_transmitter_udpport_is_pad (self->priv->udpport, pad));
FS_RAWUDP_COMPONENT_LOCK(self);
stunv = stun_agent_validate (&self->priv->stun_agent, &msg,
- GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), NULL, NULL);
+ map.data, map.size, NULL, NULL);
FS_RAWUDP_COMPONENT_UNLOCK(self);
/* not a valid stun message */
if (stunv != STUN_VALIDATION_SUCCESS)
- return TRUE;
+ goto passthrough;
+
stunr = stun_usage_bind_process (&msg,
(struct sockaddr *) &addr, &addr_len,
@@ -1483,7 +1491,14 @@ stun_recv_cb (GstPad *pad, GstBuffer *buffer,
fs_candidate_destroy (candidate);
- return FALSE;
+ gst_buffer_unmap (buffer, &map);
+
+ return GST_PAD_PROBE_DROP;
+
+passthrough:
+
+ gst_buffer_unmap (buffer, &map);
+ return GST_PAD_PROBE_OK;
}
static gpointer
@@ -1704,18 +1719,19 @@ fs_rawudp_component_emit_candidate (FsRawUdpComponent *self,
* This is a has "have-data" signal handler, so we return %TRUE to not
* drop the buffer
*/
-static gboolean
-buffer_recv_cb (GstPad *pad, GstBuffer *buffer, gpointer user_data)
+static GstPadProbeReturn
+buffer_recv_cb (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
FsRawUdpComponent *self = FS_RAWUDP_COMPONENT (user_data);
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+ GstNetAddressMeta *netmeta = gst_buffer_get_net_address_meta (buffer);
- if (GST_IS_NETBUFFER (buffer))
+ if (netmeta)
{
- GstNetBuffer *netbuffer = (GstNetBuffer*) buffer;
-
FS_RAWUDP_COMPONENT_LOCK (self);
if (self->priv->remote_is_unique &&
- gst_netaddress_equal (&self->priv->remote_address, &netbuffer->from))
+ fs_g_inet_socket_address_equal (self->priv->remote_address,
+ netmeta->addr))
{
FS_RAWUDP_COMPONENT_UNLOCK (self);
g_signal_emit (self, signals[KNOWN_SOURCE_PACKET_RECEIVED], 0,
@@ -1728,8 +1744,8 @@ buffer_recv_cb (GstPad *pad, GstBuffer *buffer, gpointer user_data)
}
else
{
- GST_WARNING ("received buffer thats not a NetBuffer");
+ GST_WARNING ("received buffer that does not contain a GstNetAddressMeta");
}
- return TRUE;
+ return GST_PAD_PROBE_OK;
}
diff --git a/transmitters/rawudp/fs-rawudp-transmitter.c b/transmitters/rawudp/fs-rawudp-transmitter.c
index 377de54e..c81aaddb 100644
--- a/transmitters/rawudp/fs-rawudp-transmitter.c
+++ b/transmitters/rawudp/fs-rawudp-transmitter.c
@@ -281,13 +281,13 @@ fs_rawudp_transmitter_constructed (GObject *object)
/* Lets create the RTP source funnel */
- self->priv->udpsrc_funnels[c] = gst_element_factory_make ("fsfunnel", NULL);
+ self->priv->udpsrc_funnels[c] = gst_element_factory_make ("funnel", NULL);
if (!self->priv->udpsrc_funnels[c])
{
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not make the fsfunnel element");
+ "Could not make the funnel element");
return;
}
@@ -296,11 +296,11 @@ fs_rawudp_transmitter_constructed (GObject *object)
{
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not add the fsfunnel element to the transmitter src bin");
+ "Could not add the funnel element to the transmitter src bin");
}
pad = gst_element_get_static_pad (self->priv->udpsrc_funnels[c], "src");
- padname = g_strdup_printf ("src%d", c);
+ padname = g_strdup_printf ("src_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -330,7 +330,7 @@ fs_rawudp_transmitter_constructed (GObject *object)
}
pad = gst_element_get_static_pad (self->priv->udpsink_tees[c], "sink");
- padname = g_strdup_printf ("sink%d", c);
+ padname = g_strdup_printf ("sink_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -362,7 +362,7 @@ fs_rawudp_transmitter_constructed (GObject *object)
"sync", FALSE,
NULL);
- pad = gst_element_get_request_pad (self->priv->udpsink_tees[c], "src%d");
+ pad = gst_element_get_request_pad (self->priv->udpsink_tees[c], "src_%u");
pad2 = gst_element_get_static_pad (fakesink, "sink");
ret = gst_pad_link (pad, pad2);
@@ -549,6 +549,7 @@ struct _UdpPort {
guint port;
gint fd;
+ GSocket *socket;
/* These are just convenience pointers to our parent transmitter */
GstElement *funnel;
@@ -564,7 +565,7 @@ struct _UdpPort {
struct KnownAddress {
FsRawUdpAddressUniqueCallbackFunc callback;
gpointer user_data;
- GstNetAddress addr;
+ GSocketAddress *addr;
};
static gint
@@ -645,7 +646,7 @@ _create_sinksource (
GstBin *bin,
GstElement *teefunnel,
GstElement *filter,
- gint fd,
+ GSocket *socket,
GstPadDirection direction,
gboolean do_timestamp,
GstPad **requested_pad,
@@ -667,9 +668,9 @@ _create_sinksource (
}
g_object_set (elem,
- "sockfd", fd,
"auto-multicast", FALSE,
- "closefd", FALSE,
+ "close-socket", FALSE,
+ "socket", socket,
NULL);
if (direction == GST_PAD_SINK)
@@ -692,9 +693,9 @@ _create_sinksource (
}
if (direction == GST_PAD_SINK)
- *requested_pad = gst_element_get_request_pad (teefunnel, "src%d");
+ *requested_pad = gst_element_get_request_pad (teefunnel, "src_%u");
else
- *requested_pad = gst_element_get_request_pad (teefunnel, "sink%d");
+ *requested_pad = gst_element_get_request_pad (teefunnel, "sink_%u");
if (!*requested_pad)
{
@@ -885,6 +886,10 @@ fs_rawudp_transmitter_get_udpport (FsRawUdpTransmitter *trans,
if (udpport->fd < 0)
goto error;
+ udpport->socket = g_socket_new_from_fd (udpport->fd, error);
+ if (!udpport->socket)
+ goto error;
+
/* Now lets create the elements */
udpport->tee = trans->priv->udpsink_tees[component_id];
@@ -892,14 +897,15 @@ fs_rawudp_transmitter_get_udpport (FsRawUdpTransmitter *trans,
udpport->udpsrc = _create_sinksource ("udpsrc",
GST_BIN (trans->priv->gst_src), udpport->funnel, NULL,
- udpport->fd, GST_PAD_SRC, trans->priv->do_timestamp,
+ udpport->socket, GST_PAD_SRC, trans->priv->do_timestamp,
&udpport->udpsrc_requested_pad, error);
if (!udpport->udpsrc)
goto error;
udpport->udpsink = _create_sinksource ("multiudpsink",
GST_BIN (trans->priv->gst_sink), udpport->tee, NULL,
- udpport->fd, GST_PAD_SINK, FALSE, &udpport->udpsink_requested_pad, error);
+ udpport->socket, GST_PAD_SINK, FALSE, &udpport->udpsink_requested_pad,
+ error);
if (!udpport->udpsink)
goto error;
@@ -909,8 +915,9 @@ fs_rawudp_transmitter_get_udpport (FsRawUdpTransmitter *trans,
if (udpport->recvonly_filter)
{
udpport->recvonly_udpsink = _create_sinksource ("multiudpsink",
- GST_BIN (trans->priv->gst_sink), udpport->tee, udpport->recvonly_filter,
- udpport->fd, GST_PAD_SINK, FALSE, &udpport->recvonly_requested_pad, error);
+ GST_BIN (trans->priv->gst_sink), udpport->tee,
+ udpport->recvonly_filter, udpport->socket, GST_PAD_SINK, FALSE,
+ &udpport->recvonly_requested_pad, error);
if (!udpport->recvonly_udpsink)
goto error;
}
@@ -1018,13 +1025,21 @@ fs_rawudp_transmitter_put_udpport (FsRawUdpTransmitter *trans,
GST_ERROR ("Could not remove udpsink element from transmitter source");
}
+ g_clear_object (&udpport->socket);
+
if (udpport->fd >= 0)
close (udpport->fd);
if (udpport->mutex)
g_mutex_free (udpport->mutex);
if (udpport->known_addresses)
+ {
+ guint i;
+ for (i = 0; i < udpport->known_addresses->len; i++)
+ g_object_unref (g_array_index (udpport->known_addresses,
+ struct KnownAddress, i).addr);
g_array_free (udpport->known_addresses, TRUE);
+ }
g_free (udpport->requested_ip);
g_slice_free (UdpPort, udpport);
@@ -1073,7 +1088,7 @@ fs_rawudp_transmitter_udpport_sendto (UdpPort *udpport,
gulong
fs_rawudp_transmitter_udpport_connect_recv (UdpPort *udpport,
- GCallback callback,
+ GstPadProbeCallback callback,
gpointer user_data)
{
GstPad *pad;
@@ -1081,7 +1096,9 @@ fs_rawudp_transmitter_udpport_connect_recv (UdpPort *udpport,
pad = gst_element_get_static_pad (udpport->udpsrc, "src");
- id = gst_pad_add_buffer_probe (pad, callback, user_data);
+ id = gst_pad_add_probe (pad,
+ GST_PAD_PROBE_TYPE_BUFFER,
+ callback, user_data, NULL);
gst_object_unref (pad);
@@ -1095,7 +1112,7 @@ fs_rawudp_transmitter_udpport_disconnect_recv (UdpPort *udpport,
{
GstPad *pad = gst_element_get_static_pad (udpport->udpsrc, "src");
- gst_pad_remove_buffer_probe (pad, id);
+ gst_pad_remove_probe (pad, id);
gst_object_unref (pad);
}
@@ -1133,7 +1150,7 @@ fs_rawudp_transmitter_get_stream_transmitter_type (FsTransmitter *transmitter)
/**
* fs_rawudp_transmitter_udpport_add_known_address:
* @udpport: a #UdpPort
- * @address: the new #GstNetAddress that we know
+ * @address: the new #GSocketAddress that we know
* @callback: a Callback that will be called if the uniqueness of an address
* changes
* @user_data: data passed back to the callback
@@ -1146,7 +1163,7 @@ fs_rawudp_transmitter_get_stream_transmitter_type (FsTransmitter *transmitter)
gboolean
fs_rawudp_transmitter_udpport_add_known_address (UdpPort *udpport,
- GstNetAddress *address,
+ GSocketAddress *address,
FsRawUdpAddressUniqueCallbackFunc callback,
gpointer user_data)
{
@@ -1159,11 +1176,13 @@ fs_rawudp_transmitter_udpport_add_known_address (UdpPort *udpport,
g_mutex_lock (udpport->mutex);
for (i = 0;
- g_array_index (udpport->known_addresses, struct KnownAddress, i).callback;
+ g_array_index (udpport->known_addresses,
+ struct KnownAddress, i).callback;
i++)
{
- struct KnownAddress *ka = &g_array_index (udpport->known_addresses, struct KnownAddress, i);
- if (gst_netaddress_equal (address, &ka->addr))
+ struct KnownAddress *ka = &g_array_index (udpport->known_addresses,
+ struct KnownAddress, i);
+ if (fs_g_inet_socket_address_equal (address, ka->addr))
{
g_assert (!(ka->callback == callback && ka->user_data == user_data));
@@ -1179,10 +1198,10 @@ fs_rawudp_transmitter_udpport_add_known_address (UdpPort *udpport,
else if (counter == 1)
{
if (prev_ka->callback)
- prev_ka->callback (FALSE, &prev_ka->addr, prev_ka->user_data);
+ prev_ka->callback (FALSE, prev_ka->addr, prev_ka->user_data);
}
- memcpy (&newka.addr, address, sizeof (GstNetAddress));
+ newka.addr = g_object_ref (address);
newka.callback = callback;
newka.user_data = user_data;
@@ -1208,7 +1227,7 @@ fs_rawudp_transmitter_udpport_add_known_address (UdpPort *udpport,
void
fs_rawudp_transmitter_udpport_remove_known_address (UdpPort *udpport,
- GstNetAddress *address,
+ GSocketAddress *address,
FsRawUdpAddressUniqueCallbackFunc callback,
gpointer user_data)
{
@@ -1223,8 +1242,9 @@ fs_rawudp_transmitter_udpport_remove_known_address (UdpPort *udpport,
g_array_index (udpport->known_addresses, struct KnownAddress, i).callback;
i++)
{
- struct KnownAddress *ka = &g_array_index (udpport->known_addresses, struct KnownAddress, i);
- if (gst_netaddress_equal (address, &ka->addr))
+ struct KnownAddress *ka = &g_array_index (udpport->known_addresses,
+ struct KnownAddress, i);
+ if (fs_g_inet_socket_address_equal (address, ka->addr))
{
if (ka->callback == callback && ka->user_data == user_data)
{
@@ -1245,8 +1265,10 @@ fs_rawudp_transmitter_udpport_remove_known_address (UdpPort *udpport,
}
if (counter == 1)
- prev_ka->callback (TRUE, &prev_ka->addr, prev_ka->user_data);
+ prev_ka->callback (TRUE, prev_ka->addr, prev_ka->user_data);
+ g_object_unref (g_array_index (udpport->known_addresses,
+ struct KnownAddress, remove_i).addr);
g_array_remove_index_fast (udpport->known_addresses, remove_i);
out:
@@ -1307,3 +1329,26 @@ fs_rawudp_transmitter_set_type_of_service (FsRawUdpTransmitter *self,
out:
g_mutex_unlock (self->priv->mutex);
}
+
+
+/* TEMPORARY: should be in Glib */
+gboolean
+fs_g_inet_socket_address_equal (GSocketAddress *addr1, GSocketAddress *addr2)
+{
+ GInetSocketAddress *inet1;
+ GInetSocketAddress *inet2;
+
+ if (!G_IS_INET_SOCKET_ADDRESS (addr1) || !G_IS_INET_SOCKET_ADDRESS (addr2))
+ return FALSE;
+
+ inet1 = G_INET_SOCKET_ADDRESS (addr1);
+ inet2 = G_INET_SOCKET_ADDRESS (addr2);
+
+ if (g_inet_socket_address_get_port (inet1) ==
+ g_inet_socket_address_get_port (inet2) &&
+ g_inet_address_equal (g_inet_socket_address_get_address (inet1),
+ g_inet_socket_address_get_address (inet2)))
+ return TRUE;
+ else
+ return FALSE;
+}
diff --git a/transmitters/rawudp/fs-rawudp-transmitter.h b/transmitters/rawudp/fs-rawudp-transmitter.h
index c5c18de1..23ec312f 100644
--- a/transmitters/rawudp/fs-rawudp-transmitter.h
+++ b/transmitters/rawudp/fs-rawudp-transmitter.h
@@ -27,9 +27,8 @@
#include <farstream/fs-transmitter.h>
-#include <gst/netbuffer/gstnetbuffer.h>
-
#include <gst/gst.h>
+#include <gst/net/gstnetaddressmeta.h>
#ifdef G_OS_WIN32
# include <ws2tcpip.h>
@@ -93,7 +92,7 @@ struct _FsRawUdpTransmitter
typedef struct _UdpPort UdpPort;
typedef void (*FsRawUdpAddressUniqueCallbackFunc) (gboolean unique,
- const GstNetAddress *address, gpointer user_data);
+ GSocketAddress *address, gpointer user_data);
GType fs_rawudp_transmitter_get_type (void);
@@ -123,7 +122,7 @@ gboolean fs_rawudp_transmitter_udpport_sendto (UdpPort *udpport,
GError **error);
gulong fs_rawudp_transmitter_udpport_connect_recv (UdpPort *udpport,
- GCallback callback,
+ GstPadProbeCallback callback,
gpointer user_data);
void fs_rawudp_transmitter_udpport_disconnect_recv (UdpPort *udpport,
gulong id);
@@ -135,12 +134,12 @@ gint fs_rawudp_transmitter_udpport_get_port (UdpPort *udpport);
gboolean fs_rawudp_transmitter_udpport_add_known_address (UdpPort *udpport,
- GstNetAddress *address,
+ GSocketAddress *address,
FsRawUdpAddressUniqueCallbackFunc callback,
gpointer user_data);
void fs_rawudp_transmitter_udpport_remove_known_address (UdpPort *udpport,
- GstNetAddress *address,
+ GSocketAddress *address,
FsRawUdpAddressUniqueCallbackFunc callback,
gpointer user_data);
@@ -152,6 +151,9 @@ void fs_rawudp_transmitter_udpport_remove_recvonly_dest (UdpPort *udpport,
const gchar *ip,
gint port);
+gboolean fs_g_inet_socket_address_equal (GSocketAddress *addr1,
+ GSocketAddress *addr2);
+
G_END_DECLS
#endif /* __FS_RAWUDP_TRANSMITTER_H__ */
diff --git a/transmitters/shm/fs-shm-transmitter.c b/transmitters/shm/fs-shm-transmitter.c
index af658f80..b548608a 100644
--- a/transmitters/shm/fs-shm-transmitter.c
+++ b/transmitters/shm/fs-shm-transmitter.c
@@ -346,12 +346,12 @@ fs_shm_transmitter_constructed (GObject *object)
/* Lets create the RTP source funnel */
- self->priv->funnels[c] = gst_element_factory_make ("fsfunnel", NULL);
+ self->priv->funnels[c] = gst_element_factory_make ("funnel", NULL);
if (!self->priv->funnels[c]) {
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not make the fsfunnel element");
+ "Could not make the funnel element");
return;
}
@@ -359,11 +359,11 @@ fs_shm_transmitter_constructed (GObject *object)
self->priv->funnels[c])) {
trans->construction_error = g_error_new (FS_ERROR,
FS_ERROR_CONSTRUCTION,
- "Could not add the fsfunnel element to the transmitter src bin");
+ "Could not add the funnel element to the transmitter src bin");
}
pad = gst_element_get_static_pad (self->priv->funnels[c], "src");
- padname = g_strdup_printf ("src%d", c);
+ padname = g_strdup_printf ("src_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -391,7 +391,7 @@ fs_shm_transmitter_constructed (GObject *object)
}
pad = gst_element_get_static_pad (self->priv->tees[c], "sink");
- padname = g_strdup_printf ("sink%d", c);
+ padname = g_strdup_printf ("sink_%u", c);
ghostpad = gst_ghost_pad_new (padname, pad);
g_free (padname);
gst_object_unref (pad);
@@ -422,7 +422,7 @@ fs_shm_transmitter_constructed (GObject *object)
return;
}
- pad = gst_element_get_request_pad (self->priv->tees[c], "src%d");
+ pad = gst_element_get_request_pad (self->priv->tees[c], "src_%u");
pad2 = gst_element_get_static_pad (fakesink, "sink");
ret = gst_pad_link (pad, pad2);
@@ -570,9 +570,12 @@ struct _ShmSrc {
};
-static gboolean
-src_buffer_probe_cb (GstPad *pad, GstBuffer *buffer, ShmSrc *shm)
+static GstPadProbeReturn
+src_buffer_probe_cb (GstPad *pad, GstPadProbeInfo *info, gpointer user_data)
{
+ ShmSrc *shm = user_data;
+ GstBuffer *buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+
shm->got_buffer_func (buffer, shm->component, shm->cb_data);
return TRUE;
@@ -638,7 +641,7 @@ fs_shm_transmitter_get_shm_src (FsShmTransmitter *self,
shm->src = elem;
shm->funnelpad = gst_element_get_request_pad (self->priv->funnels[component],
- "sink%d");
+ "sink_%u");
if (!shm->funnelpad)
{
@@ -659,8 +662,9 @@ fs_shm_transmitter_get_shm_src (FsShmTransmitter *self,
gst_object_unref (pad);
if (got_buffer_func)
- shm->buffer_probe = gst_pad_add_buffer_probe (shm->funnelpad,
- G_CALLBACK (src_buffer_probe_cb), shm);
+ shm->buffer_probe = gst_pad_add_probe (shm->funnelpad,
+ GST_PAD_PROBE_TYPE_BUFFER,
+ src_buffer_probe_cb, shm, NULL);
if (!gst_element_sync_state_with_parent (shm->src))
{
@@ -688,7 +692,7 @@ fs_shm_transmitter_check_shm_src (FsShmTransmitter *self, ShmSrc *shm,
return TRUE;
if (shm->buffer_probe)
- gst_pad_remove_buffer_probe (shm->funnelpad, shm->buffer_probe);
+ gst_pad_remove_probe (shm->funnelpad, shm->buffer_probe);
shm->buffer_probe = 0;
if (shm->src)
@@ -845,7 +849,7 @@ fs_shm_transmitter_get_shm_sink (FsShmTransmitter *self,
}
shm->teepad = gst_element_get_request_pad (self->priv->tees[component],
- "src%d");
+ "src_%u");
if (!shm->teepad)
{