Browse Source

MT#57719 Provide some of attributes list via `stream_params`

We have to move the list of attributes with following types
to the `call_media`'s `sdp_attributes` using `stream_params`:
 ATTR_SSRC
 ATTR_MSID
 ATTR_OTHER

This is then required by the `insert_sdp_attributes()`
used by:
- `sdp_replace()` -> `replace_sdp_media_section()`
- `sdp_create()`

Additionally: move the `insert_sdp_attributes()`
to the usage of the `append_attr_to_gstring()`, which
gives SDP attrs manipulations control over attributes
being inserted into SDP. Previously not supported.

Additionally: `process_media_attributes()` takes new
argument `bool strip_attr_other`, in order to control
whether or not to strip `ATTR_OTHER/ATTR_SSRC/ATTR_MSID`.
For now there is only one user of it `replace_sdp_media_section()`,
but for later on, we can control this using this bool.

Additionally: `print_sdp_media_section()` takes new
argument `bool print_other_attrs`, in order to control
whether or not to strip `ATTR_OTHER/ATTR_SSRC/ATTR_MSID`.
This is required, because the sdp replacing/creating mechanism
needs a controllable way of adding them, users are:
- `janus_videoroom_join()`
  `janus_videoroom_configure()` - always need them
- `call_publish_ng` - always needs them
- `call_subscribe_request_ng` - never needs them
  (otherwise leads to a duplication of such attributes)
- `call_offer_answer_ng()` - requires them always
- `call_subscribe_request_ng()` - never needs them
  (otherwise leads to a duplication of such attributes)

Change-Id: I9c83d99da1603acb55443c462797b2cd1e72477d
pull/1752/head
Donat Zenichev 2 years ago
parent
commit
71aa1496b3
8 changed files with 197 additions and 81 deletions
  1. +14
    -0
      daemon/call.c
  2. +4
    -4
      daemon/call_interfaces.c
  3. +2
    -2
      daemon/janus.c
  4. +101
    -16
      daemon/sdp.c
  5. +1
    -0
      include/call.h
  6. +4
    -2
      include/sdp.h
  7. +16
    -0
      t/auto-daemon-tests-websocket.py
  8. +55
    -57
      t/auto-daemon-tests.pl

+ 14
- 0
daemon/call.c View File

