summaryrefslogtreecommitdiff
path: root/gst/fsmsnconference/fs-msn-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/fsmsnconference/fs-msn-session.c')
-rw-r--r--gst/fsmsnconference/fs-msn-session.c544
1 files changed, 0 insertions, 544 deletions
diff --git a/gst/fsmsnconference/fs-msn-session.c b/gst/fsmsnconference/fs-msn-session.c
deleted file mode 100644
index cf455fd0..00000000
--- a/gst/fsmsnconference/fs-msn-session.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * Farstream - Farstream MSN Session
- *
- * Copyright 2008 Richard Spiers <richard.spiers@gmail.com>
- * Copyright 2007 Nokia Corp.
- * Copyright 2007-2009 Collabora Ltd.
- * @author: Olivier Crete <olivier.crete@collabora.co.uk>
- * @author: Youness Alaoui <youness.alaoui@collabora.co.uk>
- *
- * fs-msn-session.c - A Farstream Msn Session gobject
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * SECTION:fs-msn-session
- * @short_description: A MSN session in a #FsMsnConference
- *
- * There can be only one stream per session.
- *
- * It can afterwards be modified to pause sending (or receiving) by modifying
- * the #FsMsnStream::direction property.
- *
- * The transmitter parameters to the fs_session_new_stream() function are
- * used to set the initial value of the construct properties of the stream
- * object. This plugin does not use transmitter plugins, so the transmitter
- * parameter itself is ignored.
- *
- * The codecs preferences can not be modified and the codec is a fixed value.
- * It is always "MIMIC".
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "fs-msn-session.h"
-
-#include <string.h>
-
-#include <gst/gst.h>
-
-#include "fs-msn-stream.h"
-#include "fs-msn-participant.h"
-
-#define GST_CAT_DEFAULT fsmsnconference_debug
-
-/* Signals */
-enum
-{
- LAST_SIGNAL
-};
-
-/* props */
-enum
-{
- PROP_0,
- PROP_MEDIA_TYPE,
- PROP_ID,
- PROP_SINK_PAD,
- PROP_CODEC_PREFERENCES,
- PROP_CODECS,
- PROP_CODECS_WITHOUT_CONFIG,
- PROP_CURRENT_SEND_CODEC,
- PROP_CONFERENCE,
- PROP_TOS
-};
-
-
-
-struct _FsMsnSessionPrivate
-{
- FsMediaType media_type;
-
- FsMsnConference *conference;
- FsMsnStream *stream;
-
- GError *construction_error;
-
- GstPad *media_sink_pad;
-
- guint tos; /* Protected by conf lock */
-
- GMutex mutex; /* protects the conference */
-};
-
-G_DEFINE_TYPE (FsMsnSession, fs_msn_session, FS_TYPE_SESSION);
-
-#define FS_MSN_SESSION_GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), FS_TYPE_MSN_SESSION, FsMsnSessionPrivate))
-
-static void fs_msn_session_dispose (GObject *object);
-static void fs_msn_session_finalize (GObject *object);
-
-static void fs_msn_session_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void fs_msn_session_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-
-static void fs_msn_session_constructed (GObject *object);
-
-static FsStream *fs_msn_session_new_stream (FsSession *session,
- FsParticipant *participant,
- FsStreamDirection direction,
- GError **error);
-
-static GType
-fs_msn_session_get_stream_transmitter_type (FsSession *session,
- const gchar *transmitter);
-
-static void _remove_stream (gpointer user_data,
- GObject *where_the_object_was);
-
-static void
-fs_msn_session_class_init (FsMsnSessionClass *klass)
-{
- GObjectClass *gobject_class;
- FsSessionClass *session_class;
-
- gobject_class = (GObjectClass *) klass;
- session_class = FS_SESSION_CLASS (klass);
-
- gobject_class->set_property = fs_msn_session_set_property;
- gobject_class->get_property = fs_msn_session_get_property;
- gobject_class->constructed = fs_msn_session_constructed;
-
- session_class->new_stream = fs_msn_session_new_stream;
- session_class->get_stream_transmitter_type =
- fs_msn_session_get_stream_transmitter_type;
-
- g_object_class_override_property (gobject_class,
- PROP_MEDIA_TYPE, "media-type");
- g_object_class_override_property (gobject_class,
- PROP_ID, "id");
- g_object_class_override_property (gobject_class,
- PROP_SINK_PAD, "sink-pad");
-
- g_object_class_override_property (gobject_class,
- PROP_CODEC_PREFERENCES, "codec-preferences");
- g_object_class_override_property (gobject_class,
- PROP_CODECS, "codecs");
- g_object_class_override_property (gobject_class,
- PROP_CODECS_WITHOUT_CONFIG, "codecs-without-config");
- g_object_class_override_property (gobject_class,
- PROP_CURRENT_SEND_CODEC, "current-send-codec");
- g_object_class_override_property (gobject_class,
- PROP_TOS, "tos");
- g_object_class_override_property (gobject_class,
- PROP_CONFERENCE, "conference");
-
- gobject_class->dispose = fs_msn_session_dispose;
- gobject_class->finalize = fs_msn_session_finalize;
-
- g_type_class_add_private (klass, sizeof (FsMsnSessionPrivate));
-}
-
-static void
-fs_msn_session_init (FsMsnSession *self)
-{
- /* member init */
- self->priv = FS_MSN_SESSION_GET_PRIVATE (self);
- self->priv->construction_error = NULL;
-
- g_mutex_init (&self->priv->mutex);
-
- self->priv->media_type = FS_MEDIA_TYPE_LAST + 1;
-}
-
-
-static FsMsnConference *
-fs_msn_session_get_conference (FsMsnSession *self, GError **error)
-{
- FsMsnConference *conference;
-
- g_mutex_lock (&self->priv->mutex);
- conference = self->priv->conference;
- if (conference)
- g_object_ref (conference);
- g_mutex_unlock (&self->priv->mutex);
-
- if (!conference)
- g_set_error (error, FS_ERROR, FS_ERROR_DISPOSED,
- "Called function after session has been disposed");
-
- return conference;
-}
-
-
-static void
-fs_msn_session_dispose (GObject *object)
-{
- FsMsnSession *self = FS_MSN_SESSION (object);
- GstBin *conferencebin = NULL;
- FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
- GstElement *valve = NULL;
-
- g_mutex_lock (&self->priv->mutex);
- self->priv->conference = NULL;
- g_mutex_unlock (&self->priv->mutex);
-
- if (!conference)
- goto out;
-
- if (self->priv->stream)
- {
- g_object_weak_unref (G_OBJECT (self->priv->stream), _remove_stream, self);
- fs_stream_destroy (FS_STREAM (self->priv->stream));
- self->priv->stream = NULL;
- }
-
- conferencebin = GST_BIN (conference);
-
- if (!conferencebin)
- goto out;
-
- if (self->priv->media_sink_pad)
- gst_pad_set_active (self->priv->media_sink_pad, FALSE);
-
- GST_OBJECT_LOCK (conference);
- valve = self->valve;
- self->valve = NULL;
- GST_OBJECT_UNLOCK (conference);
-
- if (valve)
- {
- gst_element_set_locked_state (valve, TRUE);
- gst_element_set_state (valve, GST_STATE_NULL);
- gst_bin_remove (conferencebin, valve);
- }
-
- if (self->priv->media_sink_pad)
- gst_element_remove_pad (GST_ELEMENT (conference),
- self->priv->media_sink_pad);
- self->priv->media_sink_pad = NULL;
-
- gst_object_unref (conferencebin);
- gst_object_unref (conference);
-
- out:
-
- G_OBJECT_CLASS (fs_msn_session_parent_class)->dispose (object);
-}
-
-static void
-fs_msn_session_finalize (GObject *object)
-{
- FsMsnSession *self = FS_MSN_SESSION (object);
-
- g_mutex_clear (&self->priv->mutex);
-
- G_OBJECT_CLASS (fs_msn_session_parent_class)->finalize (object);
-}
-
-static void
-fs_msn_session_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- FsMsnSession *self = FS_MSN_SESSION (object);
- FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-
- if (!conference)
- return;
-
- switch (prop_id)
- {
- case PROP_MEDIA_TYPE:
- g_value_set_enum (value, self->priv->media_type);
- break;
- case PROP_ID:
- g_value_set_uint (value, 1);
- break;
- case PROP_CONFERENCE:
- g_value_set_object (value, self->priv->conference);
- break;
- case PROP_SINK_PAD:
- g_value_set_object (value, self->priv->media_sink_pad);
- break;
- case PROP_CODEC_PREFERENCES:
- /* There are no preferences, so return NULL */
- break;
- case PROP_CODECS:
- case PROP_CODECS_WITHOUT_CONFIG:
- {
- GList *codecs = NULL;
- FsCodec *mimic_codec = fs_codec_new (FS_CODEC_ID_ANY, "mimic",
- FS_MEDIA_TYPE_VIDEO, 0);
- codecs = g_list_append (codecs, mimic_codec);
- g_value_take_boxed (value, codecs);
- }
- break;
- case PROP_CURRENT_SEND_CODEC:
- {
- FsCodec *send_codec = fs_codec_new (FS_CODEC_ID_ANY, "mimic",
- FS_MEDIA_TYPE_VIDEO, 0);
- g_value_take_boxed (value, send_codec);
- break;
- }
- case PROP_TOS:
- GST_OBJECT_LOCK (conference);
- g_value_set_uint (value, self->priv->tos);
- GST_OBJECT_UNLOCK (conference);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-
- gst_object_unref (conference);
-}
-
-static void
-fs_msn_session_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- FsMsnSession *self = FS_MSN_SESSION (object);
- FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-
- if (!conference && !(pspec->flags & G_PARAM_CONSTRUCT_ONLY))
- return;
-
- switch (prop_id)
- {
- case PROP_MEDIA_TYPE:
- self->priv->media_type = g_value_get_enum (value);
- break;
- case PROP_ID:
- break;
- case PROP_CONFERENCE:
- self->priv->conference = FS_MSN_CONFERENCE (g_value_dup_object (value));
- break;
- case PROP_TOS:
- if (conference)
- GST_OBJECT_LOCK (conference);
- self->priv->tos = g_value_get_uint (value);
- if (self->priv->stream)
- fs_msn_stream_set_tos_locked (self->priv->stream, self->priv->tos);
- if (conference)
- GST_OBJECT_UNLOCK (conference);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-
- if (conference)
- gst_object_unref (conference);
-}
-
-static void
-fs_msn_session_constructed (GObject *object)
-{
- FsMsnSession *self = FS_MSN_SESSION (object);
- GstPad *pad;
-
- g_assert (self->priv->conference);
-
- self->valve = gst_element_factory_make ("valve", NULL);
-
- if (!self->valve)
- {
- self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION, "Could not make sink valve");
- return;
- }
-
- if (!gst_bin_add (GST_BIN (self->priv->conference), self->valve))
- {
- self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION, "Could not add valve to conference");
- return;
- }
-
- g_object_set (G_OBJECT (self->valve), "drop", TRUE, NULL);
-
- pad = gst_element_get_static_pad (self->valve, "sink");
- self->priv->media_sink_pad = gst_ghost_pad_new ("sink1", pad);
- gst_object_unref (pad);
-
- if (!self->priv->media_sink_pad)
- {
- self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION, "Could not create sink ghost pad");
- return;
- }
-
- gst_pad_set_active (self->priv->media_sink_pad, TRUE);
- if (!gst_element_add_pad (GST_ELEMENT (self->priv->conference),
- self->priv->media_sink_pad))
- {
- self->priv->construction_error = g_error_new (FS_ERROR,
- FS_ERROR_CONSTRUCTION, "Could not add sink pad to conference");
- gst_object_unref (self->priv->media_sink_pad);
- self->priv->media_sink_pad = NULL;
- return;
- }
-
- gst_element_sync_state_with_parent (self->valve);
-
- if (G_OBJECT_CLASS (fs_msn_session_parent_class)->constructed)
- G_OBJECT_CLASS (fs_msn_session_parent_class)->constructed (object);
-}
-
-
-static void
-_remove_stream (gpointer user_data,
- GObject *where_the_object_was)
-{
- FsMsnSession *self = FS_MSN_SESSION (user_data);
- FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
-
- if (!conference)
- return;
-
- GST_OBJECT_LOCK (conference);
- if (self->priv->stream == (FsMsnStream *) where_the_object_was)
- self->priv->stream = NULL;
- GST_OBJECT_UNLOCK (conference);
- gst_object_unref (conference);
-}
-
-/**
- * fs_msn_session_new_stream:
- * @session: an #FsMsnSession
- * @participant: #FsParticipant of a participant for the new stream
- * @direction: #FsStreamDirection describing the direction of the new stream
- * that will be created for this participant
- * @error: location of a #GError, or NULL if no error occured
- *
- * This function creates a stream for the given participant into the active
- * session.
- *
- * Returns: the new #FsStream that has been created. User must unref the
- * #FsStream when the stream is ended. If an error occured, returns NULL.
- */
-static FsStream *
-fs_msn_session_new_stream (FsSession *session,
- FsParticipant *participant,
- FsStreamDirection direction,
- GError **error)
-{
- FsMsnSession *self = FS_MSN_SESSION (session);
- FsMsnParticipant *msnparticipant = NULL;
- FsStream *new_stream = NULL;
- FsMsnConference *conference;
-
- if (!FS_IS_MSN_PARTICIPANT (participant))
- {
- g_set_error (error, FS_ERROR, FS_ERROR_INVALID_ARGUMENTS,
- "You have to provide a participant of type MSN");
- return NULL;
- }
-
- conference = fs_msn_session_get_conference (self, error);
- if (!conference)
- return FALSE;
-
- GST_OBJECT_LOCK (conference);
- if (self->priv->stream)
- goto already_have_stream;
- GST_OBJECT_UNLOCK (conference);
-
- msnparticipant = FS_MSN_PARTICIPANT (participant);
-
- new_stream = FS_STREAM_CAST (fs_msn_stream_new (self, msnparticipant,
- direction, conference));
-
- GST_OBJECT_LOCK (conference);
- if (self->priv->stream)
- {
- g_object_unref (new_stream);
- goto already_have_stream;
- }
- self->priv->stream = (FsMsnStream *) new_stream;
- g_object_weak_ref (G_OBJECT (new_stream), _remove_stream, self);
-
- fs_msn_stream_set_tos_locked (self->priv->stream, self->priv->tos);
- GST_OBJECT_UNLOCK (conference);
-
- gst_object_unref (conference);
-
-
- return new_stream;
-
- already_have_stream:
- GST_OBJECT_UNLOCK (conference);
- gst_object_unref (conference);
-
- g_set_error (error, FS_ERROR, FS_ERROR_ALREADY_EXISTS,
- "There already is a stream in this session");
- return NULL;
-}
-
-FsMsnSession *
-fs_msn_session_new (FsMediaType media_type,
- FsMsnConference *conference,
- GError **error)
-{
- FsMsnSession *session = g_object_new (FS_TYPE_MSN_SESSION,
- "media-type", media_type,
- "conference", conference,
- NULL);
-
- if (!session)
- {
- *error = g_error_new (FS_ERROR, FS_ERROR_CONSTRUCTION,
- "Could not create object");
- }
- else if (session->priv->construction_error)
- {
- g_propagate_error (error, session->priv->construction_error);
- g_object_unref (session);
- return NULL;
- }
-
- return session;
-}
-
-
-static GType
-fs_msn_session_get_stream_transmitter_type (FsSession *session,
- const gchar *transmitter)
-{
- return FS_TYPE_MSN_STREAM;
-}