Tag Parser 10.3.1
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
mp4track.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_MP4TRACK_H
2#define TAG_PARSER_MP4TRACK_H
3
4#include "../abstracttrack.h"
5
6#include <memory>
7#include <vector>
8
9namespace TagParser {
10
11class Mp4Atom;
12class Mpeg4Descriptor;
13struct AvcConfiguration;
14struct Av1Configuration;
15struct TrackHeaderInfo;
16
18public:
20
21 std::uint8_t audioObjectType;
23 std::uint32_t sampleFrequency;
33 std::uint16_t coreCoderDelay;
34 std::uint8_t extensionFlag;
35 std::uint8_t layerNr;
36 std::uint8_t numOfSubFrame;
37 std::uint16_t layerLength;
38 std::uint8_t resilienceFlags;
39 std::uint8_t epConfig;
40};
41
43public:
45
46 std::uint8_t profile;
47 std::string userData;
48};
49
51public:
53
54 bool dependencyFlag() const;
55 bool urlFlag() const;
56 bool ocrFlag() const;
57 std::uint8_t priority() const;
58 std::uint8_t streamTypeId() const;
59 bool upstream() const;
60
61 std::uint16_t id;
62 std::uint8_t esDescFlags;
63 std::uint16_t dependsOnId;
64 std::string url;
65 std::uint16_t ocrId;
66 std::uint8_t objectTypeId;
67 std::uint8_t decCfgDescFlags;
68 std::uint32_t bufferSize;
69 std::uint32_t maxBitrate;
70 std::uint32_t averageBitrate;
71 std::unique_ptr<Mpeg4AudioSpecificConfig> audioSpecificConfig;
72 std::unique_ptr<Mpeg4VideoSpecificConfig> videoSpecificConfig;
73};
74
76 : id(0)
77 , esDescFlags(0)
78 , dependsOnId(0)
79 , ocrId(0)
80 , objectTypeId(0)
81 , decCfgDescFlags(0)
82 , bufferSize(0)
83 , maxBitrate(0)
84 , averageBitrate(0)
85{
86}
87
89{
90 return esDescFlags & 0x80;
91}
92
94{
95 return esDescFlags & 0x40;
96}
97
99{
100 return esDescFlags & 0x20;
101}
102
103inline std::uint8_t Mpeg4ElementaryStreamInfo::priority() const
104{
105 return esDescFlags & 0x1F;
106}
107
109{
110 return decCfgDescFlags >> 2;
111}
112
114{
115 return decCfgDescFlags & 0x02;
116}
117
119public:
120 Mp4Track(Mp4Atom &trakAtom);
121 ~Mp4Track() override;
122 TrackType type() const override;
123
124 // getter methods specific for MP4 tracks
125 Mp4Atom &trakAtom();
126 const std::vector<std::uint32_t> &sampleSizes() const;
127 unsigned int chunkOffsetSize() const;
128 std::uint32_t chunkCount() const;
129 std::uint32_t sampleToChunkEntryCount() const;
130 const Mpeg4ElementaryStreamInfo *mpeg4ElementaryStreamInfo() const;
131 const AvcConfiguration *avcConfiguration() const;
132 const Av1Configuration *av1Configuration() const;
133
134 // methods to parse configuration details from the track header
135 static std::unique_ptr<Mpeg4ElementaryStreamInfo> parseMpeg4ElementaryStreamInfo(
136 CppUtilities::BinaryReader &reader, Mp4Atom *esDescAtom, Diagnostics &diag);
137 static std::unique_ptr<Mpeg4AudioSpecificConfig> parseAudioSpecificConfig(
138 std::istream &stream, std::uint64_t startOffset, std::uint64_t size, Diagnostics &diag);
139 static std::unique_ptr<Mpeg4VideoSpecificConfig> parseVideoSpecificConfig(
140 CppUtilities::BinaryReader &reader, std::uint64_t startOffset, std::uint64_t size, Diagnostics &diag);
141
142 // methods to read the "index" (chunk offsets and sizes)
143 std::vector<std::uint64_t> readChunkOffsets(bool parseFragments, Diagnostics &diag);
144 std::vector<std::tuple<std::uint32_t, std::uint32_t, std::uint32_t>> readSampleToChunkTable(Diagnostics &diag);
145 std::vector<std::uint64_t> readChunkSizes(TagParser::Diagnostics &diag);
146
147 // methods to make the track header
148 void bufferTrackAtoms(Diagnostics &diag);
149 std::uint64_t requiredSize(Diagnostics &diag) const;
150 void makeTrack(Diagnostics &diag);
151 void makeTrackHeader(Diagnostics &diag);
152 void makeMedia(Diagnostics &diag);
153 void makeMediaInfo(Diagnostics &diag);
154 void makeSampleTable(Diagnostics &diag);
155
156 // methods to update chunk offsets
157 void updateChunkOffsets(const std::vector<std::int64_t> &oldMdatOffsets, const std::vector<std::int64_t> &newMdatOffsets);
158 void updateChunkOffsets(const std::vector<std::uint64_t> &chunkOffsets);
159 void updateChunkOffset(std::uint32_t chunkIndex, std::uint64_t offset);
160
161 static void addInfo(const AvcConfiguration &avcConfig, AbstractTrack &track);
162 static void addInfo(const Av1Configuration &av1Config, AbstractTrack &track);
163
164protected:
165 void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress) override;
166
167private:
168 // private helper methods
169 std::uint64_t accumulateSampleSizes(std::size_t &sampleIndex, std::size_t count, Diagnostics &diag);
170 void addChunkSizeEntries(
171 std::vector<std::uint64_t> &chunkSizeTable, std::size_t count, std::size_t &sampleIndex, std::uint32_t sampleCount, Diagnostics &diag);
172 TrackHeaderInfo verifyPresentTrackHeader() const;
173
174 Mp4Atom *m_trakAtom;
175 Mp4Atom *m_tkhdAtom;
176 Mp4Atom *m_mdiaAtom;
177 Mp4Atom *m_mdhdAtom;
178 Mp4Atom *m_hdlrAtom;
179 Mp4Atom *m_minfAtom;
180 Mp4Atom *m_stblAtom;
181 Mp4Atom *m_stsdAtom;
182 Mp4Atom *m_stscAtom;
183 Mp4Atom *m_stcoAtom;
184 Mp4Atom *m_stszAtom;
185 std::uint32_t m_rawMediaType;
186 std::uint16_t m_framesPerSample;
187 std::vector<std::uint32_t> m_sampleSizes;
188 unsigned int m_chunkOffsetSize;
189 std::uint32_t m_chunkCount;
190 std::uint32_t m_sampleToChunkEntryCount;
191 std::unique_ptr<Mpeg4ElementaryStreamInfo> m_esInfo;
192 std::unique_ptr<AvcConfiguration> m_avcConfig;
193 std::unique_ptr<Av1Configuration> m_av1Config;
194};
195
200{
201 return *m_trakAtom;
202}
203
211inline const std::vector<std::uint32_t> &Mp4Track::sampleSizes() const
212{
213 return m_sampleSizes;
214}
215
221inline unsigned int Mp4Track::chunkOffsetSize() const
222{
223 return m_chunkOffsetSize;
224}
225
229inline std::uint32_t Mp4Track::chunkCount() const
230{
231 return m_chunkCount;
232}
233
237inline std::uint32_t Mp4Track::sampleToChunkEntryCount() const
238{
239 return m_sampleToChunkEntryCount;
240}
241
250{
251 return m_esInfo.get();
252}
253
261{
262 return m_avcConfig.get();
263}
264
272{
273 return m_av1Config.get();
274}
275
276} // namespace TagParser
277
278#endif // TAG_PARSER_MP4TRACK_H
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:65
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38
Implementation of TagParser::AbstractTrack for the MP4 container.
Definition: mp4track.h:118
const Av1Configuration * av1Configuration() const
Returns the AV1 configuration.
Definition: mp4track.h:271
std::uint32_t chunkCount() const
Returns the number of chunks denoted by the stco atom.
Definition: mp4track.h:229
std::uint32_t sampleToChunkEntryCount() const
Returns the number of "sample to chunk" entries within the stsc atom.
Definition: mp4track.h:237
const std::vector< std::uint32_t > & sampleSizes() const
Returns the sample size table for the track.
Definition: mp4track.h:211
unsigned int chunkOffsetSize() const
Returns the size of a single chunk offset denotation within the stco atom.
Definition: mp4track.h:221
const Mpeg4ElementaryStreamInfo * mpeg4ElementaryStreamInfo() const
Returns information about the MPEG-4 elementary stream.
Definition: mp4track.h:249
const AvcConfiguration * avcConfiguration() const
Returns the AVC configuration.
Definition: mp4track.h:260
Mp4Atom & trakAtom()
Returns the trak atom for the current instance.
Definition: mp4track.h:199
The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAud...
Definition: mp4track.h:17
std::uint32_t extensionSampleFrequency
Definition: mp4track.h:29
std::uint8_t extensionChannelConfiguration
Definition: mp4track.h:30
std::uint8_t extensionSampleFrequencyIndex
Definition: mp4track.h:28
The Mpeg4ElementaryStreamInfo class holds MPEG-4 elementary stream info parsed using Mp4Track::parseM...
Definition: mp4track.h:50
std::unique_ptr< Mpeg4AudioSpecificConfig > audioSpecificConfig
Definition: mp4track.h:71
std::uint8_t priority() const
Definition: mp4track.h:103
std::uint8_t streamTypeId() const
Definition: mp4track.h:108
std::unique_ptr< Mpeg4VideoSpecificConfig > videoSpecificConfig
Definition: mp4track.h:72
The Mpeg4VideoSpecificConfig class holds MPEG-4 video specific config parsed using Mp4Track::parseVid...
Definition: mp4track.h:42
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TrackType
The TrackType enum specifies the underlying file type of a track and the concrete class of the track ...
Definition: abstracttrack.h:31
The Av1Configuration struct provides a parser for AV1 configuration found in ISOBMFF files.
The AvcConfiguration struct provides a parser for AVC configuration.
The TrackHeaderInfo struct holds information about the present track header (tkhd atom) and informati...
Definition: mp4track.cpp:36