12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #include "OPUSDecoder.h"
- #include <stdlib.h> // for free, malloc
- #include "CodecType.h" // for bell
- #include "opus.h" // for opus_decoder_destroy, opus_decode, opus_decod...
- using namespace bell;
- #define MAX_FRAME_SIZE 6 * 960
- #define MAX_CHANNELS 2
- // dummy structure, just to get access to channels
- struct OpusDecoder {
- int dummy1;
- int dummy2;
- int channels;
- };
- OPUSDecoder::OPUSDecoder() {
- opus = nullptr;
- pcmData = (int16_t*)malloc(MAX_FRAME_SIZE * MAX_CHANNELS * sizeof(int16_t));
- }
- OPUSDecoder::~OPUSDecoder() {
- if (opus)
- opus_decoder_destroy(opus);
- free(pcmData);
- }
- bool OPUSDecoder::setup(uint32_t sampleRate, uint8_t channelCount,
- uint8_t bitDepth) {
- if (opus)
- opus_decoder_destroy(opus);
- opus = opus_decoder_create((int32_t)sampleRate, channelCount, &lastErrno);
- return !lastErrno;
- }
- uint8_t* OPUSDecoder::decode(uint8_t* inData, uint32_t& inLen,
- uint32_t& outLen) {
- if (!inData)
- return nullptr;
- outLen =
- opus_decode(opus, static_cast<unsigned char*>(inData),
- static_cast<int32_t>(inLen), pcmData, MAX_FRAME_SIZE, false);
- outLen *= opus->channels * sizeof(int16_t);
- inLen = 0;
- return (uint8_t*)pcmData;
- }
|