7 #include "nb/interf_dec.h"
8 #include "nb/interf_enc.h"
34 inline AMRNB(
bool enableDTX =
false) { dtx_enabled = enableDTX; }
41 Encoder_Interface_exit(encoderState);
42 encoderState =
nullptr;
46 Decoder_Interface_exit(decoderState);
47 decoderState =
nullptr;
71 inline int encode(
const int16_t* pcmSamples,
size_t sampleCount,
72 uint8_t* amrData,
size_t amrBufferSize)
override {
74 if (encoderState ==
nullptr)
75 encoderState = Encoder_Interface_init(dtx_enabled ? 1 : 0);
78 if (encoderState ==
nullptr || !amrData || amrBufferSize == 0) {
83 const size_t samplesPerFrame = 160;
84 size_t bytesWritten = 0;
86 for (
size_t i = 0; i < sampleCount && bytesWritten < amrBufferSize;
87 i += samplesPerFrame) {
89 if (i + samplesPerFrame > sampleCount) {
94 if (bytesWritten + 32 > amrBufferSize) {
99 int frameBytes = Encoder_Interface_Encode(
100 encoderState, mapMode(currentMode),
101 const_cast<short*
>(pcmSamples + i), amrData + bytesWritten,
105 bytesWritten += frameBytes;
119 inline int decode(
const uint8_t* amrData,
size_t amrSize, int16_t* pcmSamples,
120 size_t maxSampleCount)
override {
122 if (decoderState ==
nullptr) decoderState = Decoder_Interface_init();
124 if (decoderState ==
nullptr || !amrData || amrSize == 0 || !pcmSamples ||
125 maxSampleCount == 0) {
130 const size_t samplesPerFrame = 160;
131 size_t totalSamplesDecoded = 0;
135 while (offset < amrSize &&
136 totalSamplesDecoded + samplesPerFrame <= maxSampleCount) {
138 uint8_t frameType = (amrData[offset] >> 3) & 0x0F;
141 size_t frameSize = 1;
142 if (frameType <= 7) {
147 if (offset + frameSize > amrSize) {
152 Decoder_Interface_Decode(decoderState,
153 const_cast<unsigned char*
>(amrData + offset),
154 pcmSamples + totalSamplesDecoded,
159 totalSamplesDecoded += samplesPerFrame;
162 return totalSamplesDecoded;
186 void* encoderState =
nullptr;
187 void* decoderState =
nullptr;
188 Mode currentMode = Mode::NB_122;
189 bool dtx_enabled =
false;
193 return static_cast<ModeNB
>(mode);
198 const uint8_t frameSizes[] = {
208 return frameSizes[
static_cast<int>(mode)];
Base class for AMR codec implementations.
Definition: AMRCodec.h:9
AMR Narrowband codec implementation.
Definition: AMRNB.h:14
~AMRNB() override
Destructor.
Definition: AMRNB.h:39
int decode(const uint8_t *amrData, size_t amrSize, int16_t *pcmSamples, size_t maxSampleCount) override
Decode AMR-NB data to PCM samples.
Definition: AMRNB.h:119
int getEncodedFrameSizeBytes() override
Get the size in bytes for one encoded frame in current mode.
Definition: AMRNB.h:181
void setMode(Mode mode)
Set encoding mode.
Definition: AMRNB.h:55
int getFrameSizeSamples() override
Get frame size in samples (160 for AMR-NB)
Definition: AMRNB.h:175
Mode
Available encoding modes for AMR-NB.
Definition: AMRNB.h:19
AMRNB(bool enableDTX=false)
Construct a new AMRNB codec.
Definition: AMRNB.h:34
Mode getMode() const
Get current encoding mode.
Definition: AMRNB.h:61
int encode(const int16_t *pcmSamples, size_t sampleCount, uint8_t *amrData, size_t amrBufferSize) override
Encode PCM samples to AMR-NB format.
Definition: AMRNB.h:71
int getSampleRate() const override
Get sample rate (8000 Hz for AMR-NB)
Definition: AMRNB.h:169