[farsight2/master] msn: Stream locking completed
Olivier Crête
olivier.crete at collabora.co.uk
Tue Jul 14 09:50:51 PDT 2009
---
gst/fsmsnconference/fs-msn-session.c | 12 ++-
gst/fsmsnconference/fs-msn-stream.c | 202 ++++++++++++++++++++++++----------
2 files changed, 152 insertions(+), 62 deletions(-)
diff --git a/gst/fsmsnconference/fs-msn-session.c b/gst/fsmsnconference/fs-msn-session.c
index 4c33d63..fa6bf4d 100644
--- a/gst/fsmsnconference/fs-msn-session.c
+++ b/gst/fsmsnconference/fs-msn-session.c
@@ -281,7 +281,7 @@ fs_msn_session_get_property (GObject *object,
FsMsnSession *self = FS_MSN_SESSION (object);
FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
- if (!conference)
+ if (!conference && !(pspec->flags & G_PARAM_CONSTRUCT_ONLY))
return;
switch (prop_id)
@@ -332,7 +332,8 @@ fs_msn_session_get_property (GObject *object,
break;
}
- gst_object_unref (conference);
+ if (conference)
+ gst_object_unref (conference);
}
static void
@@ -344,7 +345,7 @@ fs_msn_session_set_property (GObject *object,
FsMsnSession *self = FS_MSN_SESSION (object);
FsMsnConference *conference = fs_msn_session_get_conference (self, NULL);
- if (!conference)
+ if (!conference && !(pspec->flags & G_PARAM_CONSTRUCT_ONLY))
return;
switch (prop_id)
@@ -374,7 +375,8 @@ fs_msn_session_set_property (GObject *object,
break;
}
- gst_object_unref (conference);
+ if (conference)
+ gst_object_unref (conference);
}
static void
@@ -383,6 +385,8 @@ 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)
diff --git a/gst/fsmsnconference/fs-msn-stream.c b/gst/fsmsnconference/fs-msn-stream.c
index 66d8a38..40690f5 100644
--- a/gst/fsmsnconference/fs-msn-stream.c
+++ b/gst/fsmsnconference/fs-msn-stream.c
@@ -132,7 +132,6 @@ fs_msn_stream_class_init (FsMsnStreamClass *klass)
gobject_class->dispose = fs_msn_stream_dispose;
gobject_class->finalize = fs_msn_stream_finalize;
-
stream_class->set_remote_candidates = fs_msn_stream_set_remote_candidates;
@@ -213,9 +212,7 @@ fs_msn_stream_dispose (GObject *object)
if (self->priv->recv_valve)
{
- gst_element_set_locked_state (self->priv->recv_valve, TRUE);
- gst_element_set_state (self->priv->recv_valve, GST_STATE_NULL);
- gst_bin_remove (GST_BIN (conference), self->priv->recv_valve);
+ gst_object_unref (self->priv->recv_valve);
self->priv->recv_valve = NULL;
}
@@ -269,6 +266,14 @@ fs_msn_stream_get_property (GObject *object,
GParamSpec *pspec)
{
FsMsnStream *self = FS_MSN_STREAM (object);
+ FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
+
+ if (!conference &&
+ !(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)))
+ return;
+
+ if (conference)
+ GST_OBJECT_LOCK (conference);
switch (prop_id)
{
@@ -288,6 +293,12 @@ fs_msn_stream_get_property (GObject *object,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
+
+ if (conference)
+ {
+ GST_OBJECT_UNLOCK (conference);
+ gst_object_unref (conference);
+ }
}
static void
@@ -297,6 +308,14 @@ fs_msn_stream_set_property (GObject *object,
GParamSpec *pspec)
{
FsMsnStream *self = FS_MSN_STREAM (object);
+ FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
+
+ if (!conference &&
+ !(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)))
+ return;
+
+ if (conference)
+ GST_OBJECT_LOCK (conference);
switch (prop_id)
{
@@ -345,6 +364,12 @@ fs_msn_stream_set_property (GObject *object,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
+
+ if (conference)
+ {
+ GST_OBJECT_UNLOCK (conference);
+ gst_object_unref (conference);
+ }
}
static void
@@ -403,13 +428,18 @@ _local_candidates_prepared (FsMsnConnection *connection,
gpointer user_data)
{
FsMsnStream *self = FS_MSN_STREAM (user_data);
+ FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
+
+ if (!conference)
+ return;
- gst_element_post_message (GST_ELEMENT (self->priv->conference),
- gst_message_new_element (GST_OBJECT (self->priv->conference),
+ gst_element_post_message (GST_ELEMENT (conference),
+ gst_message_new_element (GST_OBJECT (conference),
gst_structure_new ("farsight-local-candidates-prepared",
"stream", FS_TYPE_STREAM, self,
NULL)));
+ gst_object_unref (conference);
}
static void
@@ -419,13 +449,19 @@ _new_local_candidate (
gpointer user_data)
{
FsMsnStream *self = FS_MSN_STREAM (user_data);
+ FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
- gst_element_post_message (GST_ELEMENT (self->priv->conference),
- gst_message_new_element (GST_OBJECT (self->priv->conference),
+ if (!conference)
+ return;
+
+ gst_element_post_message (GST_ELEMENT (conference),
+ gst_message_new_element (GST_OBJECT (conference),
gst_structure_new ("farsight-new-local-candidate",
"stream", FS_TYPE_STREAM, self,
"candidate", FS_TYPE_CANDIDATE, candidate,
NULL)));
+
+ gst_object_unref (conference);
}
static void
@@ -439,39 +475,44 @@ _connected (
GstPad *pad;
GstElement *fdelem;
int checkfd;
+ FsMsnConference *conference = fs_msn_stream_get_conference (self, NULL);
+ GstElement *codecbin = NULL;
+ GstElement *recv_valve = NULL;
+ GstElement *send_valve = NULL;
+ gboolean drop;
+
+ if (!conference)
+ goto error;
GST_DEBUG ("******** CONNECTED %d**********", fd);
if (self->priv->orig_direction == FS_DIRECTION_RECV)
- self->priv->codecbin = gst_parse_bin_from_description (
+ codecbin = gst_parse_bin_from_description (
"fdsrc name=fdsrc ! mimdec ! valve name=recv_valve", TRUE, &error);
else
- self->priv->codecbin = gst_parse_bin_from_description (
+ codecbin = gst_parse_bin_from_description (
"ffmpegcolorspace ! videoscale ! mimenc ! fdsink name=fdsink",
TRUE, &error);
- if (!self->priv->codecbin)
+ if (!codecbin)
{
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not build codecbin", error->message);
g_clear_error (&error);
- return;
+ goto error;
}
-
if (self->priv->orig_direction == FS_DIRECTION_RECV)
- fdelem = gst_bin_get_by_name (GST_BIN (self->priv->codecbin), "fdsrc");
+ fdelem = gst_bin_get_by_name (GST_BIN (codecbin), "fdsrc");
else
- fdelem = gst_bin_get_by_name (GST_BIN (self->priv->codecbin), "fdsink");
+ fdelem = gst_bin_get_by_name (GST_BIN (codecbin), "fdsink");
if (!fdelem)
{
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not get fd element",
"Could not get fd element");
- gst_object_unref (self->priv->codecbin);
- self->priv->codecbin = NULL;
- return;
+ goto error;
}
g_object_set (fdelem, "fd", fd, NULL);
@@ -482,79 +523,101 @@ _connected (
{
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_INTERNAL,
"Could not set file descriptor", "Could not set fd");
- gst_object_unref (self->priv->codecbin);
- self->priv->codecbin = NULL;
- return;
+ goto error;
}
if (self->priv->orig_direction == FS_DIRECTION_RECV)
- pad = gst_element_get_static_pad (self->priv->codecbin, "src");
+ pad = gst_element_get_static_pad (codecbin, "src");
else
- pad = gst_element_get_static_pad (self->priv->codecbin, "sink");
+ pad = gst_element_get_static_pad (codecbin, "sink");
if (!pad)
{
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not get codecbin pad",
"Could not get codecbin pad");
- gst_object_unref (self->priv->codecbin);
- self->priv->codecbin = NULL;
- return;
+ goto error;
}
- if (!gst_bin_add (GST_BIN (self->priv->conference), self->priv->codecbin))
+ GST_OBJECT_LOCK (conference);
+ self->priv->codecbin = gst_object_ref (codecbin);
+ GST_OBJECT_UNLOCK (conference);
+
+ if (!gst_bin_add (GST_BIN (conference), codecbin))
{
+ gst_object_unref (pad);
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not add codecbin to the conference",
"Could not add codecbin to the conference");
- gst_object_unref (pad);
- gst_object_unref (self->priv->codecbin);
- self->priv->codecbin = NULL;
- return;
+ goto error;
}
if (self->priv->orig_direction == FS_DIRECTION_RECV)
{
FsCodec *mimic_codec;
+ GstPad *src_pad;
- self->priv->src_pad = gst_ghost_pad_new ("src_1_1_1", pad);
+ src_pad = gst_ghost_pad_new ("src_1_1_1", pad);
gst_object_unref (pad);
- if (!gst_element_add_pad (GST_ELEMENT (self->priv->conference),
- self->priv->src_pad))
+ GST_OBJECT_LOCK (conference);
+ self->priv->src_pad = gst_object_ref (src_pad);
+ GST_OBJECT_UNLOCK (conference);
+
+ gst_pad_set_active (src_pad, TRUE);
+ if (!gst_element_add_pad (GST_ELEMENT (conference), src_pad))
{
- fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
- "Could not add src_1_1_1 pad",
- "Could not add src_1_1_1 pad");
- gst_object_unref (self->priv->src_pad);
- self->priv->src_pad = NULL;
- return;
+ fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
+ "Could not add src_1_1_1 pad",
+ "Could not add src_1_1_1 pad");
+ gst_object_unref (src_pad);
+ goto error;
}
- self->priv->recv_valve = fdelem = gst_bin_get_by_name (
- GST_BIN (self->priv->codecbin), "recv_valve");
+ recv_valve = gst_bin_get_by_name (GST_BIN (codecbin), "recv_valve");
- if (!self->priv->recv_valve)
+ if (!recv_valve)
{
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not get recv_valve",
"Could not get recv_valve");
- return;
+ gst_object_unref (src_pad);
+ goto error;
}
- g_object_set (self->priv->recv_valve,
- "drop", !(self->priv->direction & FS_DIRECTION_RECV), NULL);
+ GST_OBJECT_LOCK (conference);
+ self->priv->recv_valve = gst_object_ref (recv_valve);
+ drop = !(self->priv->direction & FS_DIRECTION_RECV);
+ GST_OBJECT_UNLOCK (conference);
+
+ g_object_set (recv_valve, "drop", drop, NULL);
+
mimic_codec = fs_codec_new (0, "mimic",
FS_MEDIA_TYPE_VIDEO, 0);
- fs_stream_emit_src_pad_added (FS_STREAM (self), self->priv->src_pad,
- mimic_codec);
+ fs_stream_emit_src_pad_added (FS_STREAM (self), src_pad, mimic_codec);
fs_codec_destroy (mimic_codec);
+ gst_object_unref (src_pad);
+
}
else
{
- GstPad *valvepad = gst_element_get_static_pad (self->priv->session->valve,
- "src");
+ GstPad *valvepad;
+
+ GST_OBJECT_LOCK (conference);
+ if (self->priv->session->valve)
+ send_valve = gst_object_ref (self->priv->session->valve);
+ GST_OBJECT_UNLOCK (conference);
+
+ if (!send_valve)
+ {
+ fs_stream_emit_error (FS_STREAM (self), FS_ERROR_DISPOSED,
+ "Session was disposed",
+ "Session was disposed");
+ goto error;
+ }
+
+ valvepad = gst_element_get_static_pad (send_valve, "src");
if (!valvepad)
{
@@ -562,7 +625,7 @@ _connected (
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not get valve sink pad",
"Could not get valve sink pad");
- return;
+ goto error;
}
if (GST_PAD_LINK_FAILED (gst_pad_link (valvepad, pad)))
@@ -572,24 +635,38 @@ _connected (
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not link valve to codec bin",
"Could not link valve to codec bin");
- return;
+ goto error;
}
gst_object_unref (valvepad);
gst_object_unref (pad);
}
- if (!gst_element_sync_state_with_parent (self->priv->codecbin))
+ if (!gst_element_sync_state_with_parent (codecbin))
{
fs_stream_emit_error (FS_STREAM (self), FS_ERROR_CONSTRUCTION,
"Could not start codec bin",
"Could not start codec bin");
- return;
+ goto error;
}
+ if (self->priv->orig_direction == FS_DIRECTION_SEND)
+ {
+ GST_OBJECT_LOCK (conference);
+ drop = !(self->priv->direction & FS_DIRECTION_SEND);
+ GST_OBJECT_UNLOCK (conference);
+ g_object_set (send_valve, "drop", drop, NULL);
+ }
- if (self->priv->direction == FS_DIRECTION_SEND)
- g_object_set (self->priv->recv_valve,
- "drop", !(self->priv->direction & FS_DIRECTION_SEND), NULL);
+ error:
+
+ if (send_valve)
+ gst_object_unref (send_valve);
+ if (recv_valve)
+ gst_object_unref (recv_valve);
+ if (codecbin)
+ gst_object_unref (codecbin);
+ if (conference)
+ gst_object_unref (conference);
}
/**
@@ -600,9 +677,18 @@ fs_msn_stream_set_remote_candidates (FsStream *stream, GList *candidates,
GError **error)
{
FsMsnStream *self = FS_MSN_STREAM (stream);
+ FsMsnConference *conference = fs_msn_stream_get_conference (self, error);
+ gboolean ret;
- return fs_msn_connection_set_remote_candidates (self->priv->connection,
+ if (error)
+ return FALSE;
+
+ GST_OBJECT_LOCK (conference);
+ ret = fs_msn_connection_set_remote_candidates (self->priv->connection,
candidates, error);
+ GST_OBJECT_UNLOCK (conference);
+
+ return ret;
}
--
1.5.6.5
More information about the farsight-commits
mailing list