Tag Parser  6.4.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 MP4TRACK_H
2 #define MP4TRACK_H
3 
4 #include "../abstracttrack.h"
5 
6 #include <vector>
7 #include <memory>
8 
9 namespace Media
10 {
11 
12 class Mp4Atom;
13 class Mpeg4Descriptor;
14 struct AvcConfiguration;
15 struct TrackHeaderInfo;
16 
18 {
19 public:
21 
27  bool sbrPresent;
28  bool psPresent;
36  byte layerNr;
38  uint16 layerLength;
40  byte epConfig;
41 };
42 
44 {
45 public:
47 
48  byte profile;
49  std::string userData;
50 };
51 
53 {
54 public:
56 
57  bool dependencyFlag() const;
58  bool urlFlag() const;
59  bool ocrFlag() const;
60  byte priority() const;
61  byte streamTypeId() const;
62  bool upstream() const;
63 
64  uint16 id;
66  uint16 dependsOnId;
67  std::string url;
68  uint16 ocrId;
71  uint32 bufferSize;
72  uint32 maxBitrate;
74  std::unique_ptr<Mpeg4AudioSpecificConfig> audioSpecificConfig;
75  std::unique_ptr<Mpeg4VideoSpecificConfig> videoSpecificConfig;
76 };
77 
79  id(0),
80  esDescFlags(0),
81  dependsOnId(0),
82  ocrId(0),
83  objectTypeId(0),
84  decCfgDescFlags(0),
85  bufferSize(0),
86  maxBitrate(0),
87  averageBitrate(0)
88 {}
89 
91 {
92  return esDescFlags & 0x80;
93 }
94 
96 {
97  return esDescFlags & 0x40;
98 }
99 
101 {
102  return esDescFlags & 0x20;
103 }
104 
106 {
107  return esDescFlags & 0x1F;
108 }
109 
111 {
112  return decCfgDescFlags >> 2;
113 }
114 
116 {
117  return decCfgDescFlags & 0x02;
118 }
119 
121 {
122 public:
123  Mp4Track(Mp4Atom &trakAtom);
124  ~Mp4Track();
125  TrackType type() const;
126 
127  // getter methods specific for MP4 tracks
128  Mp4Atom &trakAtom();
129  const std::vector<uint32> &sampleSizes() const;
130  unsigned int chunkOffsetSize() const;
131  uint32 chunkCount() const;
132  uint32 sampleToChunkEntryCount() const;
133  const Mpeg4ElementaryStreamInfo *mpeg4ElementaryStreamInfo() const;
134  const AvcConfiguration *avcConfiguration() const;
135 
136  // methods to parse configuration details from the track header
137  static std::unique_ptr<Mpeg4ElementaryStreamInfo> parseMpeg4ElementaryStreamInfo(StatusProvider &statusProvider, IoUtilities::BinaryReader &reader, Mp4Atom *esDescAtom);
138  static std::unique_ptr<Mpeg4AudioSpecificConfig> parseAudioSpecificConfig(StatusProvider &statusProvider, std::istream &stream, uint64 startOffset, uint64 size);
139  static std::unique_ptr<Mpeg4VideoSpecificConfig> parseVideoSpecificConfig(StatusProvider &statusProvider, IoUtilities::BinaryReader &reader, uint64 startOffset, uint64 size);
140 
141  // methods to read the "index" (chunk offsets and sizes)
142  std::vector<uint64> readChunkOffsets();
143  std::vector<uint64> readChunkOffsetsSupportingFragments(bool parseFragments = false);
144  std::vector<std::tuple<uint32, uint32, uint32> > readSampleToChunkTable();
145  std::vector<uint64> readChunkSizes();
146 
147  // methods to make the track header
148  void bufferTrackAtoms();
149  uint64 requiredSize() const;
150  void makeTrack();
151  void makeTrackHeader();
152  void makeMedia();
153  void makeMediaInfo();
154  void makeSampleTable();
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 
163 protected:
164  void internalParseHeader();
165 
166 private:
167  // private helper methods
168  uint64 accumulateSampleSizes(size_t &sampleIndex, size_t count);
169  void addChunkSizeEntries(std::vector<uint64> &chunkSizeTable, size_t count, size_t &sampleIndex, uint32 sampleCount);
170  TrackHeaderInfo verifyPresentTrackHeader() const;
171 
172  Mp4Atom *m_trakAtom;
173  Mp4Atom *m_tkhdAtom;
174  Mp4Atom *m_mdiaAtom;
175  Mp4Atom *m_mdhdAtom;
176  Mp4Atom *m_hdlrAtom;
177  Mp4Atom *m_minfAtom;
178  Mp4Atom *m_stblAtom;
179  Mp4Atom *m_stsdAtom;
180  Mp4Atom *m_stscAtom;
181  Mp4Atom *m_stcoAtom;
182  Mp4Atom *m_stszAtom;
183  uint16 m_framesPerSample;
184  std::vector<uint32> m_sampleSizes;
185  unsigned int m_chunkOffsetSize;
186  uint32 m_chunkCount;
187  uint32 m_sampleToChunkEntryCount;
188  std::unique_ptr<Mpeg4ElementaryStreamInfo> m_esInfo;
189  std::unique_ptr<AvcConfiguration> m_avcConfig;
190 };
191 
196 {
197  return *m_trakAtom;
198 }
199 
207 inline const std::vector<uint32> &Mp4Track::sampleSizes() const
208 {
209  return m_sampleSizes;
210 }
211 
217 inline unsigned int Mp4Track::chunkOffsetSize() const
218 {
219  return m_chunkOffsetSize;
220 }
221 
225 inline uint32 Mp4Track::chunkCount() const
226 {
227  return m_chunkCount;
228 }
229 
234 {
235  return m_sampleToChunkEntryCount;
236 }
237 
246 {
247  return m_esInfo.get();
248 }
249 
257 {
258  return m_avcConfig.get();
259 }
260 
261 }
262 
263 #endif // MP4TRACK_H
Implementation of Media::AbstractTrack for the MP4 container.
Definition: mp4track.h:120
The Mpeg4ElementaryStreamInfo class holds MPEG-4 elementary stream info parsed using Mp4Track::parseM...
Definition: mp4track.h:52
TrackType
Specifies the track type.
Definition: abstracttrack.h:28
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:40
const std::vector< uint32 > & sampleSizes() const
Returns the sample size table for the track.
Definition: mp4track.h:207
std::unique_ptr< Mpeg4VideoSpecificConfig > videoSpecificConfig
Definition: mp4track.h:75
const AvcConfiguration * avcConfiguration() const
Returns the AVC configuration.
Definition: mp4track.h:256
The TrackHeaderInfo struct holds information about the present track header (tkhd atom) and informati...
Definition: mp4track.cpp:37
unsigned int chunkOffsetSize() const
Returns the size of a single chunk offset denotation within the stco atom.
Definition: mp4track.h:217
The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAud...
Definition: mp4track.h:17
The AvcConfiguration struct provides a parser for AVC configuration.
std::unique_ptr< Mpeg4AudioSpecificConfig > audioSpecificConfig
Definition: mp4track.h:74
uint32 sampleToChunkEntryCount() const
Returns the number of "sample to chunk" entries within the stsc atom.
Definition: mp4track.h:233
uint32 chunkCount() const
Returns the number of chunks denoted by the stco atom.
Definition: mp4track.h:225
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:57
The Mpeg4VideoSpecificConfig class holds MPEG-4 video specific config parsed using Mp4Track::parseVid...
Definition: mp4track.h:43
const Mpeg4ElementaryStreamInfo * mpeg4ElementaryStreamInfo() const
Returns information about the MPEG-4 elementary stream.
Definition: mp4track.h:245
Mp4Atom & trakAtom()
Returns the trak atom for the current instance.
Definition: mp4track.h:195
Contains all classes and functions of the TagInfo library.
Definition: exceptions.h:9
The StatusProvider class acts as a base class for objects providing status information.
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.