diff --git a/daemon/codec.c b/daemon/codec.c index db1eff722..d491d4cec 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -159,7 +159,7 @@ void codec_handler_free(struct codec_handler **handler) { *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)); if (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->packet_encoded = packet_encoded_rtp; handler->packet_decoded = packet_decoded_fifo; + handler->media = media; return handler; } @@ -288,9 +289,9 @@ check_output:; } 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->func = handler_func_playback; 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->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); receiver->dtmf_injector->func = handler_func_inject_dtmf; 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) { ilog(LOG_DEBUG, "Creating codec handler for " STR_FORMAT, STR_FMT(&pt->encoding_with_params)); - handler = __handler_new(pt); + handler = __handler_new(pt, receiver); g_hash_table_insert(receiver->codec_handlers, GINT_TO_POINTER(handler->source_pt.payload_type), handler); @@ -745,7 +746,7 @@ static void __check_t38_decoder(struct call_media *t38_media) { if (t38_media->t38_handler) return; 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; } @@ -1721,6 +1722,10 @@ uint64_t codec_decoder_unskip_pts(struct codec_ssrc_handler *ch) { 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) { struct codec_handler *h = p; @@ -1774,6 +1779,9 @@ static struct ssrc_entry *__ssrc_handler_transcode_new(void *p) { if (!ch->decoder) 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) * h->dest_pt.codec_def->bits_per_sample / 8; diff --git a/daemon/media_player.c b/daemon/media_player.c index a9bd95cbe..82e9475b3 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -324,7 +324,7 @@ found: } } 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) return -1; diff --git a/include/codec.h b/include/codec.h index 054f0a2f0..33e9679fa 100644 --- a/include/codec.h +++ b/include/codec.h @@ -36,6 +36,7 @@ struct codec_handler { struct ssrc_hash *ssrc_hash; struct codec_handler *output_handler; // == self, or other PT handler + struct call_media *media; #ifdef WITH_TRANSCODING int (*packet_encoded)(encoder_t *enc, void *u1, void *u2); 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); void codec_handlers_free(struct call_media *); 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 codec_add_raw_packet(struct media_packet *mp); diff --git a/lib/codeclib.h b/lib/codeclib.h index 924af5f70..2b5ee3e2f 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -144,6 +144,10 @@ struct resample_s { SwrContext *swresample; }; +enum codec_event { + CE_DUMMY = -1, +}; + struct decoder_s { const codec_def_t *def; codec_options_t codec_options; @@ -171,6 +175,9 @@ struct decoder_s { unsigned long rtp_ts; uint64_t pts; int ptime; + + int (*event_func)(enum codec_event event, void *ptr, void *event_data); + void *event_data; }; struct encoder_s { @@ -279,6 +286,13 @@ INLINE char *av_error(int no) { av_strerror(no, buf, THREAD_BUF_SIZE); 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