Tag Parser  7.1.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 TrackHeaderInfo;
15 
17 public:
19 
25  bool sbrPresent;
26  bool psPresent;
34  byte layerNr;
36  uint16 layerLength;
38  byte epConfig;
39 };
40 
42 public:
44 
45  byte profile;
46  std::string userData;
47 };
48 
50 public:
52 
53  bool dependencyFlag() const;
54  bool urlFlag() const;
55  bool ocrFlag() const;
56  byte priority() const;
57  byte streamTypeId() const;
58  bool upstream() const;
59 
60  uint16 id;
62  uint16 dependsOnId;
63  std::string url;
64  uint16 ocrId;
67  uint32 bufferSize;
68  uint32 maxBitrate;
70  std::unique_ptr<Mpeg4AudioSpecificConfig> audioSpecificConfig;
71  std::unique_ptr<Mpeg4VideoSpecificConfig> videoSpecificConfig;
72 };
73 
75  : id(0)
76  , esDescFlags(0)
77  , dependsOnId(0)
78  , ocrId(0)
79  , objectTypeId(0)
80  , decCfgDescFlags(0)
81  , bufferSize(0)
82  , maxBitrate(0)
83  , averageBitrate(0)
84 {
85 }
86 
88 {
89  return esDescFlags & 0x80;
90 }
91 
93 {
94  return esDescFlags & 0x40;
95 }
96 
98 {
99  return esDescFlags & 0x20;
100 }
101 
103 {
104  return esDescFlags & 0x1F;
105 }
106 
108 {
109  return decCfgDescFlags >> 2;
110 }
111 
113 {
114  return decCfgDescFlags & 0x02;
115 }
116 
118 public:
119  Mp4Track(Mp4Atom &trakAtom);
120  ~Mp4Track() override;
121  TrackType type() const override;
122 
123  // getter methods specific for MP4 tracks
124  Mp4Atom &trakAtom();
125  const std::vector<uint32> &sampleSizes() const;
126  unsigned int chunkOffsetSize() const;
127  uint32 chunkCount() const;
128  uint32 sampleToChunkEntryCount() const;
129  const Mpeg4ElementaryStreamInfo *mpeg4ElementaryStreamInfo() const;
130  const AvcConfiguration *avcConfiguration() const;
131 
132  // methods to parse configuration details from the track header
133  static std::unique_ptr<Mpeg4ElementaryStreamInfo> parseMpeg4ElementaryStreamInfo(
134  IoUtilities::BinaryReader &reader, Mp4Atom *esDescAtom, Diagnostics &diag);
135  static std::unique_ptr<Mpeg4AudioSpecificConfig> parseAudioSpecificConfig(
136  std::istream &stream, uint64 startOffset, uint64 size, Diagnostics &diag);
137  static std::unique_ptr<Mpeg4VideoSpecificConfig> parseVideoSpecificConfig(
138  IoUtilities::BinaryReader &reader, uint64 startOffset, uint64 size, Diagnostics &diag);
139 
140  // methods to read the "index" (chunk offsets and sizes)
141  std::vector<uint64> readChunkOffsets(bool parseFragments, Diagnostics &diag);
142  std::vector<std::tuple<uint32, uint32, uint32>> readSampleToChunkTable(Diagnostics &diag);
143  std::vector<uint64> readChunkSizes(TagParser::Diagnostics &diag);
144 
145  // methods to make the track header
146  void bufferTrackAtoms(Diagnostics &diag);
147  uint64 requiredSize(Diagnostics &diag) const;
148  void makeTrack(Diagnostics &diag);
149  void makeTrackHeader(Diagnostics &diag);
150  void makeMedia(Diagnostics &diag);
151  void makeMediaInfo(Diagnostics &diag);
152  void makeSampleTable(Diagnostics &diag);
153 
154  // methods to update chunk offsets
155  void updateChunkOffsets(const std::vector<int64> &oldMdatOffsets, const std::vector<int64> &newMdatOffsets);
156  void updateChunkOffsets(const std::vector<uint64> &chunkOffsets);
157  void updateChunkOffset(uint32 chunkIndex, uint64 offset);
158 
159  static void addInfo(const AvcConfiguration &avcConfig, AbstractTrack &track);
160 
161 protected:
162  void internalParseHeader(Diagnostics &diag) override;
163 
164 private:
165  // private helper methods
166  uint64 accumulateSampleSizes(size_t &sampleIndex, size_t count, Diagnostics &diag);
167  void addChunkSizeEntries(std::vector<uint64> &chunkSizeTable, size_t count, size_t &sampleIndex, uint32 sampleCount, Diagnostics &diag);
168  TrackHeaderInfo verifyPresentTrackHeader() const;
169 
170  Mp4Atom *m_trakAtom;
171  Mp4Atom *m_tkhdAtom;
172  Mp4Atom *m_mdiaAtom;
173  Mp4Atom *m_mdhdAtom;
174  Mp4Atom *m_hdlrAtom;
175  Mp4Atom *m_minfAtom;
176  Mp4Atom *m_stblAtom;
177  Mp4Atom *m_stsdAtom;
178  Mp4Atom *m_stscAtom;
179  Mp4Atom *m_stcoAtom;
180  Mp4Atom *m_stszAtom;
181  uint16 m_framesPerSample;
182  std::vector<uint32> m_sampleSizes;
183  unsigned int m_chunkOffsetSize;
184  uint32 m_chunkCount;
185  uint32 m_sampleToChunkEntryCount;
186  std::unique_ptr<Mpeg4ElementaryStreamInfo> m_esInfo;
187  std::unique_ptr<AvcConfiguration> m_avcConfig;
188 };
189 
194 {
195  return *m_trakAtom;
196 }
197 
205 inline const std::vector<uint32> &Mp4Track::sampleSizes() const
206 {
207  return m_sampleSizes;
208 }
209 
215 inline unsigned int Mp4Track::chunkOffsetSize() const
216 {
217  return m_chunkOffsetSize;
218 }
219 
223 inline uint32 Mp4Track::chunkCount() const
224 {
225  return m_chunkCount;
226 }
227 
232 {
233  return m_sampleToChunkEntryCount;
234 }
235 
244 {
245  return m_esInfo.get();
246 }
247 
255 {
256  return m_avcConfig.get();
257 }
258 
259 } // namespace TagParser
260 
261 #endif // TAG_PARSER_MP4TRACK_H
const std::vector< uint32 > & sampleSizes() const
Returns the sample size table for the track.
Definition: mp4track.h:205
const AvcConfiguration * avcConfiguration() const
Returns the AVC configuration.
Definition: mp4track.h:254
The Mpeg4ElementaryStreamInfo class holds MPEG-4 elementary stream info parsed using Mp4Track::parseM...
Definition: mp4track.h:49
The TrackHeaderInfo struct holds information about the present track header (tkhd atom) and informati...
Definition: mp4track.cpp:37
const Mpeg4ElementaryStreamInfo * mpeg4ElementaryStreamInfo() const
Returns information about the MPEG-4 elementary stream.
Definition: mp4track.h:243
uint32 chunkCount() const
Returns the number of chunks denoted by the stco atom.
Definition: mp4track.h:223
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:215
The Mpeg4VideoSpecificConfig class holds MPEG-4 video specific config parsed using Mp4Track::parseVid...
Definition: mp4track.h:41
The AvcConfiguration struct provides a parser for AVC configuration.
Implementation of TagParser::AbstractTrack for the MP4 container.
Definition: mp4track.h:117
Mp4Atom & trakAtom()
Returns the trak atom for the current instance.
Definition: mp4track.h:193
The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAud...
Definition: mp4track.h:16
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:39
uint32 sampleToChunkEntryCount() const
Returns the number of "sample to chunk" entries within the stsc atom.
Definition: mp4track.h:231
std::unique_ptr< Mpeg4AudioSpecificConfig > audioSpecificConfig
Definition: mp4track.h:70
std::unique_ptr< Mpeg4VideoSpecificConfig > videoSpecificConfig
Definition: mp4track.h:71
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:154