|
|
|
|
@ -35,6 +35,7 @@ struct sdp_origin {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct sdp_connection {
|
|
|
|
|
str s;
|
|
|
|
|
struct network_address address;
|
|
|
|
|
int parsed:1;
|
|
|
|
|
};
|
|
|
|
|
@ -69,6 +70,7 @@ struct sdp_media {
|
|
|
|
|
int port_count;
|
|
|
|
|
|
|
|
|
|
struct sdp_connection connection;
|
|
|
|
|
const char *c_line_pos;
|
|
|
|
|
int rr, rs;
|
|
|
|
|
struct sdp_attributes attributes;
|
|
|
|
|
GQueue format_list; /* list of slice-alloc'd str objects */
|
|
|
|
|
@ -348,6 +350,8 @@ static int parse_connection(str *value_str, struct sdp_connection *output) {
|
|
|
|
|
if (output->parsed)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
output->s = *value_str;
|
|
|
|
|
|
|
|
|
|
EXTRACT_NETWORK_ADDRESS(address);
|
|
|
|
|
|
|
|
|
|
output->parsed = 1;
|
|
|
|
|
@ -1090,6 +1094,9 @@ new_session:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'm':
|
|
|
|
|
if (media && !media->c_line_pos)
|
|
|
|
|
media->c_line_pos = b;
|
|
|
|
|
|
|
|
|
|
media = g_slice_alloc0(sizeof(*media));
|
|
|
|
|
media->session = session;
|
|
|
|
|
attrs_init(&media->attributes);
|
|
|
|
|
@ -1111,6 +1118,9 @@ new_session:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'a':
|
|
|
|
|
if (media && !media->c_line_pos)
|
|
|
|
|
media->c_line_pos = b;
|
|
|
|
|
|
|
|
|
|
attr = g_slice_alloc0(sizeof(*attr));
|
|
|
|
|
|
|
|
|
|
attr->full_line.s = b;
|
|
|
|
|
@ -1140,6 +1150,9 @@ new_session:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'b':
|
|
|
|
|
if (media && !media->c_line_pos)
|
|
|
|
|
media->c_line_pos = b;
|
|
|
|
|
|
|
|
|
|
/* RR:0 */
|
|
|
|
|
if (line_end - value < 4)
|
|
|
|
|
break;
|
|
|
|
|
@ -1151,6 +1164,11 @@ new_session:
|
|
|
|
|
(line_end - value == 4 && value[3] == '0') ? 0 : 1;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 'k':
|
|
|
|
|
if (media && !media->c_line_pos)
|
|
|
|
|
media->c_line_pos = b;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 's':
|
|
|
|
|
case 'i':
|
|
|
|
|
case 'u':
|
|
|
|
|
@ -1159,7 +1177,6 @@ new_session:
|
|
|
|
|
case 't':
|
|
|
|
|
case 'r':
|
|
|
|
|
case 'z':
|
|
|
|
|
case 'k':
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
@ -1839,6 +1856,22 @@ static int replace_network_address(struct sdp_chopper *chop, struct network_addr
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int synth_session_connection(struct sdp_chopper *chop, struct sdp_media *sdp_media) {
|
|
|
|
|
if (!sdp_media->session->connection.s.s)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
if (sdp_media->c_line_pos)
|
|
|
|
|
copy_up_to_ptr(chop, sdp_media->c_line_pos);
|
|
|
|
|
else
|
|
|
|
|
copy_up_to_end_of(chop, chop->input);
|
|
|
|
|
|
|
|
|
|
chopper_append_c(chop, "c=");
|
|
|
|
|
chopper_append_str(chop, &sdp_media->session->connection.s);
|
|
|
|
|
chopper_append_c(chop, "\n");
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void sdp_chopper_destroy(struct sdp_chopper *chop) {
|
|
|
|
|
g_string_free(chop->output, TRUE);
|
|
|
|
|
g_slice_free1(sizeof(*chop), chop);
|
|
|
|
|
@ -2318,7 +2351,7 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
|
|
|
|
|
goto error;
|
|
|
|
|
ps = j->data;
|
|
|
|
|
|
|
|
|
|
if (!flags->ice_force_relay) {
|
|
|
|
|
if (!flags->ice_force_relay && call_media->type_id != MT_MESSAGE) {
|
|
|
|
|
if (replace_media_type(chop, sdp_media, call_media))
|
|
|
|
|
goto error;
|
|
|
|
|
if (replace_media_port(chop, sdp_media, ps))
|
|
|
|
|
@ -2336,6 +2369,13 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (call_media->type_id == MT_MESSAGE) {
|
|
|
|
|
if (!sdp_media->connection.parsed)
|
|
|
|
|
if (synth_session_connection(chop, sdp_media))
|
|
|
|
|
goto error;
|
|
|
|
|
// leave everything untouched
|
|
|
|
|
goto next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (process_media_attributes(chop, sdp_media, flags, call_media))
|
|
|
|
|
goto error;
|
|
|
|
|
|