1
1
#include " AudioGenerator.hpp"
2
2
3
+ #include < AvTranscoder/transform/AudioTransform.hpp>
4
+
3
5
namespace avtranscoder
4
6
{
5
7
6
8
AudioGenerator::AudioGenerator ()
7
9
: _inputFrame( NULL )
10
+ , _silent( NULL )
8
11
, _frameDesc()
9
12
{
10
13
}
@@ -21,21 +24,29 @@ void AudioGenerator::setFrame( Frame& inputFrame )
21
24
22
25
bool AudioGenerator::decodeNextFrame ( Frame& frameBuffer )
23
26
{
27
+ // Generate silent
24
28
if ( ! _inputFrame )
25
29
{
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;
38
48
}
49
+ // Take audio frame from _inputFrame
39
50
else
40
51
{
41
52
frameBuffer.copyData ( _inputFrame->getPtr (), _inputFrame->getSize () );
0 commit comments