|
|
|
@ -1836,25 +1836,31 @@ static struct codec_handler *__input_handler(struct codec_handler *h, struct med |
|
|
|
return h; |
|
|
|
} |
|
|
|
|
|
|
|
static int packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_handler *input_ch, |
|
|
|
static int packet_dtmf_event(struct codec_ssrc_handler *ch, struct codec_ssrc_handler *input_ch, |
|
|
|
struct transcode_packet *packet, struct media_packet *mp) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(&mp->media->dtmf_lock); |
|
|
|
|
|
|
|
if (mp->media->dtmf_ts != packet->ts) { // ignore already processed events |
|
|
|
int ret = dtmf_event_packet(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; |
|
|
|
LOCK(&mp->media->dtmf_lock); |
|
|
|
|
|
|
|
if (mp->media->dtmf_ts != packet->ts) { // ignore already processed events |
|
|
|
int ret = dtmf_event_packet(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; |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_handler *input_ch, |
|
|
|
struct transcode_packet *packet, struct media_packet *mp) |
|
|
|
{ |
|
|
|
if (packet_dtmf_event(ch, input_ch, packet, mp)) |
|
|
|
return -1; |
|
|
|
|
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
@ -3243,17 +3249,23 @@ static int packet_decode(struct codec_ssrc_handler *ch, struct codec_ssrc_handle |
|
|
|
if (!ch->first_ts) |
|
|
|
ch->first_ts = packet->ts; |
|
|
|
|
|
|
|
if (input_ch->dtmf_start_ts && !rtpe_config.dtmf_no_suppress) { |
|
|
|
if ((packet->ts > input_ch->dtmf_start_ts && packet->ts - input_ch->dtmf_start_ts > 80000) || |
|
|
|
(packet->ts < input_ch->dtmf_start_ts && input_ch->dtmf_start_ts - packet->ts > 80000)) { |
|
|
|
ilogs(transcoding, LOG_DEBUG, "Resetting decoder DTMF state due to TS discrepancy"); |
|
|
|
input_ch->dtmf_start_ts = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
ilogs(transcoding, LOG_DEBUG, "Decoder is in DTMF state, discaring codec packet"); |
|
|
|
if (mp->ssrc_out) |
|
|
|
mp->ssrc_out->parent->seq_diff--; |
|
|
|
if (ch->decoder->def->dtmf) { |
|
|
|
if (packet_dtmf_event(ch, input_ch, packet, mp)) |
|
|
|
goto out; |
|
|
|
} |
|
|
|
else { |
|
|
|
if (input_ch->dtmf_start_ts && !rtpe_config.dtmf_no_suppress) { |
|
|
|
if ((packet->ts > input_ch->dtmf_start_ts && packet->ts - input_ch->dtmf_start_ts > 80000) || |
|
|
|
(packet->ts < input_ch->dtmf_start_ts && input_ch->dtmf_start_ts - packet->ts > 80000)) { |
|
|
|
ilogs(transcoding, LOG_DEBUG, "Resetting decoder DTMF state due to TS discrepancy"); |
|
|
|
input_ch->dtmf_start_ts = 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
ilogs(transcoding, LOG_DEBUG, "Decoder is in DTMF state, discaring codec packet"); |
|
|
|
if (mp->ssrc_out) |
|
|
|
mp->ssrc_out->parent->seq_diff--; |
|
|
|
goto out; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|