Skip to content

Commit 24f820f

Browse files
author
Clement Champetier
committed
generators: added FrameDesc parameter in constructor
* Need to have a description of the given frame buffer when decoding, because the buffer could be invalid (clear at the end of decoding of an other stream). This attribute could be seen as a backup. * Almost a revert of commits 935ed64 and 924bf5b.
1 parent 7a8bed3 commit 24f820f

File tree

7 files changed

+53
-42
lines changed

7 files changed

+53
-42
lines changed

src/AvTranscoder/decoder/AudioGenerator.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
#include <AvTranscoder/util.hpp>
44

55
#include <sstream>
6-
#include <stdexcept>
76

87
namespace avtranscoder
98
{
109

11-
AudioGenerator::AudioGenerator()
10+
AudioGenerator::AudioGenerator(const AudioFrameDesc& frameDesc)
1211
: _inputFrame(NULL)
1312
, _silent(NULL)
13+
, _frameDesc(frameDesc)
1414
{
1515
}
1616

@@ -23,7 +23,11 @@ bool AudioGenerator::decodeNextFrame(Frame& frameBuffer)
2323
{
2424
// check the given frame
2525
if(! frameBuffer.isAudioFrame())
26-
throw std::runtime_error("The given frame is not a valid audio frame: allocate a new AVSample to put generated data into it.");
26+
{
27+
LOG_WARN("The given frame to put data is not a valid audio frame: try to reallocate it.")
28+
frameBuffer.clear();
29+
static_cast<AudioFrame&>(frameBuffer).allocateAVSample(_frameDesc);
30+
}
2731

2832
// Check channel layout of the given frame to be able to copy audio data to it.
2933
// @see Frame.copyData method
@@ -41,8 +45,7 @@ bool AudioGenerator::decodeNextFrame(Frame& frameBuffer)
4145
// Generate the silent only once
4246
if(!_silent)
4347
{
44-
AudioFrame& audioBuffer = static_cast<AudioFrame&>(frameBuffer);
45-
_silent = new AudioFrame(audioBuffer.desc());
48+
_silent = new AudioFrame(_frameDesc);
4649

4750
std::stringstream msg;
4851
msg << "Generate a silence with the following features:" << std::endl;

src/AvTranscoder/decoder/AudioGenerator.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class AvExport AudioGenerator : public IDecoder
1414
AudioGenerator(const AudioGenerator& audioGenerator);
1515

1616
public:
17-
AudioGenerator();
17+
AudioGenerator(const AudioFrameDesc& frameDesc);
1818

1919
~AudioGenerator();
2020

@@ -26,6 +26,7 @@ class AvExport AudioGenerator : public IDecoder
2626
private:
2727
Frame* _inputFrame; ///< Has link (no ownership)
2828
AudioFrame* _silent; ///< The generated silent (has ownership)
29+
const AudioFrameDesc _frameDesc; ///< The description of the given frame buffer when decoding.
2930
};
3031
}
3132

src/AvTranscoder/decoder/VideoGenerator.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
#include <AvTranscoder/util.hpp>
44

55
#include <sstream>
6-
#include <stdexcept>
76

87
namespace avtranscoder
98
{
109

11-
VideoGenerator::VideoGenerator()
10+
VideoGenerator::VideoGenerator(const VideoFrameDesc& frameDesc)
1211
: _inputFrame(NULL)
1312
, _blackImage(NULL)
13+
, _frameDesc(frameDesc)
1414
, _videoTransform()
1515
{
1616
}
@@ -24,25 +24,31 @@ bool VideoGenerator::decodeNextFrame(Frame& frameBuffer)
2424
{
2525
// check the given frame
2626
if(! frameBuffer.isVideoFrame())
27-
throw std::runtime_error("The given frame is not a valid video frame: allocate a new AVPicture to put generated data into it.");
27+
{
28+
LOG_WARN("The given frame to put data is not a valid video frame: try to reallocate it.")
29+
frameBuffer.clear();
30+
static_cast<VideoFrame&>(frameBuffer).allocateAVPicture(_frameDesc);
31+
}
2832

2933
// Generate black image
3034
if(!_inputFrame)
3135
{
3236
// Generate the black image only once
3337
if(!_blackImage)
3438
{
39+
// Create the black RGB image
40+
VideoFrameDesc blackDesc(_frameDesc._width, _frameDesc._height, "rgb24");
41+
_blackImage = new VideoFrame(blackDesc);
42+
const unsigned char fillChar = 0;
43+
_blackImage->assign(fillChar);
44+
3545
std::stringstream msg;
3646
msg << "Generate a black image with the following features:" << std::endl;
37-
msg << "width = " << frameBuffer.getAVFrame().width << std::endl;
38-
msg << "height = " << frameBuffer.getAVFrame().height << std::endl;
39-
msg << "pixel format = rgb24" << std::endl;
47+
msg << "width = " << _blackImage->getWidth() << std::endl;
48+
msg << "height = " << _blackImage->getHeight() << std::endl;
49+
msg << "pixel format = " << getPixelFormatName(_blackImage->getPixelFormat()) << std::endl;
4050
LOG_INFO(msg.str())
4151

42-
// Create the black RGB image
43-
_blackImage = new VideoFrame(VideoFrameDesc(frameBuffer.getAVFrame().width, frameBuffer.getAVFrame().height, "rgb24"));
44-
const unsigned char fillChar = 0;
45-
_blackImage->assign(fillChar);
4652
}
4753
LOG_DEBUG("Copy data of the black image when decode next frame")
4854
// Convert the black image to the configuration of the given frame

src/AvTranscoder/decoder/VideoGenerator.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class AvExport VideoGenerator : public IDecoder
1515
VideoGenerator& operator=(const VideoGenerator& videoGenerator);
1616

1717
public:
18-
VideoGenerator();
18+
VideoGenerator(const VideoFrameDesc& frameDesc);
1919
~VideoGenerator();
2020

2121
bool decodeNextFrame(Frame& frameBuffer);
@@ -30,6 +30,7 @@ class AvExport VideoGenerator : public IDecoder
3030
private:
3131
Frame* _inputFrame; ///< A frame given from outside (has link, no ownership)
3232
VideoFrame* _blackImage; ///< The generated RGB black image (has ownership)
33+
const VideoFrameDesc _frameDesc; ///< The description of the given frame buffer when decoding.
3334
VideoTransform _videoTransform; ///< To transform data of the back image to the given Frame when decoding.
3435
};
3536
}

src/AvTranscoder/reader/AudioReader.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,19 @@ void AudioReader::init()
4444
_decoder->setupDecoder();
4545
_currentDecoder = _decoder;
4646

47-
// generator
48-
_generator = new AudioGenerator();
49-
50-
// create transform
51-
_transform = new AudioTransform();
52-
5347
// create src frame
5448
_srcFrame = new AudioFrame(_inputFile->getStream(_streamIndex).getAudioCodec().getAudioFrameDesc());
5549
AudioFrame* srcFrame = static_cast<AudioFrame*>(_srcFrame);
5650
// create dst frame
5751
_outputSampleRate = srcFrame->getSampleRate();
5852
_outputNbChannels = (_channelIndex == -1) ? srcFrame->getNbChannels() : 1;
5953
_dstFrame = new AudioFrame(AudioFrameDesc(_outputSampleRate, _outputNbChannels, _outputSampleFormat));
54+
55+
// generator
56+
_generator = new AudioGenerator(srcFrame->desc());
57+
58+
// create transform
59+
_transform = new AudioTransform();
6060
}
6161

6262
AudioReader::~AudioReader()

src/AvTranscoder/reader/VideoReader.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,19 @@ void VideoReader::init()
4343
_decoder->setupDecoder();
4444
_currentDecoder = _decoder;
4545

46-
// generator
47-
_generator = new VideoGenerator();
48-
49-
// create transform
50-
_transform = new VideoTransform();
51-
5246
// create src frame
5347
_srcFrame = new VideoFrame(_inputFile->getStream(_streamIndex).getVideoCodec().getVideoFrameDesc());
5448
VideoFrame* srcFrame = static_cast<VideoFrame*>(_srcFrame);
5549
// create dst frame
5650
_outputWidth = srcFrame->getWidth();
5751
_outputHeight = srcFrame->getHeight();
5852
_dstFrame = new VideoFrame(VideoFrameDesc(_outputWidth, _outputHeight, getOutputPixelFormat()));
53+
54+
// generator
55+
_generator = new VideoGenerator(srcFrame->desc());
56+
57+
// create transform
58+
_transform = new VideoTransform();
5959
}
6060

