MT#60476 call_monologue: use whole `sdp_origin` struct

Instead of using separate data members to
bring data with the `call_monologue` structure,
just use the whole `sdp_origin` object type (structure)
as a pointer and keep it aling with real SDP origin
of according monologue's side.

Refactor the code accordingly for `sdp_create()`
users (firstly only here).

Additionally introduce functions to alloc/de-alloc
`sdp_orig` object:
- `sdp_orig_dup()` returns a pointer to copied object
- `sdp_orig_free()` deallocates it

Change-Id: Iff6a777e4867e78c73ca79c73fdb73ff8e9f22eb
rfuchs/gh1842
Donat Zenichev 11 months ago
parent 860ce31f63
commit e037367878

@ -2618,29 +2618,8 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, sdp_ng_f
/* consume sdp session parts */
{
/* origin (name, version etc.) */
/* TODO: rework the whole SDP origin into one structure */
if (!ml->sdp_username && flags->session_sdp_orig.username.len)
{
ml->sdp_username = call_strdup_len(call, flags->session_sdp_orig.username.s,
flags->session_sdp_orig.username.len);
}
if (!ml->sdp_session_id && flags->session_sdp_orig.session_id.len)
{
ml->sdp_session_id = str_to_ui(&flags->session_sdp_orig.session_id, 0);
}
if (!ml->sdp_origin_ip && flags->session_sdp_orig.address.address.len)
{
ml->sdp_origin_ip = call_strdup_len(call, flags->session_sdp_orig.address.address.s,
flags->session_sdp_orig.address.address.len);
}
if (!ml->sdp_origin_ip_family && flags->session_sdp_orig.address.address_type.len)
{
ml->sdp_origin_ip_family = call_strdup_len(call, flags->session_sdp_orig.address.address_type.s,
flags->session_sdp_orig.address.address_type.len);
}
ml->sdp_version = flags->session_sdp_orig.version_num;
if (ml->sdp_version == ULLONG_MAX)
ml->sdp_version = (unsigned int)ssl_random();
if (!ml->session_sdp_orig && flags->session_sdp_orig.parsed)
ml->session_sdp_orig = sdp_orig_dup(&flags->session_sdp_orig);
/* sdp session name */
if (flags->session_sdp_name.len &&
(!ml->sdp_session_name || /* if not set yet */
@ -3988,6 +3967,8 @@ void __monologue_free(struct call_monologue *m) {
if (m->last_out_sdp)
g_string_free(m->last_out_sdp, TRUE);
str_free_dup(&m->last_in_sdp);
if (m->session_sdp_orig)
sdp_orig_free(m->session_sdp_orig);
sdp_sessions_clear(&m->last_in_sdp_parsed);
t_queue_clear_full(&m->sdp_attributes, sdp_attr_free);
sdp_streams_clear(&m->last_in_sdp_streams);

@ -1784,6 +1784,33 @@ void sdp_attr_free(struct sdp_attr *c) {
g_free(c);
}
sdp_origin *sdp_orig_dup(const sdp_origin *orig) {
sdp_origin *copy = g_slice_alloc0(sizeof(*copy));
str_init_dup_str(&copy->username, &orig->username);
str_init_dup_str(&copy->session_id, &orig->session_id);
str_init_dup_str(&copy->version_str, &orig->version_str);
copy->version_num = orig->version_num;
copy->version_output_pos = orig->version_output_pos;
copy->parsed = orig->parsed;
/* struct network_address */
str_init_dup_str(&copy->address.network_type, &orig->address.network_type);
str_init_dup_str(&copy->address.address_type, &orig->address.address_type);
str_init_dup_str(&copy->address.address, &orig->address.address);
copy->address.parsed = orig->address.parsed;
return copy;
}
void sdp_orig_free(sdp_origin *o) {
str_free_dup(&o->username);
str_free_dup(&o->session_id);
str_free_dup(&o->version_str);
str_free_dup(&o->address.network_type);
str_free_dup(&o->address.address_type);
str_free_dup(&o->address.address);
g_slice_free1(sizeof(*o), o);
}
// Duplicate all OTHER attributes from the source (parsed SDP attributes list) into
// the destination (string-format attribute list)
static void sdp_attr_append_other(sdp_attr_q *dst, struct sdp_attributes *src) {
@ -3403,8 +3430,6 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *monologue,
struct packet_stream *first_ps, sdp_ng_flags *flags)
{
struct call_monologue *ml = monologue;
const char *origin_address = NULL;
const char *origin_address_type = first_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name;
/* for the offer/answer model or subscribe don't use the given monologues SDP,
* but try the one of the subscription, because the given monologue itself
@ -3413,35 +3438,27 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *monologue,
if (ms && ms->monologue) {
ml = ms->monologue;
/* by default set to what's parsed from SDP
* but only if a replacement of origin isn't requested */
if (!flags->replace_origin)
{
if (ml->sdp_origin_ip)
origin_address = ml->sdp_origin_ip;
if (ml->sdp_origin_ip_family)
origin_address_type = ml->sdp_origin_ip_family;
/* values taken from the monologue (so parsed origin) */
if (!flags->replace_origin && ml->session_sdp_orig->parsed) {
g_string_append_printf(out,
"o="STR_FORMAT" "STR_FORMAT" %llu IN "STR_FORMAT" "STR_FORMAT"\r\n",
STR_FMT(&ml->session_sdp_orig->username),
STR_FMT(&ml->session_sdp_orig->session_id),
ml->session_sdp_orig->version_num,
STR_FMT(&ml->session_sdp_orig->address.address_type),
STR_FMT(&ml->session_sdp_orig->address.address));
return;
}
}
if (!origin_address)
/* by default for PUBLISH */
origin_address = sockaddr_print_buf(&first_ps->selected_sfd->local_intf->advertised_address.addr);
if (!ml->sdp_username)
ml->sdp_username = "-";
if (!ml->sdp_session_id)
ml->sdp_session_id = (unsigned long long) rtpe_now.tv_sec << 32 | rtpe_now.tv_usec;
if (!ml->sdp_version)
ml->sdp_version = ml->sdp_session_id;
/* default values otherwise for cases like:
* - publish
* - replace_origin flag */
unsigned long long id = (unsigned long long) rtpe_now.tv_sec << 32 | rtpe_now.tv_usec;
g_string_append_printf(out,
"o=%s %llu %llu IN %s %s\r\n",
ml->sdp_username,
ml->sdp_session_id,
ml->sdp_version,
origin_address_type,
origin_address);
"o=- %llu %llu IN %s %s\r\n", id, id,
first_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name,
sockaddr_print_buf(&first_ps->selected_sfd->local_intf->advertised_address.addr));
}
static void sdp_out_add_session_name(GString *out, struct call_monologue *monologue,

@ -334,7 +334,6 @@ struct janus_session;
struct audio_player;
struct media_subscription;
typedef bencode_buffer_t call_buffer_t;
#define call_buffer_alloc bencode_buffer_alloc
#define call_buffer_init bencode_buffer_init
@ -614,6 +613,9 @@ struct call_monologue {
char *sdp_username; /* sdp origin session name */
char *sdp_origin_ip; /* sdp origin ip */
char *sdp_origin_ip_family; /* sdp origin ip family */
sdp_origin * session_sdp_orig; /* whole o= line in a structure */
char *sdp_session_name;
char *sdp_session_timing;
struct ssrc_hash *ssrc_hash;

@ -73,6 +73,7 @@ struct sdp_ng_flags {
sdp_attr_q session_attributes; // top-level (not part of an m= section) SDP session attributes
sdp_origin session_sdp_orig;
str session_sdp_name;
str session_timing; /* t= line */
int session_rr, session_rs; /* b= bandwidth per session level */

@ -44,23 +44,6 @@ struct sdp_attr {
enum sdp_attr_type type;
};
struct network_address {
str network_type;
str address_type;
str address;
sockaddr_t parsed;
};
struct sdp_origin {
str username;
str session_id;
str version_str;
struct network_address address;
unsigned long long version_num;
size_t version_output_pos;
unsigned int parsed:1;
};
extern const str rtpe_instance_id;
void sdp_init(void);
@ -74,6 +57,8 @@ void sdp_append_str_attr(GString *s, const sdp_ng_flags *flags, enum media_type
#define sdp_append_attr(s, g, t, n, f, ...) sdp_append_str_attr(s, g, t, &STR_INIT(n), f, ##__VA_ARGS__)
void sdp_attr_free(struct sdp_attr *);
sdp_origin *sdp_orig_dup(const sdp_origin *orig);
void sdp_orig_free(sdp_origin *o);
int sdp_parse(str *body, sdp_sessions_q *sessions, const sdp_ng_flags *);
int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_flags *);

@ -2,6 +2,7 @@
#define __TYPES__H__
#include <glib.h>
#include "socket.h"
typedef struct sdp_ng_flags sdp_ng_flags;
typedef struct stats_metric stats_metric;
@ -11,6 +12,24 @@ typedef struct stream_fd stream_fd;
typedef struct rtp_payload_type rtp_payload_type;
typedef struct sdp_origin sdp_origin;
struct network_address {
str network_type;
str address_type;
str address;
sockaddr_t parsed;
};
struct sdp_origin {
str username;
str session_id;
str version_str;
struct network_address address;
unsigned long long version_num;
size_t version_output_pos;
unsigned int parsed:1;
};
typedef struct sdp_origin sdp_origin;
union sdp_attr_print_arg {
struct call_media *cm;
struct call_monologue *ml;

@ -67,7 +67,7 @@ SDP
($port_b) = answer('SIPREC pause/resume',
{ }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
o=test 1545997028 2 IN IP4 198.51.100.1
s=tester
t=0 0
a=a-dummy
@ -81,7 +81,7 @@ a=b-foo:bar
a=b-baz:quux blah
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.1
o=test 1545997028 2 IN IP4 198.51.100.1
s=tester
t=0 0
a=a-dummy
@ -105,9 +105,9 @@ snd($sock_a, $port_b, rtp(0, 4000, 7000, 0x6543, "\x00" x 160));
rcv_no($sock_c);
(undef, $ttr, undef, undef, undef, $port_c) = subscribe_request('SIPREC pause/resume',
{ 'from-tag' => ft(), flags => ['SIPREC', 'replace-origin'] }, <<SDP);
{ 'from-tag' => ft(), flags => ['SIPREC'] }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 203.0.113.1
o=- 1545997027 1 IN IP4 198.51.100.1
s=tester
t=0 0
a=s-dummy

@ -537,7 +537,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio \d+ RTP/AVP 8\r\n"
@ -613,7 +613,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=foobar\r\n"
"t=0 0\r\n"
"m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n"
@ -822,7 +822,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio \d+ RTP/AVP 8\r\n"
@ -901,7 +901,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=foobar\r\n"
"t=0 0\r\n"
"m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n"
@ -1088,7 +1088,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio \d+ RTP/SAVP 8\r\n"
@ -1187,7 +1187,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio \d+ RTP/SAVP 8\r\n"
@ -1283,7 +1283,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n"
@ -1378,7 +1378,7 @@ class TestVideoroom(unittest.TestCase):
self.assertIsInstance(sdp, str)
match_re = re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio (\d+) RTP/AVP 8\r\n"
@ -1905,7 +1905,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio \d+ RTP/AVP 8\r\n"
@ -2019,7 +2019,7 @@ class TestVideoroom(unittest.TestCase):
sdp,
re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=foobar\r\n"
"t=0 0\r\n"
"m=audio \d+ UDP/TLS/RTP/SAVPF 8\r\n"
@ -2629,7 +2629,7 @@ class TestVideoroom(unittest.TestCase):
self.assertIsInstance(sdp, str)
match_re = re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio (\d+) RTP/AVP 96\r\n"
@ -2753,7 +2753,7 @@ class TestVideoroom(unittest.TestCase):
match_re = re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio (\d+) RTP/AVP 96\r\n"
@ -3002,7 +3002,7 @@ class TestVideoroom(unittest.TestCase):
match_re = re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=rtpengine.*?\r\n"
"t=0 0\r\n"
"m=audio (\d+) RTP/AVP 96\r\n"
@ -3151,7 +3151,7 @@ class TestVideoroom(unittest.TestCase):
match_re = re.compile(
"^v=0\r\n"
"o=x \d+ \d+ IN IP4 203.0.113.1\r\n"
"o=- \d+ \d+ IN IP4 203.0.113.1\r\n"
"s=foobar\r\n"
"t=0 0\r\n"
"m=audio (\d+) RTP/AVP 96\r\n"

@ -1517,7 +1517,7 @@ SDP
answer('AMR asymmetric', {flags => ['allow asymmetric codecs']}, <<SDP);
v=0
o=- 4694032 4694033 IN IP4 10.104.1.81
o=test 4694032 4694033 IN IP4 10.104.1.81
s=-
c=IN IP4 10.104.1.141
t=0 0
@ -1534,7 +1534,7 @@ a=ptime:20
a=maxptime:40
-----------------------------------------
v=0
o=- 4694032 4694033 IN IP4 10.104.1.81
o=test 4694032 4694033 IN IP4 10.104.1.81
s=-
c=IN IP4 10.104.1.141
t=0 0
@ -1554,7 +1554,7 @@ SDP
subscribe_request('AMR asymmetric', {flags => [qw/SIPREC all/]}, <<SDP);
v=0
o=ccs-0-615-7 SDP_VERSION IN IP4 10.104.1.81
o=test SDP_VERSION IN IP4 10.104.1.81
s=-
t=0 0
m=audio PORT RTP/AVP 96 98

Loading…
Cancel
Save