Skip to content

Commit 8702e05

Browse files
committed
ContainerM4A: fix core dump
1 parent 40eac83 commit 8702e05

File tree

5 files changed

+31
-15
lines changed

5 files changed

+31
-15
lines changed

src/AudioTools/AudioCodecs/ContainerM4A.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,11 @@ class ContainerM4A : public ContainerDecoder {
6262
ContainerM4A* self = static_cast<ContainerM4A*>(ref);
6363
MultiDecoder& dec = *self->p_decoder;
6464
// select decoder based on mime type
65-
dec.selectDecoder(frame.mime);
65+
if (!dec.selectDecoder(frame.mime)){
66+
const char*mime = frame.mime ? frame.mime : "(nullptr)";
67+
LOGE("No decoder found for mime type: %s", mime);
68+
return;
69+
}
6670

6771
// process magic cookie if not done yet
6872
if (!self->is_magic_cookie_processed) {

src/AudioTools/AudioCodecs/M4AAudioDemuxer.h

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class M4AAudioDemuxer {
1818
*/
1919
struct Frame {
2020
Codec codec;
21-
const char* mime = "";
21+
const char* mime = nullptr;;
2222
const uint8_t* data;
2323
size_t size;
2424
uint64_t timestamp;
@@ -45,11 +45,12 @@ class M4AAudioDemuxer {
4545

4646
void setCodec(M4AAudioDemuxer::Codec c) { codec = c; }
4747

48-
void setCallback(FrameCallback cb, void* r) {
48+
void setCallback(FrameCallback cb) {
4949
callback = cb;
50-
ref = r;
5150
}
5251

52+
void setReference(void* r) { ref = r; }
53+
5354
void write(const uint8_t* data, size_t len, bool is_final) {
5455
// Resize buffer to the current sample size
5556
size_t currentSize = currentSampleSize();
@@ -115,7 +116,7 @@ class M4AAudioDemuxer {
115116
frame.mime = "audio/mpeg";
116117
break;
117118
default:
118-
frame.mime = "unknown";
119+
frame.mime = nullptr;
119120
break;
120121
}
121122
if (callback) callback(frame, ref);
@@ -152,34 +153,45 @@ class M4AAudioDemuxer {
152153

153154
M4AAudioDemuxer(FrameCallback cb) : callback(cb) {
154155
parser.setReference(this);
155-
// Generic callback which just provides the data in the buffer
156156
parser.setCallback(boxCallback);
157157

158+
sampleExtractor.setReference(this);
159+
sampleExtractor.setCallback(callback);
160+
158161
// incremental data callback
159162
parser.setDataCallback(boxDataCallback);
160163

161164
// Add more as needed...
162-
parser.begin();
165+
// parser.begin();
163166
}
164167

165168
void begin() {
166-
parser.begin();
167169
codec = Codec::Unknown;
168170
alacMagicCookie.clear();
171+
resize(1024);
169172

170173
// When codec/sampleSizes/callback/ref change, update the extractor:
174+
parser.begin();
171175
sampleExtractor.begin();
172-
sampleExtractor.setCallback(callback, ref);
173176
}
174177

175178
void write(const uint8_t* data, size_t len) { parser.write(data, len); }
176179

177180
int availableForWrite() { return parser.availableForWrite(); }
178181

179182
Vector<uint8_t>& getAlacMagicCookie() { return alacMagicCookie; }
180-
void setReference(void* ref) { parser.setReference(ref); }
181183

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:
183195
FrameCallback callback;
184196
MP4ParserIncremental parser;
185197
Codec codec = Codec::Unknown;
@@ -197,7 +209,7 @@ class M4AAudioDemuxer {
197209
static void boxCallback(MP4Parser::Box& box, void* ref) {
198210
M4AAudioDemuxer& self = *static_cast<M4AAudioDemuxer*>(ref);
199211
if (self.isRelevantBox(box.type)) {
200-
self.buffer.resize(box.size);
212+
self.resize(box.size);
201213
self.buffer.clear();
202214
if (box.data_size > 0) self.buffer.writeArray(box.data, box.data_size);
203215
}
@@ -348,8 +360,7 @@ class M4AAudioDemuxer {
348360
size_t size = box.data_size;
349361
if (size < 4) return;
350362
uint32_t entryCount = readU32(data);
351-
Vector<size_t>& chunkOffsets =
352-
sampleExtractor.getChunkOffsets();
363+
Vector<size_t>& chunkOffsets = sampleExtractor.getChunkOffsets();
353364
chunkOffsets.clear();
354365
if (size < 4 + 4 * entryCount) return;
355366
for (uint32_t i = 0; i < entryCount; ++i) {

src/AudioTools/AudioCodecs/MultiDecoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class MultiDecoder : public AudioDecoder {
7272
/// automatically from the determined mime type
7373
bool selectDecoder(const char* mime) {
7474
bool result = false;
75-
if (mime = nullptr) return false;
75+
if (mime == nullptr) return false;
7676
// do nothing if no change
7777
if (StrView(mime).equals(actual_decoder.mime)) {
7878
is_first = false;

tests-cmake/codec/m4a/CMakeLists.txt renamed to tests-cmake/codec/container-m4a/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ target_compile_options(m4a PRIVATE -Wno-multichar)
4242

4343
# set compile optioins
4444
target_compile_options(arduino-audio-tools INTERFACE -Wno-inconsistent-missing-override)
45+
target_compile_definitions(arduino-audio-tools INTERFACE -DUSE_ALLOCATOR)
4546

4647
# specify libraries
4748
target_link_libraries(m4a PRIVATE
File renamed without changes.

0 commit comments

Comments
 (0)