diff --git a/daemon/call.c b/daemon/call.c index e6cb84c2e..50d479ba3 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2429,13 +2429,13 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi codec_tracker_update(&media->codecs); // set up handlers - codec_handlers_update(media, other_media, flags, sp , NULL); + codec_handlers_update(media, other_media, .flags = flags, .sp = sp); // updating the handlers may have removed some codecs, so run update the supp codecs again codec_tracker_update(&media->codecs); // finally set up handlers again based on final results - codec_handlers_update(media, other_media, flags, sp, dialogue[1]); + codec_handlers_update(media, other_media, .flags = flags, .sp = sp, .sub = dialogue[1]); } else { // answer @@ -2465,7 +2465,7 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi // update callee side codec handlers again (second pass after the offer) as we // might need to update some handlers, e.g. when supplemental codecs have been // rejected - codec_handlers_update(other_media, media, NULL, NULL, NULL); + codec_handlers_update(other_media, media); // finally set up our caller side codecs ilogs(codec, LOG_DEBUG, "Codec answer for " STR_FORMAT " #%u", @@ -2474,15 +2474,15 @@ void codecs_offer_answer(struct call_media *media, struct call_media *other_medi codec_store_answer(&media->codecs, &other_media->codecs, flags); // set up handlers - codec_handlers_update(media, other_media, flags, sp, NULL); + codec_handlers_update(media, other_media, .flags = flags, .sp = sp); // updating the handlers may have removed some codecs, so run update the supp codecs again codec_tracker_update(&media->codecs); codec_tracker_update(&other_media->codecs); // finally set up handlers again based on final results - codec_handlers_update(media, other_media, flags, sp, dialogue[1]); - codec_handlers_update(other_media, media, NULL, NULL, dialogue[0]); + codec_handlers_update(media, other_media, .flags = flags, .sp = sp, .sub = dialogue[1]); + codec_handlers_update(other_media, media, .sub = dialogue[0]); // activate audio player if needed (not done by codec_handlers_update without `flags`) audio_player_activate(media); @@ -3135,7 +3135,7 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca codec_store_transcode(&dst_media->codecs, &flags->codec_transcode, &sp->codecs); codec_store_synthesise(&dst_media->codecs, &src_media->codecs); - codec_handlers_update(dst_media, src_media, flags, sp, NULL); + codec_handlers_update(dst_media, src_media, .flags = flags, .sp = sp); if (!flags->inactive) bf_copy(&dst_media->media_flags, MEDIA_FLAG_SEND, &src_media->media_flags, SP_FLAG_RECV); @@ -3251,8 +3251,8 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, struct sdp_ng_flag return -1; } - codec_handlers_update(src_media, dst_media, NULL, NULL, NULL); - codec_handlers_update(dst_media, src_media, flags, sp, rev_cs); + codec_handlers_update(src_media, dst_media); + codec_handlers_update(dst_media, src_media, .flags = flags, .sp = sp, .sub = rev_cs); __dtls_logic(flags, dst_media, sp); diff --git a/daemon/codec.c b/daemon/codec.c index 5b76d01d0..43bcab2c0 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -991,15 +991,15 @@ static int __codec_handler_eq(const void *a, const void *b) { } // call must be locked in W -void codec_handlers_update(struct call_media *receiver, struct call_media *sink, - const struct sdp_ng_flags *flags, const struct stream_params *sp, struct call_subscription *sub) +void __codec_handlers_update(struct call_media *receiver, struct call_media *sink, + struct chu_args a) { ilogs(codec, LOG_DEBUG, "Setting up codec handlers for " STR_FORMAT_M " #%u -> " STR_FORMAT_M " #%u", STR_FMT_M(&receiver->monologue->tag), receiver->index, STR_FMT_M(&sink->monologue->tag), sink->index); - if (sub) - sub->attrs.transcoding = 0; + if (a.sub) + a.sub->attrs.transcoding = 0; MEDIA_CLEAR(receiver, GENERATOR); MEDIA_CLEAR(sink, GENERATOR); @@ -1010,9 +1010,9 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink, // non-RTP protocol? if (proto_is(receiver->protocol, PROTO_UDPTL)) { - if (codec_handler_udptl_update(receiver, sink, flags)) { - if (sub) - sub->attrs.transcoding = 1; + if (codec_handler_udptl_update(receiver, sink, a.flags)) { + if (a.sub) + a.sub->attrs.transcoding = 1; return; } } @@ -1026,9 +1026,9 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink, // should we transcode to a non-RTP protocol? if (proto_is_not_rtp(sink->protocol)) { - if (codec_handler_non_rtp_update(receiver, sink, flags, sp)) { - if (sub) - sub->attrs.transcoding = 1; + if (codec_handler_non_rtp_update(receiver, sink, a.flags, a.sp)) { + if (a.sub) + a.sub->attrs.transcoding = 1; return; } } @@ -1048,15 +1048,15 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink, bool use_audio_player = !!MEDIA_ISSET(sink, AUDIO_PLAYER); bool implicit_audio_player = false; - if (flags && flags->audio_player == AP_FORCE) + if (a.flags && a.flags->audio_player == AP_FORCE) use_audio_player = true; - else if (flags && flags->audio_player == AP_OFF) + else if (a.flags && a.flags->audio_player == AP_OFF) use_audio_player = false; else if (rtpe_config.use_audio_player == UAP_ALWAYS) use_audio_player = true; else if (rtpe_config.use_audio_player == UAP_PLAY_MEDIA) { // check for implicitly enabled player - if ((flags && flags->opmode == OP_PLAY_MEDIA) || (media_player_is_active(sink->monologue))) { + if ((a.flags && a.flags->opmode == OP_PLAY_MEDIA) || (media_player_is_active(sink->monologue))) { use_audio_player = true; implicit_audio_player = true; } @@ -1088,7 +1088,7 @@ void codec_handlers_update(struct call_media *receiver, struct call_media *sink, if (receiver->monologue->dtmf_trigger.len) do_dtmf_detect = true; - if (flags && flags->inject_dtmf) + if (a.flags && a.flags->inject_dtmf) sink->monologue->inject_dtmf = 1; bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || sink->monologue->inject_dtmf; @@ -1195,7 +1195,7 @@ sink_pt_fixed:; // XXX synthesise missing supp codecs according to codec tracker XXX needed? - if (!flags) { + if (!a.flags) { // second pass going through the offerer codecs during an answer: // if an answer rejected a supplemental codec that isn't marked for transcoding, // reject it on the sink side as well @@ -1319,9 +1319,9 @@ sink_pt_fixed:; transcode: // enable audio player if not explicitly disabled - if (rtpe_config.use_audio_player == UAP_TRANSCODING && (!flags || flags->audio_player != AP_OFF)) + if (rtpe_config.use_audio_player == UAP_TRANSCODING && (!a.flags || a.flags->audio_player != AP_OFF)) use_audio_player = true; - else if (flags && flags->audio_player == AP_TRANSCODING) + else if (a.flags && a.flags->audio_player == AP_TRANSCODING) use_audio_player = true; if (use_audio_player) { @@ -1377,8 +1377,8 @@ next: MEDIA_SET(sink, AUDIO_PLAYER); if (is_transcoding) { - if (sub) - sub->attrs.transcoding = 1; + if (a.sub) + a.sub->attrs.transcoding = 1; if (!use_audio_player) { // we have to translate RTCP packets @@ -1427,7 +1427,7 @@ next: audio_player_setup(sink, pref_dest_codec, rtpe_config.audio_buffer_length, rtpe_config.audio_buffer_delay); - if (flags && (flags->early_media || flags->opmode == OP_ANSWER)) + if (a.flags && (a.flags->early_media || a.flags->opmode == OP_ANSWER)) audio_player_activate(sink); } } @@ -4148,7 +4148,7 @@ void codec_update_all_handlers(struct call_monologue *ml) { struct call_media *sink_media = sink->medias->pdata[i]; if (!sink_media) continue; - codec_handlers_update(source_media, sink_media, NULL, NULL, NULL); + codec_handlers_update(source_media, sink_media); } } @@ -4168,7 +4168,7 @@ void codec_update_all_source_handlers(struct call_monologue *ml, const struct sd struct call_media *sink_media = ml->medias->pdata[i]; if (!sink_media) continue; - codec_handlers_update(source_media, sink_media, flags, NULL, NULL); + codec_handlers_update(source_media, sink_media, .flags = flags); } } diff --git a/daemon/redis.c b/daemon/redis.c index fc2b9cf41..65e15e606 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -1861,7 +1861,7 @@ static int json_link_medias(struct call *c, struct redis_list *medias, continue; other_m->monologue = other_ml; if (other_m->index == med->index) { - codec_handlers_update(other_m, med, NULL, NULL, cs); + codec_handlers_update(other_m, med, .sub = cs); break; } } diff --git a/include/codec.h b/include/codec.h index ca32de089..7eff38985 100644 --- a/include/codec.h +++ b/include/codec.h @@ -168,13 +168,20 @@ void codec_init_payload_type(struct rtp_payload_type *, enum media_type); void payload_type_clear(struct rtp_payload_type *p); +struct chu_args { + const struct sdp_ng_flags *flags; + const struct stream_params *sp; + struct call_subscription *sub; +}; +#define codec_handlers_update(r, s, ...) \ + __codec_handlers_update(r, s, (struct chu_args) {__VA_ARGS__}) #ifdef WITH_TRANSCODING void ensure_codec_def(struct rtp_payload_type *pt, struct call_media *media); void codec_handler_free(struct codec_handler **handler); -void codec_handlers_update(struct call_media *receiver, struct call_media *sink, const struct sdp_ng_flags *, - const struct stream_params *, struct call_subscription *); +__attribute__((nonnull(1, 2))) +void __codec_handlers_update(struct call_media *receiver, struct call_media *sink, struct chu_args); void codec_add_dtmf_event(struct codec_ssrc_handler *ch, int code, int level, uint64_t ts, bool injected); uint64_t codec_last_dtmf_event(struct codec_ssrc_handler *ch); uint64_t codec_encoder_pts(struct codec_ssrc_handler *ch, struct ssrc_ctx *); @@ -215,8 +222,7 @@ INLINE struct codec_handler *codec_handler_lookup(GHashTable *ht, int pt, struct #else -INLINE void codec_handlers_update(struct call_media *receiver, struct call_media *sink, - const struct sdp_ng_flags *flags, const struct stream_params *sp, struct call_subscription *sub) +INLINE void __codec_handlers_update(struct call_media *receiver, struct call_media *sink, struct chu_args a) { } INLINE void codec_handler_free(struct codec_handler **handler) { }