diff --git a/daemon/media_socket.c b/daemon/media_socket.c index a1f50024f..a8d197876 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -79,6 +79,7 @@ struct packet_handler_ctx { bool unkernelize_subscriptions; // if our peer address changed bool kernelize; // true if stream can be kernelized bool rtcp_discard; // do not forward RTCP + bool media_set; // media explicitly know via MID header extension // output: struct media_packet mp; // passed to handlers @@ -2857,6 +2858,7 @@ static void rtp_ext_mid_parse(struct packet_handler_ctx *phc, const struct rtp_e return; // XXX log error? media_packet_reset_media(phc, media); + phc->media_set = true; } static ssize_t rtp_ext_mid_len(struct call_media *media) { return media->media_id.len ?: -1; @@ -2955,9 +2957,13 @@ static void media_packet_rtp_in(struct packet_handler_ctx *phc) { const char *unkern = NULL; + __auto_type ssrc_hash = &phc->mp.media->ssrc_hash_in; + if (phc->mp.media->bundle) + ssrc_hash = &phc->mp.media->bundle->ssrc_hash_in; + if (phc->mp.rtp) { unkern = __stream_ssrc_in(phc->in_srtp, phc->mp.rtp->ssrc, &phc->mp.ssrc_in, - &phc->mp.media->ssrc_hash_in); + ssrc_hash); if (G_LIKELY(phc->mp.ssrc_in)) payload_tracker_add(&phc->mp.ssrc_in->tracker, phc->payload_type); @@ -2986,11 +2992,18 @@ static void media_packet_rtp_in(struct packet_handler_ctx *phc) { } else if (phc->rtcp) { unkern = __stream_ssrc_in(phc->in_srtp, phc->mp.rtcp->ssrc, &phc->mp.ssrc_in, - &phc->mp.media->ssrc_hash_in); + ssrc_hash); } if (unkern) phc->unkernelize = unkern; + + if (phc->mp.media->bundle) { + if (phc->media_set) + phc->mp.ssrc_in->media = phc->mp.media; + else if (phc->mp.ssrc_in->media) + media_packet_reset_media(phc, phc->mp.ssrc_in->media); + } } static void media_packet_rtp_out(struct packet_handler_ctx *phc, struct sink_handler *sh) { diff --git a/include/ssrc.h b/include/ssrc.h index 25a09e287..fddf59760 100644 --- a/include/ssrc.h +++ b/include/ssrc.h @@ -59,6 +59,8 @@ struct ssrc_entry { struct ssrc_entry_call { struct ssrc_entry h; // must be first + struct call_media *media; // bundle receive media + struct payload_tracker tracker; // XXX move entire crypto context in here?