Skip to content

Commit d17c2ac

Browse files
committed
Improve aac file detection
1 parent a54c9f9 commit d17c2ac

File tree

2 files changed

+40
-25
lines changed

2 files changed

+40
-25
lines changed

src/AudioTools/AudioCodecs/HeaderParserMP3.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -229,16 +229,17 @@ class HeaderParserMP3 {
229229
break;
230230
}
231231

232-
readFrameHeader(data+sync_pos);
232+
readFrameHeader(data + sync_pos);
233233
is_valid_mp3 = validate(data + sync_pos, len_available);
234234

235235
// check expected expected end of frame ( next frame)
236236
int frame_len = getFrameLength();
237-
if (is_valid_mp3 && frame_len > 0){
238-
int expected_next_frame = sync_pos + getFrameLength();
239-
int pos = seekFrameSync(data + expected_next_frame, len - expected_next_frame);
240-
LOGI("- end frame found: %s", pos==0?"yes": "no");
241-
if (pos !=0) is_valid_mp3 = false;
237+
if (is_valid_mp3 && frame_len > 0) {
238+
int expected_next_frame = sync_pos + getFrameLength();
239+
int pos = seekFrameSync(data + expected_next_frame,
240+
len - expected_next_frame);
241+
LOGI("- end frame found: %s", pos == 0 ? "yes" : "no");
242+
if (pos != 0) is_valid_mp3 = false;
242243
}
243244

244245
// find end sync
@@ -256,10 +257,10 @@ class HeaderParserMP3 {
256257
LOGI("is mp3: %s", is_valid_mp3 ? "yes" : "no");
257258
LOGI("frame size: %d", getFrameLength());
258259
LOGI("sample rate: %u", getSampleRate());
259-
// LOGI("bit rate index: %d", getFrameHeader().BitrateIndex);
260+
// LOGI("bit rate index: %d", getFrameHeader().BitrateIndex);
260261
LOGI("bit rate: %d", getBitRate());
261262
LOGI("Padding: %d", getFrameHeader().Padding);
262-
LOGI("Layer: %s (0x%x)", getLayerStr(),(int) getFrameHeader().Layer);
263+
LOGI("Layer: %s (0x%x)", getLayerStr(), (int)getFrameHeader().Layer);
263264
LOGI("Version: %s (0x%x)", getVersionStr(),
264265
(int)getFrameHeader().AudioVersion);
265266
LOGI("-------------------");
@@ -304,8 +305,7 @@ class HeaderParserMP3 {
304305
int findSyncWord(const uint8_t* buf, size_t nBytes, uint8_t synch = 0xFF,
305306
uint8_t syncl = 0xF0) {
306307
for (int i = 0; i < nBytes - 1; i++) {
307-
if ((buf[i + 0] & synch) == synch &&
308-
(buf[i + 1] & syncl) == syncl)
308+
if ((buf[i + 0] & synch) == synch && (buf[i + 1] & syncl) == syncl)
309309
return i;
310310
}
311311
return -1;
@@ -321,6 +321,7 @@ class HeaderParserMP3 {
321321
}
322322

323323
bool contains(const uint8_t* data, const char* toFind, size_t len) {
324+
if (data == nullptr || len == 0) return false;
324325
int find_str_len = strlen(toFind);
325326
for (int j = 0; j < len - find_str_len; j++) {
326327
if (memcmp(data + j, toFind, find_str_len) == 0) return true;

src/AudioTools/CoreAudio/AudioMetaData/MimeDetector.h

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

3-
#include "AudioTools/AudioCodecs/HeaderParserMP3.h"
43
#include "AudioTools/AudioCodecs/HeaderParserAAC.h"
4+
#include "AudioTools/AudioCodecs/HeaderParserMP3.h"
55
#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
66

77
namespace audio_tools {
@@ -23,11 +23,12 @@ namespace audio_tools {
2323
class MimeDetector {
2424
public:
2525
MimeDetector() {
26-
setCheck("audio/mpeg", checkMP3Ext);
27-
setCheck("audio/aac", checkAACExt);
2826
setCheck("audio/vnd.wave", checkWAV);
2927
setCheck("audio/ogg", checkOGG);
3028
setCheck("video/MP2T", checkMP2T);
29+
setCheck("audio/prs.sid", checkSID);
30+
setCheck("audio/mpeg", checkMP3Ext);
31+
setCheck("audio/aac", checkAACExt);
3132
}
3233

3334
bool begin() {
@@ -37,6 +38,7 @@ class MimeDetector {
3738

3839
/// write the header to determine the mime
3940
size_t write(uint8_t* data, size_t len) {
41+
actual_mime = default_mime;
4042
determineMime(data, len);
4143
return len;
4244
}
@@ -63,25 +65,29 @@ class MimeDetector {
6365

6466
/// Provides the actual mime type, that was determined from the first
6567
/// available data
66-
const char* mime() { return actual_mime; }
68+
const char* mime() {
69+
return actual_mime;
70+
}
6771

6872
static bool checkAAC(uint8_t* start, size_t len) {
6973
return start[0] == 0xFF &&
7074
(start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9);
7175
}
7276

7377
static bool checkAACExt(uint8_t* start, size_t len) {
74-
// quick check
75-
if (!(start[0] == 0xFF &&
76-
(start[1] == 0xF0 || start[1] == 0xF1 || start[1] == 0xF9)))
77-
return false;
78-
HeaderParserMP3 mp3;
78+
// checking logic for files
79+
if (memcmp(start+4, "ftypM4A", 7) == 0) {
80+
return true;
81+
}
82+
// check for streaming
83+
HeaderParserAAC aac;
7984
// it should start with a synch word
80-
if (mp3.findSyncWord((const uint8_t*)start, len) != 0) {
85+
int pos = aac.findSyncWord((const uint8_t*)start, len);
86+
if (pos == -1) {
8187
return false;
8288
}
8389
// make sure that it is not an mp3
84-
if (mp3.isValid(start, len)) {
90+
if (aac.isValid(start+pos, len-pos)) {
8591
return false;
8692
}
8793
return true;
@@ -98,7 +104,7 @@ class MimeDetector {
98104
}
99105

100106
static bool checkWAV(uint8_t* start, size_t len) {
101-
return memcmp(start, "OggS", 4) == 0;
107+
return memcmp(start, "RIFF", 4) == 0;
102108
}
103109

104110
static bool checkOGG(uint8_t* start, size_t len) {
@@ -107,12 +113,19 @@ class MimeDetector {
107113

108114
/// MPEG-2 TS Byte Stream Format
109115
static bool checkMP2T(uint8_t* start, size_t len) {
110-
if (len < 189)
111-
return start[0] == 0x47;
116+
if (len < 189) return start[0] == 0x47;
112117

113118
return start[0] == 0x47 && start[188] == 0x47;
114119
}
115120

121+
/// Commodore 64 SID File
122+
static bool checkSID(uint8_t* start, size_t len) {
123+
return memcmp(start, "PSID", 4) == 0 || memcmp(start, "RSID", 4) == 0;
124+
}
125+
126+
/// Provides the default mime type if no mime could be determined
127+
void setDefaultMime(const char* mime) { default_mime = mime; }
128+
116129
protected:
117130
struct Check {
118131
const char* mime = nullptr;
@@ -126,6 +139,7 @@ class MimeDetector {
126139
Vector<Check> checks{0};
127140
bool is_first = false;
128141
const char* actual_mime = nullptr;
142+
const char* default_mime = nullptr;
129143
void (*notifyMimeCallback)(const char* mime) = nullptr;
130144

131145
/// Update the mime type
@@ -147,7 +161,7 @@ class MimeDetector {
147161
return l_check.mime;
148162
}
149163
}
150-
return nullptr;
164+
return default_mime;
151165
}
152166
};
153167

0 commit comments

Comments
 (0)