Skip to content

Commit 06b8b45

Browse files
author
Valentin NOEL
committed
FilterGraph: renames FrameBuffer to AudioFrameBuffer
Since video frames cannot be split, this filter graph buffers will be specialized to audio frames.
1 parent cbd4700 commit 06b8b45

File tree

2 files changed

+38
-30
lines changed

2 files changed

+38
-30
lines changed

src/AvTranscoder/filter/FilterGraph.cpp

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,25 @@ namespace avtranscoder
1818

1919
/******************
2020
21-
FrameBuffer
21+
AudioFramebuffer
2222
2323
******************/
2424

25-
FrameBuffer::FrameBuffer(const AudioFrameDesc& audioFrameDesc)
25+
AudioFramebuffer::AudioFramebuffer(const AudioFrameDesc& audioFrameDesc)
2626
: _audioFrameDesc(audioFrameDesc)
2727
, _frameQueue()
2828
, _totalDataSize(0)
2929
, _positionInFrontFrame(0)
3030
{
3131
}
3232

33-
FrameBuffer::~FrameBuffer()
33+
AudioFramebuffer::~AudioFramebuffer()
3434
{
3535
for(size_t i = 0; i < _frameQueue.size(); ++i)
3636
popFrame();
3737
}
3838

39-
void FrameBuffer::addFrame(IFrame* frame)
39+
void AudioFramebuffer::addFrame(IFrame* frame)
4040
{
4141
LOG_DEBUG("Add a new " << frame->getDataSize() << " bytes frame to frame buffer. New buffer size: " << _frameQueue.size() + 1);
4242
// Copy the input frame to store it into the queue
@@ -50,13 +50,13 @@ void FrameBuffer::addFrame(IFrame* frame)
5050
_frameQueue.push(newAudioFrame);
5151
}
5252

53-
void FrameBuffer::popFrame()
53+
void AudioFramebuffer::popFrame()
5454
{
5555
_frameQueue.pop();
5656
LOG_DEBUG("Pop frame from buffer. Remaining frames in buffer: " << _frameQueue.size());
5757
}
5858

