EncodedAudioStream.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "EncodedAudioStream.h"
  2. #include <iostream>
  3. using namespace bell;
  4. EncodedAudioStream::EncodedAudioStream() {
  5. bell::decodersInstance->ensureAAC();
  6. bell::decodersInstance->ensureMP3();
  7. inputBuffer = std::vector<uint8_t>(AAC_READBUF_SIZE * 4);
  8. outputBuffer = std::vector<short>(AAC_MAX_NCHANS * AAC_MAX_NSAMPS * 4 * 4);
  9. decodePtr = inputBuffer.data();
  10. }
  11. EncodedAudioStream::~EncodedAudioStream() {
  12. this->innerStream->close();
  13. }
  14. void EncodedAudioStream::openWithStream(
  15. std::unique_ptr<bell::ByteStream> byteStream) {
  16. if (this->innerStream) {
  17. this->innerStream->close();
  18. }
  19. this->innerStream = std::move(byteStream);
  20. this->guessDataFormat();
  21. }
  22. bool EncodedAudioStream::vectorStartsWith(std::vector<uint8_t>& vec,
  23. std::vector<uint8_t>& start) {
  24. if (vec.size() < start.size()) {
  25. return false;
  26. }
  27. for (int i = 0; i < start.size(); i++) {
  28. if (vec[i] != start[i]) {
  29. return false;
  30. }
  31. }
  32. return true;
  33. }
  34. size_t EncodedAudioStream::decodeFrame(uint8_t* dst) {
  35. if (innerStream->size() != 0 &&
  36. innerStream->position() >= innerStream->size()) {
  37. return 0;
  38. }
  39. switch (this->codec) {
  40. case AudioCodec::AAC:
  41. return decodeFrameAAC(dst);
  42. break;
  43. case AudioCodec::MP3:
  44. return decodeFrameMp3(dst);
  45. break;
  46. default:
  47. break;
  48. }
  49. return 0;
  50. }
  51. size_t EncodedAudioStream::decodeFrameMp3(uint8_t* dst) {
  52. size_t writtenBytes = 0;
  53. int bufSize = MP3_READBUF_SIZE;
  54. int readBytes = innerStream->read(inputBuffer.data() + bytesInBuffer,
  55. bufSize - bytesInBuffer);
  56. if (readBytes > 0) {
  57. bytesInBuffer += readBytes;
  58. decodePtr = inputBuffer.data();
  59. offset = MP3FindSyncWord(inputBuffer.data(), bytesInBuffer);
  60. if (offset != -1) {
  61. bytesInBuffer -= offset;
  62. decodePtr += offset;
  63. int decodeStatus =
  64. MP3Decode(bell::decodersInstance->mp3Decoder, &decodePtr,
  65. &bytesInBuffer, outputBuffer.data(), 0);
  66. MP3GetLastFrameInfo(bell::decodersInstance->mp3Decoder, &mp3FrameInfo);
  67. if (decodeStatus == ERR_MP3_NONE) {
  68. decodedSampleRate = mp3FrameInfo.samprate;
  69. writtenBytes =
  70. (mp3FrameInfo.bitsPerSample / 8) * mp3FrameInfo.outputSamps;
  71. memcpy(dst, outputBuffer.data(), writtenBytes);
  72. } else {
  73. BELL_LOG(info, TAG, "Error in frame, moving two bytes %d",
  74. decodeStatus);
  75. decodePtr += 1;
  76. bytesInBuffer -= 1;
  77. }
  78. } else {
  79. BELL_LOG(info, TAG, "Unexpected error in data, skipping a word");
  80. decodePtr += 3800;
  81. bytesInBuffer -= 3800;
  82. }
  83. memmove(inputBuffer.data(), decodePtr, bytesInBuffer);
  84. }
  85. return writtenBytes;
  86. }
  87. bool EncodedAudioStream::isReadable() {
  88. return this->codec != AudioCodec::NONE;
  89. }
  90. size_t EncodedAudioStream::decodeFrameAAC(uint8_t* dst) {
  91. size_t writtenBytes = 0;
  92. auto bufSize = AAC_READBUF_SIZE;
  93. int readBytes = innerStream->read(inputBuffer.data() + bytesInBuffer,
  94. bufSize - bytesInBuffer);
  95. if (readBytes > 0) {
  96. bytesInBuffer += readBytes;
  97. decodePtr = inputBuffer.data();
  98. offset = AACFindSyncWord(inputBuffer.data(), bytesInBuffer);
  99. if (offset != -1) {
  100. bytesInBuffer -= offset;
  101. decodePtr += offset;
  102. int decodeStatus =
  103. AACDecode(bell::decodersInstance->aacDecoder, &decodePtr,
  104. &bytesInBuffer, outputBuffer.data());
  105. AACGetLastFrameInfo(bell::decodersInstance->aacDecoder, &aacFrameInfo);
  106. if (decodeStatus == ERR_AAC_NONE) {
  107. decodedSampleRate = aacFrameInfo.sampRateOut;
  108. writtenBytes =
  109. (aacFrameInfo.bitsPerSample / 8) * aacFrameInfo.outputSamps;
  110. memcpy(dst, outputBuffer.data(), writtenBytes);
  111. } else {
  112. BELL_LOG(info, TAG, "Error in frame, moving two bytes %d",
  113. decodeStatus);
  114. decodePtr += 1;
  115. bytesInBuffer -= 1;
  116. }
  117. } else {
  118. BELL_LOG(info, TAG, "Unexpected error in data, skipping a word");
  119. decodePtr += 3800;
  120. bytesInBuffer -= 3800;
  121. }
  122. memmove(inputBuffer.data(), decodePtr, bytesInBuffer);
  123. }
  124. return writtenBytes;
  125. }
  126. void EncodedAudioStream::guessDataFormat() {
  127. // Read 14 bytes from the stream
  128. this->innerStream->read(inputBuffer.data(), 14);
  129. bytesInBuffer = 14;
  130. BELL_LOG(info, TAG, "No codec set, reading secret bytes");
  131. if (vectorStartsWith(inputBuffer, this->mp3MagicBytesIdc) ||
  132. vectorStartsWith(inputBuffer, this->mp3MagicBytesUntagged)) {
  133. BELL_LOG(info, TAG, "Detected MP3");
  134. codec = AudioCodec::MP3;
  135. } else if (vectorStartsWith(inputBuffer, this->aacMagicBytes) ||
  136. vectorStartsWith(inputBuffer, this->aacMagicBytes4)) {
  137. BELL_LOG(info, TAG, "Detected AAC");
  138. codec = AudioCodec::AAC;
  139. }
  140. if (codec == AudioCodec::NONE) {
  141. throw std::runtime_error("Codec not supported");
  142. }
  143. }
  144. void EncodedAudioStream::readFully(uint8_t* dst, size_t nbytes) {
  145. }