Browse Source

MT#55283 dtmf_event_payload: canonicalise DTMF end event ts if start packet send was delayed

in some scenarios the start event ts can be before the *pts value, which
will result in a shortened DTMF event being transmitted than expected during
injection as the end event ts is calculated based on that initial dtmf start
value.
This change updates the end event ts by the amount the start ts was
behind, so that the resulting event has the right duration

Change-Id: Ia637d1e1c5d92de8b35317ec552c22eae23c0645
(cherry picked from commit c7fa81c764)
pull/1887/head
Tom Briden 2 years ago
committed by Richard Fuchs
parent
commit
0c88e6007f
1 changed files with 9 additions and 1 deletions
  1. +9
    -1
      daemon/dtmf.c

+ 9
- 1
daemon/dtmf.c View File

@ -436,8 +436,8 @@ void dtmf_event_free(void *e) {
int dtmf_event_payload(str *buf, uint64_t *pts, uint64_t duration, struct dtmf_event *cur_event, GQueue *events) {
// do we have a relevant state change?
struct dtmf_event prev_event = *cur_event;
struct dtmf_event *ev = g_queue_peek_head(events);
while (events->length) {
struct dtmf_event *ev = g_queue_peek_head(events);
ilog(LOG_DEBUG, "Next DTMF event starts at %" PRIu64 ". PTS now %" PRIu64, ev->ts, *pts);
if (ev->ts > *pts)
break; // future event
@ -447,6 +447,14 @@ int dtmf_event_payload(str *buf, uint64_t *pts, uint64_t duration, struct dtmf_e
g_queue_pop_head(events);
*cur_event = *ev;
dtmf_event_free(ev);
ev = g_queue_peek_head(events);
if (ev && ev->code == 0 && cur_event->ts < *pts) {
// if the start event ts was before *pts we need
// to adjust the end event_ts to ensure we're not shortening
// the event
ilog(LOG_DEBUG, "Delayed send of DTMF, adjusting end event_ts by %lu - %lu = %lu", *pts, cur_event->ts, *pts - cur_event->ts);
ev->ts += *pts - cur_event->ts;
}
cur_event->ts = *pts; // canonicalise start TS
}


Loading…
Cancel
Save