Skip to content

Commit f506f18

Browse files
author
Clement Champetier
committed
StreamTranscoder: updated buffer attributes
* Need pointers here to be able to use polymorphism. * Updated FilterGraph parameters to launch a process. * Almost a revert of commit ecd3ddd
1 parent 966d949 commit f506f18

File tree

4 files changed

+57
-50
lines changed

4 files changed

+57
-50
lines changed

src/AvTranscoder/filter/FilterGraph.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ FilterGraph::~FilterGraph()
3535
avfilter_graph_free(&_graph);
3636
}
3737

38-
void FilterGraph::process(const std::vector<Frame>& inputs, Frame& output)
38+
void FilterGraph::process(const std::vector<Frame*>& inputs, Frame& output)
3939
{
4040
if(!hasFilters())
4141
{
4242
LOG_DEBUG("No filter to process: reference first input frame to the given output.")
43-
output.refFrame(inputs.at(0));
43+
output.refFrame(*inputs.at(0));
4444
return;
4545
}
4646

@@ -51,7 +51,7 @@ void FilterGraph::process(const std::vector<Frame>& inputs, Frame& output)
5151
// setup input frames
5252
for(size_t index = 0; index < inputs.size(); ++index)
5353
{
54-
const int ret = av_buffersrc_write_frame(_filters.at(index)->getAVFilterContext(), &inputs.at(index).getAVFrame());
54+
const int ret = av_buffersrc_write_frame(_filters.at(index)->getAVFilterContext(), &inputs.at(index)->getAVFrame());
5555
if(ret < 0)
5656
{
5757
throw std::runtime_error("Error when adding a frame to the source buffer used to start to process filters: " +
@@ -81,7 +81,7 @@ Filter& FilterGraph::addFilter(const std::string& filterName, const std::string&
8181
return *_filters.back();
8282
}
8383

84-
void FilterGraph::init(const std::vector<Frame>& inputs, Frame& output)
84+
void FilterGraph::init(const std::vector<Frame*>& inputs, Frame& output)
8585
{
8686
// push filters to the graph
8787
addInBuffer(inputs);
@@ -141,30 +141,30 @@ void FilterGraph::pushFilter(Filter& filter)
141141
}
142142
}
143143

144-
void FilterGraph::addInBuffer(const std::vector<Frame>& inputs)
144+
void FilterGraph::addInBuffer(const std::vector<Frame*>& inputs)
145145
{
146-
for(std::vector<Frame>::const_reverse_iterator it = inputs.rbegin(); it != inputs.rend(); ++it)
146+
for(std::vector<Frame*>::const_reverse_iterator it = inputs.rbegin(); it != inputs.rend(); ++it)
147147
{
148148
std::string filterName;
149149
std::stringstream filterOptions;
150150
// audio frame
151-
if(it->isAudioFrame())
151+
if((*it)->isAudioFrame())
152152
{
153153
filterName = "abuffer";
154-
const AudioFrame& audioFrame = dynamic_cast<const AudioFrame&>(*it);
154+
const AudioFrame* audioFrame = dynamic_cast<const AudioFrame*>(*it);
155155
filterOptions << "time_base=" << _codec.getAVCodecContext().time_base.num << "/"
156156
<< _codec.getAVCodecContext().time_base.den << ":";
157-
filterOptions << "sample_rate=" << audioFrame.getSampleRate() << ":";
158-
filterOptions << "sample_fmt=" << getSampleFormatName(audioFrame.getSampleFormat()) << ":";
159-
filterOptions << "channel_layout=0x" << std::hex << audioFrame.getChannelLayout();
157+
filterOptions << "sample_rate=" << audioFrame->getSampleRate() << ":";
158+
filterOptions << "sample_fmt=" << getSampleFormatName(audioFrame->getSampleFormat()) << ":";
159+
filterOptions << "channel_layout=0x" << std::hex << audioFrame->getChannelLayout();
160160
}
161161
// video frame
162-
else if(it->isVideoFrame())
162+
else if((*it)->isVideoFrame())
163163
{
164164
filterName = "buffer";
165-
const VideoFrame& videoFrame = dynamic_cast<const VideoFrame&>(*it);
166-
filterOptions << "video_size=" << videoFrame.getWidth() << "x" << videoFrame.getHeight() << ":";
167-
filterOptions << "pix_fmt=" << getPixelFormatName(videoFrame.getPixelFormat()) << ":";
165+
const VideoFrame* videoFrame = dynamic_cast<const VideoFrame*>(*it);
166+
filterOptions << "video_size=" << videoFrame->getWidth() << "x" << videoFrame->getHeight() << ":";
167+
filterOptions << "pix_fmt=" << getPixelFormatName(videoFrame->getPixelFormat()) << ":";
168168
filterOptions << "time_base=" << _codec.getAVCodecContext().time_base.num << "/"
169169
<< _codec.getAVCodecContext().time_base.den << ":";
170170
filterOptions << "pixel_aspect=" << _codec.getAVCodecContext().sample_aspect_ratio.num << "/"

src/AvTranscoder/filter/FilterGraph.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class AvExport FilterGraph
5353
* |
5454
* input 2 ---|
5555
*/
56-
void process(const std::vector<Frame>& inputs, Frame& output);
56+
void process(const std::vector<Frame*>& inputs, Frame& output);
5757

5858
private:
5959
/**
@@ -67,7 +67,7 @@ class AvExport FilterGraph
6767
* @see pushInBuffer
6868
* @see pushOutBuffer
6969
*/
70-
void init(const std::vector<Frame>& inputs, Frame& output);
70+
void init(const std::vector<Frame*>& inputs, Frame& output);
7171

7272
/**
7373
* @brief Push the given Filter to the graph.
@@ -76,7 +76,7 @@ class AvExport FilterGraph
7676

7777
///@{
7878
/// @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);
79+
void addInBuffer(const std::vector<Frame*>& inputs);
8080
void addOutBuffer(const Frame& output);
8181
//@}
8282

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
2424
, _inputStreams()
2525
, _outputStream(NULL)
2626
, _decodedData()
27-
, _filteredData()
28-
, _transformedData()
27+
, _filteredData(NULL)
28+
, _transformedData(NULL)
2929
, _inputDecoders()
3030
, _generators()
3131
, _currentDecoder(NULL)
@@ -56,9 +56,9 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
5656
_generators.push_back(new VideoGenerator());
5757

5858
// buffers to process
59-
_decodedData.push_back(VideoFrame(inputFrameDesc));
60-
_filteredData = VideoFrame(inputFrameDesc);
61-
_transformedData = VideoFrame(inputFrameDesc);
59+
_decodedData.push_back(new VideoFrame(inputFrameDesc));
60+
_filteredData = new VideoFrame(inputFrameDesc);
61+
_transformedData = new VideoFrame(inputFrameDesc);
6262

6363
// transform
6464
_transform = new VideoTransform();
@@ -92,9 +92,9 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
9292
_generators.push_back(new AudioGenerator());
9393

9494
// buffers to process
95-
_decodedData.push_back(AudioFrame(inputFrameDesc));
96-
_filteredData = AudioFrame(inputFrameDesc);
97-
_transformedData = AudioFrame(inputFrameDesc);
95+
_decodedData.push_back(new AudioFrame(inputFrameDesc));
96+
_filteredData = new AudioFrame(inputFrameDesc);
97+
_transformedData = new AudioFrame(inputFrameDesc);
9898

9999
// transform
100100
_transform = new AudioTransform();
@@ -131,8 +131,8 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
131131
, _inputStreams()
132132
, _outputStream(NULL)
133133
, _decodedData()
134-
, _filteredData()
135-
, _transformedData()
134+
, _filteredData(NULL)
135+
, _transformedData(NULL)
136136
, _inputDecoders()
137137
, _generators()
138138
, _currentDecoder(NULL)
@@ -167,8 +167,8 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
167167
_outputStream = &outputFile.addVideoStream(outputVideo->getVideoCodec());
168168

169169
// buffers to process
170-
_filteredData = VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc());
171-
_transformedData = VideoFrame(outputVideo->getVideoCodec().getVideoFrameDesc());
170+
_filteredData = new VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc());
171+
_transformedData = new VideoFrame(outputVideo->getVideoCodec().getVideoFrameDesc());
172172

173173
// transform
174174
_transform = new VideoTransform();
@@ -198,8 +198,8 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
198198
if(inputStreamDesc.demultiplexing())
199199
inputFrameDesc._nbChannels = inputStreamDesc._channelIndexArray.size();
200200

201-
_filteredData = AudioFrame(inputFrameDesc);
202-
_transformedData = AudioFrame(outputAudio->getAudioCodec().getAudioFrameDesc());
201+
_filteredData = new AudioFrame(inputFrameDesc);
202+
_transformedData = new AudioFrame(outputAudio->getAudioCodec().getAudioFrameDesc());
203203

204204
// transform
205205
_transform = new AudioTransform();
@@ -232,7 +232,7 @@ void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInput
232232
_generators.push_back(new VideoGenerator());
233233

234234
// buffers to process
235-
_decodedData.push_back(VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc()));
235+
_decodedData.push_back(new VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc()));
236236

237237
break;
238238
}
@@ -252,7 +252,7 @@ void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInput
252252
if(inputStreamDesc.demultiplexing())
253253
inputFrameDesc._nbChannels = inputStreamDesc._channelIndexArray.size();
254254

255-
_decodedData.push_back(AudioFrame(inputFrameDesc));
255+
_decodedData.push_back(new AudioFrame(inputFrameDesc));
256256

257257
break;
258258
}
@@ -269,8 +269,8 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
269269
, _inputStreams()
270270
, _outputStream(NULL)
271271
, _decodedData()
272-
, _filteredData()
273-
, _transformedData()
272+
, _filteredData(NULL)
273+
, _transformedData(NULL)
274274
, _inputDecoders()
275275
, _generators()
276276
, _currentDecoder(NULL)
@@ -298,9 +298,9 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
298298
// buffers to process
299299
VideoFrameDesc outputFrameDesc = inputFrameDesc;
300300
outputFrameDesc.setParameters(profile);
301-
_decodedData.push_back(VideoFrame(inputFrameDesc));
302-
_filteredData = VideoFrame(inputFrameDesc);
303-
_transformedData = VideoFrame(outputFrameDesc);
301+
_decodedData.push_back(new VideoFrame(inputFrameDesc));
302+
_filteredData = new VideoFrame(inputFrameDesc);
303+
_transformedData = new VideoFrame(outputFrameDesc);
304304

305305
// transform
306306
_transform = new VideoTransform();
@@ -331,9 +331,9 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
331331
// buffers to process
332332
AudioFrameDesc outputFrameDesc = inputFrameDesc;
333333
outputFrameDesc.setParameters(profile);
334-
_decodedData.push_back(AudioFrame(inputFrameDesc));
335-
_filteredData = AudioFrame(inputFrameDesc);
336-
_transformedData = AudioFrame(outputFrameDesc);
334+
_decodedData.push_back(new AudioFrame(inputFrameDesc));
335+
_filteredData = new AudioFrame(inputFrameDesc);
336+
_transformedData = new AudioFrame(outputFrameDesc);
337337

338338
// transform
339339
_transform = new AudioTransform();
@@ -354,6 +354,13 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
354354

355355
StreamTranscoder::~StreamTranscoder()
356356
{
357+
for(std::vector<Frame*>::iterator it = _decodedData.begin(); it != _decodedData.end(); ++it)
358+
{
359+
delete(*it);
360+
}
361+
delete _filteredData;
362+
delete _transformedData;
363+
357364
for(std::vector<IDecoder*>::iterator it = _inputDecoders.begin(); it != _inputDecoders.end(); ++it)
358365
{
359366
delete(*it);
@@ -510,22 +517,22 @@ bool StreamTranscoder::processTranscode()
510517
for(size_t index = 0; index < _inputDecoders.size(); ++index)
511518
{
512519
if(! _inputStreamDesc.empty() && _inputStreamDesc.at(index).demultiplexing())
513-
decodingStatus = decodingStatus && _currentDecoder->decodeNextFrame(_decodedData.at(index), _inputStreamDesc.at(index)._channelIndexArray);
520+
decodingStatus = decodingStatus && _currentDecoder->decodeNextFrame(*_decodedData.at(index), _inputStreamDesc.at(index)._channelIndexArray);
514521
else
515-
decodingStatus = decodingStatus && _currentDecoder->decodeNextFrame(_decodedData.at(index));
522+
decodingStatus = decodingStatus && _currentDecoder->decodeNextFrame(*_decodedData.at(index));
516523
}
517524

518525
CodedData data;
519526
if(decodingStatus)
520527
{
521528
LOG_DEBUG("Filtering")
522-
_filterGraph->process(_decodedData, _filteredData);
529+
_filterGraph->process(_decodedData, *_filteredData);
523530

524531
LOG_DEBUG("Convert")
525-
_transform->convert(_filteredData, _transformedData);
532+
_transform->convert(*_filteredData, *_transformedData);
526533

527534
LOG_DEBUG("Encode")
528-
_outputEncoder->encodeFrame(_transformedData, data);
535+
_outputEncoder->encodeFrame(*_transformedData, data);
529536
}
530537
else
531538
{

src/AvTranscoder/transcoder/StreamTranscoder.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ class AvExport StreamTranscoder
133133
std::vector<IInputStream*> _inputStreams; ///< List of input stream to read next packet (has link, no ownership)
134134
IOutputStream* _outputStream; ///< Output stream to wrap next packet (has link, no ownership)
135135

136-
std::vector<Frame> _decodedData; ///< List of buffers of decoded data.
137-
Frame _filteredData; ///< Buffer of filtered data.
138-
Frame _transformedData; ///< Buffer of transformed data.
136+
std::vector<Frame*> _decodedData; ///< List of buffers of decoded data (has ownership).
137+
Frame* _filteredData; ///< Buffer of filtered data (has ownership).
138+
Frame* _transformedData; ///< Buffer of transformed data (has ownership).
139139

140140
std::vector<IDecoder*> _inputDecoders; ///< Decoders of packets read from _inputStream (has ownership)
141141
std::vector<IDecoder*> _generators; ///< Generators of audio or video packets (has ownership)

0 commit comments

Comments
 (0)