From 17e57fbba4f3e3be57c2b1b0be7b1bdfa3e3b40a Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 14 Sep 2023 09:23:55 -0400 Subject: [PATCH] MT#57977 convert monologue flags to uint Change-Id: Id30e4dc290dee3cb93deb488817a4938b9369c63 --- daemon/call.c | 14 +++++++------- daemon/call_interfaces.c | 14 +++++++------- daemon/cli.c | 2 +- daemon/codec.c | 18 +++++++++--------- daemon/media_socket.c | 8 ++++---- daemon/recording.c | 12 ++++++------ include/call.h | 22 +++++++++++++++------- t/test-transcode.c | 2 +- 8 files changed, 50 insertions(+), 42 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index eb629c1f5..6b8fb5241 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -229,7 +229,7 @@ next: media_update_stats(media); ssrc_collect_metrics(media); } - if (media->monologue->transcoding) + if (ML_ISSET(media->monologue, TRANSCODING)) hlp->transcoded_media++; } @@ -2522,7 +2522,7 @@ static void __update_init_subscribers(struct call_monologue *ml, GQueue *streams recording_setup_monologue(ml); if (flags && flags->block_short) - ml->block_short = 1; + ML_SET(ml, BLOCK_SHORT); for (unsigned int j = 0; j < ml->medias->len; j++) { @@ -2767,7 +2767,7 @@ static int __sub_is_transcoding(gconstpointer p, gconstpointer dummy) { } // set transcoding flag if any media flows are transcoding, otherwise unset it static void set_monologue_flags_per_subscribers(struct call_monologue *ml) { - ml->transcoding = 0; + ML_CLEAR(ml, TRANSCODING); /* find at least one media susbcriber who requires a transcoding */ for (int i = 0; i < ml->medias->len; i++) @@ -2777,7 +2777,7 @@ static void set_monologue_flags_per_subscribers(struct call_monologue *ml) { continue; if (g_queue_find_custom(&media->media_subscribers, NULL, __sub_is_transcoding)) { - ml->transcoding = 1; + ML_SET(ml, TRANSCODING); return; } } @@ -2803,8 +2803,8 @@ int monologue_offer_answer(struct call_monologue *monologues[2], GQueue *streams __call_monologue_init_from_flags(other_ml, flags); if (flags && flags->exclude_recording) { - monologue->no_recording = 1; - other_ml->no_recording = 1; + ML_SET(monologue, NO_RECORDING); + ML_SET(other_ml, NO_RECORDING); } __C_DBG("this="STR_FORMAT" other="STR_FORMAT, STR_FMT(&monologue->tag), STR_FMT(&other_ml->tag)); @@ -3291,7 +3291,7 @@ int monologue_publish(struct call_monologue *ml, GQueue *streams, struct sdp_ng_ __call_monologue_init_from_flags(ml, flags); if (flags->exclude_recording) - ml->no_recording = 1; + ML_SET(ml, NO_RECORDING); for (GList *l = streams->head; l; l = l->next) { struct stream_params *sp = l->data; diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index c5cd02285..1645d8cc8 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -2813,7 +2813,7 @@ const char *call_start_forwarding_ng(bencode_item_t *input, bencode_item_t *outp if (monologue) { ilog(LOG_INFO, "Start forwarding for single party (tag '" STR_FORMAT_M "')", STR_FMT_M(&monologue->tag)); - monologue->rec_forwarding = 1; + ML_SET(monologue, REC_FORWARDING); } else { ilog(LOG_INFO, "Start forwarding (entire call)"); @@ -2842,7 +2842,7 @@ const char *call_stop_forwarding_ng(bencode_item_t *input, bencode_item_t *outpu if (monologue) { ilog(LOG_INFO, "Stop forwarding for single party (tag '" STR_FORMAT_M "')", STR_FMT_M(&monologue->tag)); - monologue->rec_forwarding = 0; + ML_CLEAR(monologue, REC_FORWARDING); } else { ilog(LOG_INFO, "Stop forwarding (entire call)"); @@ -2850,7 +2850,7 @@ const char *call_stop_forwarding_ng(bencode_item_t *input, bencode_item_t *outpu if (flags.all == ALL_ALL) { for (GList *l = call->monologues.head; l; l = l->next) { monologue = l->data; - monologue->rec_forwarding = 0; + ML_CLEAR(monologue, REC_FORWARDING); } } } @@ -2874,7 +2874,7 @@ static void call_monologue_set_block_mode(struct call_monologue *ml, struct sdp_ media->buffer_delay = flags->delay_buffer; } } - ml->detect_dtmf = flags->detect_dtmf; + bf_set_clear(&ml->ml_flags, ML_FLAG_DETECT_DTMF, flags->detect_dtmf); if (flags->volume >= 0 && flags->volume <= 63) ml->tone_vol = flags->volume; @@ -2973,7 +2973,7 @@ const char *call_unblock_dtmf_ng(bencode_item_t *input, bencode_item_t *output) media->buffer_delay = flags.delay_buffer; } } - monologue->detect_dtmf = flags.detect_dtmf; + bf_set_clear(&monologue->ml_flags, ML_FLAG_DETECT_DTMF, flags.detect_dtmf); codec_update_all_handlers(monologue); } } @@ -2997,7 +2997,7 @@ const char *call_unblock_dtmf_ng(bencode_item_t *input, bencode_item_t *output) media->buffer_delay = flags.delay_buffer; } } - monologue->detect_dtmf = flags.detect_dtmf; + bf_set_clear(&monologue->ml_flags, ML_FLAG_DETECT_DTMF, flags.detect_dtmf); if (is_dtmf_replace_mode(prev_ml_mode) || is_dtmf_replace_mode(prev_mode) || flags.delay_buffer >= 0) codec_update_all_handlers(monologue); @@ -3309,7 +3309,7 @@ const char *call_play_dtmf_ng(bencode_item_t *input, bencode_item_t *output) { // XXX fall back to generating a secondary stream found: - monologue->dtmf_injection_active = 1; + ML_SET(monologue, DTMF_INJECTION_ACTIVE); dialogue_unkernelize(monologue, "DTMF playback"); for (GList *k = monologue->subscribers.head; k; k = k->next) { diff --git a/daemon/cli.c b/daemon/cli.c index f7da851e8..cab2fc2a1 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -1605,7 +1605,7 @@ static void cli_incoming_tag_detdtmf(str *instr, struct cli_writer *cw) { cw->cw_printf(cw, "%s audio DTMF detection\n", onoff ? "Enabling" : "Disabling"); - cw->ml->detect_dtmf = onoff ? 1 : 0; + bf_set_clear(&cw->ml->ml_flags, ML_FLAG_DETECT_DTMF, onoff); codec_update_all_handlers(cw->ml); } #endif diff --git a/daemon/codec.c b/daemon/codec.c index 28c9c3123..b9351d6a7 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -708,7 +708,7 @@ static void __check_dtmf_injector(struct call_media *receiver, struct call_media struct codec_handler *parent, GHashTable *output_transcoders) { - if (!sink->monologue->inject_dtmf) + if (!ML_ISSET(sink->monologue, INJECT_DTMF)) return; if (parent->dtmf_payload_type != -1) return; @@ -1108,9 +1108,9 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin do_dtmf_detect = true; if (a.flags && a.flags->inject_dtmf) - other_monologue->inject_dtmf = 1; + ML_SET(other_monologue, INJECT_DTMF); - bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || other_monologue->inject_dtmf; + bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || ML_ISSET(other_monologue, INJECT_DTMF); // do we have to force everything through the transcoding engine even if codecs match? bool force_transcoding = do_pcm_dtmf_blocking || do_dtmf_blocking || use_audio_player; @@ -1213,7 +1213,7 @@ sink_pt_fixed:; && sink_dtmf_pt->for_transcoding) pcm_dtmf_detect = true; - if (monologue->detect_dtmf) + if (ML_ISSET(monologue, DETECT_DTMF)) pcm_dtmf_detect = true; // special mode for DTMF blocking @@ -1311,7 +1311,7 @@ sink_pt_fixed:; } // force transcoding if we want DTMF injection and there's no DTMF PT - if (!sink_dtmf_pt && other_monologue->inject_dtmf) + if (!sink_dtmf_pt && ML_ISSET(other_monologue, INJECT_DTMF)) goto transcode; // everything matches - we can do passthrough @@ -1670,7 +1670,7 @@ static int handler_func_passthrough(struct codec_handler *h, struct media_packet codec_calc_jitter(mp->ssrc_in, ts, h->source_pt.clock_rate, &mp->tv); codec_calc_lost(mp->ssrc_in, ntohs(mp->rtp->seq_num)); - if (mp->media->monologue->block_short && h->source_pt.codec_def + if (ML_ISSET(mp->media->monologue, BLOCK_SHORT) && h->source_pt.codec_def && h->source_pt.codec_def->fixed_sizes) { if (!h->payload_len) @@ -1680,7 +1680,7 @@ static int handler_func_passthrough(struct codec_handler *h, struct media_packet } } - mp->media->monologue->dtmf_injection_active = 0; + ML_CLEAR(mp->media->monologue, DTMF_INJECTION_ACTIVE); __buffer_delay_raw(h->delay_buffer, h, codec_add_raw_packet, mp, h->source_pt.clock_rate); @@ -2250,7 +2250,7 @@ static int packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_handler } else if (!input_ch->dtmf_events.length) - mp->media->monologue->dtmf_injection_active = 0; + ML_CLEAR(mp->media->monologue, DTMF_INJECTION_ACTIVE); } @@ -2532,7 +2532,7 @@ static int handler_func_passthrough_ssrc(struct codec_handler *h, struct media_p add_packet_fn = codec_add_raw_packet_dup; } else if (!ch->dtmf_events.length) - mp->media->monologue->dtmf_injection_active = 0; + ML_CLEAR(mp->media->monologue, DTMF_INJECTION_ACTIVE); obj_put(&ch->h); } diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 878a0a055..40a05c0d2 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1490,7 +1490,7 @@ static const char *kernelize_one(struct rtpengine_target_info *reti, GQueue *out if (proto_is_rtp(media->protocol)) { reti->rtp = 1; - if (!media->monologue->transcoding) { + if (!ML_ISSET(media->monologue, TRANSCODING)) { reti->rtcp_fw = 1; if (media->protocol->avpf) reti->rtcp_fb_fw = 1; @@ -1564,7 +1564,7 @@ output: // PT manipulations bool silenced = call->silence_media || media->monologue->silence_media || sink_handler->attrs.silence_media; - bool manipulate_pt = silenced || media->monologue->block_short; + bool manipulate_pt = silenced || ML_ISSET(media->monologue, BLOCK_SHORT); if (manipulate_pt && payload_types) { int i = 0; for (GList *l = *payload_types; l; l = l->next) { @@ -1584,7 +1584,7 @@ output: memcpy(rpt->replace_pattern, replace_pattern.s, replace_pattern.len); } - if (media->monologue->block_short && ch->payload_len) + if (ML_ISSET(media->monologue, BLOCK_SHORT) && ch->payload_len) rpt->min_payload_len = ch->payload_len; } @@ -2583,7 +2583,7 @@ static void media_packet_kernel_check(struct packet_handler_ctx *phc) { return; } - if (phc->mp.media->monologue->dtmf_injection_active) + if (ML_ISSET(phc->mp.media->monologue, DTMF_INJECTION_ACTIVE)) return; mutex_lock(&phc->mp.stream->in_lock); diff --git a/daemon/recording.c b/daemon/recording.c index 8be745267..53cd84c30 100644 --- a/daemon/recording.c +++ b/daemon/recording.c @@ -310,7 +310,7 @@ static void update_flags_proc(struct call *call, bool streams) { for (GList *l = call->streams.head; l; l = l->next) { struct packet_stream *ps = l->data; append_meta_chunk_null(call->recording, "STREAM %u FORWARDING %u", - ps->unique_id, ps->media->monologue->rec_forwarding ? 1 : 0); + ps->unique_id, ML_ISSET(ps->media->monologue, REC_FORWARDING) ? 1 : 0); } } static void recording_update_flags(struct call *call, bool streams) { @@ -386,7 +386,7 @@ void recording_stop(struct call *call) { for (GList *l = call->monologues.head; l; l = l->next) { struct call_monologue *ml = l->data; - if (ml->rec_forwarding) { + if (ML_ISSET(ml, REC_FORWARDING)) { recording_update_flags(call, true); return; } @@ -694,7 +694,7 @@ static void stream_pcap_dump(struct media_packet *mp, const str *s) { } static void dump_packet_pcap(struct media_packet *mp, const str *s) { - if (mp->media->monologue->no_recording) + if (ML_ISSET(mp->media->monologue, NO_RECORDING)) return; struct recording *recording = mp->call->recording; mutex_lock(&recording->pcap.recording_lock); @@ -895,7 +895,7 @@ static void setup_stream_proc(struct packet_stream *stream) { return; if (stream->recording.proc.stream_idx != UNINIT_IDX) return; - if (ml->no_recording) + if (ML_ISSET(ml, NO_RECORDING)) return; len = snprintf(buf, sizeof(buf), "TAG %u MEDIA %u TAG-MEDIA %u COMPONENT %u FLAGS %u", @@ -922,7 +922,7 @@ static void setup_monologue_proc(struct call_monologue *ml) { if (!recording) return; - if (ml->no_recording) + if (ML_ISSET(ml, NO_RECORDING)) return; append_meta_chunk_str(recording, &ml->tag, "TAG %u", ml->unique_id); @@ -938,7 +938,7 @@ static void setup_media_proc(struct call_media *media) { if (!recording) return; - if (media->monologue->no_recording) + if (ML_ISSET(media->monologue, NO_RECORDING)) return; append_meta_chunk_null(recording, "MEDIA %u PTIME %i", media->unique_id, media->ptime); diff --git a/include/call.h b/include/call.h index aab4aa569..0b630351f 100644 --- a/include/call.h +++ b/include/call.h @@ -190,6 +190,15 @@ enum { #define MEDIA_FLAG_LEGACY_OSRTP SHARED_FLAG_LEGACY_OSRTP #define MEDIA_FLAG_LEGACY_OSRTP_REV SHARED_FLAG_LEGACY_OSRTP_REV +/* struct call_monologue */ +#define ML_FLAG_REC_FORWARDING 0x00010000 +#define ML_FLAG_INJECT_DTMF 0x00020000 +#define ML_FLAG_DTMF_INJECTION_ACTIVE 0x00040000 +#define ML_FLAG_DETECT_DTMF 0x00080000 +#define ML_FLAG_NO_RECORDING 0x00100000 +#define ML_FLAG_TRANSCODING 0x00200000 +#define ML_FLAG_BLOCK_SHORT 0x00400000 + /* access macros */ #define SP_ISSET(p, f) bf_isset(&(p)->sp_flags, SP_FLAG_ ## f) #define SP_SET(p, f) bf_set(&(p)->sp_flags, SP_FLAG_ ## f) @@ -204,6 +213,11 @@ enum { #define MEDIA_ARESET2(p, f, g) bf_areset(&(p)->media_flags, MEDIA_FLAG_ ## f | MEDIA_FLAG_ ## g) #define MEDIA_SET(p, f) bf_set(&(p)->media_flags, MEDIA_FLAG_ ## f) #define MEDIA_CLEAR(p, f) bf_clear(&(p)->media_flags, MEDIA_FLAG_ ## f) +#define ML_ISSET(p, f) bf_isset(&(p)->ml_flags, ML_FLAG_ ## f) +#define ML_ISSET2(p, f, g) bf_isset(&(p)->ml_flags, ML_FLAG_ ## f | ML_FLAG_ ## g) +#define ML_ARESET2(p, f, g) bf_areset(&(p)->ml_flags, ML_FLAG_ ## f | ML_FLAG_ ## g) +#define ML_SET(p, f) bf_set(&(p)->ml_flags, ML_FLAG_ ## f) +#define ML_CLEAR(p, f) bf_clear(&(p)->ml_flags, ML_FLAG_ ## f) enum block_dtmf_mode { BLOCK_DTMF_OFF = 0, @@ -546,13 +560,7 @@ struct call_monologue { bool block_media; bool silence_media; - unsigned int rec_forwarding:1; - unsigned int inject_dtmf:1; - unsigned int dtmf_injection_active:1; - unsigned int detect_dtmf:1; - unsigned int no_recording:1; - unsigned int transcoding:1; - unsigned int block_short:1; + volatile unsigned int ml_flags; }; struct call_iterator_list { diff --git a/t/test-transcode.c b/t/test-transcode.c index 783a65744..edcae2f71 100644 --- a/t/test-transcode.c +++ b/t/test-transcode.c @@ -258,7 +258,7 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media .sfd = &sfd, }; // from __stream_ssrc() - if (!media->monologue->transcoding) + if (!ML_ISSET(media->monologue, TRANSCODING)) mp.ssrc_in->ssrc_map_out = ntohl(ssrc); mp.ssrc_out = get_ssrc_ctx(mp.ssrc_in->ssrc_map_out, other_media->monologue->ssrc_hash, SSRC_DIR_OUTPUT, NULL); payload_tracker_add(&mp.ssrc_in->tracker, pt_in & 0x7f);