From 06c89206c1d47b965345017000fb3dfbd7da7209 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 25 Jun 2025 11:27:52 -0400 Subject: [PATCH] MT#62571 turn mix output into sink Change-Id: I59140d641679b84ce3831ba1dcad07e38deda46f --- recording-daemon/decoder.c | 25 +----------------------- recording-daemon/mix.c | 40 ++++++++++++++++++++++++++++++++++++-- recording-daemon/mix.h | 6 +++--- recording-daemon/packet.c | 5 +++++ 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/recording-daemon/decoder.c b/recording-daemon/decoder.c index 183521960..66efff075 100644 --- a/recording-daemon/decoder.c +++ b/recording-daemon/decoder.c @@ -108,30 +108,7 @@ static int decoder_got_frame(decoder_t *dec, AVFrame *frame, void *sp, void *dp) if (!metafile->recording_on) goto no_recording; - // handle mix output - pthread_mutex_lock(&metafile->mix_lock); - if (metafile->mix_out) { - dbg("adding packet from stream #%lu to mix output", stream->id); - if (G_UNLIKELY(deco->mix_sink.mixer_idx == (unsigned int) -1)) - deco->mix_sink.mixer_idx = mix_get_index(metafile->mix, ssrc, stream->media_sdp_id, stream->channel_slot); - format_t actual_format; - if (output_config(metafile->mix_out, &dec->dest_format, &actual_format)) - goto no_mix_out; - mix_config(metafile->mix, &actual_format); - // XXX might be a second resampling to same format - AVFrame *copy_frame = av_frame_clone(frame); - AVFrame *dec_frame = resample_frame(&deco->mix_sink.resampler, copy_frame, &actual_format); - if (!dec_frame) { - pthread_mutex_unlock(&metafile->mix_lock); - goto err; - } - if (mix_add(metafile->mix, dec_frame, deco->mix_sink.mixer_idx, ssrc, metafile->mix_out)) - ilog(LOG_ERR, "Failed to add decoded packet to mixed output"); - if (dec_frame != copy_frame) - av_frame_free(©_frame); - } -no_mix_out: - pthread_mutex_unlock(&metafile->mix_lock); + sink_add(&deco->mix_sink, frame, &dec->dest_format); if (output) { dbg("SSRC %lx of stream #%lu has single output", ssrc->ssrc, stream->id); diff --git a/recording-daemon/mix.c b/recording-daemon/mix.c index 16810da69..7039c270c 100644 --- a/recording-daemon/mix.c +++ b/recording-daemon/mix.c @@ -138,7 +138,7 @@ unsigned int mix_get_index(mix_t *mix, void *ptr, unsigned int media_sdp_id, uns } -int mix_config(mix_t *mix, const format_t *format) { +static int mix_config_(mix_t *mix, const format_t *format) { const char *err; char args[512]; @@ -323,7 +323,7 @@ static void mix_silence_fill(mix_t *mix) { } -int mix_add(mix_t *mix, AVFrame *frame, unsigned int idx, void *ptr, output_t *output) { +static int mix_add_(mix_t *mix, AVFrame *frame, unsigned int idx, void *ptr, output_t *output) { const char *err; err = "index out of range"; @@ -403,3 +403,39 @@ err: av_frame_free(&frame); return -1; } + + +bool mix_add(sink_t *sink, AVFrame *frame) { + ssrc_t *ssrc = sink->ssrc; + metafile_t *metafile = ssrc->metafile; + + LOCK(&metafile->mix_lock); + + if (!metafile->mix_out) + return true; + + if (mix_add_(metafile->mix, frame, sink->mixer_idx, ssrc, metafile->mix_out)) + ilog(LOG_ERR, "Failed to add decoded packet to mixed output"); + + return true; +} + + +bool mix_config(sink_t *sink, const format_t *requested_format, format_t *actual_format) { + ssrc_t *ssrc = sink->ssrc; + metafile_t *metafile = ssrc->metafile; + + LOCK(&metafile->mix_lock); + + if (!metafile->mix_out) + return true; + + stream_t *stream = ssrc->stream; + + if (G_UNLIKELY(sink->mixer_idx == (unsigned int) -1)) + sink->mixer_idx = mix_get_index(metafile->mix, ssrc, stream->media_sdp_id, stream->channel_slot); + if (output_config(metafile->mix_out, requested_format, actual_format)) + return true; + mix_config_(metafile->mix, actual_format); + return true; +} diff --git a/recording-daemon/mix.h b/recording-daemon/mix.h index a162f36ee..65eeade5d 100644 --- a/recording-daemon/mix.h +++ b/recording-daemon/mix.h @@ -9,8 +9,8 @@ mix_t *mix_new(void); void mix_destroy(mix_t *mix); void mix_set_channel_slots(mix_t *mix, unsigned int); -int mix_config(mix_t *, const format_t *format); -int mix_add(mix_t *mix, AVFrame *frame, unsigned int idx, void *, output_t *output); +bool mix_config(sink_t *, const format_t *requested_format, format_t *actual_format); +bool mix_add(sink_t *, AVFrame *frame); unsigned int mix_get_index(mix_t *, void *, unsigned int, unsigned int); -#endif +#endif diff --git a/recording-daemon/packet.c b/recording-daemon/packet.c index 58763b459..af07481ec 100644 --- a/recording-daemon/packet.c +++ b/recording-daemon/packet.c @@ -19,6 +19,7 @@ #include "tag.h" #include "fix_frame_channel_layout.h" #include "tls_send.h" +#include "mix.h" static void packet_free(void *p) { @@ -120,8 +121,12 @@ static void packet_decode(ssrc_t *ssrc, packet_t *packet) { else if (ssrc->output) dec_format = ssrc->output->requested_format; ssrc->decoders[payload_type] = decoder_new(payload_str, format, ptime, &dec_format); + sink_init(&ssrc->decoders[payload_type]->mix_sink); ssrc->decoders[payload_type]->mix_sink.ssrc = ssrc; + ssrc->decoders[payload_type]->mix_sink.add = mix_add; + ssrc->decoders[payload_type]->mix_sink.config = mix_config; + pthread_mutex_unlock(&mf->mix_lock); if (!ssrc->decoders[payload_type]) { ilog(LOG_WARN, "Cannot decode RTP payload type %u (%s)",