From 1b6ad783a8fc62bd9736360eebfc9dce6312c844 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 12 Feb 2025 09:03:12 -0400 Subject: [PATCH] MT#61625 refactor codec_handlers hash index Change-Id: I52a34cbd6940ab3bd18ebb5d0c024303eb3381fd --- daemon/codec.c | 21 +++++++++++---------- include/codec.h | 19 +++++++++++-------- include/types.h | 2 +- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index ea394deca..4b95614e6 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -411,7 +411,8 @@ static struct codec_handler *__handler_new(const rtp_payload_type *pt, struct ca handler->packet_encoded = packet_encoded_rtp; handler->packet_decoded = packet_decoded_fifo; handler->media = media; - handler->sink = sink; + handler->i.payload_type = handler->source_pt.payload_type; + handler->i.sink = sink; return handler; } @@ -851,7 +852,7 @@ static struct codec_handler *__get_pt_handler(struct call_media *receiver, rtp_p // make sure existing handler matches this PT if (!rtp_payload_type_eq_exact(pt, &handler->source_pt)) { ilogs(codec, LOG_DEBUG, "Resetting codec handler for PT %i", pt->payload_type); - t_hash_table_remove(receiver->codec_handlers, handler); + t_hash_table_remove(receiver->codec_handlers, &handler->i); __handler_shutdown(handler); handler = NULL; __atomic_store_n(&receiver->codec_handler_cache, NULL, __ATOMIC_RELAXED); @@ -863,7 +864,7 @@ static struct codec_handler *__get_pt_handler(struct call_media *receiver, rtp_p STR_FMT0(&pt->format_parameters), pt->payload_type); handler = __handler_new(pt, receiver, sink); - t_hash_table_insert(receiver->codec_handlers, handler, handler); + t_hash_table_insert(receiver->codec_handlers, &handler->i, handler); t_queue_push_tail(&receiver->codec_handlers_store, handler); } @@ -1093,11 +1094,11 @@ static void __codec_rtcp_timer(struct call_media *receiver) { // XXX unify with media player into a generic RTCP player } -static unsigned int __codec_handler_hash(const struct codec_handler *h) { - return h->source_pt.payload_type ^ GPOINTER_TO_UINT(h->sink); +static unsigned int __codec_handler_hash(const struct codec_handler_index *h) { + return h->payload_type ^ GPOINTER_TO_UINT(h->sink); } -static int __codec_handler_eq(const struct codec_handler *h, const struct codec_handler *j) { - return h->source_pt.payload_type == j->source_pt.payload_type +static int __codec_handler_eq(const struct codec_handler_index *h, const struct codec_handler_index *j) { + return h->payload_type == j->payload_type && h->sink == j->sink; } @@ -1603,9 +1604,9 @@ static struct codec_handler *codec_handler_get_rtp(struct call_media *m, int pay if (payload_type < 0) return NULL; - struct codec_handler lookup = __codec_handler_lookup_struct(payload_type, sink); + struct codec_handler_index lookup = __codec_handler_lookup_struct(payload_type, sink); h = __atomic_load_n(&m->codec_handler_cache, __ATOMIC_RELAXED); - if (G_LIKELY(h) && G_LIKELY(__codec_handler_eq(&lookup, h))) + if (G_LIKELY(h) && G_LIKELY(__codec_handler_eq(&lookup, &h->i))) return h; if (G_UNLIKELY(!t_hash_table_is_set(m->codec_handlers))) @@ -3760,7 +3761,7 @@ void codec_handlers_stop(codec_handlers_q *q, struct call_media *sink) { for (__auto_type l = q->head; l; l = l->next) { struct codec_handler *h = l->data; - if (sink && h->sink != sink) + if (sink && h->i.sink != sink) continue; if (h->delay_buffer) { diff --git a/include/codec.h b/include/codec.h index 16de19443..dd033a56a 100644 --- a/include/codec.h +++ b/include/codec.h @@ -31,9 +31,15 @@ struct sink_handler; typedef int codec_handler_func(struct codec_handler *, struct media_packet *); +struct codec_handler_index { + int payload_type; + struct call_media *sink; +}; + struct codec_handler { - rtp_payload_type source_pt; // source_pt.payload_type = hashtable index + rtp_payload_type source_pt; rtp_payload_type dest_pt; + struct codec_handler_index i; int dtmf_payload_type; int real_dtmf_payload_type; int cn_payload_type; @@ -49,7 +55,6 @@ struct codec_handler { struct codec_handler *input_handler; // == main handler for supp codecs struct codec_handler *output_handler; // == self, or other PT handler struct call_media *media; - struct call_media *sink; #ifdef WITH_TRANSCODING int (*packet_encoded)(encoder_t *enc, void *u1, void *u2); int (*packet_decoded)(decoder_t *, AVFrame *, void *, void *); @@ -222,17 +227,15 @@ void codec_output_rtp(struct media_packet *mp, struct codec_scheduler *, unsigned long ts_delay); -INLINE struct codec_handler __codec_handler_lookup_struct(int pt, struct call_media *sink) { - struct codec_handler lookup = { - .source_pt = { - .payload_type = pt, - }, +INLINE struct codec_handler_index __codec_handler_lookup_struct(int pt, struct call_media *sink) { + struct codec_handler_index lookup = { + .payload_type = pt, .sink = sink, }; return lookup; } INLINE struct codec_handler *codec_handler_lookup(codec_handlers_ht ht, int pt, struct call_media *sink) { - struct codec_handler lookup = __codec_handler_lookup_struct(pt, sink); + struct codec_handler_index lookup = __codec_handler_lookup_struct(pt, sink); return t_hash_table_lookup(ht, &lookup); } diff --git a/include/types.h b/include/types.h index 1dd2cf746..c4a014f19 100644 --- a/include/types.h +++ b/include/types.h @@ -71,7 +71,7 @@ struct ice_candidate_pair; TYPED_GQUEUE(candidate_pair, struct ice_candidate_pair) struct codec_handler; -TYPED_GHASHTABLE_PROTO(codec_handlers_ht, struct codec_handler, struct codec_handler) +TYPED_GHASHTABLE_PROTO(codec_handlers_ht, struct codec_handler_index, struct codec_handler) TYPED_GQUEUE(codec_handlers, struct codec_handler) struct codec_packet;