From 8795e92fab22c3602e6e1191476a9084b7919b28 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 30 Jul 2025 14:10:40 -0400 Subject: [PATCH] MT#63317 refactor RTP parsing code Split up demuxing, parsing, stats, and the setting of ingress and egress streams. Change-Id: I1ed736024b3df8c3f24b68dc9bb8ef3e886712be --- daemon/media_socket.c | 72 +++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 53e7453dd..a7c2ad496 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2278,28 +2278,57 @@ static int media_loop_detect(struct packet_handler_ctx *phc) { -// in_srtp is set to point to the SRTP context to use -// sinks is set to where to forward the packet to -static void media_packet_rtcp_demux(struct packet_handler_ctx *phc) -{ +// sets rtcp flag +static void media_packet_rtcp_demux(struct packet_handler_ctx *phc) { + if (!proto_is_rtp(phc->mp.media->protocol)) + return; + + phc->rtcp = rtcp_demux_is_rtcp(&phc->s); +} + +// sets RTP payload, RTP/RTCP header, and payload type +static void media_packet_parse(struct packet_handler_ctx *phc) { + phc->payload_type = -1; + + if (G_UNLIKELY(!phc->mp.media)) + return; + if (G_UNLIKELY(!proto_is_rtp(phc->mp.media->protocol))) + return; + + if (!phc->rtcp) { + phc->mp.rtp = rtp_payload(&phc->mp.payload, &phc->s); + if (G_LIKELY(phc->mp.rtp)) { + // check the payload type + // XXX redundant between SSRC handling and codec_handler stuff -> combine + phc->payload_type = (phc->mp.rtp->m_pt & 0x7f); + } + } + else { + phc->mp.rtcp = rtcp_payload(NULL, &phc->s); + if (G_UNLIKELY(!phc->mp.rtcp)) + phc->rtcp = false; + } +} + +// sets in_srtp and sinks +static void media_packet_set_streams(struct packet_handler_ctx *phc) { phc->in_srtp = phc->mp.stream; phc->sinks = &phc->mp.stream->rtp_sinks; - // is this RTCP? - if (!proto_is_rtp(phc->mp.media->protocol)) - return; // no + if (G_UNLIKELY(!phc->mp.media)) + return; + if (G_UNLIKELY(!proto_is_rtp(phc->mp.media->protocol))) + return; - bool is_rtcp = rtcp_demux_is_rtcp(&phc->s); - if (is_rtcp) { + if (phc->rtcp) { if (phc->mp.stream->rtcp_sibling) phc->in_srtp = phc->mp.stream->rtcp_sibling; // use RTCP SRTP context phc->sinks = &phc->mp.stream->rtcp_sinks; - phc->rtcp = true; } } + // out_srtp is set to point to the SRTP context to use -static void media_packet_rtcp_mux(struct packet_handler_ctx *phc, struct sink_handler *sh) -{ +static void media_packet_rtcp_mux(struct packet_handler_ctx *phc, struct sink_handler *sh) { phc->out_srtp = sh->sink; if (phc->rtcp && sh->sink->rtcp_sibling) phc->out_srtp = sh->sink->rtcp_sibling; // use RTCP SRTP context @@ -2309,10 +2338,8 @@ static void media_packet_rtcp_mux(struct packet_handler_ctx *phc, struct sink_ha } -static void media_packet_rtp_in(struct packet_handler_ctx *phc) -{ - phc->payload_type = -1; - +// sets ssrc_in and tracks stats +static void media_packet_rtp_in(struct packet_handler_ctx *phc) { if (G_UNLIKELY(!phc->mp.media)) return; if (G_UNLIKELY(!proto_is_rtp(phc->mp.media->protocol))) @@ -2320,13 +2347,10 @@ static void media_packet_rtp_in(struct packet_handler_ctx *phc) const char *unkern = NULL; - if (G_LIKELY(!phc->rtcp && (phc->mp.rtp = rtp_payload(&phc->mp.payload, &phc->s)))) { + 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); - // check the payload type - // XXX redundant between SSRC handling and codec_handler stuff -> combine - phc->payload_type = (phc->mp.rtp->m_pt & 0x7f); if (G_LIKELY(phc->mp.ssrc_in)) payload_tracker_add(&phc->mp.ssrc_in->tracker, phc->payload_type); @@ -2350,7 +2374,7 @@ static void media_packet_rtp_in(struct packet_handler_ctx *phc) g_atomic_pointer_set(&phc->mp.stream->rtp_stats_cache, rtp_s); } } - else if (phc->rtcp && (phc->mp.rtcp = rtcp_payload(NULL, &phc->s))) { + 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); } @@ -2829,10 +2853,12 @@ static int stream_packet(struct packet_handler_ctx *phc) { } #endif - // this sets rtcp, in_srtp, and sinks media_packet_rtcp_demux(phc); - // this set payload_type, ssrc_in, and mp payloads + media_packet_parse(phc); + + media_packet_set_streams(phc); + media_packet_rtp_in(phc); // decrypt in place