Skip to content

Commit b013d4c

Browse files
author
Clement Champetier
committed
FilterGraph: fixed process with several inputs
1 parent 3e85e31 commit b013d4c

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

src/AvTranscoder/filter/FilterGraph.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,24 +84,28 @@ Filter& FilterGraph::addFilter(const std::string& filterName, const std::string&
8484
void FilterGraph::init(const std::vector<Frame>& inputs, Frame& output)
8585
{
8686
// push filters to the graph
87-
pushInBuffer(inputs);
88-
for(size_t i = 1; i < _filters.size(); ++i)
87+
addInBuffer(inputs);
88+
addOutBuffer(output);
89+
for(size_t i = 0; i < _filters.size(); ++i)
8990
{
9091
pushFilter(*_filters.at(i));
9192
}
92-
pushOutBuffer(output);
9393

9494
// connect filters
9595
for(size_t index = 0; index < _filters.size() - 1; ++index)
9696
{
97-
size_t indexOfFilterToConnect = index + 1;
97+
size_t indexOfOutputFilterToConnect = index + 1;
98+
size_t indexOfInputPadOfDestinationFilter = 0;
9899
// handle cases with several inputs
99100
if(index < inputs.size())
100-
indexOfFilterToConnect = inputs.size();
101+
{
102+
indexOfOutputFilterToConnect = inputs.size();
103+
indexOfInputPadOfDestinationFilter = index;
104+
}
101105

102-
LOG_INFO("Connect filter " << _filters.at(index)->getName() << " to filter " << _filters.at(indexOfFilterToConnect)->getName())
106+
LOG_INFO("Connect filter " << _filters.at(index)->getName() << " to filter " << _filters.at(indexOfOutputFilterToConnect)->getName())
103107
const int err =
104-
avfilter_link(_filters.at(index)->getAVFilterContext(), 0, _filters.at(indexOfFilterToConnect)->getAVFilterContext(), 0);
108+
avfilter_link(_filters.at(index)->getAVFilterContext(), 0, _filters.at(indexOfOutputFilterToConnect)->getAVFilterContext(), indexOfInputPadOfDestinationFilter);
105109
if(err < 0)
106110
{
107111
throw std::runtime_error("Error when connecting filters.");
@@ -137,9 +141,9 @@ void FilterGraph::pushFilter(Filter& filter)
137141
}
138142
}
139143

140-
void FilterGraph::pushInBuffer(const std::vector<Frame>& inputs)
144+
void FilterGraph::addInBuffer(const std::vector<Frame>& inputs)
141145
{
142-
for(std::vector<Frame>::const_iterator it = inputs.begin(); it != inputs.end(); ++it)
146+
for(std::vector<Frame>::const_reverse_iterator it = inputs.rbegin(); it != inputs.rend(); ++it)
143147
{
144148
std::string filterName;
145149
std::stringstream filterOptions;
@@ -174,11 +178,10 @@ void FilterGraph::pushInBuffer(const std::vector<Frame>& inputs)
174178
Filter* in = new Filter(filterName, filterOptions.str(), "in");
175179
LOG_INFO("Add filter '" << filterName << "' at the beginning of the graph.")
176180
_filters.insert(_filters.begin(), in);
177-
pushFilter(*in);
178181
}
179182
}
180183

181-
void FilterGraph::pushOutBuffer(const Frame& output)
184+
void FilterGraph::addOutBuffer(const Frame& output)
182185
{
183186
std::string filterName;
184187

@@ -190,7 +193,6 @@ void FilterGraph::pushOutBuffer(const Frame& output)
190193
throw std::runtime_error("Cannot create output buffer of filter graph: the given frame is invalid.");
191194

192195
// add out buffer
193-
Filter& out = addFilter(filterName, "", "out");
194-
pushFilter(out);
196+
addFilter(filterName, "", "out");
195197
}
196198
}

src/AvTranscoder/filter/FilterGraph.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class AvExport FilterGraph
4545
* @param inputs: input data buffers (at least one).
4646
* @param output: output data buffer.
4747
* @note Do nothing if there was no filter added.
48-
* If there is one input buffer, the filter graph is a chain of effects: input -> filter 1 -> filter 2 -> output.
48+
* If there is one input buffer, the filter graph is a chain of effects: input -> filter 1 -> filter 2 -> output.
4949
* If there is several input buffers, the filter graph is like this:
5050
* input 1 ---|
5151
* |
@@ -75,9 +75,9 @@ class AvExport FilterGraph
7575
void pushFilter(Filter& filter);
7676

7777
///@{
78-
/// @brief Push the input and output buffer at the beginning and the end of the graph.
79-
void pushInBuffer(const std::vector<Frame>& inputs);
80-
void pushOutBuffer(const Frame& output);
78+
/// @brief Add the input and output buffers at the beginning and the end of the list of filters.
79+
void addInBuffer(const std::vector<Frame>& inputs);
80+
void addOutBuffer(const Frame& output);
8181
//@}
8282

8383
private:

0 commit comments

Comments
 (0)