59-
IFrame* FrameBuffer::getFrame(const size_t size)
59+
IFrame* AudioFramebuffer::getFrame(const size_t size)
6060
{
6161
LOG_DEBUG("Get a " << size << " bytes frame from a " << _totalDataSize << " bytes frame buffer");
6262
IFrame* next = _frameQueue.front();
@@ -133,7 +133,7 @@ FilterGraph::FilterGraph(const ICodec& codec)
133133

134134
FilterGraph::~FilterGraph()
135135
{
136-
_inputFramesBuffer.clear();
136+
_inputAudioFramesBuffer.clear();
137137
for(std::vector<Filter*>::iterator it = _filters.begin(); it < _filters.end(); ++it)
138138
{
139139
delete(*it);
@@ -145,7 +145,7 @@ size_t FilterGraph::getAvailableFrameSize(const std::vector<IFrame*>& inputs, co
145145
{
146146
size_t frameSize = inputs.at(index)->getDataSize();
147147
if(frameSize == 0)
148-
frameSize = _inputFramesBuffer.at(index).getDataSize();
148+
frameSize = _inputAudioFramesBuffer.at(index).getDataSize();
149149
return frameSize;
150150
}
151151

@@ -166,10 +166,10 @@ size_t FilterGraph::getMinInputFrameSize(const std::vector<IFrame*>& inputs)
166166

167167
bool FilterGraph::hasBufferedFrames()
168168
{
169-
if(!_inputFramesBuffer.size())
169+
if(!_inputAudioFramesBuffer.size())
170170
return false;
171171

172-
for(std::vector<FrameBuffer>::iterator it = _inputFramesBuffer.begin(); it != _inputFramesBuffer.end(); ++it)
172+
for(std::vector<AudioFramebuffer>::iterator it = _inputAudioFramesBuffer.begin(); it != _inputAudioFramesBuffer.end(); ++it)
173173
{
174174
if(it->isEmpty())
175175
return false;
@@ -179,13 +179,20 @@ bool FilterGraph::hasBufferedFrames()
179179

180180
bool FilterGraph::hasBufferedFrames(const size_t index)
181181
{
182-
if(index >= _inputFramesBuffer.size())
182+
if(index >= _inputAudioFramesBuffer.size())
183183
return false;
184184

185-
return !_inputFramesBuffer.at(index).isEmpty();
185+
return !_inputAudioFramesBuffer.at(index).isEmpty();
186186
}
187187

188-
bool FilterGraph::areInputFrameSizeEqual(const std::vector<IFrame*>& inputs)
188+
bool FilterGraph::areInputAudioFrames(const std::vector<IFrame*>& inputs)
189+
{
190+
if(!inputs.size())
191+
return false;
192+
return typeid(*(inputs.at(0))) == typeid(AudioFrame);
193+
}
194+
195+
bool FilterGraph::areInputFrameSizesEqual(const std::vector<IFrame*>& inputs)
189196
{
190197
if(!inputs.size() || inputs.size() == 1)
191198
return true;
@@ -201,10 +208,10 @@ bool FilterGraph::areInputFrameSizeEqual(const std::vector<IFrame*>& inputs)
201208

202209
bool FilterGraph::areFrameBuffersEmpty()
203210
{
204-
if(!_inputFramesBuffer.size())
211+
if(!_inputAudioFramesBuffer.size())
205212
return true;
206213

207-
for(std::vector<FrameBuffer>::iterator it = _inputFramesBuffer.begin(); it != _inputFramesBuffer.end(); ++it)
214+
for(std::vector<AudioFramebuffer>::iterator it = _inputAudioFramesBuffer.begin(); it != _inputAudioFramesBuffer.end(); ++it)
208215
{
209216
if(!it->isEmpty())
210217
return false;
@@ -218,8 +225,8 @@ void FilterGraph::process(const std::vector<IFrame*>& inputs, IFrame& output)
218225
if(!_isInit)
219226
init(inputs, output);
220227

221-
// Check whether we can bypass the input buffers
222-
const bool bypassBuffers = areInputFrameSizeEqual(inputs) && areFrameBuffersEmpty();
228+
// Check whether we can bypass the input audio buffers
229+
const bool bypassBuffers = !areInputAudioFrames(inputs) || (areInputFrameSizesEqual(inputs) && areFrameBuffersEmpty());
223230
size_t minInputFrameSize = 0;
224231

225232
if(!bypassBuffers)
@@ -229,10 +236,10 @@ void FilterGraph::process(const std::vector<IFrame*>& inputs, IFrame& output)
229236
{
230237
if(!inputs.at(index)->getDataSize())
231238
{
232-
LOG_DEBUG("Empty frame from filter graph input " << index << ". Remaining frames in buffer: " << _inputFramesBuffer.at(index).getBufferSize());
239+
LOG_DEBUG("Empty frame from filter graph input " << index << ". Remaining audio frames in buffer: " << _inputAudioFramesBuffer.at(index).getBufferSize());
233240
continue;
234241
}
235-
_inputFramesBuffer.at(index).addFrame(inputs.at(index));
242+
_inputAudioFramesBuffer.at(index).addFrame(inputs.at(index));
236243
}
237244

238245
// Get the minimum input frames size
@@ -244,7 +251,7 @@ void FilterGraph::process(const std::vector<IFrame*>& inputs, IFrame& output)
244251
for(size_t index = 0; index < inputs.size(); ++index)
245252
{
246253
// Retrieve frame from buffer or directly from input
247-
IFrame* inputFrame = (bypassBuffers)? inputs.at(index) : _inputFramesBuffer.at(index).getFrame(minInputFrameSize);
254+
IFrame* inputFrame = (bypassBuffers)? inputs.at(index) : _inputAudioFramesBuffer.at(index).getFrame(minInputFrameSize);
248255
const int ret = av_buffersrc_add_frame_flags(_filters.at(index)->getAVFilterContext(), &inputFrame->getAVFrame(), AV_BUFFERSRC_FLAG_PUSH);
249256

250257
if(ret < 0)
@@ -356,7 +363,7 @@ void FilterGraph::addInBuffer(const std::vector<IFrame*>& inputs)
356363
const AudioFrameDesc audioFrameDesc(audioFrame->getSampleRate(),
357364
audioFrame->getNbChannels(),
358365
getSampleFormatName(audioFrame->getSampleFormat()));
359-
_inputFramesBuffer.push_back(FrameBuffer(audioFrameDesc));
366+
_inputAudioFramesBuffer.push_back(AudioFramebuffer(audioFrameDesc));
360367
}
361368
// video frame
362369
else if((*it)->isVideoFrame())

src/AvTranscoder/filter/FilterGraph.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ namespace avtranscoder
1616
{
1717

1818
/**
19-
* @brief Filter graph input frame buffer.
20-
* This FIFO buffer contains IFrame pointers and can deliver specific size frames.
21-
*
22-
* @todo Only for audio frame, for the moment. Make it usable with video frames.
19+
* @brief Filter graph input audio frame buffer.
20+
* This FIFO buffer contains IFrame pointers and can deliver specific size audio frames.
21+
* It makes no sense to use such buffers for video, since video frames are spatially consistent,
22+
* so can not be divided nor concatenated.
2323
**/
24-
class FrameBuffer
24+
class AudioFramebuffer
2525
{
2626
public:
27-
FrameBuffer(const AudioFrameDesc& audioFrameDesc);
28-
~FrameBuffer();
27+
AudioFramebuffer(const AudioFrameDesc& audioFrameDesc);
28+
~AudioFramebuffer();
2929

3030
/**
3131
* @brief Return whether the buffer is empty or not.
@@ -143,15 +143,16 @@ class AvExport FilterGraph
143143
*/
144144
size_t getMinInputFrameSize(const std::vector<IFrame*>& inputs);
145145

146-
bool areInputFrameSizeEqual(const std::vector<IFrame*>& inputs);
146+
bool areInputAudioFrames(const std::vector<IFrame*>& inputs);
147+
bool areInputFrameSizesEqual(const std::vector<IFrame*>& inputs);
147148
bool areFrameBuffersEmpty();
148149

149150
private:
150151
AVFilterGraph* _graph; ///< The graph which holds the filters.
151152
std::vector<Filter*> _filters; ///< List of filters to process.
152153
const ICodec& _codec; ///< Codec of the stream on which the filters will be applied.
153154

154-
std::vector<FrameBuffer> _inputFramesBuffer;
155+
std::vector<AudioFramebuffer> _inputAudioFramesBuffer;
155156

156157
/**
157158
* @brief Is the FilterGraph initialized.

0 commit comments

Comments
 (0)