Browse Source

TT#14008 eliminate duplicate DTMF reports when forking media

With multiple media subscriptions, codec handlers are called
consecutively, once for each forwarding chain, leading to DTMF events
reported multiple times. The DTMF trigger must therefore keep track of
the state in the upper media object, not in the codec handlers.

Change-Id: I9ceaf406e093f25b7c037a325a0f2a7a91954922
mika/coverity
Richard Fuchs 4 years ago
parent
commit
730cc646a8
3 changed files with 20 additions and 11 deletions
  1. +2
    -0
      daemon/call.c
  2. +14
    -11
      daemon/codec.c
  3. +4
    -0
      include/call.h

+ 2
- 0
daemon/call.c View File

@ -821,6 +821,7 @@ struct call_media *call_media_new(struct call *call) {
med = uid_slice_alloc0(med, &call->medias); med = uid_slice_alloc0(med, &call->medias);
med->call = call; med->call = call;
codec_store_init(&med->codecs, med); codec_store_init(&med->codecs, med);
mutex_init(&med->dtmf_lock);
return med; return med;
} }
@ -3332,6 +3333,7 @@ void call_media_free(struct call_media **mdp) {
codec_handler_free(&md->t38_handler); codec_handler_free(&md->t38_handler);
t38_gateway_put(&md->t38_gateway); t38_gateway_put(&md->t38_gateway);
g_queue_clear_full(&md->sdp_attributes, free); g_queue_clear_full(&md->sdp_attributes, free);
mutex_destroy(&md->dtmf_lock);
g_slice_free1(sizeof(*md), md); g_slice_free1(sizeof(*md), md);
*mdp = NULL; *mdp = NULL;
} }


+ 14
- 11
daemon/codec.c View File

@ -129,7 +129,6 @@ struct codec_ssrc_handler {
int bytes_per_packet; int bytes_per_packet;
unsigned long first_ts; // for output TS scaling unsigned long first_ts; // for output TS scaling
unsigned long last_ts; // to detect input lag and handle lost packets unsigned long last_ts; // to detect input lag and handle lost packets
unsigned long ts_in; // for DTMF dupe detection
struct timeval first_send; struct timeval first_send;
unsigned long first_send_ts; unsigned long first_send_ts;
long output_skew; long output_skew;
@ -1748,17 +1747,21 @@ static struct codec_handler *__input_handler(struct codec_handler *h, struct med
static int packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_handler *input_ch, static int packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_handler *input_ch,
struct transcode_packet *packet, struct media_packet *mp) struct transcode_packet *packet, struct media_packet *mp)
{ {
if (ch->ts_in != packet->ts) { // ignore already processed events
int ret = dtmf_event(mp, packet->payload, ch->encoder_format.clockrate);
if (G_UNLIKELY(ret == -1)) // error
return -1;
if (ret == 1) {
// END event
ch->ts_in = packet->ts;
input_ch->dtmf_start_ts = 0;
{
LOCK(&mp->media->dtmf_lock);
if (mp->media->dtmf_ts != packet->ts) { // ignore already processed events
int ret = dtmf_event(mp, packet->payload, ch->encoder_format.clockrate);
if (G_UNLIKELY(ret == -1)) // error
return -1;
if (ret == 1) {
// END event
mp->media->dtmf_ts = packet->ts;
input_ch->dtmf_start_ts = 0;
}
else
input_ch->dtmf_start_ts = packet->ts ? packet->ts : 1;
} }
else
input_ch->dtmf_start_ts = packet->ts ? packet->ts : 1;
} }
int ret = 0; int ret = 0;


+ 4
- 0
include/call.h View File

@ -382,6 +382,10 @@ struct call_media {
//struct codec_handler *dtmf_injector; //struct codec_handler *dtmf_injector;
struct t38_gateway *t38_gateway; struct t38_gateway *t38_gateway;
struct codec_handler *t38_handler; struct codec_handler *t38_handler;
mutex_t dtmf_lock;
unsigned long dtmf_ts; // TS of last processed end event
#ifdef WITH_TRANSCODING #ifdef WITH_TRANSCODING
union { union {
struct { struct {


Loading…
Cancel
Save