From c3ebbc4b4301a41c5292311d07622d4c4a2beba3 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 30 Oct 2020 09:03:16 -0400 Subject: [PATCH] TT#98901 add decoder_packet_lost() and callbacks Change-Id: I782b79ac02238ae7bc52bf05ced4318aa14d6164 --- lib/codeclib.c | 22 +++++++++++++++++++--- lib/codeclib.h | 4 ++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/codeclib.c b/lib/codeclib.c index f056c0a90..3ea482b2f 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -662,14 +662,15 @@ err: return -1; } -int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, +static 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) { GQueue frames = G_QUEUE_INIT; if (G_UNLIKELY(!dec)) return -1; - if (!data || !data->s || !data->len) + + if (!data && !dec->def->packet_lost) return 0; ts *= dec->def->clockrate_mult; @@ -695,7 +696,10 @@ int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, } dec->rtp_ts = ts; - dec->def->codec_type->decoder_input(dec, data, &frames); + if (data) + dec->def->codec_type->decoder_input(dec, data, &frames); + else + dec->def->packet_lost(dec, &frames); AVFrame *frame; int ret = 0; @@ -714,6 +718,18 @@ int decoder_input_data(decoder_t *dec, const str *data, unsigned long ts, return ret; } +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) +{ + if (!data || !data->s || !data->len) + return 0; + return __decoder_input_data(dec, data, ts, callback, u1, u2); +} +int decoder_lost_packet(decoder_t *dec, unsigned long ts, + int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2) +{ + return __decoder_input_data(dec, NULL, ts, callback, u1, u2); +} static void avlog_ilog(void *ptr, int loglevel, const char *fmt, va_list ap) { diff --git a/lib/codeclib.h b/lib/codeclib.h index 84513a08c..10efeaa92 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -72,6 +72,7 @@ typedef void format_init_f(struct rtp_payload_type *); typedef void set_enc_options_f(encoder_t *, const str *, const str *); typedef void set_dec_options_f(decoder_t *, const str *, const str *); typedef int format_cmp_f(const struct rtp_payload_type *, const struct rtp_payload_type *); +typedef int packet_lost_f(decoder_t *, GQueue *); @@ -136,6 +137,7 @@ struct codec_def_s { format_init_f *init; set_enc_options_f *set_enc_options; set_dec_options_f *set_dec_options; + packet_lost_f *packet_lost; // filled in by codeclib_init() str rtpname_str; @@ -276,6 +278,8 @@ decoder_t *decoder_new_fmtp(const codec_def_t *def, int clockrate, int channels, void decoder_close(decoder_t *dec); 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 decoder_lost_packet(decoder_t *dec, unsigned long ts, + int (*callback)(decoder_t *, AVFrame *, void *u1, void *u2), void *u1, void *u2); encoder_t *encoder_new(void);