31 const char*
mime =
nullptr;
56 bool parse(
const uint8_t* data,
size_t size) {
57 const uint8_t* ptr = data;
58 const uint8_t* end = data + size;
60 if (ptr + 4 > end)
return false;
63 if (ptr >= end || *ptr++ != 0x03)
return false;
65 if (ptr + es_len > end)
return false;
70 if (ptr >= end || *ptr++ != 0x04)
return false;
72 if (ptr + dec_len > end)
return false;
77 if (ptr >= end || *ptr++ != 0x05)
return false;
79 if (ptr + dsi_len > end || dsi_len < 2)
return false;
81 uint8_t byte1 = ptr[0];
82 uint8_t byte2 = ptr[1];
95 for (
int i = 0; i < 4 && ptr < end; ++i) {
97 len = (len << 7) | (b & 0x7F);
98 if ((b & 0x80) == 0)
break;
165 size_t write(
const uint8_t* data,
size_t len,
bool is_final) {
168 if (currentSize == 0) {
169 LOGE(
"No sample size defined: e.g. mdat before stsz!");
175 for (
int j = 0; j < len; j++) {
185 LOGI(
"Reached end of box: %s write",
186 is_final ?
"final" :
"not final");
189 if (currentSize == 0) {
190 LOGE(
"No sample size defined, cannot write data");
262 frame.
size = size + 7;
263 frame.
mime =
"audio/aac";
267 frame.
mime =
"audio/alac";
270 frame.
mime =
"audio/mpeg";
273 frame.
mime =
"audio/ac3";
276 frame.
mime =
nullptr;
309 LOGE(
"No callback defined for audio frame extraction");
328 static size_t last_index = -1;
329 static size_t last_size = -1;
344 last_size = nextSize;
359 int sampleRateIdx,
int channelCfg,
363 adts[2] = ((aacProfile - 1) << 6) | (sampleRateIdx << 2) |
364 ((channelCfg >> 2) & 0x1);
365 adts[3] = ((channelCfg & 0x3) << 6) | ((frameLen + 7) >> 11);
366 adts[4] = ((frameLen + 7) >> 3) & 0xFF;
367 adts[5] = (((frameLen + 7) & 0x7) << 5) | 0x1F;
468 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
472 uint8_t* p = (uint8_t*)#
473 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
477 uint32_t nextSize = 0;
491 if (
buffer ==
nullptr || type ==
nullptr)
return false;
492 bool result =
buffer[offset] == type[0] &&
buffer[offset + 1] == type[1] &&
493 buffer[offset + 2] == type[2] &&
494 buffer[offset + 3] == type[3];
529 int sampleRateIdx = 4;
549 LOGE(
"Failed to parse esds box");
553 "-> esds: AAC objectType: %u, samplingRateIdx: %u, "
653 if (sampleSize != 0) {
706 const uint8_t* data = box.
data;
708 LOGI(
"===========================");
709 for (
size_t i = 0; i < len; i += 16) {
711 char ascii[17] = {0};
712 for (
size_t j = 0; j < 16 && i + j < len; ++j) {
713 sprintf(hex + j * 3,
"%02X ", data[i + j]);
714 ascii[j] = (data[i + j] >= 32 && data[i + j] < 127) ? data[i + j] :
'.';
717 LOGI(
"%04zx: %-48s |%s|", i, hex, ascii);
719 LOGI(
"===========================");
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define assert(T)
Definition avr.h:10
uint16_t stsz_sample_size_t
Sample size type optimized for microcontrollers.
Definition M4ACommonDemuxer.h:19