TT#45472 support SDP fragments for trickle ICE

Change-Id: I31880b5cf837a078bdb75e86dd425136bf829e4c
changes/68/25368/2
Richard Fuchs 7 years ago
parent 3603cda0c4
commit d08d84071a

@ -609,6 +609,8 @@ static void call_ng_flags_flags(struct sdp_ng_flags *out, str *s, void *dummy) {
out->reset = 1; out->reset = 1;
else if (!str_cmp(s, "all")) else if (!str_cmp(s, "all"))
out->all = 1; out->all = 1;
else if (!str_cmp(s, "fragment"))
out->fragment = 1;
else if (!str_cmp(s, "port-latching")) else if (!str_cmp(s, "port-latching"))
out->port_latching = 1; out->port_latching = 1;
else if (!str_cmp(s, "generate-mid")) else if (!str_cmp(s, "generate-mid"))
@ -833,7 +835,7 @@ static const char *call_offer_answer_ng(bencode_item_t *input,
} }
errstr = "Failed to parse SDP"; errstr = "Failed to parse SDP";
if (sdp_parse(&sdp, &parsed)) if (sdp_parse(&sdp, &parsed, &flags))
goto out; goto out;
if (flags.loop_protect && sdp_is_duplicate(&parsed)) { if (flags.loop_protect && sdp_is_duplicate(&parsed)) {
@ -854,7 +856,8 @@ static const char *call_offer_answer_ng(bencode_item_t *input,
* to establish session with another rtpengine2 even though rtpengine1 * to establish session with another rtpengine2 even though rtpengine1
* might have persisted part of the session. rtpengine2 deletes previous * might have persisted part of the session. rtpengine2 deletes previous
* call in memory and recreates an OWN call in redis */ * call in memory and recreates an OWN call in redis */
if (opmode == OP_OFFER) { // SDP fragments for trickle ICE must always operate on an existing call
if (opmode == OP_OFFER && !flags.fragment) {
if (call) { if (call) {
if (IS_FOREIGN_CALL(call)) { if (IS_FOREIGN_CALL(call)) {
/* destroy call and create new one */ /* destroy call and create new one */
@ -909,8 +912,11 @@ static const char *call_offer_answer_ng(bencode_item_t *input,
recording_start(call, NULL, &flags.metadata); recording_start(call, NULL, &flags.metadata);
ret = monologue_offer_answer(monologue, &streams, &flags); ret = monologue_offer_answer(monologue, &streams, &flags);
if (!ret) if (!ret) {
ret = sdp_replace(chopper, &parsed, monologue->active_dialogue, &flags); // SDP fragments for trickle ICE are consumed with no replacement returned
if (!flags.fragment)
ret = sdp_replace(chopper, &parsed, monologue->active_dialogue, &flags);
}
struct recording *recording = call->recording; struct recording *recording = call->recording;
if (recording != NULL) { if (recording != NULL) {
@ -943,7 +949,8 @@ static const char *call_offer_answer_ng(bencode_item_t *input,
if (ret) if (ret)
goto out; goto out;
bencode_dictionary_add_string(output, "sdp", chopper->output->str); if (chopper->output->len)
bencode_dictionary_add_string(output, "sdp", chopper->output->str);
errstr = NULL; errstr = NULL;
out: out:

@ -877,7 +877,7 @@ static int parse_attribute(struct sdp_attribute *a) {
return ret; return ret;
} }
int sdp_parse(str *body, GQueue *sessions) { int sdp_parse(str *body, GQueue *sessions, const struct sdp_ng_flags *flags) {
char *b, *end, *value, *line_end, *next_line; char *b, *end, *value, *line_end, *next_line;
struct sdp_session *session = NULL; struct sdp_session *session = NULL;
struct sdp_media *media = NULL; struct sdp_media *media = NULL;
@ -915,8 +915,12 @@ int sdp_parse(str *body, GQueue *sessions) {
} }
errstr = "SDP doesn't start with a session definition"; errstr = "SDP doesn't start with a session definition";
if (!session && b[0] != 'v') if (!session && b[0] != 'v') {
goto error; if (!flags->fragment)
goto error;
else
goto new_session; // allowed for trickle ICE SDP fragments
}
str value_str; str value_str;
str_init_len(&value_str, value, line_end - value); str_init_len(&value_str, value, line_end - value);
@ -929,6 +933,7 @@ int sdp_parse(str *body, GQueue *sessions) {
if (value[0] != '0') if (value[0] != '0')
goto error; goto error;
new_session:
session = g_slice_alloc0(sizeof(*session)); session = g_slice_alloc0(sizeof(*session));
g_queue_init(&session->media_streams); g_queue_init(&session->media_streams);
attrs_init(&session->attributes); attrs_init(&session->attributes);

@ -59,6 +59,7 @@ struct sdp_ng_flags {
dtls_passive:1, dtls_passive:1,
reset:1, reset:1,
all:1, all:1,
fragment:1,
record_call:1, record_call:1,
loop_protect:1, loop_protect:1,
always_transcode:1, always_transcode:1,

@ -19,7 +19,7 @@ struct sdp_chopper {
void sdp_init(void); void sdp_init(void);
int sdp_parse(str *body, GQueue *sessions); int sdp_parse(str *body, GQueue *sessions, const struct sdp_ng_flags *);
int sdp_streams(const GQueue *sessions, GQueue *streams, struct sdp_ng_flags *); int sdp_streams(const GQueue *sessions, GQueue *streams, struct sdp_ng_flags *);
void sdp_free(GQueue *sessions); void sdp_free(GQueue *sessions);
int sdp_replace(struct sdp_chopper *, GQueue *, struct call_monologue *, struct sdp_ng_flags *); int sdp_replace(struct sdp_chopper *, GQueue *, struct call_monologue *, struct sdp_ng_flags *);

@ -62,6 +62,7 @@ GetOptions(
'address=s' => \$options{'address'}, 'address=s' => \$options{'address'},
'pad-crypto' => \$options{'pad crypto'}, 'pad-crypto' => \$options{'pad crypto'},
'generate-mid' => \$options{'generate mid'}, 'generate-mid' => \$options{'generate mid'},
'fragment' => \$options{'fragment'},
) or die; ) or die;
my $cmd = shift(@ARGV) or die; my $cmd = shift(@ARGV) or die;
@ -74,7 +75,7 @@ for my $x (split(/,/, 'from-tag,to-tag,call-id,transport protocol,media address,
for my $x (split(/,/, 'TOS,delete-delay')) { for my $x (split(/,/, 'TOS,delete-delay')) {
defined($options{$x}) and $packet{$x} = $options{$x}; defined($options{$x}) and $packet{$x} = $options{$x};
} }
for my $x (split(/,/, 'trust address,symmetric,asymmetric,force,strict source,media handover,sip source address,reset,port latching,no rtcp attribute,loop protect,record call,always transcode,all,pad crypto,generate mid')) { for my $x (split(/,/, 'trust address,symmetric,asymmetric,force,strict source,media handover,sip source address,reset,port latching,no rtcp attribute,loop protect,record call,always transcode,all,pad crypto,generate mid,fragment')) {
defined($options{$x}) and push(@{$packet{flags}}, $x); defined($options{$x}) and push(@{$packet{flags}}, $x);
} }
for my $x (split(/,/, 'origin,session connection')) { for my $x (split(/,/, 'origin,session connection')) {

Loading…
Cancel
Save