mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2024-11-13 03:51:17 +00:00
sip: media-pipeline: Remove lport-rtp and lport-rtcp property
We're not setting the desired ports from the outside anymore, but rather querying the ports that have been allocated by the operating system. Therefore the lport-rtp and lport-rtcp property have become superfluous and are being removed. We also adapt to changes outside of the pipeline code.
This commit is contained in:
parent
aeebdfbf53
commit
849f298609
9 changed files with 39 additions and 97 deletions
|
@ -65,8 +65,6 @@ struct _CallsSipCall
|
|||
|
||||
char *ip;
|
||||
|
||||
guint lport_rtp;
|
||||
guint lport_rtcp;
|
||||
guint rport_rtp;
|
||||
guint rport_rtcp;
|
||||
gchar *remote;
|
||||
|
@ -97,18 +95,6 @@ try_setting_up_media_pipeline (CallsSipCall *self)
|
|||
calls_sip_media_pipeline_set_codec (self->pipeline, 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);
|
||||
|
||||
|
@ -127,7 +113,7 @@ calls_sip_call_answer (CallsCall *call)
|
|||
{
|
||||
CallsSipCall *self;
|
||||
g_autofree gchar *local_sdp = NULL;
|
||||
guint local_port = get_port_for_rtp ();
|
||||
guint rtp_port, rtcp_port;
|
||||
|
||||
g_assert (CALLS_IS_CALL (call));
|
||||
g_assert (CALLS_IS_SIP_CALL (call));
|
||||
|
@ -141,12 +127,15 @@ calls_sip_call_answer (CallsCall *call)
|
|||
return;
|
||||
}
|
||||
|
||||
/* TODO get free port by creating GSocket and passing that to the pipeline */
|
||||
calls_sip_call_setup_local_media_connection (self, local_port, local_port + 1);
|
||||
rtp_port = calls_sip_media_pipeline_get_rtp_port (self->pipeline);
|
||||
rtcp_port = calls_sip_media_pipeline_get_rtcp_port (self->pipeline);
|
||||
|
||||
calls_sip_call_setup_local_media_connection (self);
|
||||
|
||||
local_sdp = calls_sip_media_manager_get_capabilities (self->manager,
|
||||
self->ip,
|
||||
local_port,
|
||||
rtp_port,
|
||||
rtcp_port,
|
||||
FALSE,
|
||||
self->codecs);
|
||||
|
||||
|
@ -317,19 +306,13 @@ calls_sip_call_init (CallsSipCall *self)
|
|||
/**
|
||||
* calls_sip_call_setup_local_media_connection:
|
||||
* @self: A #CallsSipCall
|
||||
* @port_rtp: The RTP port on the the local host
|
||||
* @port_rtcp: The RTCP port on the local host
|
||||
*/
|
||||
void
|
||||
calls_sip_call_setup_local_media_connection (CallsSipCall *self,
|
||||
guint port_rtp,
|
||||
guint port_rtcp)
|
||||
calls_sip_call_setup_local_media_connection (CallsSipCall *self)
|
||||
{
|
||||
g_return_if_fail (CALLS_IS_SIP_CALL (self));
|
||||
|
||||
self->lport_rtp = port_rtp;
|
||||
self->lport_rtcp = port_rtcp;
|
||||
|
||||
/* XXX maybe we can get rid of this completely */
|
||||
try_setting_up_media_pipeline (self);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,9 +45,7 @@ void calls_sip_call_setup_remote_media_connection (CallsSi
|
|||
const char *remote,
|
||||
guint port_rtp,
|
||||
guint port_rtcp);
|
||||
void calls_sip_call_setup_local_media_connection (CallsSipCall *self,
|
||||
guint port_rtp,
|
||||
guint port_rtcp);
|
||||
void calls_sip_call_setup_local_media_connection (CallsSipCall *self);
|
||||
void calls_sip_call_activate_media (CallsSipCall *self,
|
||||
gboolean enabled);
|
||||
void calls_sip_call_set_state (CallsSipCall *self,
|
||||
|
|
|
@ -222,7 +222,8 @@ calls_sip_media_manager_default (void)
|
|||
char *
|
||||
calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
||||
const char *own_ip,
|
||||
guint port,
|
||||
gint rtp_port,
|
||||
gint rtcp_port,
|
||||
gboolean use_srtp,
|
||||
GList *supported_codecs)
|
||||
{
|
||||
|
@ -245,7 +246,7 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
|||
|
||||
/* media lines look f.e like "audio 31337 RTP/AVP 9 8 0" */
|
||||
g_string_append_printf (media_line,
|
||||
"m=audio %d RTP/%s", port, payload_type);
|
||||
"m=audio %d RTP/%s", rtp_port, payload_type);
|
||||
|
||||
for (node = supported_codecs; node != NULL; node = node->next) {
|
||||
MediaCodecInfo *codec = node->data;
|
||||
|
@ -259,7 +260,7 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
|||
"\r\n");
|
||||
}
|
||||
|
||||
g_string_append_printf (attribute_lines, "a=rtcp:%d\r\n", port + 1);
|
||||
g_string_append_printf (attribute_lines, "a=rtcp:%d\r\n", rtcp_port);
|
||||
|
||||
done:
|
||||
if (own_ip && *own_ip)
|
||||
|
@ -287,7 +288,8 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
|||
/* calls_sip_media_manager_static_capabilities:
|
||||
*
|
||||
* @self: A #CallsSipMediaManager
|
||||
* @port: Should eventually come from the ICE stack
|
||||
* @rtp_port: Port to use for RTP. Should eventually come from the ICE stack
|
||||
* @rtcp_port: Port to use for RTCP.Should eventually come from the ICE stack
|
||||
* @use_srtp: Whether to use srtp (not really handled)
|
||||
*
|
||||
* Returns: (transfer full): string describing capabilities
|
||||
|
@ -296,14 +298,16 @@ calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
|||
char *
|
||||
calls_sip_media_manager_static_capabilities (CallsSipMediaManager *self,
|
||||
const char *own_ip,
|
||||
guint port,
|
||||
gint rtp_port,
|
||||
gint rtcp_port,
|
||||
gboolean use_srtp)
|
||||
{
|
||||
g_return_val_if_fail (CALLS_IS_SIP_MEDIA_MANAGER (self), NULL);
|
||||
|
||||
return calls_sip_media_manager_get_capabilities (self,
|
||||
own_ip,
|
||||
port,
|
||||
rtp_port,
|
||||
rtcp_port,
|
||||
use_srtp,
|
||||
self->preferred_codecs);
|
||||
}
|
||||
|
|
|
@ -40,12 +40,14 @@ G_DECLARE_FINAL_TYPE (CallsSipMediaManager, calls_sip_media_manager, CALLS, SIP_
|
|||
CallsSipMediaManager* calls_sip_media_manager_default (void);
|
||||
gchar* calls_sip_media_manager_get_capabilities (CallsSipMediaManager *self,
|
||||
const char *own_ip,
|
||||
guint port,
|
||||
gint rtp_port,
|
||||
gint rtcp_port,
|
||||
gboolean use_srtp,
|
||||
GList *supported_codecs);
|
||||
gchar* calls_sip_media_manager_static_capabilities (CallsSipMediaManager *self,
|
||||
const char *own_ip,
|
||||
guint port,
|
||||
gint rtp_port,
|
||||
gint rtcp_port,
|
||||
gboolean use_srtp);
|
||||
gboolean calls_sip_media_manager_supports_media (CallsSipMediaManager *self,
|
||||
const char *media_type);
|
||||
|
|
|
@ -95,9 +95,7 @@ enum {
|
|||
PROP_0,
|
||||
PROP_CODEC,
|
||||
PROP_REMOTE,
|
||||
PROP_LPORT_RTP,
|
||||
PROP_RPORT_RTP,
|
||||
PROP_LPORT_RTCP,
|
||||
PROP_RPORT_RTCP,
|
||||
PROP_DEBUG,
|
||||
PROP_STATE,
|
||||
|
@ -128,10 +126,8 @@ struct _CallsSipMediaPipeline {
|
|||
char *remote;
|
||||
|
||||
gint rport_rtp;
|
||||
gint lport_rtp;
|
||||
|
||||
gint rport_rtcp;
|
||||
gint lport_rtcp;
|
||||
|
||||
/* Gstreamer Elements (sending) */
|
||||
GstElement *send_pipeline;
|
||||
|
@ -740,14 +736,6 @@ calls_sip_media_pipeline_get_property (GObject *object,
|
|||
g_value_set_string (value, self->remote);
|
||||
break;
|
||||
|
||||
case PROP_LPORT_RTP:
|
||||
g_value_set_uint (value, self->lport_rtp);
|
||||
break;
|
||||
|
||||
case PROP_LPORT_RTCP:
|
||||
g_value_set_uint (value, self->lport_rtcp);
|
||||
break;
|
||||
|
||||
case PROP_RPORT_RTP:
|
||||
g_value_set_uint (value, self->rport_rtp);
|
||||
break;
|
||||
|
@ -789,14 +777,6 @@ calls_sip_media_pipeline_set_property (GObject *object,
|
|||
self->remote = g_value_dup_string (value);
|
||||
break;
|
||||
|
||||
case PROP_LPORT_RTP:
|
||||
self->lport_rtp = g_value_get_uint (value);
|
||||
break;
|
||||
|
||||
case PROP_LPORT_RTCP:
|
||||
self->lport_rtcp = g_value_get_uint (value);
|
||||
break;
|
||||
|
||||
case PROP_RPORT_RTP:
|
||||
self->rport_rtp = g_value_get_uint (value);
|
||||
break;
|
||||
|
@ -884,18 +864,6 @@ calls_sip_media_pipeline_class_init (CallsSipMediaPipelineClass *klass)
|
|||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
props[PROP_LPORT_RTP] = g_param_spec_uint ("lport-rtp",
|
||||
"lport-rtp",
|
||||
"local rtp port",
|
||||
1025, 65535, 5002,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
props[PROP_LPORT_RTCP] = g_param_spec_uint ("lport-rtcp",
|
||||
"lport-rtcp",
|
||||
"local rtcp port",
|
||||
1025, 65535, 5003,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
props[PROP_RPORT_RTP] = g_param_spec_uint ("rport-rtp",
|
||||
"rport-rtp",
|
||||
"remote rtp port",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Purism SPC
|
||||
* Copyright (C) 2021-2022 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
|
@ -239,10 +239,11 @@ add_call (CallsSipOrigin *self,
|
|||
g_autofree gchar *local_sdp = NULL;
|
||||
g_auto (GStrv) address_split = NULL;
|
||||
const char *call_address = address;
|
||||
gint rtp_port, rtcp_port;
|
||||
|
||||
/* TODO get free port by creating GSocket and passing that to the pipeline */
|
||||
guint local_port = get_port_for_rtp ();
|
||||
pipeline = calls_sip_media_manager_get_pipeline (self->media_manager);
|
||||
rtp_port = calls_sip_media_pipeline_get_rtp_port (pipeline);
|
||||
rtcp_port = calls_sip_media_pipeline_get_rtcp_port (pipeline);
|
||||
|
||||
if (self->can_tel) {
|
||||
address_split = g_strsplit_set (address, ":@;", -1);
|
||||
|
@ -271,11 +272,12 @@ add_call (CallsSipOrigin *self,
|
|||
self);
|
||||
|
||||
if (!inbound) {
|
||||
calls_sip_call_setup_local_media_connection (sip_call, local_port, local_port + 1);
|
||||
calls_sip_call_setup_local_media_connection (sip_call);
|
||||
|
||||
local_sdp = calls_sip_media_manager_static_capabilities (self->media_manager,
|
||||
self->own_ip,
|
||||
local_port,
|
||||
rtp_port,
|
||||
rtcp_port,
|
||||
FALSE);
|
||||
|
||||
g_assert (local_sdp);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2021 Purism SPC
|
||||
* Copyright (C) 2021-2022 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
|
@ -61,17 +61,3 @@ protocol_is_valid (const char *protocol)
|
|||
g_strcmp0 (protocol, "TCP") == 0 ||
|
||||
g_strcmp0 (protocol, "TLS") == 0;
|
||||
}
|
||||
|
||||
#define RTP_PORT_MIN 20000
|
||||
#define RTP_PORT_MAX 65534
|
||||
guint
|
||||
get_port_for_rtp (void)
|
||||
{
|
||||
const guint rand_range = RTP_PORT_MAX - RTP_PORT_MIN;
|
||||
guint rand = (g_random_int () % rand_range) + RTP_PORT_MIN;
|
||||
|
||||
/* RTP ports must be even */
|
||||
return rand % 2 == 0 ? rand : rand + 1;
|
||||
}
|
||||
#undef RTP_PORT_MIN
|
||||
#undef RTP_PORT_MAX
|
||||
|
|
|
@ -62,4 +62,3 @@ gboolean check_sips (const char *addr);
|
|||
gboolean check_ipv6 (const char *host);
|
||||
const char *get_protocol_prefix (const char *protocol);
|
||||
gboolean protocol_is_valid (const char *protocol);
|
||||
guint get_port_for_rtp (void);
|
||||
|
|
|
@ -48,7 +48,7 @@ test_sip_media_manager_caps (void)
|
|||
|
||||
/* PCMA RTP */
|
||||
sdp_message =
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 40002, FALSE, codecs);
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 40002, 40003, FALSE, codecs);
|
||||
|
||||
g_assert_true (sdp_message);
|
||||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
|
@ -64,7 +64,7 @@ test_sip_media_manager_caps (void)
|
|||
|
||||
/* PCMA SRTP */
|
||||
sdp_message =
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 42002, TRUE, codecs);
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 42002, 42003, TRUE, codecs);
|
||||
g_assert_true (sdp_message);
|
||||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
"m=audio 42002 RTP/SAVP 8"));
|
||||
|
@ -78,7 +78,7 @@ test_sip_media_manager_caps (void)
|
|||
codecs = g_list_append (NULL, media_codec_by_name ("G722"));
|
||||
|
||||
sdp_message =
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 42042, FALSE, codecs);
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 42042, 55543, FALSE, codecs);
|
||||
|
||||
g_assert_true (sdp_message);
|
||||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
|
@ -86,7 +86,7 @@ test_sip_media_manager_caps (void)
|
|||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
"a=rtpmap:9 G722/8000"));
|
||||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
"a=rtcp:42043"));
|
||||
"a=rtcp:55543"));
|
||||
|
||||
g_clear_pointer (&codecs, g_list_free);
|
||||
g_free (sdp_message);
|
||||
|
@ -99,7 +99,7 @@ test_sip_media_manager_caps (void)
|
|||
codecs = g_list_append (codecs, media_codec_by_name ("PCMA"));
|
||||
|
||||
sdp_message =
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 33340, FALSE, codecs);
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 33340, 33341, FALSE, codecs);
|
||||
|
||||
g_assert_true (sdp_message);
|
||||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
|
@ -123,7 +123,7 @@ test_sip_media_manager_caps (void)
|
|||
codecs = g_list_append (codecs, media_codec_by_name ("PCMU"));
|
||||
|
||||
sdp_message =
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 18098, TRUE, codecs);
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 18098, 18099, TRUE, codecs);
|
||||
|
||||
g_assert_true (sdp_message);
|
||||
g_assert_true (find_string_in_sdp_message (sdp_message,
|
||||
|
@ -138,7 +138,7 @@ test_sip_media_manager_caps (void)
|
|||
g_test_expect_message ("CallsSipMediaManager", G_LOG_LEVEL_WARNING,
|
||||
"No supported codecs found. Can't build meaningful SDP message");
|
||||
sdp_message =
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 25048, FALSE, NULL);
|
||||
calls_sip_media_manager_get_capabilities (manager, NULL, 25048, 25049, FALSE, NULL);
|
||||
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert_true (sdp_message);
|
||||
|
|
Loading…
Reference in a new issue