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");
259 frame.
size = size + 7;
260 frame.
mime =
"audio/aac";
264 frame.
mime =
"audio/alac";
267 frame.
mime =
"audio/mpeg";
270 frame.
mime =
nullptr;
303 LOGE(
"No callback defined for audio frame extraction");
322 static size_t last_index = -1;
323 static size_t last_size = -1;
338 last_size = nextSize;
353 int sampleRateIdx,
int channelCfg,
357 adts[2] = ((aacProfile - 1) << 6) | (sampleRateIdx << 2) |
358 ((channelCfg >> 2) & 0x1);
359 adts[3] = ((channelCfg & 0x3) << 6) | ((frameLen + 7) >> 11);
360 adts[4] = ((frameLen + 7) >> 3) & 0xFF;
361 adts[5] = (((frameLen + 7) & 0x7) << 5) | 0x1F;
458 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
462 uint8_t* p = (uint8_t*)#
463 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
467 uint32_t nextSize = 0;
481 if (
buffer ==
nullptr || type ==
nullptr)
return false;
482 bool result =
buffer[offset] == type[0] &&
buffer[offset + 1] == type[1] &&
483 buffer[offset + 2] == type[2] &&
484 buffer[offset + 3] == type[3];
519 int sampleRateIdx = 4;
539 LOGE(
"Failed to parse esds box");
543 "-> esds: AAC objectType: %u, samplingRateIdx: %u, "
627 if (sampleSize != 0) {
680 const uint8_t* data = box.
data;
682 LOGI(
"===========================");
683 for (
size_t i = 0; i < len; i += 16) {
685 char ascii[17] = {0};
686 for (
size_t j = 0; j < 16 && i + j < len; ++j) {
687 sprintf(hex + j * 3,
"%02X ", data[i + j]);
688 ascii[j] = (data[i + j] >= 32 && data[i + j] < 127) ? data[i + j] :
'.';
691 LOGI(
"%04zx: %-48s |%s|", i, hex, ascii);
693 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