diff --git a/recording-daemon/mix.c b/recording-daemon/mix.c index 8ccb7adab..16810da69 100644 --- a/recording-daemon/mix.c +++ b/recording-daemon/mix.c @@ -388,13 +388,9 @@ int mix_add(mix_t *mix, AVFrame *frame, unsigned int idx, void *ptr, output_t *o else goto err; } - frame = resample_frame(&mix->resample, mix->sink_frame, &mix->out_format); - - bool ok = sink_add(&output->sink, frame, &mix->out_format); + bool ok = sink_add(&output->sink, mix->sink_frame, &mix->out_format); av_frame_unref(mix->sink_frame); - if (frame != mix->sink_frame) - av_frame_free(&frame); if (!ok) return -1; diff --git a/recording-daemon/output.c b/recording-daemon/output.c index 6203a95ea..c686a7e72 100644 --- a/recording-daemon/output.c +++ b/recording-daemon/output.c @@ -12,6 +12,7 @@ #include "main.h" #include "recaux.h" #include "notify.h" +#include "resample.h" #define DEFAULT_AVIO_BUFSIZE 4096 @@ -52,7 +53,21 @@ bool sink_add(sink_t *sink, AVFrame *frame, const format_t *requested_format) { if (!sink->config(sink, requested_format, &actual_format)) return false; - return sink->add(sink, frame); + AVFrame *copy_frame = av_frame_clone(frame); + if (!copy_frame) + return false; + AVFrame *dec_frame = resample_frame(&sink->resampler, copy_frame, &actual_format); + if (!dec_frame) { + av_frame_free(©_frame); + return false; + } + + bool ok = sink->add(sink, dec_frame); + + if (dec_frame != copy_frame) + av_frame_free(©_frame); + + return ok; } @@ -544,6 +559,11 @@ static bool output_shutdown(output_t *output, FILE **fp, GString **gs) { } +static void sink_close(sink_t *sink) { + resample_shutdown(&sink->resampler); +} + + void output_close(metafile_t *mf, output_t *output, tag_t *tag, bool discard) { if (!output) return; @@ -575,6 +595,7 @@ void output_close(metafile_t *mf, output_t *output, tag_t *tag, bool discard) { g_clear_pointer(&output->iobuf, g_free); if (output->membuf) g_string_free(output->membuf, TRUE); + sink_close(&output->sink); g_free(output); } diff --git a/recording-daemon/types.h b/recording-daemon/types.h index 0e7bb4548..e50391893 100644 --- a/recording-daemon/types.h +++ b/recording-daemon/types.h @@ -52,6 +52,8 @@ struct sink_s { union { output_t *output; }; + + resample_t resampler; };