diff --git a/src/filter/plugins/FfmpegFilterPlugin.cxx b/src/filter/plugins/FfmpegFilterPlugin.cxx index db377ca5e..94e83f50a 100644 --- a/src/filter/plugins/FfmpegFilterPlugin.cxx +++ b/src/filter/plugins/FfmpegFilterPlugin.cxx @@ -54,6 +54,9 @@ PreparedFfmpegFilter::Open(AudioFormat &in_audio_format) Ffmpeg::DetectFilterOutputFormat(in_audio_format, buffer_src, buffer_sink); + if (!out_audio_format.IsDefined()) + throw std::runtime_error("Unable to determine FFmpeg filter output format"); + return std::make_unique(in_audio_format, out_audio_format, std::move(graph), diff --git a/src/lib/ffmpeg/DetectFilterFormat.cxx b/src/lib/ffmpeg/DetectFilterFormat.cxx index 4367307d5..7b44eabb4 100644 --- a/src/lib/ffmpeg/DetectFilterFormat.cxx +++ b/src/lib/ffmpeg/DetectFilterFormat.cxx @@ -62,8 +62,14 @@ DetectFilterOutputFormat(const AudioFormat &in_audio_format, frame.Unref(); err = av_buffersink_get_frame(&buffer_sink, frame.get()); - if (err < 0) + if (err < 0) { + if (err == AVERROR(EAGAIN)) + /* one sample was not enough input data for + the given filter graph */ + return AudioFormat::Undefined(); + throw MakeFfmpegError(err, "av_buffersink_get_frame() failed"); + } const SampleFormat sample_format = FromFfmpegSampleFormat(AVSampleFormat(frame->format)); if (sample_format == SampleFormat::UNDEFINED) diff --git a/src/lib/ffmpeg/DetectFilterFormat.hxx b/src/lib/ffmpeg/DetectFilterFormat.hxx index 662f0e733..18bf61994 100644 --- a/src/lib/ffmpeg/DetectFilterFormat.hxx +++ b/src/lib/ffmpeg/DetectFilterFormat.hxx @@ -35,6 +35,9 @@ namespace Ffmpeg { * between. * * This function can throw if the FFmpeg filter fails. + * + * @return the output format or AudioFormat::Undefined() if it was not + * possible to determine the format */ AudioFormat DetectFilterOutputFormat(const AudioFormat &in_audio_format,