| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | #include "AACContainer.h"#include <cstring>  // for memmove#include "StreamInfo.h"  // for BitWidth, BitWidth::BW_16, SampleRate, Sampl...#include "aacdec.h"      // for AACFindSyncWordusing namespace bell;#define SYNC_WORLD_LEN 4AACContainer::AACContainer(std::istream& istr) : bell::AudioContainer(istr) {}bool AACContainer::fillBuffer() {  if (this->bytesInBuffer < AAC_MAX_FRAME_SIZE * 2) {    this->istr.read((char*)buffer.data() + bytesInBuffer,                    buffer.size() - bytesInBuffer);    this->bytesInBuffer += istr.gcount();  }  return this->bytesInBuffer >= AAC_MAX_FRAME_SIZE * 2;}std::byte* AACContainer::readSample(uint32_t& len) {  if (!this->fillBuffer()) {    len = 0;    return nullptr;  }  // Align the data if previous read was offseted  if (toConsume > 0 && toConsume <= bytesInBuffer) {    memmove(buffer.data(), buffer.data() + toConsume,            buffer.size() - toConsume);    bytesInBuffer = bytesInBuffer - toConsume;    toConsume = 0;  }  int startOffset =      AACFindSyncWord((uint8_t*)this->buffer.data(), bytesInBuffer);  if (startOffset < 0) {    // Discard word    toConsume = AAC_MAX_FRAME_SIZE;    return nullptr;  }  len = bytesInBuffer - startOffset;  return this->buffer.data() + startOffset;}void AACContainer::parseSetupData() {  channels = 2;  sampleRate = bell::SampleRate::SR_44100;  bitWidth = bell::BitWidth::BW_16;}
 |