Skip to content

Commit 53eff1d

Browse files
author
Clement Champetier
committed
Video/Audio frames: refactor how to construct frames
Because the common case is to allocate the data at the same time as the frame itself, this commit adds a default parameter to the constructor of Video/Audio frames.
1 parent ebd558d commit 53eff1d

File tree

7 files changed

+17
-34
lines changed

7 files changed

+17
-34
lines changed

src/AvTranscoder/data/decoded/AudioFrame.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void AudioFrameDesc::setParameters(const ProfileLoader::Profile& profile)
3939
_sampleFormat = getAVSampleFormat(profile.find(constants::avProfileSampleFormat)->second.c_str());
4040
}
4141

42-
AudioFrame::AudioFrame(const AudioFrameDesc& desc)
42+
AudioFrame::AudioFrame(const AudioFrameDesc& desc, const bool forceDataAllocation)
4343
: Frame()
4444
, _desc(desc)
4545
{
@@ -49,6 +49,9 @@ AudioFrame::AudioFrame(const AudioFrameDesc& desc)
4949
av_frame_set_channel_layout(_frame, av_get_default_channel_layout(desc._nbChannels));
5050
_frame->format = desc._sampleFormat;
5151
_frame->nb_samples = desc._sampleRate / 25.; // cannot be known before calling avcodec_decode_audio4
52+
53+
if(forceDataAllocation)
54+
allocateData();
5255
}
5356

5457
std::string AudioFrame::getChannelLayoutDesc() const
@@ -87,9 +90,6 @@ size_t AudioFrame::getSize() const
8790