@ -2637,6 +2637,7 @@ static void __media_init_from_flags(struct call_media *other_media, struct call_
struct stream_params *sp, struct sdp_ng_flags *flags) struct stream_params *sp, struct sdp_ng_flags *flags)
{ {
struct call *call = other_media->call; struct call *call = other_media->call;
GQueue *additional_attributes = &sp->attributes; /* attributes in str format */
if (flags && flags->opmode == OP_OFFER && flags->reset) { if (flags && flags->opmode == OP_OFFER && flags->reset) {
if (media) if (media)
@ -2719,6 +2720,19 @@ static void __media_init_from_flags(struct call_media *other_media, struct call_
} }
} }
/* moved as plain text attributes, required later by sdp_create()
* ssrc
* other (unknown type)
*/
if (media && additional_attributes && additional_attributes->head) {
g_queue_clear_full(&media->sdp_attributes, free);
for (const GList *l = additional_attributes->head; l; l = l->next) {
str *source_attr = l->data;
str * destination_attr = str_dup(source_attr);
g_queue_push_tail(&media->sdp_attributes, destination_attr);
}
}
// codec and RTP payload types handling // codec and RTP payload types handling
if (sp->ptime > 0) { if (sp->ptime > 0) {
if (media && !MEDIA_ISSET(media, PTIME_OVERRIDE)) if (media && !MEDIA_ISSET(media, PTIME_OVERRIDE))


+ 4
- 4
daemon/call_interfaces.c View File

@ -2078,7 +2078,7 @@ static const char *call_offer_answer_ng(struct ng_buffer *ngbuf, bencode_item_t
ret = monologue_offer_answer(monologues, &streams, &flags); ret = monologue_offer_answer(monologues, &streams, &flags);
if (!ret) if (!ret)
ret = sdp_replace(chopper, &parsed, to_ml, &flags);
ret = sdp_replace(chopper, &parsed, to_ml, &flags, true);
if (!ret) if (!ret)
save_last_sdp(from_ml, &sdp, &parsed, &streams); save_last_sdp(from_ml, &sdp, &parsed, &streams);
@ -3415,7 +3415,7 @@ const char *call_publish_ng(struct ng_buffer *ngbuf, bencode_item_t *input, benc
if (ret) if (ret)
ilog(LOG_ERR, "Publish error"); // XXX close call? handle errors? ilog(LOG_ERR, "Publish error"); // XXX close call? handle errors?
ret = sdp_create(&sdp_out, ml, &flags);
ret = sdp_create(&sdp_out, ml, &flags, true);
if (!ret) { if (!ret) {
save_last_sdp(ml, &sdp_in, &parsed, &streams); save_last_sdp(ml, &sdp_in, &parsed, &streams);
bencode_buffer_destroy_add(output->buffer, g_free, sdp_out.s); bencode_buffer_destroy_add(output->buffer, g_free, sdp_out.s);
@ -3491,12 +3491,12 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out
return "Failed to request subscription"; return "Failed to request subscription";
if (chopper && sdp_ml) { if (chopper && sdp_ml) {
ret = sdp_replace(chopper, &sdp_ml->last_in_sdp_parsed, dest_ml, &flags);
ret = sdp_replace(chopper, &sdp_ml->last_in_sdp_parsed, dest_ml, &flags, false);
if (ret) if (ret)
return "Failed to rewrite SDP"; return "Failed to rewrite SDP";
} else { } else {
/* create new SDP */ /* create new SDP */
ret = sdp_create(&sdp_out, dest_ml, &flags);
ret = sdp_create(&sdp_out, dest_ml, &flags, false);
} }
/* place return output SDP */ /* place return output SDP */


+ 2
- 2
daemon/janus.c View File

@ -630,7 +630,7 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan
return "Subscribe error"; return "Subscribe error";
/* create SDP */ /* create SDP */
ret = sdp_create(jsep_sdp_out, dest_ml, &flags);
ret = sdp_create(jsep_sdp_out, dest_ml, &flags, true);
if (!dest_ml->janus_session) if (!dest_ml->janus_session)
dest_ml->janus_session = obj_get(session); dest_ml->janus_session = obj_get(session);
@ -865,7 +865,7 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc
// XXX check there's only one audio and one video stream? // XXX check there's only one audio and one video stream?
AUTO_CLEANUP(str sdp_out, str_free_dup) = STR_NULL; AUTO_CLEANUP(str sdp_out, str_free_dup) = STR_NULL;
ret = sdp_create(&sdp_out, ml, &flags);
ret = sdp_create(&sdp_out, ml, &flags, true);
if (ret) if (ret)
return "Publish error"; return "Publish error";


+ 101
- 16
daemon/sdp.c View File

@ -258,6 +258,13 @@ struct sdp_attribute {
ATTR_T38FAXTRANSCODINGMMR, ATTR_T38FAXTRANSCODINGMMR,
ATTR_T38FAXTRANSCODINGJBIG, ATTR_T38FAXTRANSCODINGJBIG,
ATTR_T38FAXRATEMANAGEMENT, ATTR_T38FAXRATEMANAGEMENT,
ATTR_T38MAXBITRATE,
ATTR_T38FAXMAXBUFFER,
ATTR_XG726BITORDER,
ATTR_MAXPTIME,
ATTR_DIRECTION,
ATTR_LABEL,
ATTR_MSID,
ATTR_TLS_ID, ATTR_TLS_ID,
ATTR_END_OF_CANDIDATES, ATTR_END_OF_CANDIDATES,
} attr; } attr;
@ -1171,6 +1178,27 @@ static int parse_attribute(struct sdp_attribute *a) {
case CSH_LOOKUP("T38FaxRateManagement"): case CSH_LOOKUP("T38FaxRateManagement"):
ret = parse_attribute_t38faxratemanagement(a); ret = parse_attribute_t38faxratemanagement(a);
break; break;
case CSH_LOOKUP("T38MaxBitRate"):
a->attr = ATTR_T38MAXBITRATE;
break;
case CSH_LOOKUP("T38FaxMaxBuffer"):
a->attr = ATTR_T38FAXMAXBUFFER;
break;
case CSH_LOOKUP("xg726bitorder"):
a->attr = ATTR_XG726BITORDER;
break;
case CSH_LOOKUP("maxptime"):
a->attr = ATTR_MAXPTIME;
break;
case CSH_LOOKUP("label"):
a->attr = ATTR_LABEL;
break;
case CSH_LOOKUP("direction"):
a->attr = ATTR_DIRECTION;
break;
case CSH_LOOKUP("msid"):
a->attr = ATTR_MSID;
break;
} }
return ret; return ret;
@ -1618,6 +1646,7 @@ static void sp_free(void *p) {
codec_store_cleanup(&s->codecs); codec_store_cleanup(&s->codecs);
ice_candidates_free(&s->ice_candidates); ice_candidates_free(&s->ice_candidates);
crypto_params_sdes_queue_clear(&s->sdes_params); crypto_params_sdes_queue_clear(&s->sdes_params);
g_queue_clear_full(&s->attributes, free);
g_slice_free1(sizeof(*s), s); g_slice_free1(sizeof(*s), s);
} }
@ -1781,6 +1810,30 @@ int sdp_streams(const GQueue *sessions, GQueue *streams, struct sdp_ng_flags *fl
cps->params.session_params.unauthenticated_srtp = attr->crypto.unauthenticated_srtp; cps->params.session_params.unauthenticated_srtp = attr->crypto.unauthenticated_srtp;
} }
/* a=ssrc, move them via plain text attributes, required later by sdp_create() */
attrs = attr_list_get_by_id(&media->attributes, ATTR_SSRC);
for (GList *ll = attrs ? attrs->head : NULL; ll; ll = ll->next) {
attr = ll->data;
str * ret = str_dup(&attr->line_value);
g_queue_push_tail(&sp->attributes, ret);
}
/* a=msid, move via plain text attributes, required later by sdp_create() */
attrs = attr_list_get_by_id(&media->attributes, ATTR_MSID);
for (GList *ll = attrs ? attrs->head : NULL; ll; ll = ll->next) {
attr = ll->data;
str * ret = str_dup(&attr->line_value);
g_queue_push_tail(&sp->attributes, ret);
}
/* move all other unknown type attributes also, required later by sdp_create() */
attrs = attr_list_get_by_id(&media->attributes, ATTR_OTHER);
for (GList *ll = attrs ? attrs->head : NULL; ll; ll = ll->next) {
attr = ll->data;
str * ret = str_dup(&attr->line_value);
g_queue_push_tail(&sp->attributes, ret);
}
/* a=sendrecv/sendonly/recvonly/inactive */ /* a=sendrecv/sendonly/recvonly/inactive */
SP_SET(sp, SEND); SP_SET(sp, SEND);
SP_SET(sp, RECV); SP_SET(sp, RECV);
@ -2087,11 +2140,10 @@ static void insert_codec_parameters(GString *s, struct call_media *cm,
} }
} }
static void insert_sdp_attributes(GString *gs, struct call_media *cm) {
static void insert_sdp_attributes(GString *gs, struct call_media *cm, struct sdp_ng_flags *flags) {
for (GList *l = cm->sdp_attributes.head; l; l = l->next) { for (GList *l = cm->sdp_attributes.head; l; l = l->next) {
str *s = l->data; str *s = l->data;
g_string_append_printf(gs, "a=" STR_FORMAT "\r\n",
STR_FMT(s));
append_attr_to_gstring(gs, s->s, NULL, flags, cm->type_id);
} }
} }
@ -2343,7 +2395,7 @@ strip_with_subst:
/* processing existing media attributes (those present in offer/answer) */ /* processing existing media attributes (those present in offer/answer) */
static int process_media_attributes(struct sdp_chopper *chop, struct sdp_media *sdp, static int process_media_attributes(struct sdp_chopper *chop, struct sdp_media *sdp,
struct sdp_ng_flags *flags, struct call_media *media)
struct sdp_ng_flags *flags, struct call_media *media, bool strip_attr_other)
{ {
GList *l; GList *l;
struct sdp_attributes *attrs = &sdp->attributes; struct sdp_attributes *attrs = &sdp->attributes;
@ -2401,6 +2453,17 @@ static int process_media_attributes(struct sdp_chopper *chop, struct sdp_media *
goto strip; goto strip;
break; break;
/* strip all unknown type attributes if required, additionally:
* ssrc
* everything related to T38
*/
case ATTR_OTHER:
case ATTR_SSRC:
case ATTR_MSID:
if (strip_attr_other)
goto strip;
break;
default: default:
break; break;
} }
@ -2447,6 +2510,16 @@ static int process_media_attributes(struct sdp_chopper *chop, struct sdp_media *
break; break;
goto strip; goto strip;
/* strip all unknown type attributes if required, additionally:
* ssrc
*/
case ATTR_OTHER:
case ATTR_SSRC:
case ATTR_MSID:
if (strip_attr_other)
goto strip;
break;
default: default:
break; break;
} }
@ -2864,7 +2937,8 @@ static void append_attr_to_gstring(GString *s, char * name, const str * value,
/* first check if the originally present attribute is to be removed */ /* first check if the originally present attribute is to be removed */
if (sdp_manipulate_remove(sdp_manipulations, &attr)) if (sdp_manipulate_remove(sdp_manipulations, &attr))
{ {
ilog(LOG_DEBUG, "Cannot insert: '%s' because prevented by SDP manipulations (remove)", name);
ilog(LOG_DEBUG, "Cannot insert: '" STR_FORMAT "' because prevented by SDP manipulations (remove)",
STR_FMT(&attr));
return; return;
} }
@ -2898,7 +2972,8 @@ static void append_attr_int_to_gstring(GString *s, char * name, const int * valu
/* first check if the originally present attribute is to be removed */ /* first check if the originally present attribute is to be removed */
if (sdp_manipulate_remove(sdp_manipulations, &attr)) if (sdp_manipulate_remove(sdp_manipulations, &attr))
{ {
ilog(LOG_DEBUG, "Cannot insert: '%s' because prevented by SDP manipulations (remove)", name);
ilog(LOG_DEBUG, "Cannot insert: '" STR_FORMAT "' because prevented by SDP manipulations (remove)",
STR_FMT(&attr));
return; return;
} }
@ -2969,7 +3044,10 @@ static void print_sdp_session_section(GString *s, struct sdp_ng_flags *flags,
static struct packet_stream *print_sdp_media_section(GString *s, struct call_media *media, static struct packet_stream *print_sdp_media_section(GString *s, struct call_media *media,
struct sdp_media *sdp_media, struct sdp_media *sdp_media,
struct sdp_ng_flags *flags, struct sdp_ng_flags *flags,
GList *rtp_ps_link, bool is_active, bool force_end_of_ice)
GList *rtp_ps_link,
bool is_active,
bool force_end_of_ice,
bool print_other_attrs)
{ {
struct packet_stream *rtp_ps = rtp_ps_link->data; struct packet_stream *rtp_ps = rtp_ps_link->data;
struct packet_stream *ps_rtcp = NULL; struct packet_stream *ps_rtcp = NULL;
@ -2983,7 +3061,9 @@ static struct packet_stream *print_sdp_media_section(GString *s, struct call_med
if (proto_is_rtp(media->protocol)) if (proto_is_rtp(media->protocol))
insert_codec_parameters(s, media, flags); insert_codec_parameters(s, media, flags);
insert_sdp_attributes(s, media);
/* all unknown type attributes will be added here */
if (print_other_attrs)
insert_sdp_attributes(s, media, flags);
/* print sendrecv */ /* print sendrecv */
if (!flags->original_sendrecv) if (!flags->original_sendrecv)
@ -3027,7 +3107,7 @@ static struct packet_stream *print_sdp_media_section(GString *s, struct call_med
static const char *replace_sdp_media_section(struct sdp_chopper *chop, struct call_media *call_media, static const char *replace_sdp_media_section(struct sdp_chopper *chop, struct call_media *call_media,
struct sdp_media *sdp_media, GList *rtp_ps_link, struct sdp_ng_flags *flags, struct sdp_media *sdp_media, GList *rtp_ps_link, struct sdp_ng_flags *flags,
const bool keep_zero_address)
const bool keep_zero_address, bool print_other_attrs)
{ {
const char *err = NULL; const char *err = NULL;
struct packet_stream *ps = rtp_ps_link->data; struct packet_stream *ps = rtp_ps_link->data;
@ -3068,8 +3148,9 @@ static const char *replace_sdp_media_section(struct sdp_chopper *chop, struct ca
goto next; goto next;
} }
/* all unknown type attributes will stripped here */
err = "failed to process media attributes"; err = "failed to process media attributes";
if (process_media_attributes(chop, sdp_media, flags, call_media))
if (process_media_attributes(chop, sdp_media, flags, call_media, true))
goto error; goto error;
copy_up_to_end_of(chop, &sdp_media->s); copy_up_to_end_of(chop, &sdp_media->s);
@ -3079,7 +3160,7 @@ static const char *replace_sdp_media_section(struct sdp_chopper *chop, struct ca
next: next:
print_sdp_media_section(chop->output, call_media, sdp_media, flags, rtp_ps_link, is_active, print_sdp_media_section(chop->output, call_media, sdp_media, flags, rtp_ps_link, is_active,
attr_get_by_id(&sdp_media->attributes, ATTR_END_OF_CANDIDATES));
attr_get_by_id(&sdp_media->attributes, ATTR_END_OF_CANDIDATES), print_other_attrs);
return NULL; return NULL;
error: error:
@ -3089,7 +3170,7 @@ error:
/* called with call->master_lock held in W */ /* called with call->master_lock held in W */
int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue, int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue,
struct sdp_ng_flags *flags)
struct sdp_ng_flags *flags, bool print_other_attrs)
{ {
struct sdp_session *session; struct sdp_session *session;
struct sdp_media *sdp_media; struct sdp_media *sdp_media;
@ -3246,7 +3327,8 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
call_media->protocol = prtp; call_media->protocol = prtp;
err = replace_sdp_media_section(chop, call_media, sdp_media, err = replace_sdp_media_section(chop, call_media, sdp_media,
rtp_ps_link, flags, rtp_ps_link, flags,
keep_zero_address);
keep_zero_address,
print_other_attrs);
*chop = chop_copy; *chop = chop_copy;
call_media->protocol = proto; call_media->protocol = proto;
if (err) if (err)
@ -3256,7 +3338,8 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
err = replace_sdp_media_section(chop, call_media, sdp_media, err = replace_sdp_media_section(chop, call_media, sdp_media,
rtp_ps_link, flags, rtp_ps_link, flags,
keep_zero_address);
keep_zero_address,
print_other_attrs);
if (err) if (err)
goto error; goto error;
@ -3299,7 +3382,9 @@ error:
return -1; return -1;
} }
int sdp_create(str *out, struct call_monologue *monologue, struct sdp_ng_flags *flags) {
int sdp_create(str *out, struct call_monologue *monologue, struct sdp_ng_flags *flags,
bool print_other_attrs)
{
const char *err = NULL; const char *err = NULL;
GString *s = NULL; GString *s = NULL;
@ -3362,7 +3447,7 @@ int sdp_create(str *out, struct call_monologue *monologue, struct sdp_ng_flags *
g_string_append_printf(s, "\r\nc=IN %s %s\r\n", g_string_append_printf(s, "\r\nc=IN %s %s\r\n",
rtp_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name, rtp_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name,
sockaddr_print_buf(&rtp_ps->selected_sfd->local_intf->advertised_address.addr)); sockaddr_print_buf(&rtp_ps->selected_sfd->local_intf->advertised_address.addr));
print_sdp_media_section(s, media, NULL, flags, rtp_ps_link, true, false);
print_sdp_media_section(s, media, NULL, flags, rtp_ps_link, true, false, print_other_attrs);
} }
out->len = s->len; out->len = s->len;


+ 1
- 0
include/call.h View File

@ -322,6 +322,7 @@ struct stream_params {
const struct transport_protocol *protocol; const struct transport_protocol *protocol;
str format_str; str format_str;
GQueue sdes_params; // slice-alloc'd GQueue sdes_params; // slice-alloc'd
GQueue attributes; /* just some other attributes */
str direction[2]; str direction[2];
sockfamily_t *desired_family; sockfamily_t *desired_family;
struct dtls_fingerprint fingerprint; struct dtls_fingerprint fingerprint;


+ 4
- 2
include/sdp.h View File

@ -33,9 +33,11 @@ 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_streams_free(GQueue *); void sdp_streams_free(GQueue *);
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 *,
bool print_other_attrs);
int sdp_is_duplicate(GQueue *sessions); int sdp_is_duplicate(GQueue *sessions);
int sdp_create(str *out, struct call_monologue *, struct sdp_ng_flags *flags);
int sdp_create(str *out, struct call_monologue *, struct sdp_ng_flags *flags,
bool print_other_attrs);
const char *sdp_get_sendrecv(struct call_media *media); const char *sdp_get_sendrecv(struct call_media *media);
int sdp_parse_candidate(struct ice_candidate *cand, const str *s); // returns -1, 0, 1 int sdp_parse_candidate(struct ice_candidate *cand, const str *s); // returns -1, 0, 1


+ 16
- 0
t/auto-daemon-tests-websocket.py View File

@ -1725,6 +1725,11 @@ class TestVideoroom(unittest.TestCase):
"a=rtpmap:111 opus/48000/2\r\n" "a=rtpmap:111 opus/48000/2\r\n"
"a=fmtp:111 useinbandfec=1; minptime=10\r\n" "a=fmtp:111 useinbandfec=1; minptime=10\r\n"
"a=rtcp-fb:111 transport-cc\r\n" "a=rtcp-fb:111 transport-cc\r\n"
"a=ssrc:677770262 cname:NMNDwVd66x2SfiO0\r\n"
"a=ssrc:677770262 msid:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC 2de0f1b0-3a39-450e-9804-8305ec87452b\r\n"
"a=ssrc:677770262 mslabel:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC\r\n"
"a=ssrc:677770262 label:2de0f1b0-3a39-450e-9804-8305ec87452b\r\n"
"a=msid:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC 2de0f1b0-3a39-450e-9804-8305ec87452b\r\n"
"a=sendonly\r\n" "a=sendonly\r\n"
"a=rtcp-mux\r\n" "a=rtcp-mux\r\n"
"a=setup:actpass\r\n" "a=setup:actpass\r\n"
@ -1744,6 +1749,17 @@ class TestVideoroom(unittest.TestCase):
"a=rtcp-fb:96 ccm fir\r\n" "a=rtcp-fb:96 ccm fir\r\n"
"a=rtcp-fb:96 nack\r\n" "a=rtcp-fb:96 nack\r\n"
"a=rtcp-fb:96 nack pli\r\n" "a=rtcp-fb:96 nack pli\r\n"
"a=ssrc:3005569364 cname:NMNDwVd66x2SfiO0\r\n"
"a=ssrc:3005569364 msid:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC 6d6ec7a7-e3d7-4c82-b03c-45e017713abd\r\n"
"a=ssrc:3005569364 mslabel:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC\r\n"
"a=ssrc:3005569364 label:6d6ec7a7-e3d7-4c82-b03c-45e017713abd\r\n"
"a=ssrc:2001490794 cname:NMNDwVd66x2SfiO0\r\n"
"a=ssrc:2001490794 msid:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC 6d6ec7a7-e3d7-4c82-b03c-45e017713abd\r\n"
"a=ssrc:2001490794 mslabel:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC\r\n"
"a=ssrc:2001490794 label:6d6ec7a7-e3d7-4c82-b03c-45e017713abd\r\n"
"a=msid:hJifdaJwqEqHxSG0pVbs1DrLAwiHqz7fKlqC 6d6ec7a7-e3d7-4c82-b03c-45e017713abd\r\n"
"a=rtcp-rsize\r\n"
"a=ssrc-group:FID 3005569364 2001490794\r\n"
"a=sendonly\r\n" "a=sendonly\r\n"
"a=rtcp-mux\r\n" "a=rtcp-mux\r\n"
"a=setup:actpass\r\n" "a=setup:actpass\r\n"


+ 55
- 57
t/auto-daemon-tests.pl View File

@ -119,15 +119,15 @@ t=0 0
a=extmap-allow-mixed a=extmap-allow-mixed
a=msid-semantic: WMS 61cc3524-d456-4497-b92e-2babd3d83d84 a=msid-semantic: WMS 61cc3524-d456-4497-b92e-2babd3d83d84
m=audio PORT RTP/SAVPF 96 97 m=audio PORT RTP/SAVPF 96 97
a=msid:61cc3524-d456-4497-b92e-2babd3d83d84 02c5b74b-b03e-44a6-b175-6639fa009f2d
a=ssrc:889323910 cname:OCP1KqOq/lFpZRp0
a=ssrc:889323910 msid:61cc3524-d456-4497-b92e-2babd3d83d84 02c5b74b-b03e-44a6-b175-6639fa009f2d
a=rtcp-xr:voip-metrics
a=mid:1 a=mid:1
a=rtpmap:96 opus/48000/2 a=rtpmap:96 opus/48000/2
a=fmtp:96 useinbandfec=1 a=fmtp:96 useinbandfec=1
a=rtpmap:97 telephone-event/48000 a=rtpmap:97 telephone-event/48000
a=fmtp:97 0-15 a=fmtp:97 0-15
a=ssrc:889323910 cname:OCP1KqOq/lFpZRp0
a=ssrc:889323910 msid:61cc3524-d456-4497-b92e-2babd3d83d84 02c5b74b-b03e-44a6-b175-6639fa009f2d
a=msid:61cc3524-d456-4497-b92e-2babd3d83d84 02c5b74b-b03e-44a6-b175-6639fa009f2d
a=rtcp-xr:voip-metrics
a=sendonly a=sendonly
a=rtcp:PORT a=rtcp:PORT
a=rtcp-mux a=rtcp-mux
@ -179,10 +179,10 @@ a=extmap-allow-mixed
a=msid-semantic: WMS 4d091157-8680-47a2-b124-36b52fefea19 a=msid-semantic: WMS 4d091157-8680-47a2-b124-36b52fefea19
m=audio PORT RTP/AVP 0 126 m=audio PORT RTP/AVP 0 126
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=msid:4d091157-8680-47a2-b124-36b52fefea19 ed2eaf3a-926c-4c1a-a315-e02458e05292
a=ssrc:572293880 cname:pHBBuw7Qa5BaQ36a
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:126 telephone-event/8000 a=rtpmap:126 telephone-event/8000
a=ssrc:572293880 cname:pHBBuw7Qa5BaQ36a
a=msid:4d091157-8680-47a2-b124-36b52fefea19 ed2eaf3a-926c-4c1a-a315-e02458e05292
a=recvonly a=recvonly
a=ptime:20 a=ptime:20
SDP SDP
@ -231,14 +231,14 @@ a=extmap-allow-mixed
a=msid-semantic: WMS 4d091157-8680-47a2-b124-36b52fefea19 a=msid-semantic: WMS 4d091157-8680-47a2-b124-36b52fefea19
m=audio PORT RTP/AVP 0 8 9 96 m=audio PORT RTP/AVP 0 8 9 96
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=msid:4d091157-8680-47a2-b124-36b52fefea19 ed2eaf3a-926c-4c1a-a315-e02458e05292
a=ssrc:572293880 cname:pHBBuw7Qa5BaQ36a
a=mid:1 a=mid:1
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000 a=rtpmap:9 G722/8000
a=rtpmap:96 telephone-event/8000 a=rtpmap:96 telephone-event/8000
a=fmtp:96 0-15 a=fmtp:96 0-15
a=ssrc:572293880 cname:pHBBuw7Qa5BaQ36a
a=msid:4d091157-8680-47a2-b124-36b52fefea19 ed2eaf3a-926c-4c1a-a315-e02458e05292
a=sendrecv a=sendrecv
a=ptime:20 a=ptime:20
SDP SDP
@ -285,22 +285,20 @@ a=extmap-allow-mixed
a=msid-semantic: WMS 4d091157-8680-47a2-b124-36b52fefea19 a=msid-semantic: WMS 4d091157-8680-47a2-b124-36b52fefea19
m=audio PORT RTP/AVP 0 8 9 96 m=audio PORT RTP/AVP 0 8 9 96
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=msid:4d091157-8680-47a2-b124-36b52fefea19 ed2eaf3a-926c-4c1a-a315-e02458e05292
a=ssrc:572293880 cname:pHBBuw7Qa5BaQ36a
a=mid:1 a=mid:1
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000 a=rtpmap:9 G722/8000
a=rtpmap:96 telephone-event/8000 a=rtpmap:96 telephone-event/8000
a=fmtp:96 0-15 a=fmtp:96 0-15
a=ssrc:572293880 cname:pHBBuw7Qa5BaQ36a
a=msid:4d091157-8680-47a2-b124-36b52fefea19 ed2eaf3a-926c-4c1a-a315-e02458e05292
a=sendrecv a=sendrecv
a=ptime:20 a=ptime:20
SDP SDP
new_call; new_call;
offer('AMR asymmetric, control', {}, <<SDP); offer('AMR asymmetric, control', {}, <<SDP);
@ -341,7 +339,6 @@ b=AS:80
b=RS:362 b=RS:362
b=RR:1087 b=RR:1087
a=maxptime:40 a=maxptime:40
a=msi:mavodi-0-15b-6c6-2-ffffffff-d3c00000-6005c95738e64-171f-ffffffffffffffff-.0.0.1-127.0.0.1;UAG-ELL-45-108
a=rtpmap:96 AMR/8000 a=rtpmap:96 AMR/8000
a=fmtp:96 mode-set=0,2,4,7;mode-change-period=2;mode-change-neighbor=1;mode-change-capability=2;max-red=0 a=fmtp:96 mode-set=0,2,4,7;mode-change-period=2;mode-change-neighbor=1;mode-change-capability=2;max-red=0
a=rtpmap:97 AMR/8000 a=rtpmap:97 AMR/8000
@ -349,6 +346,7 @@ a=fmtp:97 mode-set=7;max-red=0
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:98 telephone-event/8000 a=rtpmap:98 telephone-event/8000
a=fmtp:98 0-15 a=fmtp:98 0-15
a=msi:mavodi-0-15b-6c6-2-ffffffff-d3c00000-6005c95738e64-171f-ffffffffffffffff-.0.0.1-127.0.0.1;UAG-ELL-45-108
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -430,7 +428,6 @@ b=AS:80
b=RS:362 b=RS:362
b=RR:1087 b=RR:1087
a=maxptime:40 a=maxptime:40
a=msi:mavodi-0-15b-6c6-2-ffffffff-d3c00000-6005c95738e64-171f-ffffffffffffffff-.0.0.1-127.0.0.1;UAG-ELL-45-108
a=rtpmap:96 AMR/8000 a=rtpmap:96 AMR/8000
a=fmtp:96 mode-set=0,2,4,7;mode-change-period=2;mode-change-neighbor=1;mode-change-capability=2;max-red=0 a=fmtp:96 mode-set=0,2,4,7;mode-change-period=2;mode-change-neighbor=1;mode-change-capability=2;max-red=0
a=rtpmap:97 AMR/8000 a=rtpmap:97 AMR/8000
@ -438,6 +435,7 @@ a=fmtp:97 mode-set=7;max-red=0
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:98 telephone-event/8000 a=rtpmap:98 telephone-event/8000
a=fmtp:98 0-15 a=fmtp:98 0-15
a=msi:mavodi-0-15b-6c6-2-ffffffff-d3c00000-6005c95738e64-171f-ffffffffffffffff-.0.0.1-127.0.0.1;UAG-ELL-45-108
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -8964,10 +8962,10 @@ s=FreeSWITCH
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/AVP 8 96 m=audio PORT RTP/AVP 8 96
a=silenceSupp:off - - - -
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:96 telephone-event/8000 a=rtpmap:96 telephone-event/8000
a=fmtp:96 0-15 a=fmtp:96 0-15
a=silenceSupp:off - - - -
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -10542,12 +10540,12 @@ c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 101 m=audio PORT RTP/SAVP 0 101
a=direction:both a=direction:both
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.190
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.190
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=crypto:1 AEAD_AES_256_GCM inline:CRYPTO256S a=crypto:1 AEAD_AES_256_GCM inline:CRYPTO256S
@ -10596,12 +10594,12 @@ c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/AVP 0 101 m=audio PORT RTP/AVP 0 101
a=direction:both a=direction:both
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.218
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.218
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -10638,12 +10636,12 @@ c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 101 m=audio PORT RTP/SAVP 0 101
a=direction:both a=direction:both
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.190
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.190
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=crypto:7 AES_CM_128_HMAC_SHA1_80 inline:$srtp_key_a a=crypto:7 AES_CM_128_HMAC_SHA1_80 inline:$srtp_key_a
@ -10692,12 +10690,12 @@ c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/AVP 0 101 m=audio PORT RTP/AVP 0 101
a=direction:both a=direction:both
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.218
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.218
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -10738,12 +10736,12 @@ c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 101 m=audio PORT RTP/SAVP 0 101
a=direction:both a=direction:both
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.218
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 -
a=oldmediaip:10.50.3.218
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=crypto:7 AES_CM_128_HMAC_SHA1_80 inline:zC6Ea9EK/7YmDM79CK+TAnNXTI1pVmZuCMjUPMph a=crypto:7 AES_CM_128_HMAC_SHA1_80 inline:zC6Ea9EK/7YmDM79CK+TAnNXTI1pVmZuCMjUPMph
@ -10799,13 +10797,13 @@ s=tester
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 8 9 101 m=audio PORT RTP/SAVP 0 8 9 101
a=silenceSupp:off - - - -
a=mptime:20 20 20 20 -
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000 a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 20 20 20 -
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:QjnnaukLn7iwASAs0YLzPUplJkjOhTZK2dvOwo6c a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:QjnnaukLn7iwASAs0YLzPUplJkjOhTZK2dvOwo6c
@ -10848,11 +10846,11 @@ s=tester
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 101 m=audio PORT RTP/SAVP 0 101
a=silenceSupp:off - - - -
a=mptime:20 20 20 20 -
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15 a=fmtp:101 0-15
a=silenceSupp:off - - - -
a=mptime:20 20 20 20 -
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=rtcp-mux a=rtcp-mux
@ -11969,11 +11967,11 @@ a=X-nat:0
m=audio PORT RTP/AVP 107 101 m=audio PORT RTP/AVP 107 101
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
b=TIAS:96000 b=TIAS:96000
a=ssrc:243811319 cname:04389d431bdd5c52
a=rtpmap:107 opus/48000/2 a=rtpmap:107 opus/48000/2
a=fmtp:107 useinbandfec=1 a=fmtp:107 useinbandfec=1
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16 a=fmtp:101 0-16
a=ssrc:243811319 cname:04389d431bdd5c52
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -12043,11 +12041,11 @@ a=X-nat:0
m=audio PORT RTP/AVP 107 101 m=audio PORT RTP/AVP 107 101
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
b=TIAS:96000 b=TIAS:96000
a=ssrc:243811319 cname:04389d431bdd5c52
a=rtpmap:107 opus/48000/2 a=rtpmap:107 opus/48000/2
a=fmtp:107 useinbandfec=1 a=fmtp:107 useinbandfec=1
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16 a=fmtp:101 0-16
a=ssrc:243811319 cname:04389d431bdd5c52
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -12117,12 +12115,12 @@ a=X-nat:0
m=audio PORT RTP/AVP 107 8 101 m=audio PORT RTP/AVP 107 8 101
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
b=TIAS:96000 b=TIAS:96000
a=ssrc:243811319 cname:04389d431bdd5c52
a=rtpmap:107 opus/48000/2 a=rtpmap:107 opus/48000/2
a=fmtp:107 useinbandfec=1 a=fmtp:107 useinbandfec=1
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16 a=fmtp:101 0-16
a=ssrc:243811319 cname:04389d431bdd5c52
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -12192,12 +12190,12 @@ a=X-nat:0
m=audio PORT RTP/AVP 107 8 101 m=audio PORT RTP/AVP 107 8 101
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
b=TIAS:96000 b=TIAS:96000
a=ssrc:243811319 cname:04389d431bdd5c52
a=rtpmap:107 opus/48000/2 a=rtpmap:107 opus/48000/2
a=fmtp:107 useinbandfec=1 a=fmtp:107 useinbandfec=1
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000 a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16 a=fmtp:101 0-16
a=ssrc:243811319 cname:04389d431bdd5c52
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -12264,8 +12262,8 @@ a=X-nat:0
m=audio PORT RTP/AVP 8 m=audio PORT RTP/AVP 8
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
b=TIAS:96000 b=TIAS:96000
a=ssrc:243811319 cname:04389d431bdd5c52
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=ssrc:243811319 cname:04389d431bdd5c52
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -12331,8 +12329,8 @@ a=X-nat:0
m=audio PORT RTP/AVP 8 m=audio PORT RTP/AVP 8
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
b=TIAS:96000 b=TIAS:96000
a=ssrc:243811319 cname:04389d431bdd5c52
a=rtpmap:8 PCMA/8000 a=rtpmap:8 PCMA/8000
a=ssrc:243811319 cname:04389d431bdd5c52
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
@ -12921,12 +12919,7 @@ a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extension
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=msid:qDSKVQw0XQOFzGhek25Kn3RLxyHTM2ooxMUY 7d669de6-65e9-4fbe-829e-e89dc4baf81c
a=rtcp-mux a=rtcp-mux
a=ssrc:2628106563 cname:wMyHbPOf/cCq2tup
a=ssrc:2628106563 msid:qDSKVQw0XQOFzGhek25Kn3RLxyHTM2ooxMUY 7d669de6-65e9-4fbe-829e-e89dc4baf81c
a=ssrc:2628106563 mslabel:qDSKVQw0XQOFzGhek25Kn3RLxyHTM2ooxMUY
a=ssrc:2628106563 label:7d669de6-65e9-4fbe-829e-e89dc4baf81c
a=mid:0 a=mid:0
a=rtpmap:111 opus/48000/2 a=rtpmap:111 opus/48000/2
a=fmtp:111 useinbandfec=1; minptime=10 a=fmtp:111 useinbandfec=1; minptime=10
@ -12945,6 +12938,11 @@ a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000 a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000 a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000 a=rtpmap:126 telephone-event/8000
a=ssrc:2628106563 cname:wMyHbPOf/cCq2tup
a=ssrc:2628106563 msid:qDSKVQw0XQOFzGhek25Kn3RLxyHTM2ooxMUY 7d669de6-65e9-4fbe-829e-e89dc4baf81c
a=ssrc:2628106563 mslabel:qDSKVQw0XQOFzGhek25Kn3RLxyHTM2ooxMUY
a=ssrc:2628106563 label:7d669de6-65e9-4fbe-829e-e89dc4baf81c
a=msid:qDSKVQw0XQOFzGhek25Kn3RLxyHTM2ooxMUY 7d669de6-65e9-4fbe-829e-e89dc4baf81c
a=sendrecv a=sendrecv
a=candidate:ICEBASE 1 UDP 16777215 203.0.113.1 PORT typ relay raddr 203.0.113.1 rport PORT a=candidate:ICEBASE 1 UDP 16777215 203.0.113.1 PORT typ relay raddr 203.0.113.1 rport PORT
a=candidate:ICEBASE 1 UDP 16776959 2001:db8:4321::1 PORT typ relay raddr 2001:db8:4321::1 rport PORT a=candidate:ICEBASE 1 UDP 16776959 2001:db8:4321::1 PORT typ relay raddr 2001:db8:4321::1 rport PORT
@ -13033,9 +13031,7 @@ a=extmap:2 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extension
a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid a=extmap:3 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=msid:9z51ZTKhoszc7zqj5gxEX309ODe940YpMplv 8a622ecc-1fff-4675-8bf4-7b924845b3fd
a=rtcp-mux a=rtcp-mux
a=ssrc:97254339 cname:d7zRWvteaW9fc2Yu
a=mid:0 a=mid:0
a=rtpmap:111 opus/48000/2 a=rtpmap:111 opus/48000/2
a=fmtp:111 useinbandfec=1; minptime=10 a=fmtp:111 useinbandfec=1; minptime=10
@ -13052,6 +13048,8 @@ a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000 a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000 a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000 a=rtpmap:126 telephone-event/8000
a=ssrc:97254339 cname:d7zRWvteaW9fc2Yu
a=msid:9z51ZTKhoszc7zqj5gxEX309ODe940YpMplv 8a622ecc-1fff-4675-8bf4-7b924845b3fd
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=rtcp-mux a=rtcp-mux
@ -16736,8 +16734,8 @@ s=tester
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 m=audio PORT RTP/SAVP 0
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=test2
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=test2
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
SDP SDP
@ -16825,9 +16823,9 @@ s=tester
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 m=audio PORT RTP/SAVP 0
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=test2 a=test2
a=test6 a=test6
a=rtpmap:0 PCMU/8000
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
SDP SDP
@ -17179,8 +17177,8 @@ s=tester
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 m=audio PORT RTP/SAVP 0
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=test2
a=rtpmap:0 PCMU/8000 a=rtpmap:0 PCMU/8000
a=test2
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
SDP SDP
@ -17268,9 +17266,9 @@ s=tester
t=0 0 t=0 0
m=audio PORT RTP/SAVP 0 m=audio PORT RTP/SAVP 0
c=IN IP4 203.0.113.1 c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=test2 a=test2
a=test6 a=test6
a=rtpmap:0 PCMU/8000
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
SDP SDP
@ -21310,10 +21308,6 @@ b=AS:41
b=RS:512 b=RS:512
b=RR:1537 b=RR:1537
a=maxptime:240 a=maxptime:240
a=des:qos mandatory local sendrecv
a=curr:qos local none
a=des:qos optional remote sendrecv
a=curr:qos remote none
a=rtpmap:99 AMR-WB/16000 a=rtpmap:99 AMR-WB/16000
a=fmtp:99 mode-set=0,1,2,5,7,8; max-red=0; mode-change-capability=2 a=fmtp:99 mode-set=0,1,2,5,7,8; max-red=0; mode-change-capability=2
a=rtpmap:97 AMR/8000 a=rtpmap:97 AMR/8000
@ -21325,16 +21319,20 @@ a=rtpmap:105 telephone-event/16000
a=fmtp:105 0-15 a=fmtp:105 0-15
a=rtpmap:100 telephone-event/8000 a=rtpmap:100 telephone-event/8000
a=fmtp:100 0-15 a=fmtp:100 0-15
a=des:qos mandatory local sendrecv
a=curr:qos local none
a=des:qos optional remote sendrecv
a=curr:qos remote none
a=sendrecv a=sendrecv
a=rtcp:PORT a=rtcp:PORT
a=ptime:20 a=ptime:20
m=application PORT UDP/DTLS/SCTP webrtc-datachannel m=application PORT UDP/DTLS/SCTP webrtc-datachannel
b=AS:500 b=AS:500
a=max-message-size:1024
a=sctp-port:5000
a=setup:passive a=setup:passive
a=fingerprint:SHA-1 4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB a=fingerprint:SHA-1 4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB
a=tls-id: abc3de65cddef001be82 a=tls-id: abc3de65cddef001be82
a=max-message-size:1024
a=sctp-port:5000
a=dcmap:10 subprotocol="http" a=dcmap:10 subprotocol="http"
a=dcmap:38754 max-time=150;label="low latency" a=dcmap:38754 max-time=150;label="low latency"
a=dcmap:7216 max-retr=5;label="low loss" a=dcmap:7216 max-retr=5;label="low loss"


Loading…
Cancel
Save