Skip to content

Commit bd9d04d

Browse files
author
Clement Champetier
committed
AudioGenerator: generate the silent audio frame only once
Use an AudioTransform (like the VideoGenerator).
1 parent 9767b0f commit bd9d04d

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

src/AvTranscoder/decoder/AudioGenerator.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include "AudioGenerator.hpp"
22

3+
#include <AvTranscoder/transform/AudioTransform.hpp>
4+
35
namespace avtranscoder
46
{
57

68
AudioGenerator::AudioGenerator()
79
: _inputFrame( NULL )
10+
, _silent( NULL )
811
, _frameDesc()
912
{
1013
}
@@ -21,21 +24,29 @@ void AudioGenerator::setFrame( Frame& inputFrame )
2124

2225
bool AudioGenerator::decodeNextFrame( Frame& frameBuffer )
2326
{
27+
// Generate silent
2428
if( ! _inputFrame )
2529
{
26-
AudioFrame& audioFrameBuffer = static_cast<AudioFrame&>( frameBuffer );
27-
audioFrameBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() );
28-
29-
//av_samples_set_silence( data.getPtr(), offset, nb_samples, nb_channels, sample_fmt );
30-
int fill_char = (
31-
_frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 ||
32-
_frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8P
33-
) ? 0x80 : 0x00;
34-
35-
if( frameBuffer.getSize() != _frameDesc.getDataSize() )
36-
frameBuffer.getBuffer().resize( _frameDesc.getDataSize() );
37-
memset( frameBuffer.getPtr(), fill_char, frameBuffer.getSize() );
30+
// Generate the silent only once
31+
if( ! _silent )
32+
{
33+
int fillChar = 0;
34+
35+
AudioFrame intermediateBuffer( _frameDesc );
36+
intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() );
37+
memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() );
38+
39+
AudioTransform audioTransform;
40+
audioTransform.convert( intermediateBuffer, frameBuffer );
41+
42+
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer );
43+
audioBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() );
44+
_silent = new AudioFrame( audioBuffer.desc() );
45+
_silent->copyData( audioBuffer.getPtr(), audioBuffer.getSize() );
46+
}
47+
frameBuffer = *_silent;
3848
}
49+
// Take audio frame from _inputFrame
3950
else
4051
{
4152
frameBuffer.copyData( _inputFrame->getPtr(), _inputFrame->getSize() );

src/AvTranscoder/decoder/AudioGenerator.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class AvExport AudioGenerator : public IDecoder
2424

2525
private:
2626
Frame* _inputFrame; ///< Has link (no ownership)
27-
AudioFrameDesc _frameDesc;
27+
AudioFrame* _silent; ///< The generated silent (has ownership)
28+
AudioFrameDesc _frameDesc; ///< The description of the silent (sample rate...)
2829
};
2930

3031
}

0 commit comments

Comments
 (0)