summaryrefslogtreecommitdiff
path: root/rakia/sip-media.c
diff options
context:
space:
mode:
Diffstat (limited to 'rakia/sip-media.c')
-rw-r--r--rakia/sip-media.c86
1 files changed, 74 insertions, 12 deletions
diff --git a/rakia/sip-media.c b/rakia/sip-media.c
index f3a967b..37cb0ad 100644
--- a/rakia/sip-media.c
+++ b/rakia/sip-media.c
@@ -113,6 +113,8 @@ struct _RakiaSipMediaPrivate
GPtrArray *remote_codec_offer;
GPtrArray *remote_candidates;
+
+ gboolean can_receive;
};
@@ -856,9 +858,6 @@ rakia_sip_media_set_remote_media (RakiaSipMedia *media,
/* Check if there was any media update at all */
- if (old_media)
- g_debug ("old m %d new m %d", old_media->m_mode, new_media->m_mode);
-
new_direction = rakia_direction_from_remote_media (new_media);
@@ -954,7 +953,14 @@ rakia_sip_media_is_codec_intersect_pending (RakiaSipMedia *self)
gboolean
rakia_sip_media_is_ready (RakiaSipMedia *self)
{
- return (self->priv->local_candidates_prepared && self->priv->local_codecs);
+ RakiaSipMediaPrivate *priv = RAKIA_SIP_MEDIA_GET_PRIVATE (self);
+
+ if (priv->requested_direction & RAKIA_DIRECTION_RECEIVE && !priv->can_receive)
+ return FALSE;
+
+ return (self->priv->local_candidates_prepared &&
+ self->priv->local_codecs &&
+ !priv->codec_intersect_pending);
}
void
@@ -966,18 +972,38 @@ rakia_sip_media_take_local_codecs (RakiaSipMedia *self, GPtrArray *local_codecs)
g_ptr_array_unref (priv->local_codecs);
priv->local_codecs = local_codecs;
- if (priv->codec_intersect_pending)
+ MEDIA_DEBUG (self, "New local codecs intersect_pending: %d "
+ "push_candidates: %d candidates_prepared: %d",
+ priv->codec_intersect_pending, priv->push_candidates_on_new_codecs,
+ priv->local_candidates_prepared);
+
+
+ if (priv->push_remote_codecs_pending)
+ {
+ priv->push_remote_codecs_pending = FALSE;
+ push_remote_codecs (self);
+ }
+ else if (priv->codec_intersect_pending)
{
if (priv->push_candidates_on_new_codecs)
{
/* Push the new candidates now that we have new codecs */
+ priv->push_candidates_on_new_codecs = FALSE;
push_remote_candidates (self);
}
- priv->codec_intersect_pending = FALSE;
- if (priv->local_candidates_prepared)
- g_signal_emit (self, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0,
+ priv->codec_intersect_pending = FALSE;
+ if (rakia_sip_media_is_ready (self))
+ {
+ g_signal_emit (self, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0,
TRUE);
+ g_ptr_array_unref (priv->remote_codec_offer);
+ priv->remote_codec_offer = NULL;
+ }
+ }
+ else
+ {
+ rakia_sip_media_local_updated (self);
}
}
@@ -1013,9 +1039,11 @@ rakia_sip_media_local_candidates_prepared (RakiaSipMedia *self)
self->priv->local_candidates_prepared = TRUE;
- if (self->priv->local_codecs)
- g_signal_emit (self, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0,
- TRUE);
+ if (rakia_sip_media_is_ready (self))
+ {
+ g_signal_emit (self, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0,
+ TRUE);
+ }
return TRUE;
}
@@ -1090,7 +1118,20 @@ rakia_sip_media_get_session (RakiaSipMedia *media)
void
rakia_sip_media_codecs_rejected (RakiaSipMedia *media)
{
- g_signal_emit (media, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0, FALSE);
+ RakiaSipMediaPrivate *priv = RAKIA_SIP_MEDIA_GET_PRIVATE (media);
+
+ if (priv->push_remote_codecs_pending)
+ {
+ priv->push_remote_codecs_pending = FALSE;
+ push_remote_codecs (media);
+ }
+ else
+ {
+ priv->codec_intersect_pending = FALSE;
+ g_signal_emit (media, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0, FALSE);
+ g_ptr_array_unref (priv->remote_codec_offer);
+ priv->remote_codec_offer = NULL;
+ }
}
RakiaDirection
@@ -1118,3 +1159,24 @@ rakia_sip_media_is_held (RakiaSipMedia *media)
{
return !(media->priv->direction & RAKIA_DIRECTION_SEND);
}
+
+void
+rakia_sip_media_set_can_receive (RakiaSipMedia *media, gboolean can_receive)
+{
+ RakiaSipMediaPrivate *priv = RAKIA_SIP_MEDIA_GET_PRIVATE (media);
+
+ if (priv->can_receive == can_receive)
+ return;
+
+ priv->can_receive = can_receive;
+
+ if (rakia_sip_media_is_ready (media))
+ {
+ g_signal_emit (media, signals[SIG_LOCAL_NEGOTIATION_COMPLETE], 0, TRUE);
+ if (priv->remote_codec_offer)
+ {
+ g_ptr_array_unref (priv->remote_codec_offer);
+ priv->remote_codec_offer = NULL;
+ }
+ }
+}