@@ -18,7 +18,7 @@ class M4AAudioDemuxer {
18
18
*/
19
19
struct Frame {
20
20
Codec codec;
21
- const char * mime = " " ;
21
+ const char * mime = nullptr ; ;
22
22
const uint8_t * data;
23
23
size_t size;
24
24
uint64_t timestamp;
@@ -45,11 +45,12 @@ class M4AAudioDemuxer {
45
45
46
46
void setCodec (M4AAudioDemuxer::Codec c) { codec = c; }
47
47
48
- void setCallback (FrameCallback cb, void * r ) {
48
+ void setCallback (FrameCallback cb) {
49
49
callback = cb;
50
- ref = r;
51
50
}
52
51
52
+ void setReference (void * r) { ref = r; }
53
+
53
54
void write (const uint8_t * data, size_t len, bool is_final) {
54
55
// Resize buffer to the current sample size
55
56
size_t currentSize = currentSampleSize ();
@@ -115,7 +116,7 @@ class M4AAudioDemuxer {
115
116
frame.mime = " audio/mpeg" ;
116
117
break ;
117
118
default :
118
- frame.mime = " unknown " ;
119
+ frame.mime = nullptr ;
119
120
break ;
120
121
}
121
122
if (callback) callback (frame, ref);
@@ -152,34 +153,45 @@ class M4AAudioDemuxer {
152
153
153
154
M4AAudioDemuxer (FrameCallback cb) : callback(cb) {
154
155
parser.setReference (this );
155
- // Generic callback which just provides the data in the buffer
156
156
parser.setCallback (boxCallback);
157
157
158
+ sampleExtractor.setReference (this );
159
+ sampleExtractor.setCallback (callback);
160
+
158
161
// incremental data callback
159
162
parser.setDataCallback (boxDataCallback);
160
163
161
164
// Add more as needed...
162
- parser.begin ();
165
+ // parser.begin();
163
166
}
164
167
165
168
void begin () {
166
- parser.begin ();
167
169
codec = Codec::Unknown;
168
170
alacMagicCookie.clear ();
171
+ resize (1024 );
169
172
170
173
// When codec/sampleSizes/callback/ref change, update the extractor:
174
+ parser.begin ();
171
175
sampleExtractor.begin ();
172
- sampleExtractor.setCallback (callback, ref);
173
176
}
174
177
175
178
void write (const uint8_t * data, size_t len) { parser.write (data, len); }
176
179
177
180
int availableForWrite () { return parser.availableForWrite (); }
178
181
179
182
Vector<uint8_t >& getAlacMagicCookie () { return alacMagicCookie; }
180
- void setReference (void * ref) { parser.setReference (ref); }
181
183
182
- private:
184
+ void setReference (void * ref) {
185
+ this ->ref = ref;
186
+ }
187
+
188
+ void resize (int size) {
189
+ if (buffer.size () < size) {
190
+ buffer.resize (size);
191
+ }
192
+ }
193
+
194
+ protected:
183
195
FrameCallback callback;
184
196
MP4ParserIncremental parser;
185
197
Codec codec = Codec::Unknown;
@@ -197,7 +209,7 @@ class M4AAudioDemuxer {
197
209
static void boxCallback (MP4Parser::Box& box, void * ref) {
198
210
M4AAudioDemuxer& self = *static_cast <M4AAudioDemuxer*>(ref);
199
211
if (self.isRelevantBox (box.type )) {
200
- self.buffer . resize (box.size );
212
+ self.resize (box.size );
201
213
self.buffer .clear ();
202
214
if (box.data_size > 0 ) self.buffer .writeArray (box.data , box.data_size );
203
215
}
@@ -348,8 +360,7 @@ class M4AAudioDemuxer {
348
360
size_t size = box.data_size ;
349
361
if (size < 4 ) return ;
350
362
uint32_t entryCount = readU32 (data);
351
- Vector<size_t >& chunkOffsets =
352
- sampleExtractor.getChunkOffsets ();
363
+ Vector<size_t >& chunkOffsets = sampleExtractor.getChunkOffsets ();
353
364
chunkOffsets.clear ();
354
365
if (size < 4 + 4 * entryCount) return ;
355
366
for (uint32_t i = 0 ; i < entryCount; ++i) {
0 commit comments