|
|
|
|
@ -74,6 +74,7 @@ struct dtx_buffer {
|
|
|
|
|
struct codec_ssrc_handler *csh;
|
|
|
|
|
int ptime; // ms per packet
|
|
|
|
|
int tspp; // timestamp increment per packet
|
|
|
|
|
unsigned int clockrate;
|
|
|
|
|
struct call *call;
|
|
|
|
|
GQueue packets;
|
|
|
|
|
struct media_packet last_mp;
|
|
|
|
|
@ -2443,12 +2444,13 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
|
|
|
|
|
// inspect head packet and check TS, see if it's ready to be decoded
|
|
|
|
|
ts = dtxp->packet->ts;
|
|
|
|
|
ts_diff = ts - dtxb->head_ts;
|
|
|
|
|
long long ts_diff_us = (long long) ts_diff * 1000000 / dtxb->clockrate;
|
|
|
|
|
|
|
|
|
|
if (!dtxb->head_ts)
|
|
|
|
|
; // first packet
|
|
|
|
|
else if (ts_diff < 0)
|
|
|
|
|
ilogs(dtx, LOG_DEBUG, "DTX timestamp reset (from %lu to %lu)", dtxb->head_ts, ts);
|
|
|
|
|
else if (ts_diff > 100000) // arbitrary value
|
|
|
|
|
else if (ts_diff_us > 10000)
|
|
|
|
|
ilogs(dtx, LOG_DEBUG, "DTX timestamp reset (from %lu to %lu)", dtxb->head_ts, ts);
|
|
|
|
|
else if (ts_diff > dtxb->tspp) {
|
|
|
|
|
ilogs(dtx, LOG_DEBUG, "First packet in DTX buffer not ready yet (packet TS %lu, "
|
|
|
|
|
@ -2496,6 +2498,7 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
|
|
|
|
|
// shut down or SSRC change
|
|
|
|
|
ilogs(dtx, LOG_DEBUG, "DTX buffer for %lx has been shut down", (unsigned long) dtxb->ssrc);
|
|
|
|
|
dtxb->ttq_entry.when.tv_sec = 0;
|
|
|
|
|
dtxb->head_ts = 0;
|
|
|
|
|
mutex_unlock(&dtxb->lock);
|
|
|
|
|
goto out; // shut down
|
|
|
|
|
}
|
|
|
|
|
@ -2531,7 +2534,7 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
|
|
|
|
|
// inspect TS is most recent packet
|
|
|
|
|
struct dtx_packet *dtxp_last = g_queue_peek_tail(&dtxb->packets);
|
|
|
|
|
ts_diff = dtxp_last->packet->ts - ts;
|
|
|
|
|
long long ts_diff_us = (long long) ts_diff * 1000000 / ch->handler->source_pt.clock_rate;
|
|
|
|
|
long long ts_diff_us = (long long) ts_diff * 1000000 / dtxb->clockrate;
|
|
|
|
|
if (ts_diff_us >= rtpe_config.dtx_lag * 1000) {
|
|
|
|
|
// overflow
|
|
|
|
|
ilogs(dtx, LOG_DEBUG, "DTX timer queue overflowing (%i packets in queue, "
|
|
|
|
|
@ -2641,6 +2644,7 @@ static void __dtx_setup(struct codec_ssrc_handler *ch) {
|
|
|
|
|
if (!dtx->ptime)
|
|
|
|
|
dtx->ptime = 20; // XXX should be replaced with length of actual decoded packet
|
|
|
|
|
dtx->tspp = dtx->ptime * ch->handler->source_pt.clock_rate / 1000; // XXX ditto
|
|
|
|
|
dtx->clockrate = ch->handler->source_pt.clock_rate;
|
|
|
|
|
}
|
|
|
|
|
static void __ssrc_handler_stop(void *p) {
|
|
|
|
|
struct codec_ssrc_handler *ch = p;
|
|
|
|
|
|