mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2025-01-06 03:25:31 +00:00
sip: media-pipeline: only create pipeline after codec negotiation
This commit is contained in:
parent
c2bd6e9344
commit
a5a9f728ae
1 changed files with 55 additions and 19 deletions
|
@ -45,6 +45,13 @@ struct _CallsSipCall
|
|||
|
||||
CallsSipMediaManager *manager;
|
||||
CallsSipMediaPipeline *pipeline;
|
||||
|
||||
guint lport_rtp;
|
||||
guint lport_rtcp;
|
||||
guint rport_rtp;
|
||||
guint rport_rtcp;
|
||||
gchar *remote;
|
||||
|
||||
nua_handle_t *nh;
|
||||
GList *codecs;
|
||||
};
|
||||
|
@ -63,6 +70,43 @@ enum {
|
|||
static GParamSpec *props[PROP_LAST_PROP];
|
||||
|
||||
|
||||
static gboolean
|
||||
try_setting_up_media_pipeline (CallsSipCall *self)
|
||||
{
|
||||
g_assert (CALLS_SIP_CALL (self));
|
||||
|
||||
if (self->codecs == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (self->pipeline == NULL) {
|
||||
MediaCodecInfo *codec = (MediaCodecInfo *) self->codecs->data;
|
||||
self->pipeline = calls_sip_media_pipeline_new (codec);
|
||||
}
|
||||
|
||||
if (!self->lport_rtp || !self->lport_rtcp || !self->remote ||
|
||||
!self->rport_rtp || !self->rport_rtcp)
|
||||
return FALSE;
|
||||
|
||||
g_debug ("Setting local ports: RTP/RTCP %u/%u",
|
||||
self->lport_rtp, self->lport_rtcp);
|
||||
|
||||
g_object_set (G_OBJECT (self->pipeline),
|
||||
"lport-rtp", self->lport_rtp,
|
||||
"lport-rtcp", self->lport_rtcp,
|
||||
NULL);
|
||||
|
||||
g_debug ("Setting remote ports: RTP/RTCP %u/%u",
|
||||
self->rport_rtp, self->rport_rtcp);
|
||||
|
||||
g_object_set (G_OBJECT (self->pipeline),
|
||||
"remote", self->remote,
|
||||
"rport-rtp", self->rport_rtp,
|
||||
"rport-rtcp", self->rport_rtcp,
|
||||
NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const char *
|
||||
calls_sip_call_get_number (CallsCall *call)
|
||||
{
|
||||
|
@ -213,6 +257,7 @@ calls_sip_call_finalize (GObject *object)
|
|||
g_clear_object (&self->pipeline);
|
||||
}
|
||||
g_clear_pointer (&self->codecs, g_list_free);
|
||||
g_clear_pointer (&self->remote, g_free);
|
||||
|
||||
G_OBJECT_CLASS (calls_sip_call_parent_class)->finalize (object);
|
||||
}
|
||||
|
@ -251,13 +296,7 @@ calls_sip_call_message_source_interface_init (CallsMessageSourceInterface *iface
|
|||
static void
|
||||
calls_sip_call_init (CallsSipCall *self)
|
||||
{
|
||||
MediaCodecInfo *best_codec;
|
||||
|
||||
self->manager = calls_sip_media_manager_default ();
|
||||
|
||||
best_codec = get_best_codec (self->manager);
|
||||
|
||||
self->pipeline = calls_sip_media_pipeline_new (best_codec);
|
||||
}
|
||||
|
||||
|
||||
|
@ -267,13 +306,11 @@ calls_sip_call_setup_local_media_connection (CallsSipCall *self,
|
|||
guint port_rtcp)
|
||||
{
|
||||
g_return_if_fail (CALLS_IS_SIP_CALL (self));
|
||||
g_return_if_fail (CALLS_IS_SIP_MEDIA_PIPELINE (self->pipeline));
|
||||
|
||||
g_debug ("Setting local ports: RTP/RTCP %u/%u", port_rtp, port_rtcp);
|
||||
g_object_set (G_OBJECT (self->pipeline),
|
||||
"lport-rtp", port_rtp,
|
||||
"lport-rtcp", port_rtcp,
|
||||
NULL);
|
||||
self->lport_rtp = port_rtp;
|
||||
self->lport_rtcp = port_rtcp;
|
||||
|
||||
try_setting_up_media_pipeline (self);
|
||||
}
|
||||
|
||||
|
||||
|
@ -284,14 +321,13 @@ calls_sip_call_setup_remote_media_connection (CallsSipCall *self,
|
|||
guint port_rtcp)
|
||||
{
|
||||
g_return_if_fail (CALLS_IS_SIP_CALL (self));
|
||||
g_return_if_fail (CALLS_IS_SIP_MEDIA_PIPELINE (self->pipeline));
|
||||
|
||||
g_debug ("Setting remote ports: RTP/RTCP %u/%u", port_rtp, port_rtcp);
|
||||
g_object_set (G_OBJECT (self->pipeline),
|
||||
"remote", remote,
|
||||
"rport-rtp", port_rtp,
|
||||
"rport-rtcp", port_rtcp,
|
||||
NULL);
|
||||
g_free (self->remote);
|
||||
self->remote = g_strdup (remote);
|
||||
self->rport_rtp = port_rtp;
|
||||
self->rport_rtcp = port_rtcp;
|
||||
|
||||
try_setting_up_media_pipeline (self);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue