61 size_t write(uint8_t* data,
size_t len) {
68 void setCheck(
const char*
mime,
bool (*check)(uint8_t* start,
size_t len),
69 bool isActvie =
true) {
71 for (
int j = 0; j <
checks.size(); j++) {
73 if (mime_str.equals(l_check.
mime)) {
74 l_check.
check = check;
81 checks.push_back(check_to_add);
82 LOGI(
"MimeDetector for %s: %s",
mime, isActvie ?
"active" :
"inactive");
95 static bool checkAAC(uint8_t* start,
size_t len) {
96 return start[0] == 0xFF &&
97 (start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9);
102 if (memcmp(start + 4,
"ftypM4A", 7) == 0) {
114 if (!aac.
isValid(start + pos, len - pos)) {
127 return memcmp(start,
"ID3", 3) == 0 ||
128 (start[0] == 0xFF && ((start[1] & 0xE0) == 0xE0));
133 return mp3.
isValid(start, len);
137 if (memcmp(start,
"RIFF", 4) != 0)
return false;
139 header.
write(start, len);
140 if (!header.
parse())
return false;
148 return memcmp(start,
"RIFF", 4) == 0;
152 return memcmp(start,
"OggS", 4) == 0;
156 if (len < 4)
return false;
159 if (memcmp(start,
"fLaC", 4) == 0) {
168 if (len >= 32 && memcmp(start,
"OggS", 4) == 0) {
171 for (
size_t i = 4; i < len - 4 && i < 64; i++) {
172 if (memcmp(start + i,
"FLAC", 4) == 0) {
176 if (i < len - 5 && start[i] == 0x7F &&
177 memcmp(start + i + 1,
"FLAC", 4) == 0) {
200 if (len >= 32 && memcmp(start,
"OggS", 4) == 0) {
203 for (
size_t i = 4; i < len - 8 && i < 80; i++) {
204 if (memcmp(start + i,
"OpusHead", 8) == 0) {
227 if (len >= 32 && memcmp(start,
"OggS", 4) == 0) {
230 for (
size_t i = 4; i < len - 7 && i < 80; i++) {
231 if (start[i] == 0x01 && memcmp(start + i + 1,
"vorbis", 6) == 0) {
242 if (len < 189)
return start[0] == 0x47;
244 return start[0] == 0x47 && start[188] == 0x47;
249 if (len < 4)
return false;
250 return memcmp(start,
"DSD ", 4) == 0;
265 if (len < 7)
return false;
266 if (start[0] != 0x0B || start[1] != 0x77)
return false;
267 uint8_t bsid = start[5] >> 3;
282 if (len < 7)
return false;
283 if (start[0] != 0x0B || start[1] != 0x77)
return false;
284 uint8_t bsid = start[5] >> 3;
285 return bsid >= 11 && bsid <= 16;
290 return memcmp(start,
"PSID", 4) == 0 || memcmp(start,
"RSID", 4) == 0;
293 static bool checkM4A(uint8_t* header,
size_t len) {
294 if (len < 12)
return false;
297 if (memcmp(header,
"ID3", 3) == 0)
return false;
300 if (memcmp(header + 4,
"ftyp", 4) != 0)
return false;
303 if (memcmp(header + 8,
"M4A ", 4) == 0 ||
304 memcmp(header + 8,
"mp42", 4) == 0 ||
305 memcmp(header + 8,
"isom", 4) == 0)
317 for (
auto& check :
checks) {
319 check.is_active = active;
320 LOGI(
"MimeDetector for %s: %s", check.mime,
321 check.is_active ?
"active" :
"inactive");
338 bool (*
check)(uint8_t* data,
size_t len) =
nullptr;
365 for (
int j = 0; j <
checks.size(); j++) {
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28