| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | #include "AACDecoder.h"#include <assert.h>#include <stdlib.h>  // for free, malloc#include <string.h>#include "e_tmp4audioobjecttype.h"#include "pvmp4audiodecoder_api.h"namespace bell {class AudioContainer;}  // namespace bellusing namespace bell;AACDecoder::AACDecoder() {  aacDecoder =      (tPVMP4AudioDecoderExternal*)malloc(sizeof(tPVMP4AudioDecoderExternal));  int32_t pMemRequirement = PVMP4AudioDecoderGetMemRequirements();  pMem = malloc(pMemRequirement);  memset(aacDecoder, 0, sizeof(tPVMP4AudioDecoderExternal));  memset(pMem, 0, pMemRequirement);  // Initialize the decoder buffers  outputBuffer.resize(4096);  aacDecoder->pOutputBuffer_plus = &outputBuffer[2048];  aacDecoder->pOutputBuffer = &outputBuffer[0];  aacDecoder->inputBufferMaxLength = PVMP4AUDIODECODER_INBUFSIZE;  // Settings  aacDecoder->desiredChannels = 2;  aacDecoder->outputFormat = OUTPUTFORMAT_16PCM_INTERLEAVED;  aacDecoder->aacPlusEnabled = TRUE;  // State  aacDecoder->inputBufferCurrentLength = 0;  aacDecoder->inputBufferUsedLength = 0;  aacDecoder->remainderBits = 0;  firstFrame = true;  assert(PVMP4AudioDecoderInitLibrary(aacDecoder, pMem) == MP4AUDEC_SUCCESS);}AACDecoder::~AACDecoder() {  free(pMem);  free(aacDecoder);}int AACDecoder::getDecodedStreamType() {  switch (aacDecoder->extendedAudioObjectType) {    case MP4AUDIO_AAC_LC:    case MP4AUDIO_LTP:      return AAC;    case MP4AUDIO_SBR:      return AACPLUS;    case MP4AUDIO_PS:      return ENH_AACPLUS;    default:      return -1;  }}bool AACDecoder::setup(uint32_t sampleRate, uint8_t channelCount,                       uint8_t bitDepth) {  PVMP4AudioDecoderResetBuffer(pMem);  assert(PVMP4AudioDecoderInitLibrary(aacDecoder, pMem) == MP4AUDEC_SUCCESS);  firstFrame = true;  return true;}bool AACDecoder::setup(AudioContainer* container) {  PVMP4AudioDecoderResetBuffer(pMem);  assert(PVMP4AudioDecoderInitLibrary(aacDecoder, pMem) == MP4AUDEC_SUCCESS);  firstFrame = true;  return true;}uint8_t* AACDecoder::decode(uint8_t* inData, uint32_t& inLen,                            uint32_t& outLen) {  if (!inData || inLen == 0)    return nullptr;  aacDecoder->inputBufferCurrentLength = inLen;  aacDecoder->inputBufferUsedLength = 0;  aacDecoder->inputBufferMaxLength = inLen;  aacDecoder->pInputBuffer = inData;  aacDecoder->remainderBits = 0;  aacDecoder->repositionFlag = true;  int32_t status;  status = PVMP4AudioDecodeFrame(aacDecoder, pMem);  if (status != MP4AUDEC_SUCCESS) {    outLen = 0;    inLen = 0;    return nullptr;  } else {    inLen -= aacDecoder->inputBufferUsedLength;  }  outLen = aacDecoder->frameLength * sizeof(int16_t);  // Handle AAC+  if (aacDecoder->aacPlusUpsamplingFactor == 2) {    outLen *= 2;  }  outLen *= aacDecoder->desiredChannels;  return (uint8_t*)&outputBuffer[0];}
 |