Browse Source

TT#92250 keep supplemental codecs last in list when transcoding

Change-Id: I3172414fd724e5c5fe9d69b5a78270bed41f83b6
pull/1093/head
Richard Fuchs 5 years ago
parent
commit
5ac91499fe
5 changed files with 100 additions and 35 deletions
  1. +39
    -9
      daemon/codec.c
  2. +1
    -1
      daemon/redis.c
  3. +1
    -1
      include/codec.h
  4. +55
    -20
      t/auto-daemon-tests.pl
  5. +4
    -4
      t/transcode-test.c

+ 39
- 9
daemon/codec.c View File

@ -624,7 +624,7 @@ static void __symmetric_codecs(struct call_media *receiver, struct call_media *s
// add it to the list
ilog(LOG_DEBUG, "Adding symmetric RTP payload type %i", pt->payload_type);
g_hash_table_steal(prefs_recv, GINT_TO_POINTER(pt->payload_type));
__rtp_payload_type_add_recv(receiver, out_pt);
__rtp_payload_type_add_recv(receiver, out_pt, 1);
// and our send leg
out_pt = g_hash_table_lookup(prefs_send, GINT_TO_POINTER(pt->payload_type));
if (out_pt) {
@ -649,7 +649,7 @@ static void __symmetric_codecs(struct call_media *receiver, struct call_media *s
if (!out_pt)
continue;
g_hash_table_steal(prefs_recv, ptype);
__rtp_payload_type_add_recv(receiver, out_pt);
__rtp_payload_type_add_recv(receiver, out_pt, 1);
}
while (prefs_send_order.length) {
void *ptype = g_queue_pop_head(&prefs_send_order);
@ -2212,12 +2212,42 @@ static void __rtp_payload_type_add_name(GHashTable *ht, struct rtp_payload_type
q = g_hash_table_lookup_queue_new(ht, &pt->encoding_with_params);
g_queue_push_tail(q, GUINT_TO_POINTER(pt->payload_type));
}
static void __queue_insert_supp(GQueue *q, struct rtp_payload_type *pt, int supp_check) {
// do we care at all?
if (!supp_check) {
g_queue_push_tail(q, pt);
return;
}
// all new supp codecs go last
if (pt->codec_def && pt->codec_def->supplemental) {
g_queue_push_tail(q, pt);
return;
}
// find the cut-off point between non-supp and supp codecs
GList *insert_pos = NULL; // last non-supp codec
for (GList *l = q->tail; l; l = l->prev) {
struct rtp_payload_type *ptt = l->data;
if (!ptt->codec_def || !ptt->codec_def->supplemental) {
insert_pos = l;
break;
}
}
// do we have any non-supp codecs?
if (!insert_pos) {
g_queue_push_head(q, pt);
return;
}
g_queue_insert_after(q, insert_pos, pt);
}
// consumes 'pt'
void __rtp_payload_type_add_recv(struct call_media *media,
struct rtp_payload_type *pt)
struct rtp_payload_type *pt, int supp_check)
{
if (!pt)
return;
ensure_codec_def(pt, media);
if (proto_is_not_rtp(media->protocol)) {
payload_type_free(pt);
return;
@ -2227,7 +2257,7 @@ void __rtp_payload_type_add_recv(struct call_media *media,
pt->ptime = media->ptime;
g_hash_table_insert(media->codecs_recv, &pt->payload_type, pt);
__rtp_payload_type_add_name(media->codec_names_recv, pt);
g_queue_push_tail(&media->codecs_prefs_recv, pt);
__queue_insert_supp(&media->codecs_prefs_recv, pt, supp_check);
}
// consumes 'pt'
void __rtp_payload_type_add_send(struct call_media *other_media,
@ -2260,7 +2290,7 @@ static void __rtp_payload_type_add(struct call_media *media, struct call_media *
struct rtp_payload_type *pt)
{
__rtp_payload_type_add_send_dup(other_media, pt);
__rtp_payload_type_add_recv(media, pt);
__rtp_payload_type_add_recv(media, pt, 0);
}
static void __payload_queue_free(void *qq) {
@ -2425,7 +2455,7 @@ void codec_rtp_payload_types(struct call_media *media, struct call_media *other_
ilog(LOG_DEBUG, "Codec '" STR_FORMAT "' added for transcoding with payload type %u",
STR_FMT(&pt->encoding_with_params), pt->payload_type);
__rtp_payload_type_add_recv(media, pt);
__rtp_payload_type_add_recv(media, pt, 1);
}
if (media->type_id == MT_AUDIO && other_media->type_id == MT_IMAGE) {
@ -2441,7 +2471,7 @@ void codec_rtp_payload_types(struct call_media *media, struct call_media *other_
if (media->t38_gateway && media->t38_gateway->pcm_player
&& media->t38_gateway->pcm_player->handler)
__rtp_payload_type_add_recv(media,
__rtp_payload_type_copy(&media->t38_gateway->pcm_player->handler->dest_pt));
__rtp_payload_type_copy(&media->t38_gateway->pcm_player->handler->dest_pt), 1);
}
else if (flags->opmode == OP_OFFER) {
// T.38 -> audio transcoder, initial offer, and no codecs have been given.
@ -2451,10 +2481,10 @@ void codec_rtp_payload_types(struct call_media *media, struct call_media *other_
static const str PCMA_str = STR_CONST_INIT("PCMA");
pt = codec_add_payload_type(&PCMU_str, media);
assert(pt != NULL);
__rtp_payload_type_add_recv(media, pt);
__rtp_payload_type_add_recv(media, pt, 1);
pt = codec_add_payload_type(&PCMA_str, media);
assert(pt != NULL);
__rtp_payload_type_add_recv(media, pt);
__rtp_payload_type_add_recv(media, pt, 1);
ilog(LOG_DEBUG, "Using default codecs PCMU and PCMA for T.38 gateway");
}


+ 1
- 1
daemon/redis.c View File

@ -1422,7 +1422,7 @@ static struct rtp_payload_type *rbl_cb_plts_g(str *s, GQueue *q, struct redis_li
}
static int rbl_cb_plts_r(str *s, GQueue *q, struct redis_list *list, void *ptr) {
struct call_media *med = ptr;
__rtp_payload_type_add_recv(med, rbl_cb_plts_g(s, q, list, ptr));
__rtp_payload_type_add_recv(med, rbl_cb_plts_g(s, q, list, ptr), 0);
return 0;
}
static int rbl_cb_plts_s(str *s, GQueue *q, struct redis_list *list, void *ptr) {


+ 1
- 1
include/codec.h View File

@ -78,7 +78,7 @@ void codec_init_payload_type(struct rtp_payload_type *, struct call_media *);
// used by redis
void __rtp_payload_type_add_recv(struct call_media *media, struct rtp_payload_type *pt);
void __rtp_payload_type_add_recv(struct call_media *media, struct rtp_payload_type *pt, int supp_check);
void __rtp_payload_type_add_send(struct call_media *other_media, struct rtp_payload_type *pt);


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

@ -1045,6 +1045,41 @@ rcv($sock_a, $port_b, rtpm(96, 1004, 4200, $ssrc, "\xf0\x14\x41\x00\x30\x44\x41\
new_call;
offer('add transcode w supp codec', {
ICE => 'remove',
flags => [],
codec => {transcode => ['PCMA']},
}, <<SDP);
v=0
o=Z 58440449 0 IN IP4 89.225.243.254
s=Z
c=IN IP4 89.225.243.254
t=0 0
m=audio 8000 RTP/AVP 0 101
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
--------------------------------------
v=0
o=Z 58440449 0 IN IP4 89.225.243.254
s=Z
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
SDP
# GH 1086
new_call;
@ -1396,11 +1431,11 @@ o=dev 623840 205550 IN IP4 8.8.8.61
s=SIP Media Capabilities
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 101 0 9
m=audio PORT RTP/AVP 0 9 101
a=maxptime:20
a=rtpmap:101 telephone-event/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
a=rtcp:PORT
@ -1462,11 +1497,11 @@ o=dev 623840 205550 IN IP4 8.8.8.61
s=SIP Media Capabilities
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 101 0 9
m=audio PORT RTP/AVP 0 9 101
a=maxptime:20
a=rtpmap:101 telephone-event/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv
a=rtcp:PORT
@ -3235,12 +3270,12 @@ o=- 1822058533 1822058533 IN IP4 1.2.3.4
s=Asterisk
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 8 107 101 9
m=audio PORT RTP/AVP 8 107 9 101
a=maxptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:107 opus/48000/2
a=rtpmap:101 telephone-event/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
@ -3310,12 +3345,12 @@ o=- 1822058533 1822058533 IN IP4 1.2.3.4
s=Asterisk
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 8 107 101 9
m=audio PORT RTP/AVP 8 107 9 101
a=maxptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:107 opus/48000/2
a=rtpmap:101 telephone-event/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
@ -3384,12 +3419,12 @@ o=- 1822058533 1822058533 IN IP4 1.2.3.4
s=Asterisk
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 8 107 101 9
m=audio PORT RTP/AVP 8 107 9 101
a=maxptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:107 opus/48000/2
a=rtpmap:101 telephone-event/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
@ -3459,12 +3494,12 @@ o=- 1822058533 1822058533 IN IP4 1.2.3.4
s=Asterisk
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 8 107 101 9
m=audio PORT RTP/AVP 8 107 9 101
a=maxptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:107 opus/48000/2
a=rtpmap:101 telephone-event/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
@ -3535,12 +3570,12 @@ o=- 1822058533 1822058533 IN IP4 1.2.3.4
s=Asterisk
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 8 107 101 9
m=audio PORT RTP/AVP 8 107 9 101
a=maxptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:107 opus/48000/2
a=rtpmap:101 telephone-event/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
@ -3605,12 +3640,12 @@ o=- 1822058533 1822058533 IN IP4 1.2.3.4
s=Asterisk
c=IN IP4 203.0.113.1
t=0 0
m=audio PORT RTP/AVP 8 107 101 9
m=audio PORT RTP/AVP 8 107 9 101
a=maxptime:20
a=rtpmap:8 PCMA/8000
a=rtpmap:107 opus/48000/2
a=rtpmap:101 telephone-event/8000
a=rtpmap:9 G722/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=sendrecv
a=rtcp:PORT
@ -4790,11 +4825,11 @@ v=0
o=- 1545997027 1 IN IP4 203.0.113.1
s=tester
t=0 0
m=audio PORT RTP/AVP 0 96 8
m=audio PORT RTP/AVP 0 8 96
c=IN IP4 203.0.113.1
a=rtpmap:0 PCMU/8000
a=rtpmap:96 telephone-event/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:96 telephone-event/8000
a=sendrecv
a=rtcp:PORT
SDP
@ -8635,11 +8670,11 @@ v=0
o=- 1545997027 1 IN IP4 203.0.113.1
s=tester
t=0 0
m=audio PORT RTP/AVP 100 101 8 96
m=audio PORT RTP/AVP 100 8 101 96
c=IN IP4 203.0.113.1
a=rtpmap:100 PCMU/16000
a=rtpmap:101 telephone-event/16000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/16000
a=rtpmap:96 telephone-event/8000
a=fmtp:101 0-15
a=fmtp:96 0-15


+ 4
- 4
t/transcode-test.c View File

@ -888,14 +888,14 @@ int main(void) {
offer();
expect(A, recv, "");
expect(A, send, "8/PCMA/8000 101/telephone-event/8000");
expect(B, recv, "8/PCMA/8000 101/telephone-event/8000 0/PCMU/8000");
expect(B, recv, "8/PCMA/8000 0/PCMU/8000 101/telephone-event/8000");
expect(B, send, "");
sdp_pt(0, PCMU, 8000);
sdp_pt(101, telephone-event, 8000);
answer();
expect(A, recv, "8/PCMA/8000 101/telephone-event/8000");
expect(A, send, "8/PCMA/8000 101/telephone-event/8000");
expect(B, recv, "101/telephone-event/8000 0/PCMU/8000");
expect(B, recv, "0/PCMU/8000 101/telephone-event/8000");
expect(B, send, "0/PCMU/8000 101/telephone-event/8000");
packet_seq(A, 8, PCMA_payload, 1000000, 200, 0, PCMU_payload);
// start with marker
@ -1061,14 +1061,14 @@ int main(void) {
offer();
expect(A, recv, "");
expect(A, send, "8/PCMA/8000 101/telephone-event/8000");
expect(B, recv, "8/PCMA/8000 101/telephone-event/8000 0/PCMU/8000");
expect(B, recv, "8/PCMA/8000 0/PCMU/8000 101/telephone-event/8000");
expect(B, send, "");
sdp_pt(0, PCMU, 8000);
sdp_pt(101, telephone-event, 8000);
answer();
expect(A, recv, "8/PCMA/8000 101/telephone-event/8000");
expect(A, send, "8/PCMA/8000 101/telephone-event/8000");
expect(B, recv, "101/telephone-event/8000 0/PCMU/8000");
expect(B, recv, "0/PCMU/8000 101/telephone-event/8000");
expect(B, send, "0/PCMU/8000 101/telephone-event/8000");
packet_seq(A, 8, PCMA_payload, 1000000, 200, 0, PCMU_payload);
// start with marker


Loading…
Cancel
Save