6161
VideoReader::~VideoReader()

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
5454
VideoFrameDesc inputFrameDesc(inputStream.getVideoCodec().getVideoFrameDesc());
5555

5656
// generator decoder
57-
_generators.push_back(new VideoGenerator());
57+
_generators.push_back(new VideoGenerator(inputFrameDesc));
5858

5959
// buffers to process
6060
_decodedData.push_back(new VideoFrame(inputFrameDesc));
@@ -90,7 +90,7 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
9090
AudioFrameDesc inputFrameDesc(inputStream.getAudioCodec().getAudioFrameDesc());
9191

9292
// generator decoder
93-
_generators.push_back(new AudioGenerator());
93+
_generators.push_back(new AudioGenerator(inputFrameDesc));
9494

9595
// buffers to process
9696
_decodedData.push_back(new AudioFrame(inputFrameDesc));
@@ -242,11 +242,12 @@ void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInput
242242
_inputDecoders.push_back(inputVideo);
243243
_currentDecoder = inputVideo;
244244

245-
// generator decoder
246-
_generators.push_back(new VideoGenerator());
245+
// buffers to get the decoded data
246+
VideoFrame* inputFrame = new VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc());
247+
_decodedData.push_back(inputFrame);
247248

248-
// buffers to process
249-
_decodedData.push_back(new VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc()));
249+
// generator decoder
250+
_generators.push_back(new VideoGenerator(inputFrame->desc()));
250251

