Browse Source

MT#57977 convert monologue flags to uint

Change-Id: Id30e4dc290dee3cb93deb488817a4938b9369c63
dzenichev/fictitious
Richard Fuchs 2 years ago
parent
commit
17e57fbba4
8 changed files with 50 additions and 42 deletions
  1. +7
    -7
      daemon/call.c
  2. +7
    -7
      daemon/call_interfaces.c
  3. +1
    -1
      daemon/cli.c
  4. +9
    -9
      daemon/codec.c
  5. +4
    -4
      daemon/media_socket.c
  6. +6
    -6
      daemon/recording.c
  7. +15
    -7
      include/call.h
  8. +1
    -1
      t/test-transcode.c

+ 7
- 7
daemon/call.c View File

@ -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;


+ 7
- 7
daemon/call_interfaces.c View File

@ -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) {


+ 1
- 1
daemon/cli.c View File

@ -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


+ 9
- 9
daemon/codec.c View File

@ -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);
}


+ 4
- 4
daemon/media_socket.c View File

@ -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);


+ 6
- 6
daemon/recording.c View File

@ -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);


+ 15
- 7
include/call.h View File

@ -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 {


+ 1
- 1
t/test-transcode.c View File

@ -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);


Loading…
Cancel
Save