Browse Source

TT#98901 don't trigger DTX after a SSRC switch

Change-Id: Ic1664b3162b5e2caf7b6119ccb5863ad03cf2768
pull/1116/head
Richard Fuchs 5 years ago
parent
commit
e16cb57a3e
1 changed files with 12 additions and 4 deletions
  1. +12
    -4
      daemon/codec.c

+ 12
- 4
daemon/codec.c View File

@ -65,6 +65,7 @@ static GList *__delete_receiver_codec(struct call_media *receiver, GList *link)
struct codec_ssrc_handler; struct codec_ssrc_handler;
struct transcode_packet;
struct dtx_buffer { struct dtx_buffer {
struct timerthread_queue ttq; struct timerthread_queue ttq;
@ -81,6 +82,7 @@ struct dtx_entry {
struct transcode_packet *packet; struct transcode_packet *packet;
struct media_packet mp; struct media_packet mp;
unsigned long ts; unsigned long ts;
void *ssrc_ptr; // opaque pointer, doesn't hold a reference
}; };
struct codec_ssrc_handler { struct codec_ssrc_handler {
@ -1856,7 +1858,7 @@ static int codec_decoder_event(enum codec_event event, void *ptr, void *data) {
} }
static void __dtx_add_callback(struct dtx_buffer *dtxb, const struct timeval *base, unsigned int offset, static void __dtx_add_callback(struct dtx_buffer *dtxb, const struct timeval *base, unsigned int offset,
const struct media_packet *mp, unsigned long ts, int seq_add)
const struct media_packet *mp, unsigned long ts, int seq_add, void *ssrc_ptr)
{ {
struct dtx_entry *dtxe = g_slice_alloc0(sizeof(*dtxe)); struct dtx_entry *dtxe = g_slice_alloc0(sizeof(*dtxe));
dtxe->ttq_entry.when = *base; dtxe->ttq_entry.when = *base;
@ -1864,6 +1866,7 @@ static void __dtx_add_callback(struct dtx_buffer *dtxb, const struct timeval *ba
dtxe->ts = ts; dtxe->ts = ts;
media_packet_copy(&dtxe->mp, mp); media_packet_copy(&dtxe->mp, mp);
dtxe->mp.rtp->seq_num += htons(seq_add); dtxe->mp.rtp->seq_num += htons(seq_add);
dtxe->ssrc_ptr = ssrc_ptr;
timerthread_queue_push(&dtxb->ttq, &dtxe->ttq_entry); timerthread_queue_push(&dtxb->ttq, &dtxe->ttq_entry);
} }
@ -1911,8 +1914,12 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
mutex_lock(&dtxb->lock); mutex_lock(&dtxb->lock);
unsigned int diff = rtpe_now.tv_sec - dtxb->start; unsigned int diff = rtpe_now.tv_sec - dtxb->start;
unsigned long dtxb_ts = dtxb->ts; unsigned long dtxb_ts = dtxb->ts;
void *ssrc_ptr = dtxe->mp.stream->ssrc_in;
if (dtxe_ts == dtxb_ts && (rtpe_config.max_dtx <= 0 || diff < rtpe_config.max_dtx)) {
if (dtxe_ts == dtxb_ts
&& ssrc_ptr == dtxe->ssrc_ptr
&& (rtpe_config.max_dtx <= 0 || diff < rtpe_config.max_dtx))
{
ilog(LOG_DEBUG, "RTP media for TS %lu+ missing, triggering DTX", ilog(LOG_DEBUG, "RTP media for TS %lu+ missing, triggering DTX",
dtxe_ts); dtxe_ts);
@ -1926,7 +1933,7 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
if (ret) if (ret)
ilog(LOG_WARN | LOG_FLAG_LIMIT, "Decoder error handling DTX/lost packet"); ilog(LOG_WARN | LOG_FLAG_LIMIT, "Decoder error handling DTX/lost packet");
__dtx_add_callback(dtxb, &dtxe->ttq_entry.when, dtxb->ptime * 1000, mp, dtxe_ts, 0);
__dtx_add_callback(dtxb, &dtxe->ttq_entry.when, dtxb->ptime * 1000, mp, dtxe_ts, 0, ssrc_ptr);
} }
else else
mutex_unlock(&dtxb->lock); mutex_unlock(&dtxb->lock);
@ -2315,7 +2322,8 @@ static int packet_decode(struct codec_ssrc_handler *ch, struct transcode_packet
// packet now consumed // packet now consumed
packet = NULL; packet = NULL;
__dtx_add_callback(dtxb, &rtpe_now, (rtpe_config.dtx_delay + dtxb->ptime) * 1000, mp, ts, 1);
__dtx_add_callback(dtxb, &rtpe_now, (rtpe_config.dtx_delay + dtxb->ptime) * 1000, mp, ts, 1,
mp->stream->ssrc_in);
ret = 1; ret = 1;
} }


Loading…
Cancel
Save