From d3d1a55830faa41a9fffdb4e78476158df798e54 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 27 Aug 2025 12:16:52 -0400 Subject: [PATCH] MT#63317 support extensions in codec_output_rtp Change-Id: Ibefde005041bc6d715d42d089e6277ee2804917c --- daemon/codec.c | 15 +++++++++++---- t/auto-daemon-tests-rtp-ext.pl | 8 ++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 7cfad909c..863138d98 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -2438,7 +2438,7 @@ out_ch: void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *csch, struct codec_handler *handler, - char *buf, // bufferpool_alloc'd, room for rtp_header + filled-in payload + char *buf, // bufferpool_alloc'd, room for rtp_header + extensions + filled-in payload size_t payload_len, unsigned long payload_ts, struct rtp_markers marks, int seq, int seq_inc, int payload_type, @@ -2460,11 +2460,17 @@ void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *csch, rh->timestamp = htonl(ts); rh->ssrc = htonl(ssrc_out->h.ssrc); + if (mp->extensions.len) { + rh->v_p_x_cc |= 0x10; + char *exts = buf + sizeof(*rh); + memcpy(exts, mp->extensions.s, mp->extensions.len); + } + // add to output queue struct codec_packet *p = g_new0(__typeof(*p), 1); p->link.data = p; p->s.s = buf; - p->s.len = payload_len + sizeof(struct rtp_header); + p->s.len = payload_len + sizeof(struct rtp_header) + mp->extensions.len; payload_tracker_add(&ssrc_out->tracker, handler->dest_pt.payload_type); p->free_func = bufferpool_unref; p->ttq_entry.source = handler; @@ -4535,10 +4541,11 @@ void packet_encoded_packetize(AVPacket *pkt, struct codec_ssrc_handler *ch, stru // figure out how big of a buffer we need size_t payload_len = MAX(MAX(pkt->size, ch->bytes_per_packet), sizeof(struct telephone_event_payload)); - size_t pkt_len = sizeof(struct rtp_header) + payload_len + RTP_BUFFER_TAIL_ROOM; + size_t payload_ext_len = payload_len + mp->extensions.len; + size_t pkt_len = sizeof(struct rtp_header) + payload_ext_len + RTP_BUFFER_TAIL_ROOM; // prepare our buffers char *buf = bufferpool_alloc(media_bufferpool, pkt_len); - char *payload = buf + sizeof(struct rtp_header); + char *payload = buf + sizeof(struct rtp_header) + mp->extensions.len; // tell our packetizer how much we want str inout = STR_LEN(payload, payload_len); // and request a packet diff --git a/t/auto-daemon-tests-rtp-ext.pl b/t/auto-daemon-tests-rtp-ext.pl index 5aded3d68..b0fb3dc07 100755 --- a/t/auto-daemon-tests-rtp-ext.pl +++ b/t/auto-daemon-tests-rtp-ext.pl @@ -306,9 +306,9 @@ a=rtcp:PORT SDP snd($sock_a, $port_b, rtp( 8, 1000, 3000+160*0, 0x1234, "\x10" . ("\x00" x 158) . "\x50", [[1, "foo"]])); -rcv($sock_b, $port_a, rtpm(0, 1000, 3000+160*0, 0x1234, "\x39" . ("\x29" x 158) . "\x74")); +rcv($sock_b, $port_a, rtpm(0, 1000, 3000+160*0, 0x1234, "\x39" . ("\x29" x 158) . "\x74", [[1, "foo"]])); snd($sock_b, $port_a, rtp( 0, 8000, 7000+160*0, 0x6543, "\x39" . ("\x29" x 158) . "\x74", [[2, "blah"]])); -rcv($sock_a, $port_b, rtpm(8, 8000, 7000+160*0, 0x6543, "\x10" . ("\x00" x 158) . "\x50")); +rcv($sock_a, $port_b, rtpm(8, 8000, 7000+160*0, 0x6543, "\x10" . ("\x00" x 158) . "\x50", [[2, "blah"]])); @@ -370,9 +370,9 @@ a=rtcp:PORT SDP snd($sock_a, $port_b, rtp( 8, 1000, 3000+160*0, 0x1234, "\x10" . ("\x00" x 158) . "\x50", [[1, "foo"]])); -rcv($sock_b, $port_a, rtpm(0, 1000, 3000+160*0, 0x1234, "\x39" . ("\x29" x 158) . "\x74")); +rcv($sock_b, $port_a, rtpm(0, 1000, 3000+160*0, 0x1234, "\x39" . ("\x29" x 158) . "\x74", [[1, "foo"]])); snd($sock_b, $port_a, rtp( 0, 8000, 7000+160*0, 0x6543, "\x39" . ("\x29" x 158) . "\x74", [[2, "blah"]])); -rcv($sock_a, $port_b, rtpm(8, 8000, 7000+160*0, 0x6543, "\x10" . ("\x00" x 158) . "\x50")); +rcv($sock_a, $port_b, rtpm(8, 8000, 7000+160*0, 0x6543, "\x10" . ("\x00" x 158) . "\x50", [[2, "blah"]]));