From a46a49ba0689ca2cd6319eed2d8704936664a675 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 4 Sep 2026 09:59:01 -0400 Subject: [PATCH] MT#65420 streamline encoder input fn moved into encoder object Change-Id: I45ec3ae2575977eae896492f4eb9baade80bcb89 --- daemon/codec.c | 34 +++++++++++----------------------- lib/codeclib.c | 16 +++++++++++++--- lib/codeclib.h | 11 +++++++---- perf-tester/main.c | 2 +- recording-daemon/output.c | 2 +- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 0b569749b..5717196e5 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -143,8 +143,6 @@ struct dtx_packet { struct transcode_packet *packet, struct media_packet *mp); }; -typedef int (*encoder_input_func_t)(encoder_t *enc, AVFrame *frame, - int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2); typedef int (*packet_input_func_t)(struct codec_ssrc_handler *ch, struct codec_ssrc_handler *input_ch, struct transcode_packet *packet, unsigned long ts_delay, @@ -171,7 +169,6 @@ struct delay_frame { int payload_type; unsigned int clockrate; uint32_t ts; - encoder_input_func_t encoder_func; raw_input_func_t raw_func; packet_input_func_t packet_func; struct codec_handler *handler; @@ -328,8 +325,7 @@ static void __transcode_packet_free(struct transcode_packet *); static tc_code packet_decode(struct codec_ssrc_handler *, struct codec_ssrc_handler *, struct transcode_packet *, struct media_packet *); 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 int packet_decoded_direct(decoder_t *decoder, AVFrame *frame, void *u1, void *u2); +static int packet_decoded_encode(decoder_t *decoder, AVFrame *frame, void *u1, void *u2); static int packet_decoded_audio_player(decoder_t *decoder, AVFrame *frame, void *u1, void *u2); static void codec_touched(struct codec_store *cs, rtp_payload_type *pt); @@ -452,7 +448,7 @@ static void __handler_shutdown(struct codec_handler *handler) { handler->kernelize = false; handler->transcoder = false; handler->output_handler = handler; // reset to default - handler->packet_decoded = packet_decoded_fifo; + handler->packet_decoded = packet_decoded_encode; handler->dtmf_payload_type = -1; handler->real_dtmf_payload_type = -1; handler->cn_payload_type = -1; @@ -500,7 +496,7 @@ static struct codec_handler *__handler_new(const rtp_payload_type *pt, struct ca handler->real_dtmf_payload_type = -1; handler->cn_payload_type = -1; handler->packet_encoded = packet_encoded_rtp; - handler->packet_decoded = packet_decoded_fifo; + handler->packet_decoded = packet_decoded_encode; handler->media = media; handler->i.payload_type = handler->source_pt.payload_type; handler->i.sink = sink; @@ -893,7 +889,7 @@ static void __make_transcoder(struct codec_handler *handler, rtp_payload_type *d int cn_payload_type) { __make_transcoder_full(handler, dest, output_transcoders, dtmf_payload_type, pcm_dtmf_detect, - cn_payload_type, packet_decoded_fifo, __ssrc_handler_transcode_new); + cn_payload_type, packet_decoded_encode, __ssrc_handler_transcode_new); } static bool __make_audio_player_decoder(struct codec_handler *handler, rtp_payload_type *dest, bool pcm_dtmf_detect) @@ -1276,7 +1272,6 @@ static void __check_t38_gateway(struct call_media *pcm_media, struct call_media __make_transcoder(handler, &pcm_media->t38_gateway->pcm_pt, NULL, -1, false, -1); - handler->packet_decoded = packet_decoded_direct; handler->packet_encoded = packet_encoded_t38; } } @@ -3283,12 +3278,12 @@ INLINE struct codec_ssrc_handler *ssrc_handler_get(struct codec_ssrc_handler *ch // consumes frame // `frame` can be NULL (discarded/lost packet) static void __buffer_delay_frame(struct delay_buffer *dbuf, struct codec_ssrc_handler *ch, - encoder_input_func_t input_func, AVFrame *frame, struct media_packet *mp, uint32_t ts) + AVFrame *frame, struct media_packet *mp, uint32_t ts) { if (__buffer_delay_do_direct(dbuf)) { // input now if (frame) { - input_func(ch->encoder, frame, ch->handler->packet_encoded, ch, mp); + encoder_input_data(ch->encoder, frame, ch->handler->packet_encoded, ch, mp); av_frame_free(&frame); } return; @@ -3296,7 +3291,6 @@ static void __buffer_delay_frame(struct delay_buffer *dbuf, struct codec_ssrc_ha struct delay_frame *dframe = g_new0(__typeof(*dframe), 1); dframe->frame = frame; - dframe->encoder_func = input_func; dframe->ts = ts; dframe->ch = ssrc_handler_get(ch); dframe->handler = ch->handler; @@ -3674,9 +3668,9 @@ static void delay_packet_manipulate(struct delay_frame *dframe) { static void __delay_frame_process(struct delay_buffer *dbuf, struct delay_frame *dframe) { struct codec_ssrc_handler *csh = dframe->ch; - if (csh && csh->handler && csh->encoder && dframe->encoder_func) { + if (csh && csh->handler && csh->encoder) { delay_frame_manipulate(dframe); - dframe->encoder_func(csh->encoder, dframe->frame, csh->handler->packet_encoded, + encoder_input_data(csh->encoder, dframe->frame, csh->handler->packet_encoded, csh, &dframe->mp); } else if (dframe->raw_func) { @@ -4762,8 +4756,7 @@ static void __dtmf_detect(struct codec_ssrc_handler *ch, AVFrame *frame) { av_frame_free(&dsp_frame); } -static int packet_decoded_common(decoder_t *decoder, AVFrame *frame, void *u1, void *u2, - encoder_input_func_t input_func) +static int packet_decoded_encode(decoder_t *decoder, AVFrame *frame, void *u1, void *u2) { struct codec_ssrc_handler *ch = u1; struct media_packet *mp = u2; @@ -4821,7 +4814,7 @@ static int packet_decoded_common(decoder_t *decoder, AVFrame *frame, void *u1, v uint32_t ts = frame->pts + ch->csch.first_ts; __buffer_delay_frame(h->input_handler ? h->input_handler->delay_buffer : h->delay_buffer, - ch, input_func, frame, mp, ts); + ch, frame, mp, ts); frame = NULL; // consumed discard: @@ -4831,12 +4824,7 @@ 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_decoded_direct(decoder_t *decoder, AVFrame *frame, void *u1, void *u2) { - return packet_decoded_common(decoder, frame, u1, u2, encoder_input_data); -} + static int packet_decoded_audio_player(decoder_t *decoder, AVFrame *frame, void *u1, void *u2) { struct codec_ssrc_handler *ch = u1; struct media_packet *mp = u2; diff --git a/lib/codeclib.c b/lib/codeclib.c index 2642cb40b..e310e9891 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -57,6 +57,10 @@ TYPED_GHASHTABLE(codecs_by_name, str, struct codec_def_s, str_case_hash, str_cas static codecs_by_name codecs_by_name_ht; +static int encoder_input_direct(encoder_t *enc, AVFrame *frame, + int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2); +static int encoder_input_fifo(encoder_t *enc, AVFrame *frame, + int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2); codec_def_t *codec_find(const str *name, enum media_type type) { @@ -705,6 +709,8 @@ int encoder_config_fmtp(encoder_t *enc, codec_def_t *def, int bitrate, int ptime // output frame and fifo enc->frame = av_frame_alloc(); + enc->input_fn = encoder_input_direct; + if (enc->actual_format.format != -1 && enc->actual_format.clockrate > 0) { enc->frame->nb_samples = enc->samples_per_frame ? : 256; enc->frame->format = enc->actual_format.format; @@ -715,6 +721,7 @@ int encoder_config_fmtp(encoder_t *enc, codec_def_t *def, int bitrate, int ptime enc->fifo = av_audio_fifo_alloc(enc->frame->format, enc->actual_format.channels, enc->frame->nb_samples); + enc->input_fn = encoder_input_fifo; ilog(LOG_DEBUG, "Initialized encoder with frame size %u samples", enc->frame->nb_samples); } @@ -759,7 +766,7 @@ void encoder_free(encoder_t *enc) { } -int encoder_input_data(encoder_t *enc, AVFrame *frame, +static int encoder_input_direct(encoder_t *enc, AVFrame *frame, int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2) { enc->avpkt->size = 0; @@ -811,7 +818,7 @@ static int encoder_fifo_flush(encoder_t *enc, cdbg("output fifo pts %lu",(unsigned long) enc->fifo_pts); enc->frame->pts = enc->fifo_pts; - encoder_input_data(enc, enc->frame, callback, u1, u2); + encoder_input_direct(enc, enc->frame, callback, u1, u2); enc->fifo_pts += enc->frame->nb_samples; } @@ -819,9 +826,12 @@ static int encoder_fifo_flush(encoder_t *enc, return 0; } -int encoder_input_fifo(encoder_t *enc, AVFrame *frame, +static int encoder_input_fifo(encoder_t *enc, AVFrame *frame, int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2) { + if (!frame) + return encoder_input_direct(enc, frame, callback, u1, u2); + AVFrame *rsmp_frame = resample_frame(&enc->resampler, frame, &enc->actual_format); if (!rsmp_frame) { ilog(LOG_ERR | LOG_FLAG_LIMIT, "Resampling failed"); diff --git a/lib/codeclib.h b/lib/codeclib.h index 776b64387..d594854da 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -399,6 +399,7 @@ struct encoder_s { }; AVPacket *avpkt; AVAudioFifo *fifo; + int (*input_fn)(encoder_t *, AVFrame *, int (*)(encoder_t *, void *u1, void *u2), void *u1, void *u2); int64_t fifo_pts; // pts of first data in fifo int64_t packet_pts; // first pts of data in packetizer buffer int64_t next_pts; // next pts expected from the encoder @@ -475,10 +476,12 @@ int encoder_config_fmtp(encoder_t *enc, codec_def_t *def, int bitrate, int ptime struct rtp_codec_format *fmtp, const str *fmtp_string, const str *codec_opts); void encoder_close(encoder_t *); void encoder_free(encoder_t *); -int encoder_input_data(encoder_t *enc, AVFrame *frame, - int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2); -int encoder_input_fifo(encoder_t *enc, AVFrame *frame, - int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2); + +INLINE int encoder_input_data(encoder_t *enc, AVFrame *frame, + int (*callback)(encoder_t *, void *u1, void *u2), void *u1, void *u2) +{ + return enc->input_fn(enc, frame, callback, u1, u2); +} void packet_sequencer_init(packet_sequencer_t *ps, void (*)(seq_packet_t *)); diff --git a/perf-tester/main.c b/perf-tester/main.c index b68e7bbe1..5e9873e68 100644 --- a/perf-tester/main.c +++ b/perf-tester/main.c @@ -312,7 +312,7 @@ static int got_packet(encoder_t *encoder, void *p1, void *p2) { static int got_frame(decoder_t *decoder, AVFrame *frame, void *p1, void *b) { struct stream *s = p1; - encoder_input_fifo(s->encoder, frame, got_packet, s, NULL); + encoder_input_data(s->encoder, frame, got_packet, s, NULL); av_frame_free(&frame); return 0; } diff --git a/recording-daemon/output.c b/recording-daemon/output.c index 39d8a37f2..f278aef9c 100644 --- a/recording-daemon/output.c +++ b/recording-daemon/output.c @@ -90,7 +90,7 @@ static bool output_add(sink_t *sink, AVFrame *frame) { goto out; if (!output->fmtctx) // output not open goto out; - ret = encoder_input_fifo(output->encoder, frame, output_got_packet, output, NULL) == 0; + ret = encoder_input_data(output->encoder, frame, output_got_packet, output, NULL) == 0; out: av_frame_free(&frame);