24#include <libavfilter/buffersink.h>
25#include <libavfilter/buffersrc.h>
56 return fail(
"Failed to allocate filter graph",
AVERROR(
ENOMEM));
58 graph_->nb_threads = std::max(1, std::min(8,
static_cast<int>(std::thread::hardware_concurrency()) / 2));
63 return fail(
"Failed to parse filter graph",
ret);
70 return fail(
"Filters with multiple outputs are not supported",
AVERROR(
ENOTSUP));
72 if ((
ret = initOutputFilter(
outputs.get())) < 0)
73 return fail(
"Failed to create output for filter graph",
ret);
80 if (count !=
msps.size())
81 return fail(
"Size mismatch between number of inputs in filter graph and input parameter array",
AVERROR(
EINVAL));
85 return fail(
"Filters require non empty names",
AVERROR(
EINVAL));
86 std::string_view name =
current->name;
90 return fail(fmt::format(
"Failed to initialize input: {}", name),
ret);
93 return fail(fmt::format(
"Failed to find matching parameters for: {}", name),
ret);
98 return fail(
"Failed to configure filter graph",
ret);
100 JAMI_DBG() <<
"Filter graph initialized with: " << desc_;
108 for (
const auto& ms : inputParams_)
117 for (
const auto& ms : inputParams_)
120 throw std::out_of_range(
"Input '" +
inputName +
"' not found");
127 if (!output_ || !initialized_) {
128 fail(
"Filter not initialized", -1);
134 output.name =
"videoOutput";
144 output.name =
"audioOutput";
163 return fail(
"Filter not initialized", -1);
168 for (
size_t i = 0;
i < inputs_.size(); ++
i) {
169 auto& ms = inputParams_[
i];
176 && (ms.sampleRate !=
frame->sample_rate
177 || ms.nbChannels !=
frame->ch_layout.nb_channels);
181 if ((
ret = reinitialize()) < 0)
182 return fail(
"Failed to reinitialize filter with new input parameters",
ret);
187 return fail(
"Unable to pass frame to filters",
ret);
194std::unique_ptr<MediaFrame>
198 fail(
"Not properly initialized", -1);
202 std::unique_ptr<MediaFrame>
frame;
206 frame = std::make_unique<libjami::VideoFrame>();
210 frame = std::make_unique<AudioFrame>();
221 JAMI_WARN() <<
"Filters have reached EOF, no more frames will be output";
223 fail(
"Error occurred while pulling from filter graph",
err);
231 for (
size_t i = 0;
i < inputs_.size(); ++
i) {
254 return fail(
"Failed to create buffer sink",
ret);
259 return fail(
"Unable to link buffer sink to graph",
ret);
292 snprintf(name,
sizeof(name),
"buffersrc_%s_%d",
in->name,
in->pad_idx);
297 return fail(
"Failed to allocate filter graph input",
AVERROR(
ENOMEM));
302 return fail(
"Failed to set filter graph input parameters",
ret);
305 return fail(
"Failed to initialize buffer source",
ret);
308 return fail(
"Failed to link buffer source to graph",
ret);
311 inputParams_.emplace_back(
msp);
312 inputParams_.back().name =
in->name;
317MediaFilter::reinitialize()
320 auto params = std::move(inputParams_);
321 auto desc = std::move(desc_);
325 JAMI_DBG() <<
"Filter graph reinitialized";
330MediaFilter::fail(std::string_view
msg,
int err)
const
340 initialized_ =
false;
345 inputParams_.clear();
std::string getError(int err)
void emitSignal(Args... args)