From 0a9e85e8a3abeec6d8133c2541ad07d4c553ff7f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 31 Mar 2026 09:34:28 -0400 Subject: [PATCH] MT#55283 refactor update_all functions Change-Id: Ica0a9f5f76bf8edf194813e18d71437d6756280b --- daemon/codec.c | 51 ++++++++++++++++++++++++++----------------- daemon/media_player.c | 6 ++--- include/codec.h | 16 ++++++++++++-- 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index a724ff6ac..6878b755f 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -4919,44 +4919,55 @@ static void __buffer_delay_raw(struct delay_buffer *dbuf, struct codec_handler * #endif +void codec_update_media_handlers(struct call_media *source_media) { + IQUEUE_FOREACH(&source_media->media_subscribers, ms) { + struct call_media *sink_media = ms->media; + + if (!sink_media) + continue; + + codec_handlers_update(source_media, sink_media); + + __media_unconfirm(sink_media, "updating codec handlers"); + } + + __media_unconfirm(source_media, "updating codec handlers"); +} + void codec_update_all_handlers(struct call_monologue *ml) { for (int i = 0; i < ml->medias->len; i++) { - struct call_media * source_media = ml->medias->pdata[i]; + struct call_media *source_media = ml->medias->pdata[i]; if (!source_media) continue; - IQUEUE_FOREACH(&source_media->media_subscribers, ms) { - struct call_media *sink_media = ms->media; + codec_update_media_handlers(source_media); + } +} - if (!sink_media) - continue; +void __codec_update_media_source_handlers(struct call_media *sink_media, struct chu_args a) { + IQUEUE_FOREACH(&sink_media->media_subscriptions, ms) { + struct call_media *source_media = ms->media; - codec_handlers_update(source_media, sink_media); - } + if (!source_media) + continue; + + __codec_handlers_update(source_media, sink_media, a); + __media_unconfirm(source_media, "updating codec source handlers"); } - dialogue_unconfirm(ml, "updating codec handlers"); + __media_unconfirm(sink_media, "updating codec source handlers"); } -void codec_update_all_source_handlers(struct call_monologue *ml, const sdp_ng_flags *flags, bool clear_delay_buffer) { +void __codec_update_all_source_handlers(struct call_monologue *ml, struct chu_args a) { for (int i = 0; i < ml->medias->len; i++) { - struct call_media * sink_media = ml->medias->pdata[i]; + struct call_media *sink_media = ml->medias->pdata[i]; if (!sink_media) continue; - IQUEUE_FOREACH(&sink_media->media_subscriptions, ms) { - struct call_media *source_media = ms->media; - - if (!source_media) - continue; - - codec_handlers_update(source_media, sink_media, .flags = flags, .clear_delay_buffer = clear_delay_buffer); - } + __codec_update_media_source_handlers(sink_media, a); } - - dialogue_unconfirm(ml, "updating codec source handlers"); } diff --git a/daemon/media_player.c b/daemon/media_player.c index b74052a92..dc9c45e74 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -1673,7 +1673,7 @@ const char * call_play_media_for_ml(struct call_monologue *ml, { #ifdef WITH_TRANSCODING /* if mixing is enabled, codec handlers of all sources must be updated */ - codec_update_all_source_handlers(ml, flags, true); + codec_update_all_source_handlers(ml, .flags = flags, .clear_delay_buffer = true); /* this starts the audio player if needed */ update_init_monologue_subscribers(ml, OP_PLAY_MEDIA); @@ -1706,7 +1706,7 @@ long long call_stop_media_for_ml(struct call_monologue *ml) #ifdef WITH_TRANSCODING long long ret = media_player_stop(ml->player); /* restore to non-mixing if needed */ - codec_update_all_source_handlers(ml, NULL, false); + codec_update_all_source_handlers(ml); update_init_monologue_subscribers(ml, OP_STOP_MEDIA); /* mark MoH as already not used (it can be unset now) */ ml->player->opts.moh = 0; @@ -2052,7 +2052,7 @@ static void media_player_run(void *ptr) { if (mp->opts.block_egress) MEDIA_CLEAR(mp->media, BLOCK_EGRESS); - codec_update_all_source_handlers(mp->media->monologue, NULL, false); + codec_update_all_source_handlers(mp->media->monologue); update_init_monologue_subscribers(mp->media->monologue, OP_PLAY_MEDIA); rwlock_unlock_w(&call->master_lock); diff --git a/include/codec.h b/include/codec.h index 1661d0eab..15b17c4a4 100644 --- a/include/codec.h +++ b/include/codec.h @@ -159,8 +159,6 @@ struct codec_handler *codec_handler_make_media_player(const rtp_payload_type *sr struct codec_handler *codec_handler_make_dummy(const rtp_payload_type *dst_pt, struct call_media *media, str_case_value_ht codec_set); void codec_calc_jitter(struct ssrc_entry_call *, unsigned long ts, unsigned int clockrate, int64_t); -void codec_update_all_handlers(struct call_monologue *ml); -void codec_update_all_source_handlers(struct call_monologue *ml, const sdp_ng_flags *flags, bool clear_delay_buffer); struct codec_store_args { str_case_value_ht codec_set; @@ -239,6 +237,20 @@ struct chu_args { #define codec_handlers_update(r, s, ...) \ __codec_handlers_update(r, s, (struct chu_args) {__VA_ARGS__}) +__attribute__((nonnull(1))) +void codec_update_media_handlers(struct call_media *); +__attribute__((nonnull(1))) +void __codec_update_media_source_handlers(struct call_media *, struct chu_args); +__attribute__((nonnull(1))) +void codec_update_all_handlers(struct call_monologue *ml); +__attribute__((nonnull(1))) +void __codec_update_all_source_handlers(struct call_monologue *ml, struct chu_args); + +#define codec_update_media_source_handlers(r, ...) \ + __codec_update_media_source_handlers(r, (struct chu_args) {__VA_ARGS__}) +#define codec_update_all_source_handlers(r, ...) \ + __codec_update_all_source_handlers(r, (struct chu_args) {__VA_ARGS__}) + bool codec_handler_transform(struct call_media *r, ng_codecs_q *); #ifdef WITH_TRANSCODING