TT#76711 add handler functions for enc/dec packet

Change-Id: I59b26793f233dde367cbe895f36642ebf58a7ab9
changes/75/38375/9
Richard Fuchs 6 years ago
parent 641fd160ca
commit 570ad9427d

@ -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;
}

@ -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;

Loading…
Cancel
Save