Browse Source

TT#122401 return ptime from decoded packets for DTX

Change-Id: I382b842406fbee73ec752f6f4f0832736222ef52
rfuchs/1283
Richard Fuchs 5 years ago
parent
commit
d4fbec39d1
4 changed files with 40 additions and 9 deletions
  1. +20
    -4
      daemon/codec.c
  2. +1
    -0
      include/media_socket.h
  3. +17
    -5
      lib/codeclib.c
  4. +2
    -0
      lib/codeclib.h

+ 20
- 4
daemon/codec.c View File

@ -2558,6 +2558,9 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
timerthread_queue_push(&dtxb->ttq, &dtxb->ttq_entry); timerthread_queue_push(&dtxb->ttq, &dtxb->ttq_entry);
int ptime = dtxb->ptime;
int dtx_ptime = ptime;
mutex_unlock(&dtxb->lock); mutex_unlock(&dtxb->lock);
rwlock_lock_r(&call->master_lock); rwlock_lock_r(&call->master_lock);
@ -2568,8 +2571,13 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
ilogs(dtx, LOG_DEBUG, "Decoding DTX-buffered RTP packet (TS %lu) now; " ilogs(dtx, LOG_DEBUG, "Decoding DTX-buffered RTP packet (TS %lu) now; "
"%i packets left in queue", ts, p_left); "%i packets left in queue", ts, p_left);
mp_copy.ptime = -1;
ret = dtxp->func(ch, dtxp->packet, &mp_copy); ret = dtxp->func(ch, dtxp->packet, &mp_copy);
if (ret)
if (!ret) {
if (mp_copy.ptime > 0)
ptime = mp_copy.ptime;
}
else
ilogs(dtx, LOG_WARN | LOG_FLAG_LIMIT, ilogs(dtx, LOG_WARN | LOG_FLAG_LIMIT,
"Decoder error while processing buffered RTP packet"); "Decoder error while processing buffered RTP packet");
} }
@ -2583,7 +2591,7 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
// synthetic packet // synthetic packet
mp_copy.rtp->seq_num += htons(1); mp_copy.rtp->seq_num += htons(1);
ret = decoder_dtx(ch->decoder, ts, dtxb->ptime,
ret = decoder_dtx(ch->decoder, ts, ptime,
ch->handler->packet_decoded, ch, &mp_copy); ch->handler->packet_decoded, ch, &mp_copy);
if (ret) if (ret)
ilogs(dtx, LOG_WARN | LOG_FLAG_LIMIT, ilogs(dtx, LOG_WARN | LOG_FLAG_LIMIT,
@ -2598,6 +2606,13 @@ static void __dtx_send_later(struct timerthread_queue *ttq, void *p) {
} }
} }
if (ptime != dtx_ptime) {
mutex_lock(&dtxb->lock);
dtxb->ptime = ptime;
dtxb->tspp = ptime * dtxb->clockrate / 1000;
mutex_unlock(&dtxb->lock);
}
__ssrc_unlock_both(&mp_copy); __ssrc_unlock_both(&mp_copy);
if (mp_copy.packets_out.length && ret == 0) { if (mp_copy.packets_out.length && ret == 0) {
@ -2664,8 +2679,8 @@ static void __dtx_setup(struct codec_ssrc_handler *ch) {
dtx->ptime = 20; dtx->ptime = 20;
ilogs(dtx, LOG_DEBUG, "Using DTX ptime %i based on handler=%i codec=%i", dtx->ptime, ilogs(dtx, LOG_DEBUG, "Using DTX ptime %i based on handler=%i codec=%i", dtx->ptime,
ch->ptime, ch->handler->source_pt.codec_def->default_ptime); ch->ptime, ch->handler->source_pt.codec_def->default_ptime);
dtx->tspp = dtx->ptime * ch->handler->source_pt.clock_rate / 1000;
dtx->clockrate = ch->handler->source_pt.clock_rate; dtx->clockrate = ch->handler->source_pt.clock_rate;
dtx->tspp = dtx->ptime * dtx->clockrate / 1000;
} }
static void __ssrc_handler_stop(void *p) { static void __ssrc_handler_stop(void *p) {
struct codec_ssrc_handler *ch = p; struct codec_ssrc_handler *ch = p;
@ -3094,7 +3109,8 @@ static int packet_decoded_direct(decoder_t *decoder, AVFrame *frame, void *u1, v
static int __rtp_decode(struct codec_ssrc_handler *ch, struct transcode_packet *packet, struct media_packet *mp) static int __rtp_decode(struct codec_ssrc_handler *ch, struct transcode_packet *packet, struct media_packet *mp)
{ {
int ret = decoder_input_data(ch->decoder, packet->payload, packet->ts, ch->handler->packet_decoded,
int ret = decoder_input_data_ptime(ch->decoder, packet->payload, packet->ts, &mp->ptime,
ch->handler->packet_decoded,
ch, mp); ch, mp);
mp->ssrc_out->parent->seq_diff--; mp->ssrc_out->parent->seq_diff--;
return ret; return ret;


+ 1
- 0
include/media_socket.h View File

@ -139,6 +139,7 @@ struct media_packet {
str payload; str payload;
GQueue packets_out; GQueue packets_out;
int ptime; // returned from decoding
}; };


+ 17
- 5
lib/codeclib.c View File

@ -842,7 +842,7 @@ err:
return -1; return -1;
} }
static int __decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, int ptime,
static int __decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, int *ptime,
int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2) int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2)
{ {
GQueue frames = G_QUEUE_INIT; GQueue frames = G_QUEUE_INIT;
@ -850,7 +850,7 @@ static int __decoder_input_data(decoder_t *dec, const str *data, unsigned long t
if (G_UNLIKELY(!dec)) if (G_UNLIKELY(!dec))
return -1; return -1;
if (!data && !dec->dtx.do_dtx)
if (!data && (!dec->dtx.do_dtx || !ptime))
return 0; return 0;
ts *= dec->def->clockrate_mult; ts *= dec->def->clockrate_mult;
@ -879,11 +879,13 @@ static int __decoder_input_data(decoder_t *dec, const str *data, unsigned long t
if (data) if (data)
dec->def->codec_type->decoder_input(dec, data, &frames); dec->def->codec_type->decoder_input(dec, data, &frames);
else else
dec->dtx.do_dtx(dec, &frames, ptime);
dec->dtx.do_dtx(dec, &frames, *ptime);
AVFrame *frame; AVFrame *frame;
int ret = 0; int ret = 0;
unsigned long samples = 0;
while ((frame = g_queue_pop_head(&frames))) { while ((frame = g_queue_pop_head(&frames))) {
samples += frame->nb_samples;
dec->dec_out_format.format = frame->format; dec->dec_out_format.format = frame->format;
AVFrame *rsmp_frame = resample_frame(&dec->resampler, frame, &dec->dest_format); AVFrame *rsmp_frame = resample_frame(&dec->resampler, frame, &dec->dest_format);
if (!rsmp_frame) { if (!rsmp_frame) {
@ -897,6 +899,9 @@ static int __decoder_input_data(decoder_t *dec, const str *data, unsigned long t
av_frame_free(&frame); av_frame_free(&frame);
} }
if (ptime)
*ptime = samples * 1000L / dec->in_format.clockrate;
return ret; return ret;
} }
int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts,
@ -904,12 +909,19 @@ int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts,
{ {
if (!data || !data->s || !data->len) if (!data || !data->s || !data->len)
return 0; return 0;
return __decoder_input_data(dec, data, ts, 0, callback, u1, u2);
return __decoder_input_data(dec, data, ts, NULL, callback, u1, u2);
}
int decoder_input_data_ptime(decoder_t *dec, const str *data, unsigned long ts, int *ptime,
int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2)
{
if (!data || !data->s || !data->len)
return 0;
return __decoder_input_data(dec, data, ts, ptime, callback, u1, u2);
} }
int decoder_dtx(decoder_t *dec, unsigned long ts, int ptime, int decoder_dtx(decoder_t *dec, unsigned long ts, int ptime,
int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2) int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2)
{ {
return __decoder_input_data(dec, NULL, ts, ptime, callback, u1, u2);
return __decoder_input_data(dec, NULL, ts, &ptime, callback, u1, u2);
} }


+ 2
- 0
lib/codeclib.h View File

@ -307,6 +307,8 @@ decoder_t *decoder_new_fmtp(const codec_def_t *def, int clockrate, int channels,
void decoder_close(decoder_t *dec); void decoder_close(decoder_t *dec);
int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts,
int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2); int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2);
int decoder_input_data_ptime(decoder_t *dec, const str *data, unsigned long ts, int *ptime,
int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2);
gboolean decoder_has_dtx(decoder_t *); gboolean decoder_has_dtx(decoder_t *);
int decoder_switch_dtx(decoder_t *dec, enum dtx_method); int decoder_switch_dtx(decoder_t *dec, enum dtx_method);
int decoder_set_cn_dtx(decoder_t *dec, const str *); int decoder_set_cn_dtx(decoder_t *dec, const str *);


Loading…
Cancel
Save