38 E_IF_exit(encoderState);
39 encoderState =
nullptr;
43 D_IF_exit(decoderState);
44 decoderState =
nullptr;
68 inline int encode(
const int16_t* pcmSamples,
size_t sampleCount,
69 uint8_t* amrData,
size_t amrBufferSize)
override {
70 if (encoderState ==
nullptr) encoderState = E_IF_init();
72 if (encoderState ==
nullptr || !amrData || amrBufferSize == 0) {
77 const size_t samplesPerFrame = 320;
78 size_t bytesWritten = 0;
80 for (
size_t i = 0; i < sampleCount && bytesWritten < amrBufferSize;
81 i += samplesPerFrame) {
83 if (i + samplesPerFrame > sampleCount) {
88 if (bytesWritten + 64 > amrBufferSize) {
93 int frameBytes = E_IF_encode(encoderState,
static_cast<int>(currentMode),
94 const_cast<short*
>(pcmSamples + i),
95 amrData + bytesWritten,
99 bytesWritten += frameBytes;
113 inline int decode(
const uint8_t* amrData,
size_t amrSize, int16_t* pcmSamples,
114 size_t maxSampleCount)
override {
115 if (decoderState ==
nullptr) decoderState = D_IF_init();
117 if (decoderState ==
nullptr || !amrData || amrSize == 0 || !pcmSamples ||
118 maxSampleCount == 0) {
124 size_t totalSamplesDecoded = 0;
128 while (offset < amrSize &&
129 totalSamplesDecoded + samplesPerFrame <= maxSampleCount) {
131 uint8_t frameType = (amrData[offset] >> 3) & 0x0F;
134 size_t frameSize = 1;
135 if (frameSize <= 8) {
139 if (offset + frameSize > amrSize) {
144 D_IF_decode(decoderState,
const_cast<unsigned char*
>(amrData + offset),
145 pcmSamples + totalSamplesDecoded,
150 totalSamplesDecoded += samplesPerFrame;
153 return totalSamplesDecoded;
177 void* encoderState =
nullptr;
178 void* decoderState =
nullptr;
179 Mode currentMode = Mode::WB_23_85;
183 const uint8_t frameSizes[] = {
194 return frameSizes[mode];
Base class for AMR codec implementations.
Definition: AMRCodec.h:9
AMR Wideband codec implementation.
Definition: AMRWB.h:14
int decode(const uint8_t *amrData, size_t amrSize, int16_t *pcmSamples, size_t maxSampleCount) override
Decode AMR-WB data to PCM samples.
Definition: AMRWB.h:113
int getEncodedFrameSizeBytes() override
Get the size in bytes for one encoded frame in current mode.
Definition: AMRWB.h:172
Mode
Available encoding modes for AMR-WB.
Definition: AMRWB.h:19
int getSampleRate() const override
Get sample rate (16000 Hz for AMR-WB)
Definition: AMRWB.h:160
void setMode(Mode mode)
Set encoding mode.
Definition: AMRWB.h:52
~AMRWB() override
Destructor.
Definition: AMRWB.h:36
Mode getMode() const
Get current encoding mode.
Definition: AMRWB.h:58
int encode(const int16_t *pcmSamples, size_t sampleCount, uint8_t *amrData, size_t amrBufferSize) override
Encode PCM samples to AMR-WB format.
Definition: AMRWB.h:68
int getFrameSizeSamples() override
Get frame size in samples (320 for AMR-WB)
Definition: AMRWB.h:166