From 505ceba548bfeda8250e3f6eab231bdbe2002a7e 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 (cherry picked from commit 17e57fbba4f3e3be57c2b1b0be7b1bdfa3e3b40a) --- 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 cacb741f4..823c276e2 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -227,7 +227,7 @@ next: media_update_stats(media); ssrc_collect_metrics(media); } - if (media->monologue->transcoding) + if (ML_ISSET(media->monologue, TRANSCODING)) hlp->transcoded_media++; } @@ -2517,7 +2517,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++) { struct call_media *media = ml->medias->pdata[j]; @@ -2763,10 +2763,10 @@ 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); if (g_queue_find_custom(&ml->subscribers, NULL, __sub_is_transcoding)) - ml->transcoding = 1; + ML_SET(ml, TRANSCODING); } /* called with call->master_lock held in W */ @@ -2789,8 +2789,8 @@ int monologue_offer_answer(struct call_subscription *dialogue[2], GQueue *stream __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)); @@ -3068,7 +3068,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 6fc779a1e..d71363ac0 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -2776,7 +2776,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)"); @@ -2805,7 +2805,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)"); @@ -2813,7 +2813,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); } } } @@ -2837,7 +2837,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; @@ -2936,7 +2936,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); } } @@ -2960,7 +2960,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); @@ -3272,7 +3272,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 377ec42a0..5917d5312 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -1589,7 +1589,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 dd5a3ee55..7ffe2f52c 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; @@ -1095,9 +1095,9 @@ void __codec_handlers_update(struct call_media *receiver, struct call_media *sin do_dtmf_detect = true; if (a.flags && a.flags->inject_dtmf) - sink->monologue->inject_dtmf = 1; + ML_SET(sink->monologue, INJECT_DTMF); - bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || sink->monologue->inject_dtmf; + bool use_ssrc_passthrough = MEDIA_ISSET(receiver, ECHO) || ML_ISSET(sink->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; @@ -1200,7 +1200,7 @@ sink_pt_fixed:; && sink_dtmf_pt->for_transcoding) pcm_dtmf_detect = true; - if (receiver->monologue->detect_dtmf) + if (ML_ISSET(receiver->monologue, DETECT_DTMF)) pcm_dtmf_detect = true; // special mode for DTMF blocking @@ -1298,7 +1298,7 @@ sink_pt_fixed:; } // force transcoding if we want DTMF injection and there's no DTMF PT - if (!sink_dtmf_pt && sink->monologue->inject_dtmf) + if (!sink_dtmf_pt && ML_ISSET(sink->monologue, INJECT_DTMF)) goto transcode; // everything matches - we can do passthrough @@ -1657,7 +1657,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) @@ -1667,7 +1667,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); @@ -2237,7 +2237,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); } @@ -2519,7 +2519,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 38c39765e..c7c01ab23 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 3a935c004..f3333b6f5 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, @@ -533,13 +547,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 8429e5b2b..e70bc37ae 100644 --- a/t/test-transcode.c +++ b/t/test-transcode.c @@ -260,7 +260,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);