Browse Source

MT#63317 refactor RTP parsing code

Split up demuxing, parsing, stats, and the setting of ingress and egress
streams.

Change-Id: I1ed736024b3df8c3f24b68dc9bb8ef3e886712be
pull/2008/head
Richard Fuchs 5 months ago
parent
commit
8795e92fab
1 changed files with 49 additions and 23 deletions
  1. +49
    -23
      daemon/media_socket.c

+ 49
- 23
daemon/media_socket.c View File

@ -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


Loading…
Cancel
Save