arduino-audio-tools
Loading...
Searching...
No Matches
src
AudioTools
AudioCodecs
M4AAudioDemuxer.h
Go to the documentation of this file.
1
#pragma once
2
3
#include "
AudioTools/AudioCodecs/M4ACommonDemuxer.h
"
4
5
namespace
audio_tools
{
6
11
class
M4AAudioDemuxer
:
public
M4ACommonDemuxer
{
12
public
:
16
M4AAudioDemuxer
() {
setupParser
(); }
17
22
void
setCallback
(
FrameCallback
cb)
override
{
23
sampleExtractor
.
setReference
(
ref
);
24
sampleExtractor
.
setCallback
(cb);
25
}
26
30
bool
begin
() {
31
audio_config
.
codec
=
Codec::Unknown
;
32
audio_config
.
alacMagicCookie
.
clear
();
33
resize
(
default_size
);
34
35
stsz_processed
=
false
;
36
stco_processed
=
false
;
37
38
// When codec/sampleSizes/callback/ref change, update the extractor:
39
parser
.
begin
();
40
sampleExtractor
.
begin
();
41
return
true
;
42
}
43
49
void
write
(
const
uint8_t
* data,
size_t
len) {
parser
.
write
(data, len); }
50
55
int
availableForWrite
() {
return
parser
.
availableForWrite
(); }
56
61
Vector<uint8_t>
&
getALACMagicCookie
() {
return
audio_config
.
alacMagicCookie
; }
62
67
void
setReference
(
void
*
ref
) { this->ref =
ref
; }
68
69
void
copyFrom
(
M4ACommonDemuxer
& source) {
70
audio_config
= source.
getM4AAudioConfig
();
71
}
72
73
protected
:
74
void
*
ref
=
nullptr
;
75
79
void
setupParser
()
override
{
80
// global box data callback to get sizes
81
parser
.
setReference
(
this
);
82
83
// parsing for content of stsd (Sample Description Box)
84
parser
.
setCallback
(
"stsd"
, [](
MP4Parser::Box
& box,
void
*
ref
) {
85
static_cast<
M4AAudioDemuxer
*
>
(
ref
)->
onStsd
(box);
86
});
87
88
// parsing for content of stsd (Sample Description Box)
89
parser
.
setCallback
(
"esds"
, [](
MP4Parser::Box
& box,
void
*
ref
) {
90
static_cast<
M4AAudioDemuxer
*
>
(
ref
)->
onEsds
(box);
91
});
92
parser
.
setCallback
(
"mp4a"
, [](
MP4Parser::Box
& box,
void
*
ref
) {
93
static_cast<
M4AAudioDemuxer
*
>
(
ref
)->
onMp4a
(box);
94
});
95
parser
.
setCallback
(
"alac"
, [](
MP4Parser::Box
& box,
void
*
ref
) {
96
static_cast<
M4AAudioDemuxer
*
>
(
ref
)->
onAlac
(box);
97
});
98
99
// mdat
100
parser
.
setCallback
(
101
"mdat"
,
102
[](
MP4Parser::Box
& box,
void
*
ref
) {
103
M4AAudioDemuxer
& self = *
static_cast<
M4AAudioDemuxer
*
>
(
ref
);
104
// mdat must not be buffered
105
LOGI
(
"#%d Box: %s, size: %u of %u bytes"
, (
unsigned
) box.
seq
, box.
type
,(
unsigned
) box.
available
, (
unsigned
)box.
size
);
106
if
(box.
seq
== 0) self.
sampleExtractor
.
setMaxSize
(box.
size
);
107
size_t
written = self.
sampleExtractor
.
write
(box.
data
, box.
available
, box.
is_complete
);
108
assert
(written == box.
available
);
109
},
110
false
);
// 'false' prevents the generic callback from being executed
111
112
// stsz
113
parser
.
setCallback
(
114
"stsz"
,
115
[](
MP4Parser::Box
& box,
void
*
ref
) {
116
M4AAudioDemuxer
& self = *
static_cast<
M4AAudioDemuxer
*
>
(
ref
);
117
self.
onStsz
(box);
118
},
119
false
);
// 'false' prevents the generic callback from being executed
120
121
// parser.setCallback(
122
// "stco",
123
// [](MP4Parser::Box& box, void* ref) {
124
// M4AAudioDemuxer& self = *static_cast<M4AAudioDemuxer*>(ref);
125
// self.onStco(box);
126
// },
127
// false); // 'false' prevents the generic callback from being executed
128
}
129
};
130
131
}
// namespace audio_tools
LOGI
#define LOGI(...)
Definition
AudioLoggerIDF.h:28
M4ACommonDemuxer.h
assert
#define assert(T)
Definition
avr.h:10
audio_tools::M4AAudioDemuxer
A simple M4A audio data demuxer which is providing AAC, MP3 and ALAC frames.
Definition
M4AAudioDemuxer.h:11
audio_tools::M4AAudioDemuxer::ref
void * ref
Reference pointer for callbacks.
Definition
M4AAudioDemuxer.h:74
audio_tools::M4AAudioDemuxer::M4AAudioDemuxer
M4AAudioDemuxer()
Constructor. Sets up parser callbacks.
Definition
M4AAudioDemuxer.h:16
audio_tools::M4AAudioDemuxer::setupParser
void setupParser() override
Setup all parser callbacks.
Definition
M4AAudioDemuxer.h:79
audio_tools::M4AAudioDemuxer::getALACMagicCookie
Vector< uint8_t > & getALACMagicCookie()
Returns the ALAC magic cookie (codec config).
Definition
M4AAudioDemuxer.h:61
audio_tools::M4AAudioDemuxer::begin
bool begin()
Initializes the demuxer and resets state.
Definition
M4AAudioDemuxer.h:30
audio_tools::M4AAudioDemuxer::copyFrom
void copyFrom(M4ACommonDemuxer &source)
Definition
M4AAudioDemuxer.h:69
audio_tools::M4AAudioDemuxer::availableForWrite
int availableForWrite()
Returns the available space for writing.
Definition
M4AAudioDemuxer.h:55
audio_tools::M4AAudioDemuxer::setReference
void setReference(void *ref)
Sets a reference pointer for callbacks.
Definition
M4AAudioDemuxer.h:67
audio_tools::M4AAudioDemuxer::write
void write(const uint8_t *data, size_t len)
Writes data to the demuxer for parsing.
Definition
M4AAudioDemuxer.h:49
audio_tools::M4AAudioDemuxer::setCallback
void setCallback(FrameCallback cb) override
Defines the callback that returns the audio frames.
Definition
M4AAudioDemuxer.h:22
audio_tools::M4ACommonDemuxer::SampleExtractor::write
size_t write(const uint8_t *data, size_t len, bool is_final)
Writes data to the extractor, extracting frames as sample sizes are met. Provides the data via the ca...
Definition
M4ACommonDemuxer.h:165
audio_tools::M4ACommonDemuxer::SampleExtractor::begin
void begin()
Resets the extractor state.
Definition
M4ACommonDemuxer.h:124
audio_tools::M4ACommonDemuxer::SampleExtractor::setCallback
void setCallback(FrameCallback cb)
Sets the callback to be called for each extracted frame.
Definition
M4ACommonDemuxer.h:139
audio_tools::M4ACommonDemuxer::SampleExtractor::setReference
void setReference(void *r)
Sets a reference pointer passed to the callback.
Definition
M4ACommonDemuxer.h:145
audio_tools::M4ACommonDemuxer::SampleExtractor::setMaxSize
void setMaxSize(size_t size)
Sets the maximum box size (e.g., for mdat). This is called before the mdat data is posted....
Definition
M4ACommonDemuxer.h:153
audio_tools::M4ACommonDemuxer
Abstract base class for M4A/MP4 demuxers. Provides shared functionality for both file-based and strea...
Definition
M4ACommonDemuxer.h:25
audio_tools::M4ACommonDemuxer::parser
MP4Parser parser
Underlying MP4 parser.
Definition
M4ACommonDemuxer.h:439
audio_tools::M4ACommonDemuxer::onEsds
void onEsds(const MP4Parser::Box &box)
Handles the esds (Elementary Stream Descriptor) box.
Definition
M4ACommonDemuxer.h:532
audio_tools::M4ACommonDemuxer::onStsd
void onStsd(const MP4Parser::Box &box)
Definition
M4ACommonDemuxer.h:486
audio_tools::M4ACommonDemuxer::sampleExtractor
SampleExtractor sampleExtractor
Extractor for audio samples.
Definition
M4ACommonDemuxer.h:437
audio_tools::M4ACommonDemuxer::onAlac
void onAlac(const MP4Parser::Box &box)
Handles the alac box.
Definition
M4ACommonDemuxer.h:587
audio_tools::M4ACommonDemuxer::onStsz
void onStsz(MP4Parser::Box &box)
Handles the stsz (Sample Size) box.
Definition
M4ACommonDemuxer.h:605
audio_tools::M4ACommonDemuxer::onMp4a
void onMp4a(const MP4Parser::Box &box)
Handles the mp4a box.
Definition
M4ACommonDemuxer.h:509
audio_tools::M4ACommonDemuxer::Codec::Unknown
@ Unknown
audio_tools::M4ACommonDemuxer::audio_config
M4AAudioConfig audio_config
Definition
M4ACommonDemuxer.h:443
audio_tools::M4ACommonDemuxer::default_size
size_t default_size
Default buffer size.
Definition
M4ACommonDemuxer.h:448
audio_tools::M4ACommonDemuxer::stsz_processed
bool stsz_processed
Marks the stsz table as processed.
Definition
M4ACommonDemuxer.h:440
audio_tools::M4ACommonDemuxer::resize
void resize(int size)
Definition
M4ACommonDemuxer.h:416
audio_tools::M4ACommonDemuxer::FrameCallback
std::function< void(const Frame &, void *ref)> FrameCallback
Definition
M4ACommonDemuxer.h:365
audio_tools::M4ACommonDemuxer::getM4AAudioConfig
M4AAudioConfig getM4AAudioConfig()
Definition
M4ACommonDemuxer.h:414
audio_tools::M4ACommonDemuxer::stco_processed
bool stco_processed
Marks the stco table as processed.
Definition
M4ACommonDemuxer.h:441
audio_tools::MP4Parser::begin
bool begin()
Initializes the parser.
Definition
MP4Parser.h:107
audio_tools::MP4Parser::setCallback
void setCallback(BoxCallback cb)
Defines the generic callback for all boxes.
Definition
MP4Parser.h:75
audio_tools::MP4Parser::availableForWrite
int availableForWrite()
Returns the available space for writing.
Definition
MP4Parser.h:151
audio_tools::MP4Parser::setReference
void setReference(void *ref)
Defines an optional reference. By default it is the parser itself.
Definition
MP4Parser.h:69
audio_tools::MP4Parser::write
size_t write(const uint8_t *data, size_t len)
Provide the data to the parser (in chunks if needed).
Definition
MP4Parser.h:130
audio_tools::Vector
Vector implementation which provides the most important methods as defined by std::vector....
Definition
Vector.h:21
audio_tools::Vector::clear
void clear()
Definition
Vector.h:176
audio_tools
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition
AudioCodecsBase.h:10
audio_tools::writeData
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition
AudioTypes.h:512
audio_tools::M4ACommonDemuxer::M4AAudioConfig::alacMagicCookie
Vector< uint8_t > alacMagicCookie
ALAC codec config.
Definition
M4ACommonDemuxer.h:41
audio_tools::M4ACommonDemuxer::M4AAudioConfig::codec
Codec codec
Current codec.
Definition
M4ACommonDemuxer.h:37
audio_tools::MP4Parser::Box
Represents an individual box in the MP4 file.
Definition
MP4Parser.h:33
audio_tools::MP4Parser::Box::data
const uint8_t * data
Pointer to box payload (not including header)
Definition
MP4Parser.h:40
audio_tools::MP4Parser::Box::available
int available
Number of bytes available as data.
Definition
MP4Parser.h:47
audio_tools::MP4Parser::Box::size
size_t size
Size of payload including subboxes (not including header)
Definition
MP4Parser.h:43
audio_tools::MP4Parser::Box::is_complete
bool is_complete
True if the box data is complete.
Definition
MP4Parser.h:48
audio_tools::MP4Parser::Box::seq
size_t seq
Sequence number for the box per id.
Definition
MP4Parser.h:38
audio_tools::MP4Parser::Box::type
char type[5]
4-character box type (null-terminated)
Definition
MP4Parser.h:39
Generated by
1.9.8