From 57bc6b1e955f53ca9d602d335460dc7a837115a3 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 28 Aug 2025 11:41:11 -0400 Subject: [PATCH] MT#63317 abstract packet copy Change-Id: I0ea082a4fad138c25cd710dd82020d4f4d192485 --- daemon/codec.c | 29 +++++++++++++++++++---------- daemon/media_socket.c | 1 + include/media_socket.h | 1 + 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index a34f70f06..f8ea40180 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -2145,27 +2145,36 @@ static void codec_add_raw_packet_common(struct media_packet *mp, unsigned int cl } t_queue_push_tail_link(&mp->packets_out, &p->link); } -void codec_add_raw_packet(struct media_packet *mp, unsigned int clockrate) { - struct codec_packet *p = g_new0(__typeof(*p), 1); - p->link.data = p; - p->s = mp->raw; - p->free_func = NULL; - codec_add_raw_packet_common(mp, clockrate, p); -} -#ifdef WITH_TRANSCODING + static void codec_add_raw_packet_dup(struct media_packet *mp, unsigned int clockrate) { struct codec_packet *p = g_new0(__typeof(*p), 1); p->link.data = p; // don't just duplicate the string. need to ensure enough room // if encryption is enabled on this stream - p->s.s = bufferpool_alloc(media_bufferpool, mp->raw.len + RTP_BUFFER_TAIL_ROOM); + // or for RTP header extensions + size_t ext_len = mp->sink.rtpext->length(mp); + p->s.s = bufferpool_alloc(media_bufferpool, mp->raw.len + ext_len + RTP_BUFFER_TAIL_ROOM); memcpy(p->s.s, mp->raw.s, mp->raw.len); p->s.len = mp->raw.len; p->free_func = bufferpool_unref; p->rtp = (struct rtp_header *) p->s.s; codec_add_raw_packet_common(mp, clockrate, p); } -#endif + +void codec_add_raw_packet(struct media_packet *mp, unsigned int clockrate) { + if (!mp->sink.rtpext->may_copy) { + codec_add_raw_packet_dup(mp, clockrate); + return; + } + struct codec_packet *p = g_new0(__typeof(*p), 1); + p->link.data = p; + p->s = mp->raw; + p->free_func = NULL; + codec_add_raw_packet_common(mp, clockrate, p); +} + + + static bool handler_silence_block(struct codec_handler *h, struct media_packet *mp) { if (CALL_ISSET(mp->call, BLOCK_MEDIA) || ML_ISSET(mp->media->monologue, BLOCK_MEDIA) || mp->sink.attrs.block_media || MEDIA_ISSET(mp->media_out, BLOCK_EGRESS)) return false; diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 3d1ea3d6f..dd835cfc5 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2074,6 +2074,7 @@ static size_t rtpext_printer_copy_print(struct rtp_header *rh, void *dst, const const struct rtpext_printer rtpext_printer_copy = { .length = rtpext_printer_copy_length, .print = rtpext_printer_copy_print, + .may_copy = true, }; diff --git a/include/media_socket.h b/include/media_socket.h index 0a2e9c206..074f0f847 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -257,6 +257,7 @@ struct sink_attrs { struct rtpext_printer { size_t (*length)(const struct media_packet *); size_t (*print)(struct rtp_header *, void *dst, const struct media_packet *); + bool may_copy; }; /**