From 570ad9427dfa6aee54dde1ff949edc5aa9530c9a Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 9 Mar 2020 09:34:30 -0400 Subject: [PATCH] TT#76711 add handler functions for enc/dec packet Change-Id: I59b26793f233dde367cbe895f36642ebf58a7ab9 --- daemon/codec.c | 23 +++++++++++++++++------ include/codec.h | 2 ++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 72a24ebcf..953a637d6 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -25,6 +25,8 @@ static codec_handler_func handler_func_passthrough; static struct rtp_payload_type *__rtp_payload_type_copy(const struct rtp_payload_type *pt); static void __rtp_payload_type_dup(struct call *call, struct rtp_payload_type *pt); static void __rtp_payload_type_add_name(GHashTable *, struct rtp_payload_type *pt); +static int packet_encoded_rtp(encoder_t *enc, void *u1, void *u2); +static int packet_decoded_fifo(decoder_t *decoder, AVFrame *frame, void *u1, void *u2); static struct codec_handler codec_handler_stub = { @@ -148,6 +150,8 @@ static struct codec_handler *__handler_new(struct rtp_payload_type *pt) { handler->source_pt = *pt; handler->output_handler = handler; // default handler->dtmf_payload_type = -1; + handler->packet_encoded = packet_encoded_rtp; + handler->packet_decoded = packet_decoded_fifo; return handler; } @@ -1446,7 +1450,7 @@ static void __free_ssrc_handler(void *chp) { g_queue_clear_full(&ch->dtmf_events, dtmf_event_free); } -static int __packet_encoded(encoder_t *enc, void *u1, void *u2) { +static int packet_encoded_rtp(encoder_t *enc, void *u1, void *u2) { struct codec_ssrc_handler *ch = u1; struct media_packet *mp = u2; //unsigned int seq_off = (mp->iter_out > mp->iter_in) ? 1 : 0; @@ -1561,7 +1565,10 @@ static void __dtmf_detect(struct codec_ssrc_handler *ch, AVFrame *frame) { av_frame_free(&dsp_frame); } -static int __packet_decoded(decoder_t *decoder, AVFrame *frame, void *u1, void *u2) { +static int packet_decoded_common(decoder_t *decoder, AVFrame *frame, void *u1, void *u2, + int (*input_func)(encoder_t *enc, AVFrame *frame, + int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2)) +{ struct codec_ssrc_handler *ch = u1; struct media_packet *mp = u2; @@ -1598,7 +1605,7 @@ static int __packet_decoded(decoder_t *decoder, AVFrame *frame, void *u1, void * __dtmf_detect(ch, frame); - encoder_input_fifo(ch->encoder, frame, __packet_encoded, ch, mp); + input_func(ch->encoder, frame, ch->handler->packet_encoded, ch, mp); discard: av_frame_free(&frame); @@ -1608,11 +1615,15 @@ discard: return 0; } +static int packet_decoded_fifo(decoder_t *decoder, AVFrame *frame, void *u1, void *u2) { + return packet_decoded_common(decoder, frame, u1, u2, encoder_input_fifo); +} + static int packet_decode(struct codec_ssrc_handler *ch, struct transcode_packet *packet, struct media_packet *mp) { if (!ch->first_ts) ch->first_ts = packet->ts; - int ret = decoder_input_data(ch->decoder, packet->payload, packet->ts, __packet_decoded, ch, mp); + int ret = decoder_input_data(ch->decoder, packet->payload, packet->ts, ch->handler->packet_decoded, ch, mp); //mp->iter_in++; mp->ssrc_out->parent->seq_diff--; return ret; @@ -1649,14 +1660,14 @@ static int handler_func_transcode(struct codec_handler *h, struct media_packet * static int handler_func_playback(struct codec_handler *h, struct media_packet *mp) { decoder_input_data(h->ssrc_handler->decoder, &mp->payload, mp->rtp->timestamp, - __packet_decoded, h->ssrc_handler, mp); + h->packet_decoded, h->ssrc_handler, mp); return 0; } static int handler_func_inject_dtmf(struct codec_handler *h, struct media_packet *mp) { struct codec_ssrc_handler *ch = get_ssrc(mp->ssrc_in->parent->h.ssrc, h->ssrc_hash); decoder_input_data(ch->decoder, &mp->payload, mp->rtp->timestamp, - __packet_decoded, ch, mp); + h->packet_decoded, ch, mp); obj_put(&ch->h); return 0; } diff --git a/include/codec.h b/include/codec.h index d11aa9599..2a90a5df2 100644 --- a/include/codec.h +++ b/include/codec.h @@ -35,6 +35,8 @@ struct codec_handler { struct ssrc_hash *ssrc_hash; struct codec_handler *output_handler; // == self, or other PT handler + int (*packet_encoded)(encoder_t *enc, void *u1, void *u2); + int (*packet_decoded)(decoder_t *, AVFrame *, void *, void *); // for media playback struct codec_ssrc_handler *ssrc_handler;