6#include "M4AAudioDemuxer.h"
28 using M4ACommonDemuxer::FrameCallback;
51 if (decoder.getOutput() ==
nullptr) {
52 LOGE(
"No output defined for MultiDecoder");
56 LOGI(
"Decoding frame: %s with %d bytes", frame.mime, (
int)frame.size);
58 LOGE(
"Failed to select decoder for %s", frame.mime);
61 decoder.write(frame.data, frame.size);
70 void setCallback(FrameCallback cb)
override { frame_callback = cb; }
87 M4ACommonDemuxer::begin();
89 if (!file)
return false;
95 if (!checkMdat())
return false;
105 audio_config.
codec = M4ACommonDemuxer::Codec::Unknown;
111 stsd_processed =
false;
129 if (currentSize == 0)
return false;
130 if (!
p_file->seek(mdat_sample_pos))
return false;
133 if (bytesRead != currentSize)
return false;
136 mdat_sample_pos += currentSize;
147 uint32_t getMdatOffset()
const {
return mdat_offset; }
154 assert(
p_file !=
nullptr);
156 uint32_t currentSize = 0;
163 if (!
p_file->seek(pos))
return false;
165 size_t read_bytes =
p_file->read(
193 uint32_t stszOffset) {
211 while (
p_file->available()) {
235 uint64_t mdat_sample_pos = 0;
273 self->stsz_size = box.
size;
285 self->mdat_size = box.
size;
296 self->stsd_processed =
true;
309 frame_callback(frame,
nullptr);
311 LOGW(
"No frame callback defined");
325 uint8_t* cont =
buffer + 8;