TT#91003 create generic decoder event callback

Change-Id: Ie0deda4f452cfc2b219dcc2c5bc1e933b1a36239
pull/1077/head
Richard Fuchs 6 years ago
parent 23b1aaea10
commit d0db2cba67

@ -159,7 +159,7 @@ void codec_handler_free(struct codec_handler **handler) {
*handler = NULL; *handler = NULL;
} }
static struct codec_handler *__handler_new(const struct rtp_payload_type *pt) { static struct codec_handler *__handler_new(const struct rtp_payload_type *pt, struct call_media *media) {
struct codec_handler *handler = g_slice_alloc0(sizeof(*handler)); struct codec_handler *handler = g_slice_alloc0(sizeof(*handler));
if (pt) if (pt)
handler->source_pt = *pt; handler->source_pt = *pt;
@ -167,6 +167,7 @@ static struct codec_handler *__handler_new(const struct rtp_payload_type *pt) {
handler->dtmf_payload_type = -1; handler->dtmf_payload_type = -1;
handler->packet_encoded = packet_encoded_rtp; handler->packet_encoded = packet_encoded_rtp;
handler->packet_decoded = packet_decoded_fifo; handler->packet_decoded = packet_decoded_fifo;
handler->media = media;
return handler; return handler;
} }
@ -288,9 +289,9 @@ check_output:;
} }
struct codec_handler *codec_handler_make_playback(const struct rtp_payload_type *src_pt, struct codec_handler *codec_handler_make_playback(const struct rtp_payload_type *src_pt,
const struct rtp_payload_type *dst_pt, unsigned long last_ts) const struct rtp_payload_type *dst_pt, unsigned long last_ts, struct call_media *media)
{ {
struct codec_handler *handler = __handler_new(src_pt); struct codec_handler *handler = __handler_new(src_pt, media);
handler->dest_pt = *dst_pt; handler->dest_pt = *dst_pt;
handler->func = handler_func_playback; handler->func = handler_func_playback;
handler->ssrc_handler = (void *) __ssrc_handler_transcode_new(handler); handler->ssrc_handler = (void *) __ssrc_handler_transcode_new(handler);
@ -697,7 +698,7 @@ static void __check_dtmf_injector(const struct sdp_ng_flags *flags, struct call_
//receiver->dtmf_injector = codec_handler_make_playback(&src_pt, pref_dest_codec, 0); //receiver->dtmf_injector = codec_handler_make_playback(&src_pt, pref_dest_codec, 0);
//receiver->dtmf_injector->dtmf_payload_type = dtmf_payload_type; //receiver->dtmf_injector->dtmf_payload_type = dtmf_payload_type;
receiver->dtmf_injector = __handler_new(&src_pt); receiver->dtmf_injector = __handler_new(&src_pt, receiver);
__make_transcoder(receiver->dtmf_injector, pref_dest_codec, output_transcoders, dtmf_payload_type, 0); __make_transcoder(receiver->dtmf_injector, pref_dest_codec, output_transcoders, dtmf_payload_type, 0);
receiver->dtmf_injector->func = handler_func_inject_dtmf; receiver->dtmf_injector->func = handler_func_inject_dtmf;
g_queue_push_tail(&receiver->codec_handlers_store, receiver->dtmf_injector); g_queue_push_tail(&receiver->codec_handlers_store, receiver->dtmf_injector);
@ -722,7 +723,7 @@ static struct codec_handler *__get_pt_handler(struct call_media *receiver, struc
if (!handler) { if (!handler) {
ilog(LOG_DEBUG, "Creating codec handler for " STR_FORMAT, ilog(LOG_DEBUG, "Creating codec handler for " STR_FORMAT,
STR_FMT(&pt->encoding_with_params)); STR_FMT(&pt->encoding_with_params));
handler = __handler_new(pt); handler = __handler_new(pt, receiver);
g_hash_table_insert(receiver->codec_handlers, g_hash_table_insert(receiver->codec_handlers,
GINT_TO_POINTER(handler->source_pt.payload_type), GINT_TO_POINTER(handler->source_pt.payload_type),
handler); handler);
@ -745,7 +746,7 @@ static void __check_t38_decoder(struct call_media *t38_media) {
if (t38_media->t38_handler) if (t38_media->t38_handler)
return; return;
ilog(LOG_DEBUG, "Creating T.38 packet handler"); ilog(LOG_DEBUG, "Creating T.38 packet handler");
t38_media->t38_handler = __handler_new(NULL); t38_media->t38_handler = __handler_new(NULL, t38_media);
t38_media->t38_handler->func = handler_func_t38; t38_media->t38_handler->func = handler_func_t38;
} }
@ -1721,6 +1722,10 @@ uint64_t codec_decoder_unskip_pts(struct codec_ssrc_handler *ch) {
return prev; return prev;
} }
static int codec_decoder_event(enum codec_event event, void *ptr, void *data) {
return 0;
}
static struct ssrc_entry *__ssrc_handler_transcode_new(void *p) { static struct ssrc_entry *__ssrc_handler_transcode_new(void *p) {
struct codec_handler *h = p; struct codec_handler *h = p;
@ -1774,6 +1779,9 @@ static struct ssrc_entry *__ssrc_handler_transcode_new(void *p) {
if (!ch->decoder) if (!ch->decoder)
goto err; goto err;
ch->decoder->event_data = h->media;
ch->decoder->event_func = codec_decoder_event;
ch->bytes_per_packet = (ch->encoder->samples_per_packet ? : ch->encoder->samples_per_frame) ch->bytes_per_packet = (ch->encoder->samples_per_packet ? : ch->encoder->samples_per_frame)
* h->dest_pt.codec_def->bits_per_sample / 8; * h->dest_pt.codec_def->bits_per_sample / 8;

@ -324,7 +324,7 @@ found:
} }
} }
if (!mp->handler) if (!mp->handler)
mp->handler = codec_handler_make_playback(src_pt, dst_pt, mp->sync_ts); mp->handler = codec_handler_make_playback(src_pt, dst_pt, mp->sync_ts, mp->media);
if (!mp->handler) if (!mp->handler)
return -1; return -1;

@ -36,6 +36,7 @@ struct codec_handler {
struct ssrc_hash *ssrc_hash; struct ssrc_hash *ssrc_hash;
struct codec_handler *output_handler; // == self, or other PT handler struct codec_handler *output_handler; // == self, or other PT handler
struct call_media *media;
#ifdef WITH_TRANSCODING #ifdef WITH_TRANSCODING
int (*packet_encoded)(encoder_t *enc, void *u1, void *u2); int (*packet_encoded)(encoder_t *enc, void *u1, void *u2);
int (*packet_decoded)(decoder_t *, AVFrame *, void *, void *); int (*packet_decoded)(decoder_t *, AVFrame *, void *, void *);
@ -62,7 +63,7 @@ struct codec_packet {
struct codec_handler *codec_handler_get(struct call_media *, int payload_type); struct codec_handler *codec_handler_get(struct call_media *, int payload_type);
void codec_handlers_free(struct call_media *); void codec_handlers_free(struct call_media *);
struct codec_handler *codec_handler_make_playback(const struct rtp_payload_type *src_pt, struct codec_handler *codec_handler_make_playback(const struct rtp_payload_type *src_pt,
const struct rtp_payload_type *dst_pt, unsigned long ts); const struct rtp_payload_type *dst_pt, unsigned long ts, struct call_media *);
void ensure_codec_def(struct rtp_payload_type *pt, struct call_media *media); void ensure_codec_def(struct rtp_payload_type *pt, struct call_media *media);
void codec_add_raw_packet(struct media_packet *mp); void codec_add_raw_packet(struct media_packet *mp);

@ -144,6 +144,10 @@ struct resample_s {
SwrContext *swresample; SwrContext *swresample;
}; };
enum codec_event {
CE_DUMMY = -1,
};
struct decoder_s { struct decoder_s {
const codec_def_t *def; const codec_def_t *def;
codec_options_t codec_options; codec_options_t codec_options;
@ -171,6 +175,9 @@ struct decoder_s {
unsigned long rtp_ts; unsigned long rtp_ts;
uint64_t pts; uint64_t pts;
int ptime; int ptime;
int (*event_func)(enum codec_event event, void *ptr, void *event_data);
void *event_data;
}; };
struct encoder_s { struct encoder_s {
@ -279,6 +286,13 @@ INLINE char *av_error(int no) {
av_strerror(no, buf, THREAD_BUF_SIZE); av_strerror(no, buf, THREAD_BUF_SIZE);
return buf; return buf;
} }
INLINE int decoder_event(decoder_t *dec, enum codec_event event, void *ptr) {
if (!dec)
return 0;
if (!dec->event_func)
return 0;
return dec->event_func(event, ptr, dec->event_data);
}
#else #else

Loading…
Cancel
Save