@@ -14,11 +14,13 @@ namespace audio_tools {
1414class ADPCMDecoder : public AudioDecoderExt {
1515 public:
1616 ADPCMDecoder (AVCodecID id, int blockSize = ADAPCM_DEFAULT_BLOCK_SIZE) {
17- info.sample_rate = 44100 ;
18- info.channels = 2 ;
19- info.bits_per_sample = 16 ;
17+ if (id == AV_CODEC_ID_ADPCM_IMA_AMV) {
18+ info.sample_rate = 22050 ;
19+ info.channels = 1 ;
20+ info.bits_per_sample = 16 ;
21+ }
2022 p_decoder = adpcm_ffmpeg::ADPCMDecoderFactory::create (id);
21- if (p_decoder!= nullptr ){
23+ if (p_decoder != nullptr ) {
2224 p_decoder->setCodecID (id);
2325 p_decoder->setBlockSize (blockSize);
2426 } else {
@@ -28,26 +30,27 @@ class ADPCMDecoder : public AudioDecoderExt {
2830
2931 // defines the block size
3032 void setBlockSize (int blockSize) override {
31- if (p_decoder== nullptr ) return ;
33+ if (p_decoder == nullptr ) return ;
3234 p_decoder->setBlockSize (blockSize);
3335 }
3436
35- // / Provides the block size (size of encoded frame) (only available after calling begin)
37+ // / Provides the block size (size of encoded frame) (only available after
38+ // / calling begin)
3639 int blockSize () {
37- if (p_decoder== nullptr ) return 0 ;
40+ if (p_decoder == nullptr ) return 0 ;
3841 return p_decoder->blockSize ();
3942 }
4043
41- // / Provides the frame size (size of decoded frame) (only available after calling begin)
44+ // / Provides the frame size (size of decoded frame) (only available after
45+ // / calling begin)
4246 int frameSize () {
43- if (p_decoder== nullptr ) return 0 ;
44- return p_decoder->frameSize ()* 2 ;
47+ if (p_decoder == nullptr ) return 0 ;
48+ return p_decoder->frameSize () * 2 ;
4549 }
4650
47-
4851 bool begin () override {
4952 TRACEI ();
50- if (p_decoder== nullptr ) return false ;
53+ if (p_decoder == nullptr ) return false ;
5154 if (is_started) return true ;
5255 current_byte = 0 ;
5356 LOGI (" sample_rate: %d, channels: %d" , info.sample_rate , info.channels );
@@ -66,8 +69,7 @@ class ADPCMDecoder : public AudioDecoderExt {
6669
6770 void end () override {
6871 TRACEI ();
69- if (p_decoder!=nullptr )
70- p_decoder->end ();
72+ if (p_decoder != nullptr ) p_decoder->end ();
7173 adpcm_block.resize (0 );
7274 is_started = false ;
7375 }
@@ -85,31 +87,38 @@ class ADPCMDecoder : public AudioDecoderExt {
8587 return len;
8688 }
8789
90+ void flush () {
91+ if (p_decoder != nullptr ) p_decoder->flush ();
92+ }
93+
8894 operator bool () override { return is_started; }
8995
9096 protected:
91- adpcm_ffmpeg::ADPCMDecoder *p_decoder= nullptr ;
97+ adpcm_ffmpeg::ADPCMDecoder *p_decoder = nullptr ;
9298 Vector<uint8_t > adpcm_block;
9399 Print *p_print = nullptr ;
94100 int current_byte = 0 ;
95101 int block_size = 0 ;
96102 bool is_started = false ;
97103
98104 virtual bool decode (uint8_t byte) {
99- if (p_decoder== nullptr ) return false ;
105+ if (p_decoder == nullptr ) return false ;
100106 adpcm_block[current_byte++] = byte;
101107
102108 if (current_byte >= block_size) {
103109 TRACED ();
104- adpcm_ffmpeg::AVFrame &frame = p_decoder->decode (&adpcm_block[0 ], block_size);
110+ adpcm_ffmpeg::AVFrame &frame =
111+ p_decoder->decode (&adpcm_block[0 ], block_size);
105112 // print the result
106113 int16_t *data = (int16_t *)frame.data [0 ];
107114 size_t byte_count = frame.nb_samples * sizeof (int16_t ) * info.channels ;
108115 size_t written = p_print->write ((uint8_t *)data, byte_count);
109116 if (written != byte_count) {
110- LOGE (" decode %d -> %d -> %d" ,block_size, (int )byte_count, (int )written);
117+ LOGE (" decode %d -> %d -> %d" , block_size, (int )byte_count,
118+ (int )written);
111119 } else {
112- LOGD (" decode %d -> %d -> %d" ,block_size, (int )byte_count, (int )written);
120+ LOGD (" decode %d -> %d -> %d" , block_size, (int )byte_count,
121+ (int )written);
113122 }
114123
115124 // restart from array begin
@@ -129,41 +138,45 @@ class ADPCMDecoder : public AudioDecoderExt {
129138class ADPCMEncoder : public AudioEncoderExt {
130139 public:
131140 ADPCMEncoder (AVCodecID id, int blockSize = ADAPCM_DEFAULT_BLOCK_SIZE) {
132- info.sample_rate = 44100 ;
133- info.channels = 2 ;
134- info.bits_per_sample = 16 ;
141+ if (id == AV_CODEC_ID_ADPCM_IMA_AMV) {
142+ info.sample_rate = 22050 ;
143+ info.channels = 1 ;
144+ info.bits_per_sample = 16 ;
145+ }
135146 p_encoder = adpcm_ffmpeg::ADPCMEncoderFactory::create (id);
136- if (p_encoder!= nullptr ){
147+ if (p_encoder != nullptr ) {
137148 p_encoder->setCodecID (id);
138149 p_encoder->setBlockSize (blockSize);
139150 } else {
140151 LOGE (" Encoder not implemented" );
141152 }
142153 }
143154
144- // / Provides the block size (size of encoded frame) (only available after calling begin)
155+ // / Provides the block size (size of encoded frame) (only available after
156+ // / calling begin)
145157 int blockSize () override {
146- if (p_encoder== nullptr ) return 0 ;
158+ if (p_encoder == nullptr ) return 0 ;
147159 return p_encoder->blockSize ();
148160 }
149161
150- // / Provides the frame size (size of decoded frame) (only available after calling begin)
151- int frameSize () {
152- if (p_encoder==nullptr ) return 0 ;
153- return p_encoder->frameSize ()*2 ;
162+ // / Provides the frame size (size of decoded frame) (only available after
163+ // / calling begin)
164+ int frameSize () {
165+ if (p_encoder == nullptr ) return 0 ;
166+ return p_encoder->frameSize () * 2 ;
154167 }
155168
156169 bool begin () override {
157170 TRACEI ();
158- if (p_encoder== nullptr ) return false ;
171+ if (p_encoder == nullptr ) return false ;
159172 if (is_started) return true ;
160173 LOGI (" sample_rate: %d, channels: %d" , info.sample_rate , info.channels );
161174 p_encoder->begin (info.sample_rate , info.channels );
162175 LOGI (" frameSize: %d" , (int )frameSize ());
163176 LOGI (" blockSize: %d" , (int )blockSize ());
164177 assert (info.sample_rate != 0 );
165178 assert (p_encoder->frameSize () != 0 );
166- total_samples = p_encoder->frameSize ()* info.channels ;
179+ total_samples = p_encoder->frameSize () * info.channels ;
167180 pcm_block.resize (total_samples);
168181 current_sample = 0 ;
169182
@@ -174,7 +187,7 @@ class ADPCMEncoder : public AudioEncoderExt {
174187 void end () override {
175188 TRACEI ();
176189 pcm_block.resize (0 );
177- if (p_encoder== nullptr ) return ;
190+ if (p_encoder == nullptr ) return ;
178191 p_encoder->end ();
179192 is_started = false ;
180193 }
@@ -195,25 +208,28 @@ class ADPCMEncoder : public AudioEncoderExt {
195208 }
196209
197210 protected:
198- adpcm_ffmpeg::ADPCMEncoder* p_encoder = nullptr ;
211+ adpcm_ffmpeg::ADPCMEncoder * p_encoder = nullptr ;
199212 Vector<int16_t > pcm_block;
200213 Print *p_print = nullptr ;
201214 bool is_started = false ;
202215 int current_sample = 0 ;
203- int total_samples= 0 ;
216+ int total_samples = 0 ;
204217
205218 virtual bool encode (int16_t sample) {
206- if (p_encoder== nullptr ) return false ;
219+ if (p_encoder == nullptr ) return false ;
207220 pcm_block[current_sample++] = sample;
208221 if (current_sample >= total_samples) {
209222 TRACED ();
210- adpcm_ffmpeg::AVPacket &packet = p_encoder->encode (&pcm_block[0 ], total_samples);
223+ adpcm_ffmpeg::AVPacket &packet =
224+ p_encoder->encode (&pcm_block[0 ], total_samples);
211225 if (packet.size > 0 ) {
212226 size_t written = p_print->write (packet.data , packet.size );
213227 if (written != packet.size ) {
214- LOGE (" encode %d->%d->%d" ,2 *total_samples, (int )packet.size , (int )written);
228+ LOGE (" encode %d->%d->%d" , 2 * total_samples, (int )packet.size ,
229+ (int )written);
215230 } else {
216- LOGD (" encode %d->%d->%d" ,2 *total_samples, (int )packet.size , (int )written);
231+ LOGD (" encode %d->%d->%d" , 2 * total_samples, (int )packet.size ,
232+ (int )written);
217233 }
218234 }
219235 // restart from array begin
0 commit comments