diff --git a/recording-daemon/decoder.c b/recording-daemon/decoder.c index 7be0debda..004b9ac3f 100644 --- a/recording-daemon/decoder.c +++ b/recording-daemon/decoder.c @@ -138,9 +138,7 @@ no_mix_out: if (output) { dbg("SSRC %lx of stream #%lu has single output", ssrc->ssrc, stream->id); - if (output_config(output, &dec->dest_format, NULL)) - goto err; - if (!sink_add(&output->sink, frame)) + if (!sink_add(&output->sink, frame, &dec->dest_format)) ilog(LOG_ERR, "Failed to add decoded packet to individual output"); } diff --git a/recording-daemon/mix.c b/recording-daemon/mix.c index c623d8587..8ccb7adab 100644 --- a/recording-daemon/mix.c +++ b/recording-daemon/mix.c @@ -390,7 +390,7 @@ int mix_add(mix_t *mix, AVFrame *frame, unsigned int idx, void *ptr, output_t *o } frame = resample_frame(&mix->resample, mix->sink_frame, &mix->out_format); - bool ok = sink_add(&output->sink, frame); + bool ok = sink_add(&output->sink, frame, &mix->out_format); av_frame_unref(mix->sink_frame); if (frame != mix->sink_frame) diff --git a/recording-daemon/output.c b/recording-daemon/output.c index 84a9eadad..6203a95ea 100644 --- a/recording-daemon/output.c +++ b/recording-daemon/output.c @@ -25,6 +25,8 @@ int mp3_bitrate; static bool output_shutdown(output_t *output, FILE **, GString **); +static bool output_config_(sink_t *, output_t *output, const format_t *requested_format, + format_t *actual_format); @@ -42,9 +44,14 @@ static int output_got_packet(encoder_t *enc, void *u1, void *u2) { } -bool sink_add(sink_t *sink, AVFrame *frame) { +bool sink_add(sink_t *sink, AVFrame *frame, const format_t *requested_format) { if (!sink) return false; + + format_t actual_format; + if (!sink->config(sink, requested_format, &actual_format)) + return false; + return sink->add(sink, frame); } @@ -104,6 +111,10 @@ void sink_init(sink_t *sink) { }; } +static bool output_config__(sink_t *s, const format_t *requested_format, format_t *actual_format) { + return output_config_(s, s->output, requested_format, actual_format); +} + static output_t *output_alloc(const char *path, const char *name) { output_t *ret = g_new0(output_t, 1); ret->file_path = g_strdup(path); @@ -119,6 +130,7 @@ static output_t *output_alloc(const char *path, const char *name) { sink_init(&ret->sink); ret->sink.output = ret; ret->sink.add = output_add; + ret->sink.config = output_config__; return ret; } @@ -308,7 +320,9 @@ int64_t output_avio_mem_seek(void *opaque, int64_t offset, int whence) { return o->mempos; } -int output_config(output_t *output, const format_t *requested_format, format_t *actual_format) { +static bool output_config_(sink_t *sink, output_t *output, const format_t *requested_format, + format_t *actual_format) +{ const char *err; int av_ret = 0; @@ -461,14 +475,19 @@ no_output_file: done: if (actual_format) *actual_format = output->actual_format; - return 0; + return true; err: output_shutdown(output, NULL, NULL); ilog(LOG_ERR, "Error configuring media output: %s", err); if (av_ret) ilog(LOG_ERR, "Error returned from libav: %s", av_error(av_ret)); - return -1; + return false; +} + + +int output_config(output_t *output, const format_t *requested_format, format_t *actual_format) { + return output_config_(NULL, output, requested_format, actual_format) ? 0 : -1; } diff --git a/recording-daemon/output.h b/recording-daemon/output.h index a04982cb8..ff25126a2 100644 --- a/recording-daemon/output.h +++ b/recording-daemon/output.h @@ -18,7 +18,7 @@ int output_config(output_t *output, const format_t *requested_format, format_t * void sink_init(sink_t *); -bool sink_add(sink_t *, AVFrame *frame); +bool sink_add(sink_t *, AVFrame *frame, const format_t *requested_format); #endif diff --git a/recording-daemon/types.h b/recording-daemon/types.h index 6c290ee61..0e7bb4548 100644 --- a/recording-daemon/types.h +++ b/recording-daemon/types.h @@ -47,6 +47,7 @@ struct handler_s { struct sink_s { bool (*add)(sink_t *, AVFrame *); + bool (*config)(sink_t *, const format_t *requested_format, format_t *actual_format); union { output_t *output;