arduino-audio-tools
Loading...
Searching...
No Matches
CodecAACFAAC.h
Go to the documentation of this file.
1#pragma once
2
4#include "faac.h"
5
6// Default total bitrate in bps for 16 bit stereo @ 44100 Hz; scaled by
7// sample rate and channel count when the bitrate is not set via setBitrate().
8#ifndef FAAC_DEFAULT_BITRATE
9#define FAAC_DEFAULT_BITRATE 128000
10#endif
11
12namespace audio_tools {
13
29 public:
30 AACEncoderFAAC() = default;
31
32 AACEncoderFAAC(Print &out_stream) { setOutput(out_stream); }
33
34 ~AACEncoderFAAC() override { end(); }
35
37 void setOutput(Print &out_stream) override { p_print = &out_stream; }
38
41 void setBitrate(uint32_t bps) { bitrate = bps; }
42
45 void setQuality(uint32_t quality) { quant_quality = quality; }
46
49 void setObjectType(faac_object_type type) { object_type = type; }
50
53 void setRateControl(faac_rate_control rc) { rate_control = rc; }
54
56 void setAdts(bool enabled) { use_adts = enabled; }
57
58 bool begin(AudioInfo info) override {
60 return begin();
61 }
62
63 bool begin() override {
64 TRACEI();
65 end();
66 if (p_print == nullptr) {
67 LOGE("Output undefined");
68 return false;
69 }
70 if (info.bits_per_sample != 16) {
71 LOGE("bits_per_sample must be 16, got %d", info.bits_per_sample);
72 return false;
73 }
74
75 faac_params params;
76 faac_params_init(&params, sizeof(params));
77 params.sample_rate = info.sample_rate;
78 params.num_channels = info.channels;
79 params.object_type = object_type;
80 params.mpeg_version = FAAC_MPEG4;
81 params.input_format = FAAC_INPUT_16BIT;
82 params.output_format = use_adts ? FAAC_STREAM_ADTS : FAAC_STREAM_RAW;
83 params.rate_control = rate_control;
84 params.quant_quality = quant_quality;
85 // faac expects the bitrate per channel
86 uint32_t total_bps =
87 bitrate == (uint32_t)-1 ? defaultBitrate(info) : bitrate;
88 params.bit_rate = info.channels > 0 ? total_bps / info.channels : 0;
89
90 faac_status rc = faac_encoder_open(&params, &enc);
91 if (rc != FAAC_OK) {
92 LOGE("faac_encoder_open: %s", faac_strerror(rc));
93 enc = nullptr;
94 return false;
95 }
96
97 enc_info.struct_size = sizeof(enc_info);
98 rc = faac_encoder_get_info(enc, &enc_info);
99 if (rc != FAAC_OK) {
100 LOGE("faac_encoder_get_info: %s", faac_strerror(rc));
101 faac_encoder_close(&enc);
102 return false;
103 }
104 LOGI("frame_samples: %d, max_output_bytes: %d",
105 (int)enc_info.frame_samples, (int)enc_info.max_output_bytes);
106
107 frame_samples = enc_info.frame_samples * info.channels;
109 out_buffer.resize(enc_info.max_output_bytes);
110 pcm_pos = 0;
111 return true;
112 }
113
115 void end() override {
116 if (enc == nullptr) return;
117 TRACEI();
118 // encode the final partial frame
119 if (pcm_pos > 0) {
121 pcm_pos = 0;
122 }
123 // drain the encoder
124 uint32_t written = 0;
125 do {
126 if (!encode(nullptr, 0, &written)) break;
127 } while (written > 0);
128 faac_encoder_close(&enc);
129 enc = nullptr;
130 }
131
132 size_t write(const uint8_t *data, size_t len) override {
133 if (enc == nullptr || data == nullptr) return 0;
134 const int16_t *samples = (const int16_t *)data;
135 size_t sample_count = len / sizeof(int16_t);
136 for (size_t j = 0; j < sample_count; j++) {
137 pcm_buffer[pcm_pos++] = samples[j];
138 if (pcm_pos >= frame_samples) {
140 pcm_pos = 0;
141 }
142 }
143 return len;
144 }
145
146 const char *mime() override { return "audio/aac"; }
147
148 operator bool() override { return enc != nullptr; }
149
152 bool getAudioSpecificConfig(const uint8_t *&data, uint32_t &len) {
153 if (enc == nullptr) return false;
154 return faac_encoder_asc(enc, &data, &len) == FAAC_OK;
155 }
156
158 faac_encoder_info &encoderInfo() { return enc_info; }
159
161 faac_encoder *driver() { return enc; }
162
163 protected:
164 faac_encoder *enc = nullptr;
165 faac_encoder_info enc_info;
166 Print *p_print = nullptr;
169 size_t frame_samples = 0;
170 size_t pcm_pos = 0;
171 uint32_t bitrate = (uint32_t)-1;
172 uint32_t quant_quality = 0;
173 faac_object_type object_type = FAAC_OBJ_LOW;
174 faac_rate_control rate_control = FAAC_RC_AUTO;
175 bool use_adts = true;
176
179 static uint32_t defaultBitrate(AudioInfo info) {
180 double bps = FAAC_DEFAULT_BITRATE;
181 bps = bps * info.channels / 2.0;
182 return (uint32_t)(bps * info.sample_rate / 44100.0);
183 }
184
185 bool encode(const int16_t *samples, uint32_t sample_count,
186 uint32_t *p_written = nullptr) {
187 uint32_t written = 0;
188 faac_status rc =
189 faac_encoder_encode(enc, samples, sample_count, out_buffer.data(),
190 out_buffer.size(), &written);
191 if (p_written != nullptr) *p_written = written;
192 if (rc != FAAC_OK) {
193 LOGE("faac_encoder_encode: %s", faac_strerror(rc));
194 return false;
195 }
196 if (written > 0) {
197 size_t result = p_print->write(out_buffer.data(), written);
198 if (result != written) {
199 LOGW("Output truncated: %d of %d", (int)result, (int)written);
200 }
201 }
202 return true;
203 }
204};
205
206} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define FAAC_DEFAULT_BITRATE
Definition CodecAACFAAC.h:9
Definition Arduino.h:56
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
AAC Encoder (AAC-LC and HE-AAC v1) using faac: https://github.com/pschatzmann/codec-faac.
Definition CodecAACFAAC.h:28
void setOutput(Print &out_stream) override
Defines the output stream.
Definition CodecAACFAAC.h:37
faac_encoder * driver()
Provides access to the faac encoder handle.
Definition CodecAACFAAC.h:161
static uint32_t defaultBitrate(AudioInfo info)
Definition CodecAACFAAC.h:179
Vector< int16_t > pcm_buffer
Definition CodecAACFAAC.h:167
faac_encoder_info enc_info
Definition CodecAACFAAC.h:165
uint32_t bitrate
Definition CodecAACFAAC.h:171
faac_rate_control rate_control
Definition CodecAACFAAC.h:174
void end() override
Encodes the remaining data and releases the encoder.
Definition CodecAACFAAC.h:115
bool getAudioSpecificConfig(const uint8_t *&data, uint32_t &len)
Definition CodecAACFAAC.h:152
void setRateControl(faac_rate_control rc)
Definition CodecAACFAAC.h:53
size_t pcm_pos
Definition CodecAACFAAC.h:170
size_t write(const uint8_t *data, size_t len) override
Definition CodecAACFAAC.h:132
size_t frame_samples
Definition CodecAACFAAC.h:169
bool encode(const int16_t *samples, uint32_t sample_count, uint32_t *p_written=nullptr)
Definition CodecAACFAAC.h:185
uint32_t quant_quality
Definition CodecAACFAAC.h:172
faac_encoder_info & encoderInfo()
Provides the information of the opened encoder.
Definition CodecAACFAAC.h:158
void setObjectType(faac_object_type type)
Definition CodecAACFAAC.h:49
const char * mime() override
Provides the mime type of the encoded result.
Definition CodecAACFAAC.h:146
Vector< uint8_t > out_buffer
Definition CodecAACFAAC.h:168
void setQuality(uint32_t quality)
Definition CodecAACFAAC.h:45
bool begin(AudioInfo info) override
Definition CodecAACFAAC.h:58
bool begin() override
Definition CodecAACFAAC.h:63
Print * p_print
Definition CodecAACFAAC.h:166
bool use_adts
Definition CodecAACFAAC.h:175
void setAdts(bool enabled)
Defines if ADTS headers are generated (default true)
Definition CodecAACFAAC.h:56
faac_object_type object_type
Definition CodecAACFAAC.h:173
AACEncoderFAAC(Print &out_stream)
Definition CodecAACFAAC.h:32
void setBitrate(uint32_t bps)
Definition CodecAACFAAC.h:41
faac_encoder * enc
Definition CodecAACFAAC.h:164
~AACEncoderFAAC() override
Definition CodecAACFAAC.h:34
Encoding of PCM data.
Definition AudioCodecsBase.h:101
AudioInfo info
Definition AudioCodecsBase.h:129
void setAudioInfo(AudioInfo from) override
Defines the sample rate, number of channels and bits per sample.
Definition AudioCodecsBase.h:110
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool resize(size_t newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:316
int size()
Definition Vector.h:178
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:56
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:58
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:60
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:62