@@ -84,24 +84,28 @@ Filter& FilterGraph::addFilter(const std::string& filterName, const std::string&
84
84
void FilterGraph::init (const std::vector<Frame>& inputs, Frame& output)
85
85
{
86
86
// 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)
89
90
{
90
91
pushFilter (*_filters.at (i));
91
92
}
92
- pushOutBuffer (output);
93
93
94
94
// connect filters
95
95
for (size_t index = 0 ; index < _filters.size () - 1 ; ++index)
96
96
{
97
- size_t indexOfFilterToConnect = index + 1 ;
97
+ size_t indexOfOutputFilterToConnect = index + 1 ;
98
+ size_t indexOfInputPadOfDestinationFilter = 0 ;
98
99
// handle cases with several inputs
99
100
if (index < inputs.size ())
100
- indexOfFilterToConnect = inputs.size ();
101
+ {
102
+ indexOfOutputFilterToConnect = inputs.size ();
103
+ indexOfInputPadOfDestinationFilter = index;
104
+ }
101
105
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 ())
103
107
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 );
105
109
if (err < 0 )
106
110
{
107
111
throw std::runtime_error (" Error when connecting filters." );
@@ -137,9 +141,9 @@ void FilterGraph::pushFilter(Filter& filter)
137
141
}
138
142
}
139
143
140
- void FilterGraph::pushInBuffer (const std::vector<Frame>& inputs)
144
+ void FilterGraph::addInBuffer (const std::vector<Frame>& inputs)
141
145
{
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)
143
147
{
144
148
std::string filterName;
145
149
std::stringstream filterOptions;
@@ -174,11 +178,10 @@ void FilterGraph::pushInBuffer(const std::vector<Frame>& inputs)
174
178
Filter* in = new Filter (filterName, filterOptions.str (), " in" );
175
179
LOG_INFO (" Add filter '" << filterName << " ' at the beginning of the graph." )
176
180
_filters.insert (_filters.begin (), in);
177
- pushFilter (*in);
178
181
}
179
182
}
180
183
181
- void FilterGraph::pushOutBuffer (const Frame& output)
184
+ void FilterGraph::addOutBuffer (const Frame& output)
182
185
{
183
186
std::string filterName;
184
187
@@ -190,7 +193,6 @@ void FilterGraph::pushOutBuffer(const Frame& output)
190
193
throw std::runtime_error (" Cannot create output buffer of filter graph: the given frame is invalid." );
191
194
192
195
// add out buffer
193
- Filter& out = addFilter (filterName, " " , " out" );
194
- pushFilter (out);
196
+ addFilter (filterName, " " , " out" );
195
197
}
196
198
}
0 commit comments