Tag Parser  10.0.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 
9 namespace TagParser {
10 
11 class Mp4Atom;
12 class Mpeg4Descriptor;
13 struct AvcConfiguration;
14 struct Av1Configuration;
15 struct TrackHeaderInfo;
16 
18 public:
20 
21  std::uint8_t audioObjectType;
22  std::uint8_t sampleFrequencyIndex;
23  std::uint32_t sampleFrequency;
24  std::uint8_t channelConfiguration;
26  bool sbrPresent;
27  bool psPresent;
29  std::uint32_t extensionSampleFrequency;
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 
43 public:
45 
46  std::uint8_t profile;
47  std::string userData;
48 };
49 
51 public:
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 
103 inline std::uint8_t Mpeg4ElementaryStreamInfo::priority() const
104 {
105  return esDescFlags & 0x1F;
106 }
107 
108 inline std::uint8_t Mpeg4ElementaryStreamInfo::streamTypeId() const
109 {
110  return decCfgDescFlags >> 2;
111 }
112 
114 {
115  return decCfgDescFlags & 0x02;
116 }
117 
119 public:
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 
164 protected:
165  void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress) override;
166 
167 private:
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 
211 inline const std::vector<std::uint32_t> &Mp4Track::sampleSizes() const
212 {
213  return m_sampleSizes;
214 }
215 
221 inline unsigned int Mp4Track::chunkOffsetSize() const
222 {
223  return m_chunkOffsetSize;
224 }
225 
229 inline std::uint32_t Mp4Track::chunkCount() const
230 {
231  return m_chunkCount;
232 }
233 
237 inline 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