Tag Parser  9.1.3
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) override;
166 
167 private:
168  // private helper methods
169  std::uint64_t accumulateSampleSizes(size_t &sampleIndex, size_t count, Diagnostics &diag);
170  void addChunkSizeEntries(
171  std::vector<std::uint64_t> &chunkSizeTable, size_t count, 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::uint16_t m_framesPerSample;
186  std::vector<std::uint32_t> m_sampleSizes;
187  unsigned int m_chunkOffsetSize;
188  std::uint32_t m_chunkCount;
189  std::uint32_t m_sampleToChunkEntryCount;
190  std::unique_ptr<Mpeg4ElementaryStreamInfo> m_esInfo;
191  std::unique_ptr<AvcConfiguration> m_avcConfig;
192  std::unique_ptr<Av1Configuration> m_av1Config;
193 };
194 
199 {
200  return *m_trakAtom;
201 }
202 
210 inline const std::vector<std::uint32_t> &Mp4Track::sampleSizes() const
211 {
212  return m_sampleSizes;
213 }
214 
220 inline unsigned int Mp4Track::chunkOffsetSize() const
221 {
222  return m_chunkOffsetSize;
223 }
224 
228 inline std::uint32_t Mp4Track::chunkCount() const
229 {
230  return m_chunkCount;
231 }
232 
236 inline std::uint32_t Mp4Track::sampleToChunkEntryCount() const
237 {
238  return m_sampleToChunkEntryCount;
239 }
240 
249 {
250  return m_esInfo.get();
251 }
252 
260 {
261  return m_avcConfig.get();
262 }
263 
271 {
272  return m_av1Config.get();
273 }
274 
275 } // namespace TagParser
276 
277 #endif // TAG_PARSER_MP4TRACK_H
TagParser::Mpeg4ElementaryStreamInfo::bufferSize
std::uint32_t bufferSize
Definition: mp4track.h:68
TagParser::Mpeg4AudioSpecificConfig::extensionFlag
std::uint8_t extensionFlag
Definition: mp4track.h:34
TagParser::Mpeg4AudioSpecificConfig::audioObjectType
std::uint8_t audioObjectType
Definition: mp4track.h:21
TagParser::Mpeg4AudioSpecificConfig::layerLength
std::uint16_t layerLength
Definition: mp4track.h:37
TagParser::Mpeg4ElementaryStreamInfo::streamTypeId
std::uint8_t streamTypeId() const
Definition: mp4track.h:108
TagParser::Mpeg4VideoSpecificConfig::profile
std::uint8_t profile
Definition: mp4track.h:46
TagParser::Mpeg4ElementaryStreamInfo::maxBitrate
std::uint32_t maxBitrate
Definition: mp4track.h:69
TagParser::Mpeg4AudioSpecificConfig::frameLengthFlag
bool frameLengthFlag
Definition: mp4track.h:31
TagParser::Mpeg4ElementaryStreamInfo::id
std::uint16_t id
Definition: mp4track.h:61
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
TagParser::Mp4AtomIds::Av1Configuration
@ Av1Configuration
Definition: mp4ids.h:14
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::Mp4Track::sampleToChunkEntryCount
std::uint32_t sampleToChunkEntryCount() const
Returns the number of "sample to chunk" entries within the stsc atom.
Definition: mp4track.h:236
TagParser::Mpeg4ElementaryStreamInfo::urlFlag
bool urlFlag() const
Definition: mp4track.h:93
TagParser::Mpeg4AudioSpecificConfig::coreCoderDelay
std::uint16_t coreCoderDelay
Definition: mp4track.h:33
TagParser::Mpeg4ElementaryStreamInfo::videoSpecificConfig
std::unique_ptr< Mpeg4VideoSpecificConfig > videoSpecificConfig
Definition: mp4track.h:72
TagParser::Mpeg4AudioSpecificConfig
The Mpeg4AudioSpecificConfig class holds MPEG-4 audio specific config parsed using Mp4Track::parseAud...
Definition: mp4track.h:17
TagParser::Mp4Track::chunkOffsetSize
unsigned int chunkOffsetSize() const
Returns the size of a single chunk offset denotation within the stco atom.
Definition: mp4track.h:220
TagParser::Mpeg4AudioSpecificConfig::sbrPresent
bool sbrPresent
Definition: mp4track.h:26
TagParser::Mp4Track::sampleSizes
const std::vector< std::uint32_t > & sampleSizes() const
Returns the sample size table for the track.
Definition: mp4track.h:210
TagParser::Mpeg4AudioSpecificConfig::layerNr
std::uint8_t layerNr
Definition: mp4track.h:35
TagParser::Mpeg4AudioSpecificConfig::extensionSampleFrequency
std::uint32_t extensionSampleFrequency
Definition: mp4track.h:29
TagParser::Mpeg4ElementaryStreamInfo::dependencyFlag
bool dependencyFlag() const
Definition: mp4track.h:88
TagParser::Mp4AtomIds::AvcConfiguration
@ AvcConfiguration
Definition: mp4ids.h:15
TagParser::Mpeg4AudioSpecificConfig::extensionChannelConfiguration
std::uint8_t extensionChannelConfiguration
Definition: mp4track.h:30
TagParser::TrackType
TrackType
Specifies the track type.
Definition: abstracttrack.h:27
TagParser::Mpeg4AudioSpecificConfig::epConfig
std::uint8_t epConfig
Definition: mp4track.h:39
TagParser::Mp4Track::mpeg4ElementaryStreamInfo
const Mpeg4ElementaryStreamInfo * mpeg4ElementaryStreamInfo() const
Returns information about the MPEG-4 elementary stream.
Definition: mp4track.h:248
TagParser::Mpeg4ElementaryStreamInfo::averageBitrate
std::uint32_t averageBitrate
Definition: mp4track.h:70
TagParser::Mpeg4ElementaryStreamInfo
The Mpeg4ElementaryStreamInfo class holds MPEG-4 elementary stream info parsed using Mp4Track::parseM...
Definition: mp4track.h:50
TagParser::Mpeg4ElementaryStreamInfo::dependsOnId
std::uint16_t dependsOnId
Definition: mp4track.h:63
TagParser::Mpeg4AudioSpecificConfig::numOfSubFrame
std::uint8_t numOfSubFrame
Definition: mp4track.h:36
TagParser::Mp4Track
Implementation of TagParser::AbstractTrack for the MP4 container.
Definition: mp4track.h:118
TagParser::AbstractTrack
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:39
TagParser::Mpeg4AudioSpecificConfig::dependsOnCoreCoder
bool dependsOnCoreCoder
Definition: mp4track.h:32
TagParser::Av1Configuration
The Av1Configuration struct provides a parser for AV1 configuration found in ISOBMFF files.
Definition: av1configuration.h:17
TagParser::Mpeg4ElementaryStreamInfo::decCfgDescFlags
std::uint8_t decCfgDescFlags
Definition: mp4track.h:67
TagParser::Mpeg4ElementaryStreamInfo::objectTypeId
std::uint8_t objectTypeId
Definition: mp4track.h:66
TagParser::Mpeg4VideoSpecificConfig::userData
std::string userData
Definition: mp4track.h:47
TagParser::Mpeg4ElementaryStreamInfo::url
std::string url
Definition: mp4track.h:64
TagParser::Mpeg4ElementaryStreamInfo::audioSpecificConfig
std::unique_ptr< Mpeg4AudioSpecificConfig > audioSpecificConfig
Definition: mp4track.h:71
TagParser::Mp4Track::av1Configuration
const Av1Configuration * av1Configuration() const
Returns the AV1 configuration.
Definition: mp4track.h:270
TagParser::Mpeg4ElementaryStreamInfo::ocrId
std::uint16_t ocrId
Definition: mp4track.h:65
TagParser::Mpeg4AudioSpecificConfig::channelConfiguration
std::uint8_t channelConfiguration
Definition: mp4track.h:24
TagParser::Mpeg4AudioSpecificConfig::resilienceFlags
std::uint8_t resilienceFlags
Definition: mp4track.h:38
TagParser::Mpeg4ElementaryStreamInfo::upstream
bool upstream() const
Definition: mp4track.h:113
TagParser::TrackHeaderInfo
The TrackHeaderInfo struct holds information about the present track header (tkhd atom) and informati...
Definition: mp4track.cpp:36
TagParser::Mp4Track::chunkCount
std::uint32_t chunkCount() const
Returns the number of chunks denoted by the stco atom.
Definition: mp4track.h:228
TagParser::AvcConfiguration
The AvcConfiguration struct provides a parser for AVC configuration.
Definition: avcconfiguration.h:13
TagParser::Mpeg4ElementaryStreamInfo::Mpeg4ElementaryStreamInfo
Mpeg4ElementaryStreamInfo()
Definition: mp4track.h:75
TAG_PARSER_EXPORT
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
TagParser::Mpeg4AudioSpecificConfig::extensionAudioObjectType
std::uint8_t extensionAudioObjectType
Definition: mp4track.h:25
TagParser::Mpeg4AudioSpecificConfig::extensionSampleFrequencyIndex
std::uint8_t extensionSampleFrequencyIndex
Definition: mp4track.h:28
TagParser::Mpeg4ElementaryStreamInfo::esDescFlags
std::uint8_t esDescFlags
Definition: mp4track.h:62
TagParser::Mp4Track::avcConfiguration
const AvcConfiguration * avcConfiguration() const
Returns the AVC configuration.
Definition: mp4track.h:259
TagParser::Mp4Atom
The Mp4Atom class helps to parse MP4 files.
Definition: mp4atom.h:38
TagParser::Mp4Track::trakAtom
Mp4Atom & trakAtom()
Returns the trak atom for the current instance.
Definition: mp4track.h:198
TagParser::Mpeg4ElementaryStreamInfo::priority
std::uint8_t priority() const
Definition: mp4track.h:103
TagParser::Mpeg4AudioSpecificConfig::sampleFrequencyIndex
std::uint8_t sampleFrequencyIndex
Definition: mp4track.h:22
TagParser::Mpeg4ElementaryStreamInfo::ocrFlag
bool ocrFlag() const
Definition: mp4track.h:98
TagParser::Mpeg4AudioSpecificConfig::psPresent
bool psPresent
Definition: mp4track.h:27
TagParser::Mpeg4AudioSpecificConfig::sampleFrequency
std::uint32_t sampleFrequency
Definition: mp4track.h:23
TagParser::Mpeg4VideoSpecificConfig
The Mpeg4VideoSpecificConfig class holds MPEG-4 video specific config parsed using Mp4Track::parseVid...
Definition: mp4track.h:42