From 2f52fb2511f329748e19e2204b06d8fa24aa0b7c Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 29 Jul 2025 08:47:04 -0400 Subject: [PATCH] MT#63317 return RTP extensions from rtp_payload Change-Id: If7451e3d32ba39cab40f6f09488cd75ccbefa1cc --- daemon/jitter_buffer.c | 2 +- daemon/media_socket.c | 2 +- daemon/rtp.c | 6 +++--- lib/rtplib.c | 7 +++++-- lib/rtplib.h | 2 +- recording-daemon/packet.c | 2 +- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/daemon/jitter_buffer.c b/daemon/jitter_buffer.c index d70b34b98..6e36fa4ae 100644 --- a/daemon/jitter_buffer.c +++ b/daemon/jitter_buffer.c @@ -93,7 +93,7 @@ static int get_clock_rate(struct media_packet *mp, int payload_type) { } static struct jb_packet* get_jb_packet(struct media_packet *mp, const str *s) { - if (!(mp->rtp = rtp_payload(&mp->payload, s))) + if (!(mp->rtp = rtp_payload(&mp->payload, s, NULL))) return NULL; char *buf = bufferpool_alloc(media_bufferpool, s->len + RTP_BUFFER_HEAD_ROOM + RTP_BUFFER_TAIL_ROOM); diff --git a/daemon/media_socket.c b/daemon/media_socket.c index a7c2ad496..03ebb37d3 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2296,7 +2296,7 @@ static void media_packet_parse(struct packet_handler_ctx *phc) { return; if (!phc->rtcp) { - phc->mp.rtp = rtp_payload(&phc->mp.payload, &phc->s); + phc->mp.rtp = rtp_payload(&phc->mp.payload, &phc->s, NULL); if (G_LIKELY(phc->mp.rtp)) { // check the payload type // XXX redundant between SSRC handling and codec_handler stuff -> combine diff --git a/daemon/rtp.c b/daemon/rtp.c index 874c9c9da..b3bf52318 100644 --- a/daemon/rtp.c +++ b/daemon/rtp.c @@ -109,7 +109,7 @@ int rtp_avp2savp(str *s, struct crypto_context *c, struct ssrc_entry_call *ssrc_ if (G_UNLIKELY(!ssrc_ctx)) return -1; - if (!(rtp = rtp_payload(&payload, s))) + if (!(rtp = rtp_payload(&payload, s, NULL))) return -1; if (check_session_keys(c)) return -1; @@ -149,7 +149,7 @@ int rtp_update_index(str *s, struct packet_stream *ps, struct ssrc_entry_call *s if (G_UNLIKELY(!ssrc)) return -1; - if (!(rtp = rtp_payload(NULL, s))) + if (!(rtp = rtp_payload(NULL, s, NULL))) return -1; g_autoptr(crypto_debug_string) cds = NULL; packet_index(ssrc, rtp, &cds); @@ -165,7 +165,7 @@ int rtp_savp2avp(str *s, struct crypto_context *c, struct ssrc_entry_call *ssrc_ if (G_UNLIKELY(!ssrc_ctx)) return -1; - if (!(rtp = rtp_payload(&payload, s))) + if (!(rtp = rtp_payload(&payload, s, NULL))) return -1; if (check_session_keys(c)) return -1; diff --git a/lib/rtplib.c b/lib/rtplib.c index 24f690c80..3f506d15c 100644 --- a/lib/rtplib.c +++ b/lib/rtplib.c @@ -59,7 +59,7 @@ const int num_rfc_rtp_payload_types = G_N_ELEMENTS(rfc_rtp_payload_types); -struct rtp_header *rtp_payload(str *p, const str *s) { +struct rtp_header *rtp_payload(str *p, const str *s, str *exts) { struct rtp_header *rtp; const char *err; @@ -90,8 +90,11 @@ struct rtp_header *rtp_payload(str *p, const str *s) { if (p->len < sizeof(*ext)) goto error; ext = (void *) p->s; + size_t ext_len = sizeof(*ext) + ntohs(ext->length) * 4; + if (exts) + *exts = STR_LEN(p->s, ext_len); err = "short packet (header extensions)"; - if (str_shift(p, sizeof(*ext) + ntohs(ext->length) * 4)) + if (str_shift(p, ext_len)) goto error; } diff --git a/lib/rtplib.h b/lib/rtplib.h index ec30b9ed6..8d9e9a4b8 100644 --- a/lib/rtplib.h +++ b/lib/rtplib.h @@ -128,7 +128,7 @@ extern const int num_rfc_rtp_payload_types; __attribute__((nonnull(2))) -struct rtp_header *rtp_payload(str *p, const str *s); +struct rtp_header *rtp_payload(str *p, const str *s, str *ext); __attribute__((nonnull(2))) bool rtp_padding(const struct rtp_header *header, str *payload); const struct rtp_payload_type *rtp_get_rfc_payload_type(unsigned int type); diff --git a/recording-daemon/packet.c b/recording-daemon/packet.c index dfbd02054..97a2a76d3 100644 --- a/recording-daemon/packet.c +++ b/recording-daemon/packet.c @@ -184,7 +184,7 @@ void packet_process(stream_t *stream, unsigned char *buf, unsigned len) { if (rtcp_demux_is_rtcp(&bufstr)) goto ignore; // for now - if (!(packet->rtp = rtp_payload(&packet->payload, &bufstr))) + if (!(packet->rtp = rtp_payload(&packet->payload, &bufstr, NULL))) goto err; if (!rtp_padding(packet->rtp, &packet->payload)) goto err;