Tag Parser  8.2.0
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 
26  bool sbrPresent;
27  bool psPresent;
35  byte layerNr;
37  uint16 layerLength;
39  byte epConfig;
40 };
41 
43 public:
45 
46  byte profile;
47  std::string userData;
48 };
49 
51 public:
53 
54  bool dependencyFlag() const;
55  bool urlFlag() const;
56  bool ocrFlag() const;
57  byte priority() const;
58  byte streamTypeId() const;
59  bool upstream() const;
60 
61  uint16 id;
63  uint16 dependsOnId;
64  std::string url;
65  uint16 ocrId;
68  uint32 bufferSize;
69  uint32 maxBitrate;
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 
104 {
105  return esDescFlags & 0x1F;
106 }
107 
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<uint32> &sampleSizes() const;
127  unsigned int chunkOffsetSize() const;
128  uint32 chunkCount() const;
129  uint32 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  IoUtilities::BinaryReader &reader, Mp4Atom *esDescAtom, Diagnostics &diag);
137  static std::unique_ptr<Mpeg4AudioSpecificConfig> parseAudioSpecificConfig(
138  std::istream &stream, uint64 startOffset, uint64 size, Diagnostics &diag);
139  static std::unique_ptr<Mpeg4VideoSpecificConfig> parseVideoSpecificConfig(
140  IoUtilities::BinaryReader &reader, uint64 startOffset, uint64 size, Diagnostics &diag);
141 
142  // methods to read the "index" (chunk offsets and sizes)
143  std::vector<uint64> readChunkOffsets(bool parseFragments, Diagnostics &diag);
144  std::vector<std::tuple<uint32, uint32, uint32>> readSampleToChunkTable(Diagnostics &diag);
145  std::vector<uint64> readChunkSizes(TagParser::Diagnostics &diag);
146 
147  // methods to make the track header
148  void bufferTrackAtoms(Diagnostics &diag);
149  uint64 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<int64> &oldMdatOffsets, const std::vector<int64> &newMdatOffsets);
158  void updateChunkOffsets(const std::vector<uint64> &chunkOffsets);
159  void updateChunkOffset(uint32 chunkIndex, uint64 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) override;
166 
167 private:
168  // private helper methods
169  uint64 accumulateSampleSizes(size_t &sampleIndex, size_t count, Diagnostics &diag);
170  void addChunkSizeEntries(std::vector<uint64> &chunkSizeTable, size_t count, size_t &sampleIndex, uint32 sampleCount, Diagnostics &diag);
171  TrackHeaderInfo verifyPresentTrackHeader() const;
172 
173  Mp4Atom *m_trakAtom;
174  Mp4Atom *m_tkhdAtom;
175  Mp4Atom *m_mdiaAtom;
176  Mp4Atom *m_mdhdAtom;
177  Mp4Atom *m_hdlrAtom;
178  Mp4Atom *m_minfAtom;
179  Mp4Atom *m_stblAtom;
180  Mp4Atom *m_stsdAtom;
181  Mp4Atom *m_stscAtom;
182  Mp4Atom *m_stcoAtom;
183  Mp4Atom *m_stszAtom;
184  uint16 m_framesPerSample;
185  std::vector<uint32> m_sampleSizes;
186  unsigned int m_chunkOffsetSize;
187  uint32 m_chunkCount;
188  uint32 m_sampleToChunkEntryCount;
189  std::unique_ptr<Mpeg4ElementaryStreamInfo> m_esInfo;
190  std::unique_ptr<AvcConfiguration> m_avcConfig;
191  std::unique_ptr<Av1Configuration> m_av1Config;
192 };
193 
198 {
199  return *m_trakAtom;
200 }
201 
209 inline const std::vector<uint32> &Mp4Track::sampleSizes() const
210 {
211  return m_sampleSizes;
212 }
213 
219 inline unsigned int Mp4Track::chunkOffsetSize() const
220 {
221  return m_chunkOffsetSize;
222 }
223 
227 inline uint32 Mp4Track::chunkCount() const
228 {
229  return m_chunkCount;
230 }
231 
236 {
237  return m_sampleToChunkEntryCount;
238 }
239 
248 {
249  return m_esInfo.get();
250 }
251 
259 {
260  return m_avcConfig.get();
261 }
262 
270 {
271  return m_av1Config.get();
272 }
273 
274 } // namespace TagParser
275 
276 #endif // TAG_PARSER_MP4TRACK_H
const std::vector< uint32 > & sampleSizes() const
Returns the sample size table for the track.
Definition: mp4track.h:209
const AvcConfiguration * avcConfiguration() const
Returns the AVC configuration.
Definition: mp4track.h:258
The Mpeg4ElementaryStreamInfo class holds MPEG-4 elementary stream info parsed using Mp4Track::parseM...
Definition: mp4track.h:50
The TrackHeaderInfo struct holds information about the present track header (tkhd atom) and informati...
Definition: mp4track.cpp:39
const Mpeg4ElementaryStreamInfo * mpeg4ElementaryStreamInfo() const
Returns information about the MPEG-4 elementary stream.
Definition: mp4track.h:247
uint32 chunkCount() const
Returns the number of chunks denoted by the stco atom.
Definition: mp4track.h:227
The Av1Configuration struct provides a parser for AV1 configuration found in ISOBMFF files.
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38
unsigned int chunkOffsetSize() const
Returns the size of a single chunk offset denotation within the stco atom.
Definition: mp4track.h:219
The Mpeg4VideoSpecificConfig class holds MPEG-4 video specific config parsed using Mp4Track::parseVid...
Definition: mp4track.h:42
The AvcConfiguration struct provides a parser for AVC configuration.
Implementation of TagParser::AbstractTrack for the MP4 container.
Definition: mp4track.h:118
Mp4Atom & trakAtom()
Returns the trak atom for the current instance.
Definition: mp4track.h:197
The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAud...
Definition: mp4track.h:17
const Av1Configuration * av1Configuration() const
Returns the AV1 configuration.
Definition: mp4track.h:269
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:40
uint32 sampleToChunkEntryCount() const
Returns the number of "sample to chunk" entries within the stsc atom.
Definition: mp4track.h:235
std::unique_ptr< Mpeg4AudioSpecificConfig > audioSpecificConfig
Definition: mp4track.h:71
std::unique_ptr< Mpeg4VideoSpecificConfig > videoSpecificConfig
Definition: mp4track.h:72
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:9
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
TrackType
Specifies the track type.
Definition: abstracttrack.h:28
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156