Browse Source

TT#14008 don't accept stray answer codecs that were not offered

Special handling for codec lists that were received as part of an
answer: If the list includes a codec that was not offered, ignore that
codec. This prevents transcoders from being set up that were not
requested.

This brought to light some tests that were actually broken.

Change-Id: Iac71056ec5e10b5de5567917974f2c4e0261eb0c
(cherry picked from commit 22d8db9e72)
mr10.2.1
Richard Fuchs 4 years ago
parent
commit
d42152c535
5 changed files with 50 additions and 27 deletions
  1. +14
    -11
      daemon/call.c
  2. +29
    -9
      daemon/codec.c
  3. +2
    -2
      include/codec.h
  4. +3
    -3
      t/auto-daemon-tests.pl
  5. +2
    -2
      t/test-transcode.c

+ 14
- 11
daemon/call.c View File

@ -2317,9 +2317,11 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi
other_media->index);
if (flags) {
if (flags->reuse_codec)
codec_store_populate_reuse(&other_media->codecs, &sp->codecs, flags->codec_set);
codec_store_populate_reuse(&other_media->codecs, &sp->codecs, flags->codec_set,
false);
else
codec_store_populate(&other_media->codecs, &sp->codecs, flags->codec_set);
codec_store_populate(&other_media->codecs, &sp->codecs, flags->codec_set,
false);
codec_store_strip(&other_media->codecs, &flags->codec_strip, flags->codec_except);
codec_store_offer(&other_media->codecs, &flags->codec_offer, &sp->codecs);
if (!other_media->codecs.strip_full)
@ -2328,7 +2330,8 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi
codec_store_accept(&other_media->codecs, &flags->codec_consume, &sp->codecs);
codec_store_track(&other_media->codecs, &flags->codec_mask);
} else
codec_store_populate(&other_media->codecs, &sp->codecs, NULL);
codec_store_populate(&other_media->codecs, &sp->codecs, NULL,
false);
// we don't update the answerer side if the offer is not RTP but is going
// to RTP (i.e. T.38 transcoding) - instead we leave the existing codec list
@ -2343,9 +2346,9 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi
STR_FMT(&media->monologue->tag),
media->index);
if (flags && flags->reuse_codec)
codec_store_populate_reuse(&media->codecs, &sp->codecs, NULL);
codec_store_populate_reuse(&media->codecs, &sp->codecs, NULL, false);
else
codec_store_populate(&media->codecs, &sp->codecs, NULL);
codec_store_populate(&media->codecs, &sp->codecs, NULL, false);
}
if (flags) {
codec_store_strip(&media->codecs, &flags->codec_strip, flags->codec_except);
@ -2374,9 +2377,9 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi
STR_FMT(&other_media->monologue->tag),
other_media->index);
if (flags->reuse_codec)
codec_store_populate_reuse(&other_media->codecs, &sp->codecs, flags->codec_set);
codec_store_populate_reuse(&other_media->codecs, &sp->codecs, flags->codec_set, true);
else
codec_store_populate(&other_media->codecs, &sp->codecs, flags->codec_set);
codec_store_populate(&other_media->codecs, &sp->codecs, flags->codec_set, true);
codec_store_strip(&other_media->codecs, &flags->codec_strip, flags->codec_except);
codec_store_offer(&other_media->codecs, &flags->codec_offer, &sp->codecs);
@ -2850,7 +2853,7 @@ int monologue_publish(struct call_monologue *ml, GQueue *streams, struct sdp_ng_
__media_init_from_flags(media, NULL, sp, flags);
codec_store_populate(&media->codecs, &sp->codecs, NULL);
codec_store_populate(&media->codecs, &sp->codecs, NULL, false);
if (codec_store_accept_one(&media->codecs, &flags->codec_accept, flags->accept_any ? true : false))
return -1;
@ -2917,7 +2920,7 @@ int monologue_subscribe_request(struct call_monologue *src_ml, struct call_monol
if (__media_init_from_flags(src_media, dst_media, sp, flags) == 1)
continue;
codec_store_populate(&dst_media->codecs, &src_media->codecs, NULL);
codec_store_populate(&dst_media->codecs, &src_media->codecs, NULL, false);
codec_store_strip(&dst_media->codecs, &flags->codec_strip, flags->codec_except);
codec_store_strip(&dst_media->codecs, &flags->codec_consume, flags->codec_except);
codec_store_strip(&dst_media->codecs, &flags->codec_mask, flags->codec_except);
@ -2973,12 +2976,12 @@ int monologue_subscribe_answer(struct call_monologue *src_ml, struct call_monolo
continue;
if (flags && flags->allow_transcoding) {
codec_store_populate(&dst_media->codecs, &sp->codecs, flags->codec_set);
codec_store_populate(&dst_media->codecs, &sp->codecs, flags->codec_set, true);
codec_store_strip(&dst_media->codecs, &flags->codec_strip, flags->codec_except);
codec_store_offer(&dst_media->codecs, &flags->codec_offer, &sp->codecs);
}
else {
codec_store_populate(&dst_media->codecs, &sp->codecs, NULL);
codec_store_populate(&dst_media->codecs, &sp->codecs, NULL, true);
if (!codec_store_is_full_answer(&src_media->codecs, &dst_media->codecs))
return -1;
}


+ 29
- 9
daemon/codec.c View File

@ -3479,7 +3479,9 @@ static void codec_store_add_end(struct codec_store *cs, struct rtp_payload_type
codec_store_add_link(cs, pt, NULL);
}
void codec_store_populate_reuse(struct codec_store *dst, struct codec_store *src, GHashTable *codec_set) {
void codec_store_populate_reuse(struct codec_store *dst, struct codec_store *src, GHashTable *codec_set,
bool answer_only)
{
// start fresh
struct call_media *media = dst->media;
struct call *call = media ? media->call : NULL;
@ -3488,13 +3490,23 @@ void codec_store_populate_reuse(struct codec_store *dst, struct codec_store *src
struct rtp_payload_type *pt = l->data;
struct rtp_payload_type *orig_pt = g_hash_table_lookup(dst->codecs,
GINT_TO_POINTER(pt->payload_type));
ilogs(codec, LOG_DEBUG, "Adding codec " STR_FORMAT " (%i)",
STR_FMT(&pt->encoding_with_params),
pt->payload_type);
if (!orig_pt) {
__codec_options_set(call, pt, codec_set);
codec_store_add_end(dst, pt);
if (orig_pt)
ilogs(codec, LOG_DEBUG, "Retaining codec " STR_FORMAT " (%i)",
STR_FMT(&pt->encoding_with_params),
pt->payload_type);
else {
if (!answer_only) {
ilogs(codec, LOG_DEBUG, "Adding codec " STR_FORMAT " (%i) to end of list",
STR_FMT(&pt->encoding_with_params),
pt->payload_type);
__codec_options_set(call, pt, codec_set);
codec_store_add_end(dst, pt);
}
else
ilogs(codec, LOG_DEBUG, "Not adding stray answer codec " STR_FORMAT " (%i)",
STR_FMT(&pt->encoding_with_params),
pt->payload_type);
}
}
if(dst->codec_prefs.head){
@ -3511,7 +3523,9 @@ void codec_store_populate_reuse(struct codec_store *dst, struct codec_store *src
}
}
void codec_store_populate(struct codec_store *dst, struct codec_store *src, GHashTable *codec_set) {
void codec_store_populate(struct codec_store *dst, struct codec_store *src, GHashTable *codec_set,
bool answer_only)
{
// start fresh
struct codec_store orig_dst;
codec_store_move(&orig_dst, dst);
@ -3523,6 +3537,12 @@ void codec_store_populate(struct codec_store *dst, struct codec_store *src, GHas
struct rtp_payload_type *pt = l->data;
struct rtp_payload_type *orig_pt = g_hash_table_lookup(orig_dst.codecs,
GINT_TO_POINTER(pt->payload_type));
if (answer_only && !orig_pt) {
ilogs(codec, LOG_DEBUG, "Not adding stray answer codec " STR_FORMAT " (%i)",
STR_FMT(&pt->encoding_with_params),
pt->payload_type);
continue;
}
ilogs(codec, LOG_DEBUG, "Adding codec " STR_FORMAT " (%i)",
STR_FMT(&pt->encoding_with_params),
pt->payload_type);


+ 2
- 2
include/codec.h View File

@ -88,8 +88,8 @@ void codec_calc_jitter(struct ssrc_ctx *, unsigned long ts, unsigned int clockra
void codec_store_cleanup(struct codec_store *cs);
void codec_store_init(struct codec_store *cs, struct call_media *);
void codec_store_populate(struct codec_store *, struct codec_store *, GHashTable *);
void codec_store_populate_reuse(struct codec_store *, struct codec_store *, GHashTable *);
void codec_store_populate(struct codec_store *, struct codec_store *, GHashTable *, bool answer_only);
void codec_store_populate_reuse(struct codec_store *, struct codec_store *, GHashTable *, bool answer_only);
void codec_store_add_raw(struct codec_store *cs, struct rtp_payload_type *pt);
void codec_store_strip(struct codec_store *, GQueue *strip, GHashTable *except);
void codec_store_offer(struct codec_store *, GQueue *, struct codec_store *);


+ 3
- 3
t/auto-daemon-tests.pl View File

@ -5515,9 +5515,9 @@ 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 96 97
a=rtpmap:96 opus/48000
a=rtpmap:97 telephone-event/48000
m=audio 8000 RTP/AVP 97 102
a=rtpmap:97 opus/48000
a=rtpmap:102 telephone-event/48000
a=sendrecv
--------------------------------------
v=0


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

@ -1471,7 +1471,7 @@ int main(void) {
sdp_pt(0, PCMU, 8000);
sdp_pt(8, PCMA, 8000);
answer();
expect(B, "7/PCMA/8000 0/PCMU/8000 8/PCMA/8000");
expect(B, "0/PCMU/8000 8/PCMA/8000");
sdp_pt(0, PCMU, 8000);
sdp_pt(8, PCMA, 8000);
sdp_pt(9, PCMA, 8000);
@ -1481,7 +1481,7 @@ int main(void) {
sdp_pt(0, PCMU, 8000);
sdp_pt(8, PCMA, 8000);
answer();
expect(B, "7/PCMA/8000 0/PCMU/8000 8/PCMA/8000");
expect(B, "0/PCMU/8000 8/PCMA/8000");
end();
start();


Loading…
Cancel
Save