Skip to content

Commit 3723ffc

Browse files
author
Clement Champetier
committed
AudioGenerator: fixed decoding if the given frame is not valid
1 parent 64afc62 commit 3723ffc

File tree

5 files changed

+25
-1
lines changed

5 files changed

+25
-1
lines changed

src/AvTranscoder/data/decoded/AudioFrame.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ class AvExport AudioFrame : public Frame
7070
* @brief Allocate the audio buffer of the frame.
7171
*/
7272
void allocateAVSample(const AudioFrameDesc& ref);
73+
74+
/**
75+
* @note To allocate new audio buffer if needed.
76+
* @see allocateAVSample
77+
*/
78+
friend class AudioGenerator;
7379
};
7480
}
7581

src/AvTranscoder/decoder/AudioGenerator.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ AudioGenerator::AudioGenerator()
1616
AudioGenerator::AudioGenerator(const AudioGenerator& audioGenerator)
1717
: _inputFrame(NULL)
1818
, _silent(NULL)
19+
, _frameDesc(audioGenerator.getAudioFrameDesc())
1920
{
2021
}
2122

2223
AudioGenerator& AudioGenerator::operator=(const AudioGenerator& audioGenerator)
2324
{
2425
_inputFrame = NULL;
2526
_silent = NULL;
27+
_frameDesc = audioGenerator.getAudioFrameDesc();
2628
return *this;
2729
}
2830

@@ -38,6 +40,14 @@ void AudioGenerator::setNextFrame(Frame& inputFrame)
3840

3941
bool AudioGenerator::decodeNextFrame(Frame& frameBuffer)
4042
{
43+
// check the given frame
44+
if(!frameBuffer.isAudioFrame())
45+
{
46+
LOG_WARN("The given frame is not a valid audio frame: allocate a new AVSample to put generated data into it.");
47+
frameBuffer.clear();
48+
static_cast<AudioFrame&>(frameBuffer).allocateAVSample(_frameDesc);
49+
}
50+
4151
// Check channel layout of the given frame to be able to copy audio data to it.
4252
// @see Frame.copyData method
4353
if(frameBuffer.getAVFrame().channel_layout == 0)

src/AvTranscoder/decoder/AudioGenerator.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ class AvExport AudioGenerator : public IDecoder
2020
bool decodeNextFrame(Frame& frameBuffer, const size_t subStreamIndex);
2121

2222
void setNextFrame(Frame& inputFrame);
23+
const AudioFrameDesc& getAudioFrameDesc() const { return _frameDesc; }
24+
void setAudioFrameDesc(const AudioFrameDesc& frameDesc) { _frameDesc = frameDesc; }
2325

2426
private:
2527
Frame* _inputFrame; ///< Has link (no ownership)
2628
AudioFrame* _silent; ///< The generated silent (has ownership)
29+
AudioFrameDesc _frameDesc; ///< The description of the silence (sampleRate, channels...)
2730
};
2831
}
2932

src/AvTranscoder/reader/AudioReader.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ void AudioReader::init()
4444
_decoder->setupDecoder();
4545

4646
// generator
47-
_generator = new AudioGenerator();
47+
AudioGenerator* generator = new AudioGenerator();
48+
generator->setAudioFrameDesc(_inputFile->getStream(_streamIndex).getAudioCodec().getAudioFrameDesc());
49+
_generator = generator;
4850

4951
// create transform
5052
_transform = new AudioTransform();

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
8989

9090
// generator decoder
9191
AudioGenerator* generatorAudio = new AudioGenerator();
92+
generatorAudio->setAudioFrameDesc(inputFrameDesc);
9293
_generator = generatorAudio;
9394

9495
// buffers to process
@@ -219,6 +220,7 @@ StreamTranscoder::StreamTranscoder(IInputStream& inputStream, IOutputFile& outpu
219220

220221
// generator decoder
221222
AudioGenerator* generatorAudio = new AudioGenerator();
223+
generatorAudio->setAudioFrameDesc(outputFrameDesc);
222224
_generator = generatorAudio;
223225

224226
break;
@@ -282,6 +284,7 @@ StreamTranscoder::StreamTranscoder(const ICodec& inputCodec, IOutputFile& output
282284
// generator decoder
283285
AudioGenerator* generatorAudio = new AudioGenerator();
284286
const AudioCodec& inputAudioCodec = static_cast<const AudioCodec&>(inputCodec);
287+
generatorAudio->setAudioFrameDesc(inputAudioCodec.getAudioFrameDesc());
285288
_generator = generatorAudio;
286289
_currentDecoder = _generator;
287290

0 commit comments

Comments
 (0)