|
|
|
|
@ -2173,7 +2173,7 @@ static int packet_dtmf(struct codec_ssrc_handler *ch, struct codec_ssrc_handler
|
|
|
|
|
struct telephone_event_payload *dtmf = (void *) packet->payload->s;
|
|
|
|
|
struct codec_handler *h = input_ch->handler;
|
|
|
|
|
// fudge up TS and duration values
|
|
|
|
|
uint64_t duration = h->source_pt.clock_rate * h->source_pt.ptime / 1000;
|
|
|
|
|
uint64_t duration = (uint64_t) h->source_pt.clock_rate * h->source_pt.ptime / 1000;
|
|
|
|
|
uint64_t ts = packet->ts + ntohs(dtmf->duration) - duration;
|
|
|
|
|
|
|
|
|
|
// remember this as last "encoder" TS
|
|
|
|
|
@ -2484,32 +2484,35 @@ static int handler_func_passthrough_ssrc(struct codec_handler *h, struct media_p
|
|
|
|
|
// check for DTMF injection
|
|
|
|
|
if (h->dtmf_payload_type != -1) {
|
|
|
|
|
struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, h->ssrc_hash);
|
|
|
|
|
uint64_t ts = ntohl(mp->rtp->timestamp);
|
|
|
|
|
|
|
|
|
|
str ev_pl = { .s = buf + sizeof(*mp->rtp) };
|
|
|
|
|
|
|
|
|
|
int is_dtmf = dtmf_event_payload(&ev_pl, &ts, h->source_pt.clock_rate * h->source_pt.ptime / 1000,
|
|
|
|
|
&ch->dtmf_event, &ch->dtmf_events);
|
|
|
|
|
if (is_dtmf) {
|
|
|
|
|
// fix up RTP header
|
|
|
|
|
struct rtp_header *r = (void *) buf;
|
|
|
|
|
*r = *mp->rtp;
|
|
|
|
|
r->m_pt = h->dtmf_payload_type;
|
|
|
|
|
r->timestamp = htonl(ts);
|
|
|
|
|
if (is_dtmf == 1)
|
|
|
|
|
r->m_pt |= 0x80;
|
|
|
|
|
else if (is_dtmf == 3) // end event
|
|
|
|
|
duplicates = 2;
|
|
|
|
|
mp->rtp = r;
|
|
|
|
|
mp->raw.s = buf;
|
|
|
|
|
mp->raw.len = ev_pl.len + sizeof(*mp->rtp);
|
|
|
|
|
if (ch) {
|
|
|
|
|
uint64_t ts = ntohl(mp->rtp->timestamp);
|
|
|
|
|
|
|
|
|
|
str ev_pl = { .s = buf + sizeof(*mp->rtp) };
|
|
|
|
|
|
|
|
|
|
int is_dtmf = dtmf_event_payload(&ev_pl, &ts,
|
|
|
|
|
(uint64_t) h->source_pt.clock_rate * h->source_pt.ptime / 1000,
|
|
|
|
|
&ch->dtmf_event, &ch->dtmf_events);
|
|
|
|
|
if (is_dtmf) {
|
|
|
|
|
// fix up RTP header
|
|
|
|
|
struct rtp_header *r = (void *) buf;
|
|
|
|
|
*r = *mp->rtp;
|
|
|
|
|
r->m_pt = h->dtmf_payload_type;
|
|
|
|
|
r->timestamp = htonl(ts);
|
|
|
|
|
if (is_dtmf == 1)
|
|
|
|
|
r->m_pt |= 0x80;
|
|
|
|
|
else if (is_dtmf == 3) // end event
|
|
|
|
|
duplicates = 2;
|
|
|
|
|
mp->rtp = r;
|
|
|
|
|
mp->raw.s = buf;
|
|
|
|
|
mp->raw.len = ev_pl.len + sizeof(*mp->rtp);
|
|
|
|
|
|
|
|
|
|
add_packet_fn = codec_add_raw_packet_dup;
|
|
|
|
|
}
|
|
|
|
|
else if (!ch->dtmf_events.length)
|
|
|
|
|
mp->media->monologue->dtmf_injection_active = 0;
|
|
|
|
|
|
|
|
|
|
add_packet_fn = codec_add_raw_packet_dup;
|
|
|
|
|
obj_put(&ch->h);
|
|
|
|
|
}
|
|
|
|
|
else if (!ch->dtmf_events.length)
|
|
|
|
|
mp->media->monologue->dtmf_injection_active = 0;
|
|
|
|
|
|
|
|
|
|
obj_put(&ch->h);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// substitute out SSRC etc
|
|
|
|
|
@ -2591,7 +2594,8 @@ uint64_t codec_encoder_pts(struct codec_ssrc_handler *ch, struct ssrc_ctx *ssrc_
|
|
|
|
|
return 0;
|
|
|
|
|
uint64_t cur = atomic64_get(&ssrc_in->last_ts);
|
|
|
|
|
// return the TS of the next expected packet
|
|
|
|
|
cur += ch->ptime * ch->handler->source_pt.clock_rate / 1000;
|
|
|
|
|
if (ch)
|
|
|
|
|
cur += (uint64_t) ch->ptime * ch->handler->source_pt.clock_rate / 1000;
|
|
|
|
|
return cur;
|
|
|
|
|
}
|
|
|
|
|
return ch->encoder->fifo_pts;
|
|
|
|
|
|