From ef8967dafefe29a180d6226661d390a8780c8a98 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 11 Nov 2025 10:04:44 -0400 Subject: [PATCH] MT#55283 convert packets_out to iqueue Change-Id: Iff72ab45cd3d4f6579180b5ed121a1779ee8285b --- daemon/codec.c | 8 ++------ daemon/media_player.c | 2 +- daemon/media_socket.c | 18 +++++++----------- include/codec.h | 6 +++++- include/media_socket.h | 2 +- include/types.h | 4 +--- t/test-transcode.c | 3 +-- 7 files changed, 18 insertions(+), 25 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index e78c43f0b..f081d4773 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -2143,12 +2143,11 @@ static void codec_add_raw_packet_common(struct media_packet *mp, unsigned int cl if (!p->rtp) p->rtp = mp->rtp; } - t_queue_push_tail_link(&mp->packets_out, &p->link); + i_queue_push_tail(&mp->packets_out, p); } 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 // or for RTP header extensions @@ -2177,7 +2176,6 @@ void codec_add_raw_packet(struct media_packet *mp, unsigned int 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); @@ -2483,7 +2481,6 @@ void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *csch, // 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) + ext_len; payload_tracker_add(&ssrc_out->tracker, handler->dest_pt.payload_type); @@ -2563,7 +2560,7 @@ send: p->ttq_entry.when / 1000000, p->ttq_entry.when % 1000000); - t_queue_push_tail_link(&mp->packets_out, &p->link); + i_queue_push_tail(&mp->packets_out, p); } // returns new reference @@ -2923,7 +2920,6 @@ bool codec_packet_copy(struct codec_packet *p) { struct codec_packet *codec_packet_dup(struct codec_packet *p) { struct codec_packet *dup = g_new(__typeof(*p), 1); *dup = *p; - dup->link.data = dup; // XXX obsolete this codec_packet_copy(dup); if (dup->ssrc_out) ssrc_entry_hold(dup->ssrc_out); diff --git a/daemon/media_player.c b/daemon/media_player.c index 4c330b16d..5e1362dc4 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -1073,7 +1073,7 @@ void media_player_add_packet(struct media_player *mp, char *buf, size_t len, // keep track of RTP timestamps and real clock. look at the last packet we received // and update our sync TS. if (packet.packets_out.head) { - struct codec_packet *p = packet.packets_out.head->data; + struct codec_packet *p = packet.packets_out.head; if (p->rtp) { mp->sync_ts = ntohl(p->rtp->timestamp); mp->sync_ts_tv = p->ttq_entry.when; diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 705bbb3ef..ebc1b603f 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -3063,8 +3063,7 @@ int media_packet_encrypt(rewrite_func encrypt_func, struct packet_stream *out, s LOCK(&out->lock); - for (__auto_type l = mp->packets_out.head; l; l = l->next) { - struct codec_packet *p = l->data; + IQUEUE_FOREACH(&mp->packets_out, p) { if (mp->call->recording && rtpe_config.rec_egress && CALL_ISSET(mp->call, RECORDING_ON)) { p->plain = STR_LEN(bufferpool_alloc(media_bufferpool, p->s.len), p->s.len); memcpy(p->plain.s, p->s.s, p->s.len); @@ -3355,8 +3354,7 @@ static int do_rtcp_output(struct packet_handler_ctx *phc) { // only frees the output queue if no `sink` is given int media_socket_dequeue(struct media_packet *mp, struct packet_stream *sink) { while (mp->packets_out.length) { - codec_packet_list *link = t_queue_pop_head_link(&mp->packets_out); - __auto_type p = link->data; + __auto_type p = i_queue_pop_head(&mp->packets_out); if (sink && sink->send_timer) send_timer_push(sink->send_timer, p); else @@ -3367,7 +3365,7 @@ int media_socket_dequeue(struct media_packet *mp, struct packet_stream *sink) { void media_packet_copy(struct media_packet *dst, const struct media_packet *src) { *dst = *src; - t_queue_init(&dst->packets_out); + i_queue_init(&dst->packets_out); if (dst->sfd) obj_hold(dst->sfd); if (dst->ssrc_in) @@ -3393,8 +3391,7 @@ void media_packet_release(struct media_packet *mp) { static int media_packet_queue_dup(codec_packet_q *q) { - for (__auto_type l = q->head; l; l = l->next) { - struct codec_packet *p = l->data; + IQUEUE_FOREACH(q, p) { if (p->free_func) // nothing to do, already private continue; if (!codec_packet_copy(p)) @@ -3645,7 +3642,7 @@ static int stream_packet(struct packet_handler_ctx *phc) { { struct packet_handler_ctx mirror_phc = *phc; mirror_phc.mp.ssrc_out = NULL; - t_queue_init(&mirror_phc.mp.packets_out); + i_queue_init(&mirror_phc.mp.packets_out); struct sink_handler *mirror_sh = mirror_link->data; struct packet_stream *mirror_sink = mirror_sh->sink; @@ -3654,10 +3651,9 @@ static int stream_packet(struct packet_handler_ctx *phc) { media_packet_rtp_out(&mirror_phc, mirror_sh); media_packet_set_encrypt(&mirror_phc, mirror_sh); - for (__auto_type pack = phc->mp.packets_out.head; pack; pack = pack->next) { - struct codec_packet *p = pack->data; + IQUEUE_FOREACH(&phc->mp.packets_out, p) { __auto_type dup = codec_packet_dup(p); - t_queue_push_tail_link(&mirror_phc.mp.packets_out, &dup->link); + i_queue_push_tail(&mirror_phc.mp.packets_out, dup); } ret = __media_packet_encrypt(&mirror_phc, mirror_sh); diff --git a/include/codec.h b/include/codec.h index 522ab8d0b..53776a0cd 100644 --- a/include/codec.h +++ b/include/codec.h @@ -12,6 +12,7 @@ #include "timerthread.h" #include "types.h" #include "ssrc.h" +#include "iqueue.h" struct call_media; struct codec_handler; @@ -89,7 +90,7 @@ struct codec_handler { struct codec_packet { struct timerthread_queue_entry ttq_entry; - codec_packet_list link; + IQUEUE_LINK link; str s; str plain; struct rtp_header *rtp; @@ -100,6 +101,9 @@ struct codec_packet { void (*plain_free_func)(void *); }; +typedef IQUEUE_TYPE(struct codec_packet, link) codec_packet_q; + + struct codec_scheduler { unsigned long first_ts; // for output TS scaling unsigned long last_ts; // to detect input lag and handle lost packets diff --git a/include/media_socket.h b/include/media_socket.h index 7bfb94723..253f392df 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -12,7 +12,7 @@ #include "crypto.h" #include "socket.h" #include "containers.h" -#include "types.h" +#include "codec.h" #include "xt_RTPENGINE.h" #include "common_stats.h" diff --git a/include/types.h b/include/types.h index 1b79264b6..b90e634b4 100644 --- a/include/types.h +++ b/include/types.h @@ -56,6 +56,7 @@ typedef union { } parser_arg __attribute__ ((__transparent_union__)); #include "containers.h" +#include "iqueue.h" struct sdp_session; TYPED_GQUEUE(sdp_sessions, struct sdp_session) @@ -79,9 +80,6 @@ struct codec_pipeline_index; TYPED_GHASHTABLE_PROTO(transcode_config_ht, struct codec_pipeline_index, struct transcode_config) TYPED_GQUEUE(transcode_config, struct transcode_config) -struct codec_packet; -TYPED_GQUEUE(codec_packet, struct codec_packet) - struct packet_stream; TYPED_GQUEUE(packet_stream, struct packet_stream) diff --git a/t/test-transcode.c b/t/test-transcode.c index 3575bebe6..a28353ac8 100644 --- a/t/test-transcode.c +++ b/t/test-transcode.c @@ -313,8 +313,7 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media printf("no packet\n"); abort(); } - __auto_type link = t_queue_pop_head_link(&mp.packets_out); - __auto_type cp = link->data; + __auto_type cp = i_queue_pop_head(&mp.packets_out); str cp_s = cp->s; rtp = (void *) cp_s.s; if (rtp->m_pt != (unsigned char) pt_out) {