8891
void AudioFrame::allocateData()
8992
{
90-
if(_dataAllocated)
91-
return;
92-
9393
// Set Frame properties
9494
av_frame_set_sample_rate(_frame, _desc._sampleRate);
9595
av_frame_set_channels(_frame, _desc._nbChannels);

src/AvTranscoder/data/decoded/AudioFrame.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct AvExport AudioFrameDesc
3636
class AvExport AudioFrame : public Frame
3737
{
3838
public:
39-
AudioFrame(const AudioFrameDesc& desc);
39+
AudioFrame(const AudioFrameDesc& desc, const bool forceDataAllocation = true);
4040
~AudioFrame();
4141

4242
/**

src/AvTranscoder/data/decoded/VideoFrame.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,16 @@ void VideoFrameDesc::setParameters(const ProfileLoader::Profile& profile)
4545
_fps = atof(profile.find(constants::avProfileFrameRate)->second.c_str());
4646
}
4747

48-
VideoFrame::VideoFrame(const VideoFrameDesc& desc)
48+
VideoFrame::VideoFrame(const VideoFrameDesc& desc, const bool forceDataAllocation)
4949
: Frame()
5050
, _desc(desc)
5151
{
5252
_frame->width = desc._width;
5353
_frame->height = desc._height;
5454
_frame->format = desc._pixelFormat;
55+
56+
if(forceDataAllocation)
57+
allocateData();
5558
}
5659

5760
VideoFrame::~VideoFrame()
@@ -76,9 +79,6 @@ size_t VideoFrame::getSize() const
7679

7780
void VideoFrame::allocateData()
7881
{
79-
if(_dataAllocated)
80-
return;
81-
8282
// Set Frame properties
8383
_frame->width = _desc._width;
8484
_frame->height = _desc._height;

src/AvTranscoder/data/decoded/VideoFrame.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ struct AvExport VideoFrameDesc
4343
class AvExport VideoFrame : public Frame
4444
{
4545
public:
46-
VideoFrame(const VideoFrameDesc& desc);
46+
VideoFrame(const VideoFrameDesc& desc, const bool forceDataAllocation = true);
4747
~VideoFrame();
4848

4949
/**

src/AvTranscoder/decoder/AudioDecoder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ bool AudioDecoder::decodeNextFrame(Frame& frameBuffer, const std::vector<size_t>
133133

134134
// else decode all data in an intermediate buffer
135135
AudioFrame& audioBuffer = static_cast<AudioFrame&>(frameBuffer);
136-
AudioFrame allDataOfNextFrame(AudioFrameDesc(audioBuffer.getSampleRate(), srcNbChannels, audioBuffer.getSampleFormat()));
136+
AudioFrame allDataOfNextFrame(AudioFrameDesc(audioBuffer.getSampleRate(), srcNbChannels, audioBuffer.getSampleFormat()), false);
137137
if(!decodeNextFrame(allDataOfNextFrame))
138138
return false;
139139

src/AvTranscoder/decoder/AudioGenerator.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ bool AudioGenerator::decodeNextFrame(Frame& frameBuffer)
2828
if(!_silent)
2929
{
3030
_silent = new AudioFrame(_frameDesc);
31-
_silent->allocateData();
3231

3332
std::stringstream msg;
3433
msg << "Generate a silence with the following features:" << std::endl;

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,9 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
5757
_generators.push_back(new VideoGenerator(inputFrameDesc));
5858

5959
// buffers to process
60-
_decodedData.push_back(new VideoFrame(inputFrameDesc));
60+
_decodedData.push_back(new VideoFrame(inputFrameDesc, false));
6161
_filteredData = new VideoFrame(inputFrameDesc);
62-
_filteredData->allocateData();
6362
_transformedData = new VideoFrame(inputFrameDesc);
64-
_transformedData->allocateData();
6563

6664
// transform
6765
_transform = new VideoTransform();
@@ -95,11 +93,9 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
9593
_generators.push_back(new AudioGenerator(inputFrameDesc));
9694

9795
// buffers to process
98-
_decodedData.push_back(new AudioFrame(inputFrameDesc));
96+
_decodedData.push_back(new AudioFrame(inputFrameDesc, false));
9997
_filteredData = new AudioFrame(inputFrameDesc);
100-
_filteredData->allocateData();
10198
_transformedData = new AudioFrame(inputFrameDesc);
102-
_transformedData->allocateData();
10399

104100
// transform
105101
_transform = new AudioTransform();
@@ -179,9 +175,7 @@ StreamTranscoder::StreamTranscoder(const std::vector<InputStreamDesc>& inputStre
179175

180176
// buffers to process
181177
_filteredData = new VideoFrame(outputVideo->getVideoCodec().getVideoFrameDesc());
182-
_filteredData->allocateData();
183178
_transformedData = new VideoFrame(outputVideo->getVideoCodec().getVideoFrameDesc());
184-
_transformedData->allocateData();
185179

186180
// transform
187181
_transform = new VideoTransform();
@@ -219,9 +213,7 @@ StreamTranscoder::StreamTranscoder(const std::vector<InputStreamDesc>& inputStre
219213
inputFrameDesc._nbChannels = nbOutputChannels;
220214

221215
_filteredData = new AudioFrame(inputFrameDesc);
222-
_filteredData->allocateData();
223216
_transformedData = new AudioFrame(outputAudio->getAudioCodec().getAudioFrameDesc());
224-
_transformedData->allocateData();
225217

226218
// transform
227219
_transform = new AudioTransform();
@@ -251,7 +243,7 @@ void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInput
251243
_currentDecoder = inputVideo;
252244

253245
// buffers to get the decoded data
254-
VideoFrame* inputFrame = new VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc());
246+
VideoFrame* inputFrame = new VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc(), false);
255247
_decodedData.push_back(inputFrame);
256248

257249
// generator decoder
@@ -271,7 +263,7 @@ void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInput
271263
AudioFrameDesc inputFrameDesc(inputStream.getAudioCodec().getAudioFrameDesc());
272264
if(inputStreamDesc.demultiplexing())
273265
inputFrameDesc._nbChannels = inputStreamDesc._channelIndexArray.size();
274-
_decodedData.push_back(new AudioFrame(inputFrameDesc));
266+
_decodedData.push_back(new AudioFrame(inputFrameDesc, false));
275267

276268
// generator decoder
277269
_generators.push_back(new AudioGenerator(inputFrameDesc));
@@ -320,13 +312,9 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
320312
// buffers to process
321313
VideoFrameDesc outputFrameDesc = inputFrameDesc;
322314
outputFrameDesc.setParameters(profile);
323-
VideoFrame* decodedData = new VideoFrame(inputFrameDesc);
324-
decodedData->allocateData();
325-
_decodedData.push_back(decodedData);
315+
_decodedData.push_back(new VideoFrame(inputFrameDesc));
326316
_filteredData = new VideoFrame(inputFrameDesc);
327-
_filteredData->allocateData();
328317
_transformedData = new VideoFrame(outputFrameDesc);
329-
_transformedData->allocateData();
330318

331319
// transform
332320
_transform = new VideoTransform();
@@ -357,13 +345,9 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
357345
// buffers to process
358346
AudioFrameDesc outputFrameDesc = inputFrameDesc;
359347
outputFrameDesc.setParameters(profile);
360-
AudioFrame* decodedData = new AudioFrame(inputFrameDesc);
361-
decodedData->allocateData();
362-
_decodedData.push_back(decodedData);
348+
_decodedData.push_back(new AudioFrame(inputFrameDesc));
363349
_filteredData = new AudioFrame(inputFrameDesc);
364-
_filteredData->allocateData();
365350
_transformedData = new AudioFrame(outputFrameDesc);
366-
_transformedData->allocateData();
367351

368352
// transform
369353
_transform = new AudioTransform();

0 commit comments

Comments
 (0)