251252
break;
252253
}
@@ -258,16 +259,15 @@ void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInput
258259
_inputDecoders.push_back(inputAudio);
259260
_currentDecoder = inputAudio;
260261

261-
// generator decoder
262-
_generators.push_back(new AudioGenerator());
263-
264-
// buffers to process
262+
// buffers to get the decoded data
265263
AudioFrameDesc inputFrameDesc(inputStream.getAudioCodec().getAudioFrameDesc());
266264
if(inputStreamDesc.demultiplexing())
267265
inputFrameDesc._nbChannels = inputStreamDesc._channelIndexArray.size();
268-
269266
_decodedData.push_back(new AudioFrame(inputFrameDesc));
270267

268+
// generator decoder
269+
_generators.push_back(new AudioGenerator(inputFrameDesc));
270+
271271
break;
272272
}
273273
default:
@@ -302,7 +302,7 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
302302
inputVideoCodec.setImageParameters(inputFrameDesc);
303303

304304
// generator decoder
305-
VideoGenerator* generator = new VideoGenerator();
305+
VideoGenerator* generator = new VideoGenerator(inputFrameDesc);
306306
_generators.push_back(generator);
307307
_currentDecoder = generator;
308308

@@ -335,7 +335,7 @@ StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader:
335335
inputAudioCodec.setAudioParameters(inputFrameDesc);
336336

337337
// generator decoder
338-
AudioGenerator* generator = new AudioGenerator();
338+
AudioGenerator* generator = new AudioGenerator(inputFrameDesc);
339339
_generators.push_back(generator);
340340
_currentDecoder = generator;
341341

0 commit comments

Comments
 (0)