| 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 bell
 
- using 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];
 
- }
 
 
  |