| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | 
							- #include "EncodedAudioStream.h"
 
- #include <string.h>     // for memcpy, memmove
 
- #include <stdexcept>    // for runtime_error
 
- #include <type_traits>  // for remove_extent_t
 
- #include <utility>      // for move
 
- #include "BellLogger.h"      // for AbstractLogger, BELL_LOG, bell
 
- #include "ByteStream.h"      // for ByteStream
 
- #include "DecoderGlobals.h"  // for DecodersInstance, decodersInstance, AAC_...
 
- using namespace bell;
 
- EncodedAudioStream::EncodedAudioStream() {
 
-   bell::decodersInstance->ensureAAC();
 
-   bell::decodersInstance->ensureMP3();
 
-   inputBuffer = std::vector<uint8_t>(1024 * 4);
 
-   outputBuffer = std::vector<short>(2 * 2 * 4 * 4);
 
-   decodePtr = inputBuffer.data();
 
- }
 
- EncodedAudioStream::~EncodedAudioStream() {
 
-   this->innerStream->close();
 
- }
 
- void EncodedAudioStream::openWithStream(
 
-     std::unique_ptr<bell::ByteStream> byteStream) {
 
-   if (this->innerStream) {
 
-     this->innerStream->close();
 
-   }
 
-   this->innerStream = std::move(byteStream);
 
-   this->guessDataFormat();
 
- }
 
- bool EncodedAudioStream::vectorStartsWith(std::vector<uint8_t>& vec,
 
-                                           std::vector<uint8_t>& start) {
 
-   if (vec.size() < start.size()) {
 
-     return false;
 
-   }
 
-   for (int i = 0; i < start.size(); i++) {
 
-     if (vec[i] != start[i]) {
 
-       return false;
 
-     }
 
-   }
 
-   return true;
 
- }
 
- size_t EncodedAudioStream::decodeFrame(uint8_t* dst) {
 
-   if (innerStream->size() != 0 &&
 
-       innerStream->position() >= innerStream->size()) {
 
-     return 0;
 
-   }
 
-   switch (this->codec) {
 
-     case AudioCodec::AAC:
 
-       return decodeFrameAAC(dst);
 
-       break;
 
-     case AudioCodec::MP3:
 
-       return decodeFrameMp3(dst);
 
-       break;
 
-     default:
 
-       break;
 
-   }
 
-   return 0;
 
- }
 
- size_t EncodedAudioStream::decodeFrameMp3(uint8_t* dst) {
 
-   size_t writtenBytes = 0;
 
-   int bufSize = MP3_READBUF_SIZE;
 
-   int readBytes = innerStream->read(inputBuffer.data() + bytesInBuffer,
 
-                                     bufSize - bytesInBuffer);
 
-   if (readBytes > 0) {
 
-     bytesInBuffer += readBytes;
 
-     decodePtr = inputBuffer.data();
 
-     offset = MP3FindSyncWord(inputBuffer.data(), bytesInBuffer);
 
-     if (offset != -1) {
 
-       bytesInBuffer -= offset;
 
-       decodePtr += offset;
 
-       int decodeStatus =
 
-           MP3Decode(bell::decodersInstance->mp3Decoder, &decodePtr,
 
-                     &bytesInBuffer, outputBuffer.data(), 0);
 
-       MP3GetLastFrameInfo(bell::decodersInstance->mp3Decoder, &mp3FrameInfo);
 
-       if (decodeStatus == ERR_MP3_NONE) {
 
-         decodedSampleRate = mp3FrameInfo.samprate;
 
-         writtenBytes =
 
-             (mp3FrameInfo.bitsPerSample / 8) * mp3FrameInfo.outputSamps;
 
-         memcpy(dst, outputBuffer.data(), writtenBytes);
 
-       } else {
 
-         BELL_LOG(info, TAG, "Error in frame, moving two bytes %d",
 
-                  decodeStatus);
 
-         decodePtr += 1;
 
-         bytesInBuffer -= 1;
 
-       }
 
-     } else {
 
-       BELL_LOG(info, TAG, "Unexpected error in data, skipping a word");
 
-       decodePtr += 3800;
 
-       bytesInBuffer -= 3800;
 
-     }
 
-     memmove(inputBuffer.data(), decodePtr, bytesInBuffer);
 
-   }
 
-   return writtenBytes;
 
- }
 
