Browse Source

MT#55447 support parsing and matching AMR a=fmtp

Change-Id: I691d76f2bf71b845e4f31ad0c068e54aeb1ac882
pull/1563/head
Richard Fuchs 3 years ago
parent
commit
114a2b6b66
2 changed files with 963 additions and 0 deletions
  1. +54
    -0
      lib/codeclib.c
  2. +909
    -0
      t/auto-daemon-tests.pl

+ 54
- 0
lib/codeclib.c View File

@ -44,6 +44,7 @@ static set_dec_options_f ilbc_set_dec_options;
static format_parse_f amr_format_parse;
static set_enc_options_f amr_set_enc_options;
static set_dec_options_f amr_set_dec_options;
static format_cmp_f amr_format_cmp;
static void avc_def_init(codec_def_t *);
static const char *avc_decoder_init(decoder_t *, const str *);
@ -477,6 +478,7 @@ static codec_def_t __codec_defs[] = {
.default_bitrate = 6700,
.default_ptime = 20,
.format_parse = amr_format_parse,
.format_cmp = amr_format_cmp,
.default_fmtp = "octet-align=1;mode-change-capability=2",
.packetizer = packetizer_amr,
.bits_per_sample = 2, // max is 12200 / 8000 = 1.525 bits per sample, rounded up
@ -501,6 +503,7 @@ static codec_def_t __codec_defs[] = {
.default_bitrate = 14250,
.default_ptime = 20,
.format_parse = amr_format_parse,
.format_cmp = amr_format_cmp,
.default_fmtp = "octet-align=1;mode-change-capability=2",
.packetizer = packetizer_amr,
.bits_per_sample = 2, // max is 23850 / 16000 = 1.490625 bits per sample, rounded up
@ -2012,6 +2015,57 @@ static void amr_set_dec_options(decoder_t *dec, const str *codec_opts) {
amr_set_encdec_options(&dec->codec_options, dec->def);
codeclib_key_value_parse(codec_opts, true, amr_set_dec_codec_options, dec);
}
static int amr_mode_set_cmp(unsigned int a, unsigned int b) {
if (a && b) {
// `a` must be broader than `b`:
// `b` must not have any bits set that `a` has set
if (a == b)
return 0;
else if ((b & ~a) == 0)
return 1;
else
return -1;
}
else if (!a && b) // `a` is broader (allow anything) than `b` (restricted)
return 1;
else if (a && !b)
return -1;
return 0;
}
static int amr_format_cmp(const struct rtp_payload_type *A, const struct rtp_payload_type *B) {
// params must have been parsed successfully
if (!A->format.fmtp_parsed || !B->format.fmtp_parsed)
return -1;
__auto_type a = &A->format.parsed.amr;
__auto_type b = &B->format.parsed.amr;
// reject anything that is outright incompatible (RFC 4867, 8.3.1)
if (a->octet_aligned != b->octet_aligned)
return -1;
if (a->crc != b->crc)
return -1;
if (a->interleaving != b->interleaving)
return -1;
if (a->robust_sorting != b->robust_sorting)
return -1;
// determine whether codecs are compatible
int compat = 0;
if (a->mode_change_neighbor != b->mode_change_neighbor)
compat++;
if (a->mode_change_period != b->mode_change_period)
compat++;
int match = amr_mode_set_cmp(a->mode_set, b->mode_set);
if (match == 1)
compat++;
else if (match == -1)
return -1;
return (compat == 0) ? 0 : 1;
}
static void amr_bitrate_tracker(decoder_t *dec, unsigned int ft) {
if (dec->codec_options.amr.cmr_interval <= 0)


+ 909
- 0
t/auto-daemon-tests.pl View File

@ -79,6 +79,915 @@ sub stun_succ {
if ($amr_tests) {
new_call;
offer('AMR options test, exact match',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-change-capability=2'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1;mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1;mode-change-capability=2
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, default', { codec => { transcode => ['AMR'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1;mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1;mode-change-capability=2
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, default w/ spacing', { codec => { transcode => ['AMR'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, exact match with spacing',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-change-capability=2'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, partial option',
{ codec => { transcode => ['AMR/8000/1///octet-align=1'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, incompat',
{ codec => { transcode => ['AMR/8000/1///octet-align=0'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96 97
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
a=rtpmap:97 AMR/8000
a=fmtp:97 octet-align=0
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, extra option',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-set=1,2,3'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96 97
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2
a=rtpmap:97 AMR/8000
a=fmtp:97 octet-align=1;mode-set=1,2,3
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, redundant extra option',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-set=1,2,3'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2; mode-set=1,2,3
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-change-capability=2; mode-set=1,2,3
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, exact match with spacing',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-set=1,2,3'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, partial option',
{ codec => { transcode => ['AMR/8000/1///octet-align=1'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96 97
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
a=rtpmap:97 AMR/8000
a=fmtp:97 octet-align=1
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, incompat',
{ codec => { transcode => ['AMR/8000/1///octet-align=0'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96 97
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
a=rtpmap:97 AMR/8000
a=fmtp:97 octet-align=0
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, extra option',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-set=1,2,3,4,5'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96 97
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3
a=rtpmap:97 AMR/8000
a=fmtp:97 octet-align=1;mode-set=1,2,3,4,5
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR options test, redundant extra option',
{ codec => { transcode => ['AMR/8000/1///octet-align=1;mode-set=1,2,3'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 198.51.100.19
t=0 0
m=audio 6000 RTP/AVP 96
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3; mode-change-period=2
----------------------------------
v=0
o=- 1545997027 1 IN IP4 172.17.0.2
s=tester
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 96 97
a=rtpmap:96 AMR/8000
a=fmtp:96 octet-align=1; mode-set=1,2,3; mode-change-period=2
a=rtpmap:97 AMR/8000
a=fmtp:97 octet-align=1;mode-set=1,2,3
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept basic', { codec => { accept => ['AMR-WB'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 mode-set=3,4,5; octet-align=1
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 mode-set=3,4,5; octet-align=1
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept basic', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 mode-set=3,4,5; octet-align=1
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept basic def option not given', { codec => { accept => ['AMR-WB'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 mode-set=3,4,5
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 mode-set=3,4,5
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept basic def option not given', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 8
c=IN IP4 203.0.113.1
a=rtpmap:8 PCMA/8000
a=sendrecv
a=rtcp:PORT
SDP
# ^ XXX maybe change this to allow for octet-align=any if not given?
new_call;
offer('AMR codec accept multi', { codec => { accept => ['AMR-WB'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=0
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=0
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept multi', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept multi select', { codec => { accept => ['AMR-WB/16000/1///octet-align=0'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=0
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=0
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept multi select', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 97
c=IN IP4 203.0.113.1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=0
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept select compat control', { codec => { accept => ['AMR-WB/16000/1///octet-align=1'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=2,3,4,5,6
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=2,3,4,5,6
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept select compat control', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept select compat 1', { codec => { accept => ['AMR-WB/16000/1///octet-align=1'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=2,3,4,5,6
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=2,3,4,5,6
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept select compat 1', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=2,3,4,5,6
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept select compat 2', { codec => { accept => ['AMR-WB/16000/1///octet-align=1'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=2,3,4,5,6
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=0,1,2,3
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=2,3,4,5,6
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=0,1,2,3
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept select compat 2', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=2,3,4,5,6
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept select compat 3', { codec => { accept => ['AMR-WB/16000/1///octet-align=1;mode-set=2,3,4'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=4,5,6
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=2,3,4
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=4,5,6
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=2,3,4
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept select compat 3', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 97
c=IN IP4 203.0.113.1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=2,3,4
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept select compat 4', { codec => { accept => ['AMR-WB/16000/1///octet-align=1;mode-set=3,4,5,6'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=5,6,7
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=4,5
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=5,6,7
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=4,5
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept select compat 4', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 97
c=IN IP4 203.0.113.1
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=4,5
a=sendrecv
a=rtcp:PORT
SDP
new_call;
offer('AMR codec accept select compat 5', { codec => { accept => ['AMR-WB/16000/1///mode-set=3,4,5,6'] } }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4020 RTP/AVP 96 97 98 99 8 0
c=IN IP4 198.51.100.4
a=sendrecv
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=5,6,7
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=1,2,3
a=rtpmap:98 AMR-WB/16000
a=fmtp:98 mode-set=5,6,7
a=rtpmap:99 AMR-WB/16000
a=fmtp:99 mode-set=4,5
--------------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 96 97 98 99 8 0
c=IN IP4 203.0.113.1
a=rtpmap:96 AMR-WB/16000
a=fmtp:96 octet-align=1; mode-set=5,6,7
a=rtpmap:97 AMR-WB/16000
a=fmtp:97 octet-align=1; mode-set=1,2,3
a=rtpmap:98 AMR-WB/16000
a=fmtp:98 mode-set=5,6,7
a=rtpmap:99 AMR-WB/16000
a=fmtp:99 mode-set=4,5
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:PORT
SDP
answer('AMR codec accept select compat 5', { }, <<SDP);
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio 4022 RTP/AVP 8
c=IN IP4 198.51.100.4
----------------------------------
v=0
o=- 1545997027 1 IN IP4 198.51.100.4
s=tester
t=0 0
m=audio PORT RTP/AVP 99
c=IN IP4 203.0.113.1
a=rtpmap:99 AMR-WB/16000
a=fmtp:99 mode-set=4,5
a=sendrecv
a=rtcp:PORT
SDP
}
new_call;
offer('stray ICE reset after hold',


Loading…
Cancel
Save