@@ -69,7 +69,7 @@ class ContainerM4A : public ContainerDecoder {
69
69
bool begin () override {
70
70
TRACED ();
71
71
is_active = true ;
72
- state = ParserState::WAITING_FOR_FTYP ;
72
+ state = ParserState::READING_BOX_HEADER ;
73
73
audio_track_id = -1 ;
74
74
sample_count = 0 ;
75
75
current_sample = 0 ;
@@ -99,25 +99,35 @@ class ContainerM4A : public ContainerDecoder {
99
99
void end () override {
100
100
TRACED ();
101
101
is_active = false ;
102
+ ftyp_found = false ;
102
103
if (p_decoder) p_decoder->end ();
103
104
}
104
105
105
106
size_t write (const uint8_t * data, size_t len) override {
106
107
if (!is_active || p_print == nullptr ) {
107
108
return 0 ;
108
109
}
110
+ // we expect the file to start with an ftype
111
+ int start = 0 ;
112
+ if (!ftyp_found){
113
+ start = findFtyp (data, len);
114
+ if (start >= 0 ){
115
+ ftyp_found = true ;
116
+ start -= 4 ;
117
+ } else {
118
+ // ignore all data
119
+ return len;
120
+ }
121
+ }
109
122
110
123
size_t processed = 0 ;
111
124
112
125
// Process input data byte by byte
113
- for (size_t i = 0 ; i < len; i++) {
126
+ for (size_t i = start ; i < len; i++) {
114
127
uint8_t byte = data[i];
115
128
processed++;
116
129
117
130
switch (state) {
118
- case ParserState::WAITING_FOR_FTYP:
119
- processFtyp (byte);
120
- break ;
121
131
122
132
case ParserState::READING_BOX_HEADER:
123
133
processBoxHeader (byte);
@@ -143,7 +153,6 @@ class ContainerM4A : public ContainerDecoder {
143
153
MultiDecoder* p_decoder = nullptr ;
144
154
145
155
enum class ParserState {
146
- WAITING_FOR_FTYP,
147
156
READING_BOX_HEADER,
148
157
READING_BOX_DATA,
149
158
READING_MDAT
@@ -176,8 +185,9 @@ class ContainerM4A : public ContainerDecoder {
176
185
uint64_t chunk_offset; // Using uint64_t to support co64 boxes
177
186
};
178
187
179
- ParserState state = ParserState::WAITING_FOR_FTYP ;
188
+ ParserState state = ParserState::READING_BOX_HEADER ;
180
189
bool is_active = false ;
190
+ bool ftyp_found = false ;
181
191
182
192
BoxHeader current_box;
183
193
Vector<BoxHeader> box_stack; // Track box hierarchy
@@ -237,34 +247,12 @@ class ContainerM4A : public ContainerDecoder {
237
247
const char * BOX_HDLR = " hdlr" ;
238
248
const char * BOX_ALAC = " alac" ;
239
249
240
- void processFtyp (uint8_t byte) {
241
- static uint8_t ftyp_signature[] = {' f' , ' t' , ' y' , ' p' };
242
- static int signature_pos = 0 ;
243
-
244
- // Skip first 4 bytes (box size)
245
- static int header_pos = 0 ;
246
- if (header_pos < 4 ) {
247
- header_pos++;
248
- file_offset++;
249
- return ;
250
- }
251
-
252
- // Check for ftyp signature
253
- if (byte == ftyp_signature[signature_pos]) {
254
- signature_pos++;
255
- file_offset++;
256
- if (signature_pos == 4 ) {
257
- // Found ftyp, move to general box parsing
258
- resetBoxHeader ();
259
- state = ParserState::READING_BOX_HEADER;
260
- signature_pos = 0 ;
261
- header_pos = 0 ;
262
- }
263
- } else {
264
- // Reset if signature doesn't match
265
- signature_pos = 0 ;
266
- file_offset++;
250
+ size_t findFtyp (const uint8_t * data, size_t len) {
251
+ for (int j = 0 ; j < len-4 ; j++){
252
+ if (data[j]==' f' && data[j+1 ]==' t' && data[j+2 ]==' y' && data[j+3 ]==' p' )
253
+ return true ;
267
254
}
255
+ return false ;
268
256
}
269
257
270
258
void resetBoxHeader () {
0 commit comments