- bool EncodedAudioStream::isReadable() {
 
-   return this->codec != AudioCodec::NONE;
 
- }
 
- size_t EncodedAudioStream::decodeFrameAAC(uint8_t* dst) {
 
-   return 0;
 
-   // size_t writtenBytes = 0;
 
-   // auto bufSize = AAC_READBUF_SIZE;
 
-   // int readBytes = innerStream->read(inputBuffer.data() + bytesInBuffer,
 
-   //                                   bufSize - bytesInBuffer);
 
-   // if (readBytes > 0) {
 
-   //   bytesInBuffer += readBytes;
 
-   //   decodePtr = inputBuffer.data();
 
-   //   offset = AACFindSyncWord(inputBuffer.data(), bytesInBuffer);
 
-   //   if (offset != -1) {
 
-   //     bytesInBuffer -= offset;
 
-   //     decodePtr += offset;
 
-   //     int decodeStatus =
 
-   //         AACDecode(bell::decodersInstance->aacDecoder, &decodePtr,
 
-   //                   &bytesInBuffer, outputBuffer.data());
 
-   //     AACGetLastFrameInfo(bell::decodersInstance->aacDecoder, &aacFrameInfo);
 
-   //     if (decodeStatus == ERR_AAC_NONE) {
 
-   //       decodedSampleRate = aacFrameInfo.sampRateOut;
 
-   //       writtenBytes =
 
-   //           (aacFrameInfo.bitsPerSample / 8) * aacFrameInfo.outputSamps;
 
-   //       memcpy(dst, outputBuffer.data(), writtenBytes);
 
-   //     } else {
 
-   //       BELL_LOG(info, TAG, "Error in frame, moving two bytes %d",
 
-   //                decodeStatus);
 
-   //       decodePtr += 1;
 
-   //       bytesInBuffer -= 1;
 
-   //     }
 
-   //   } else {
 
-   //     BELL_LOG(info, TAG, "Unexpected error in data, skipping a word");
 
-   //     decodePtr += 3800;
 
-   //     bytesInBuffer -= 3800;
 
-   //   }
 
-   //   memmove(inputBuffer.data(), decodePtr, bytesInBuffer);
 
-   // }
 
-   // return writtenBytes;
 
- }
 
- void EncodedAudioStream::guessDataFormat() {
 
-   // Read 14 bytes from the stream
 
-   this->innerStream->read(inputBuffer.data(), 14);
 
-   bytesInBuffer = 14;
 
-   BELL_LOG(info, TAG, "No codec set, reading secret bytes");
 
-   if (vectorStartsWith(inputBuffer, this->mp3MagicBytesIdc) ||
 
-       vectorStartsWith(inputBuffer, this->mp3MagicBytesUntagged)) {
 
-     BELL_LOG(info, TAG, "Detected MP3");
 
-     codec = AudioCodec::MP3;
 
-   } else if (vectorStartsWith(inputBuffer, this->aacMagicBytes) ||
 
-              vectorStartsWith(inputBuffer, this->aacMagicBytes4)) {
 
-     BELL_LOG(info, TAG, "Detected AAC");
 
-     codec = AudioCodec::AAC;
 
-   }
 
-   if (codec == AudioCodec::NONE) {
 
-     throw std::runtime_error("Codec not supported");
 
-   }
 
- }
 
- void EncodedAudioStream::readFully(uint8_t* dst, size_t nbytes) {}
 
 
  |