From f349cc7ee737daa2eb4e4c958fe0eeb792491a7f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 8 Aug 2025 12:07:55 -0400 Subject: [PATCH] MT#63317 use monologue-local extmap storage Change-Id: I8a341718f3944b276cd2838aaf37d26bb5ca1e0c --- daemon/call.c | 42 ++++++++++++++++++++++++++------ daemon/sdp.c | 2 +- t/auto-daemon-tests-websocket.py | 17 +++++++++++++ 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 597100a2f..a2ca9eb83 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2861,6 +2861,17 @@ static void media_set_siprec_label(struct call_media *other_media, struct call_m other_media->label = media->label; } +__attribute__((nonnull(1))) +static void media_reset_extmap(struct call_media *media) { + // empty out old queue + t_queue_clear_full(&media->extmap, rtp_extension_free); + + t_hash_table_remove_all(media->ext_name_ht); + t_hash_table_remove_all(media->extmap_ht); + memset(media->extmap_a, 0, sizeof(media->extmap_a)); + media->extmap_lookup = call_media_ext_lookup_array; +} + __attribute__((nonnull(1, 2))) static void media_init_extmap(struct call_media *media, struct rtp_extension *ext) { ext->name = call_str_cpy(&ext->name); @@ -2876,19 +2887,31 @@ static void media_init_extmap(struct call_media *media, struct rtp_extension *ex __attribute__((nonnull(1, 2))) static void media_update_extmap(struct call_media *media, struct stream_params *sp) { - // empty out old queue and take over from `sp` - t_queue_clear_full(&media->extmap, rtp_extension_free); + media_reset_extmap(media); + + // take over from `sp` media->extmap = sp->extmap; t_queue_init(&sp->extmap); - t_hash_table_remove_all(media->ext_name_ht); - t_hash_table_remove_all(media->extmap_ht); - memset(media->extmap_a, 0, sizeof(media->extmap_a)); - media->extmap_lookup = call_media_ext_lookup_array; - // init entries for (__auto_type ll = media->extmap.head; ll; ll = ll->next) { __auto_type ext = ll->data; + + media_init_extmap(media, ext); + } +} + +__attribute__((nonnull(1, 2))) +static void media_set_extmap(struct call_media *media, const extmap_q *emq) { + media_reset_extmap(media); + + // copy entries + for (__auto_type ll = emq->head; ll; ll = ll->next) { + __auto_type ext_o = ll->data; + __auto_type ext = g_new(__typeof(*ext_o), 1); + *ext = *ext_o; + t_queue_push_tail(&media->extmap, ext); + media_init_extmap(media, ext); } } @@ -3131,7 +3154,7 @@ static struct call_media * monologue_add_zero_media(struct call_monologue *sende media_update_attrs(sender_media, sp); media_update_format(sender_media, sp); media_set_ptime(sender_media, sp, flags->rev_ptime, flags->ptime); - media_update_extmap(sender_media, sp); + media_set_extmap(sender_media, &sp->extmap); *num_ports_other = proto_num_ports(sp->num_ports, sender_media, flags, (flags->rtcp_mux_demux || flags->rtcp_mux_accept) ? true : false); __disable_streams(sender_media, *num_ports_other); @@ -3263,6 +3286,7 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q * media_set_ptime(sender_media, sp, flags->rev_ptime, flags->ptime); media_set_ptime(receiver_media, sp, flags->ptime, flags->rev_ptime); media_update_extmap(sender_media, sp); + media_set_extmap(receiver_media, &sender_media->extmap); if (flags->opmode == OP_OFFER) { ilog(LOG_DEBUG, "Setting media recording slots to %u", flags->media_rec_slot_offer); @@ -3775,6 +3799,7 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca media_set_address_family(dst_media, src_media, flags); media_set_ptime(src_media, sp, flags->rev_ptime, flags->ptime); media_set_ptime(dst_media, sp, flags->ptime, flags->rev_ptime); + media_set_extmap(dst_media, &src_media->extmap); codec_store_populate(&dst_media->codecs, &src_media->codecs, .allow_asymmetric = !!flags->allow_asymmetric_codecs); @@ -3884,6 +3909,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag media_update_crypto(dst_media, sp, flags); media_update_format(dst_media, sp); media_set_ptime(dst_media, sp, flags->ptime, 0); + media_update_extmap(dst_media, sp); if (flags->allow_transcoding) { codec_store_populate(&dst_media->codecs, &sp->codecs, diff --git a/daemon/sdp.c b/daemon/sdp.c index 52bae25e9..f2d373003 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -2852,7 +2852,7 @@ static void print_sdp_media_section(GString *s, struct call_media *media, if (proto_is_rtp(media->protocol)) insert_codec_parameters(s, media, flags); - sdp_print_extmap(s, source_media, flags); + sdp_print_extmap(s, media, flags); /* all unknown type attributes will be added here */ media->sdp_attr_print(s, media, source_media, flags); diff --git a/t/auto-daemon-tests-websocket.py b/t/auto-daemon-tests-websocket.py index e87dee0b6..bc3e13db3 100644 --- a/t/auto-daemon-tests-websocket.py +++ b/t/auto-daemon-tests-websocket.py @@ -1688,6 +1688,12 @@ class TestVideoroom(unittest.TestCase): "a=rtpmap:111 opus/48000/2\r\n" "a=fmtp:111 useinbandfec=1; minptime=10\r\n" "a=rtcp-fb:111 transport-cc\r\n" + "a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n" + "a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n" + "a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n" + "a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\n" + "a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\n" + "a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\n" "a=recvonly\r\n" "a=rtcp:\\d+\r\n" "a=rtcp-mux\r\n" @@ -1708,6 +1714,17 @@ class TestVideoroom(unittest.TestCase): "a=rtcp-fb:96 ccm fir\r\n" "a=rtcp-fb:96 nack\r\n" "a=rtcp-fb:96 nack pli\r\n" + "a=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\n" + "a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\n" + "a=extmap:13 urn:3gpp:video-orientation\r\n" + "a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n" + "a=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\n" + "a=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\n" + "a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\n" + "a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\n" + "a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\n" + "a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\n" + "a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\n" "a=recvonly\r\n" "a=rtcp:\\d+\r\n" "a=rtcp-mux\r\n"