Tag Parser  9.4.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
abstracttrack.cpp
Go to the documentation of this file.
1 #include "./abstracttrack.h"
2 #include "./exceptions.h"
3 #include "./language.h"
4 #include "./mediaformat.h"
5 
6 #include "./mp4/mp4ids.h"
7 
9 
10 using namespace std;
11 using namespace CppUtilities;
12 
13 namespace TagParser {
14 
31 AbstractTrack::AbstractTrack(istream &inputStream, ostream &outputStream, std::uint64_t startOffset)
32  : m_istream(&inputStream)
33  , m_ostream(&outputStream)
34  , m_reader(BinaryReader(&inputStream))
35  , m_writer(BinaryWriter(&outputStream))
36  , m_startOffset(startOffset)
37  , m_headerValid(false)
38  , m_format()
39  , m_mediaType(MediaType::Unknown)
40  , m_version(0.0)
41  , m_size(0)
42  , m_trackNumber(0)
43  , m_id(0)
44  , m_bitrate(0.0)
45  , m_maxBitrate(0.0)
46  , m_samplingFrequency(0)
47  , m_extensionSamplingFrequency(0)
48  , m_bitsPerSample(0)
49  , m_bytesPerSecond(0)
50  , m_channelCount(0)
51  , m_channelConfig(0)
52  , m_extensionChannelConfig(0)
53  , m_sampleCount(0)
54  , m_quality(0)
55  , m_depth(0)
56  , m_fps(0)
57  , m_chromaFormat(nullptr)
58  , m_interlaced(false)
59  , m_timeScale(0)
60  , m_enabled(true)
61  , m_default(false)
62  , m_forced(false)
63  , m_lacing(false)
64  , m_encrypted(false)
65  , m_usedInPresentation(true)
66  , m_usedWhenPreviewing(true)
67  , m_colorSpace(0)
68 {
69 }
70 
78 AbstractTrack::AbstractTrack(std::iostream &stream, std::uint64_t startOffset)
79  : AbstractTrack(stream, stream, startOffset)
80 {
81 }
82 
87 {
88 }
89 
94 {
95  switch (m_format.general) {
101  default:
102  return nullptr;
103  }
104 }
105 
110 {
112 }
113 
118 {
119  switch (m_format.general) {
122  default:
123  return nullptr;
124  }
125 }
126 
133 string AbstractTrack::label() const
134 {
135  stringstream ss;
136  ss << "ID: " << id();
137  ss << ", type: " << mediaTypeName();
138  if (!name().empty()) {
139  ss << ", name: \"" << name() << "\"";
140  }
141  if (isLanguageDefined(language())) {
142  ss << ", language: " << languageNameFromIsoWithFallback(language()) << "";
143  }
144  return ss.str();
145 }
146 
148 string AbstractTrack::makeDescription(bool verbose) const
149 {
150  // use abbreviated format
151  const auto format = MediaFormat(m_format.general, verbose ? m_format.sub : 0, verbose ? m_format.extension : 0);
152  const char *formatName = format.shortAbbreviation();
153  if (!formatName || !*formatName) {
154  // fall back to media type name if no abbreviation available
156  }
157 
158  // find additional info and level
159  const char *additionalInfoRef = nullptr;
160  string level;
161  switch (m_mediaType) {
162  case MediaType::Video:
163  if (!displaySize().isNull()) {
164  additionalInfoRef = displaySize().abbreviation();
165  } else if (!pixelSize().isNull()) {
166  additionalInfoRef = pixelSize().abbreviation();
167  }
168  if (verbose) {
169  switch (format.general) {
172  case GeneralMediaFormat::Hevc:
173  if (version()) {
174  level = "@L" + numberToString(version());
175  }
176  break;
177  default:;
178  }
179  }
180  break;
181  case MediaType::Audio:
182  case MediaType::Text:
183  if (channelCount()) {
184  if (!language().empty() && language() != "und") {
185  return argsToString(formatName, '-', channelCount(), "ch-", language());
186  } else {
187  return argsToString(formatName, '-', channelCount(), 'c', 'h');
188  }
189  } else if (!language().empty() && language() != "und") {
190  additionalInfoRef = language().data();
191  }
192  break;
193  default:;
194  }
195 
196  if (additionalInfoRef) {
197  return argsToString(formatName, level, '-', additionalInfoRef);
198  }
199  return argsToString(formatName, level);
200 }
202 
215 {
216  return makeDescription(true);
217 }
218 
229 {
230  return makeDescription(false);
231 }
232 
246 {
247  m_headerValid = false;
248  m_istream->seekg(static_cast<streamoff>(m_startOffset), ios_base::beg);
249  try {
250  internalParseHeader(diag);
251  m_headerValid = true;
252  } catch (Failure &) {
253  throw;
254  }
255 }
256 
267 } // namespace TagParser
mp4ids.h
TagParser::Mpeg4ElementaryStreamObjectIds::Aac
@ Aac
Definition: mp4ids.h:455
TagParser::MediaFormat::extension
unsigned char extension
Definition: mediaformat.h:260
exceptions.h
TagParser::AbstractTrack::channelCount
std::uint16_t channelCount() const
Returns the number of channels if known; otherwise returns 0.
Definition: abstracttrack.h:461
TagParser::AbstractTrack::channelConfigString
const char * channelConfigString() const
Returns a string with the channel configuration if available; otherwise returns nullptr.
Definition: abstracttrack.cpp:93
TagParser::AbstractTrack::label
std::string label() const
Returns a label for the track.
Definition: abstracttrack.cpp:133
TagParser::MpegChannelMode
MpegChannelMode
Specifies the channel mode.
Definition: mpegaudioframe.h:18
mpegaudioframe.h
TagParser::AbstractTrack::extensionChannelConfig
std::uint8_t extensionChannelConfig() const
Returns the extension channel configuration if available; otherwise returns nullptr.
Definition: abstracttrack.cpp:109
TagParser::Diagnostics
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
TagParser
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
TagParser::languageNameFromIsoWithFallback
TAG_PARSER_EXPORT const std::string & languageNameFromIsoWithFallback(const std::string &isoCode)
Returns the language name for the specified ISO-639-2 code (bibliographic, 639-2/B).
Definition: language.cpp:34
TagParser::Mpeg4ElementaryStreamObjectIds::Avc
@ Avc
Definition: mp4ids.h:451
TagParser::isLanguageDefined
bool isLanguageDefined(const std::string &languageSpecification)
Returns whether languageSpecification is not empty or undefined.
Definition: language.h:16
TagParser::MatroskaElementLevel::TopLevel
@ TopLevel
TagParser::FourccIds::Mpeg4Video
@ Mpeg4Video
Definition: mp4ids.h:331
TagParser::AbstractTrack::format
MediaFormat format() const
Returns the format of the track if known; otherwise returns MediaFormat::Unknown.
Definition: abstracttrack.h:253
TagParser::Mpeg4ElementaryStreamObjectIds::Mpeg1Audio
@ Mpeg1Audio
Definition: mp4ids.h:467
TagParser::Failure
The class inherits from std::exception and serves as base class for exceptions thrown by the elements...
Definition: exceptions.h:11
TagParser::Mpeg4ElementaryStreamObjectIds::Mpeg2Audio
@ Mpeg2Audio
Definition: mp4ids.h:465
TagParser::AbstractTrack::~AbstractTrack
virtual ~AbstractTrack()
Destroys the track.
Definition: abstracttrack.cpp:86
TagParser::mpegChannelModeString
TAG_PARSER_EXPORT const char * mpegChannelModeString(MpegChannelMode channelMode)
Returns the string representation for the specified channelMode.
Definition: mpegaudioframe.cpp:17
TagParser::MediaFormat::shortAbbreviation
const char * shortAbbreviation() const
Returns a short abbreviation of the media format as C-style string.
Definition: mediaformat.cpp:761
TagParser::MediaType
MediaType
The MediaType enum specifies the type of media data (audio, video, text, ...).
Definition: mediaformat.h:13
language.h
TagParser::AbstractTrack::m_headerValid
bool m_headerValid
Definition: abstracttrack.h:124
CppUtilities
Definition: abstractcontainer.h:15
TagParser::AbstractTrack::parseHeader
void parseHeader(Diagnostics &diag)
Parses technical information about the track from the header.
Definition: abstracttrack.cpp:245
TagParser::AbstractTrack::version
double version() const
Returns the version/level of the track if known; otherwise returns 0.
Definition: abstracttrack.h:261
TagParser::AbstractTrack::formatName
const char * formatName() const
Returns the format of the track as C-style string if known; otherwise returns the format abbreviation...
Definition: abstracttrack.h:273
TagParser::AbstractTrack
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
Definition: abstracttrack.h:39
TagParser::AbstractTrack::description
std::string description() const
Returns a description about the track.
Definition: abstracttrack.cpp:214
TagParser::AbstractTrack::m_mediaType
MediaType m_mediaType
Definition: abstracttrack.h:128
TagParser::MediaFormat::general
GeneralMediaFormat general
Definition: mediaformat.h:258
TagParser::AbstractTrack::m_startOffset
std::uint64_t m_startOffset
Definition: abstracttrack.h:123
abstracttrack.h
TagParser::AbstractTrack::m_format
MediaFormat m_format
Definition: abstracttrack.h:125
TagParser::AbstractTrack::language
const std::string & language() const
Returns the language of the track if known; otherwise returns an empty string.
Definition: abstracttrack.h:417
TagParser::AbstractTrack::id
std::uint64_t id() const
Returns the track ID if known; otherwise returns 0.
Definition: abstracttrack.h:341
TagParser::AbstractTrack::AbstractTrack
AbstractTrack(std::istream &inputStream, std::ostream &outputStream, std::uint64_t startOffset)
Constructs a new track.
Definition: abstracttrack.cpp:31
TagParser::MatroskaTrackType::Video
@ Video
Definition: matroskaid.h:405
TagParser::AbstractTrack::m_channelConfig
std::uint8_t m_channelConfig
Definition: abstracttrack.h:145
mediaformat.h
TagParser::AbstractTrack::displaySize
const Size & displaySize() const
Returns the size of the video frames to display if known; otherwise returns a zero size.
Definition: abstracttrack.h:510
TagParser::AbstractTrack::pixelSize
const Size & pixelSize() const
Returns the size of the encoded video frames if known; otherwise returns a zero size.
Definition: abstracttrack.h:500
TagParser::AbstractTrack::shortDescription
std::string shortDescription() const
Returns a short description about the track.
Definition: abstracttrack.cpp:228
TagParser::AbstractTrack::internalParseHeader
virtual void internalParseHeader(Diagnostics &diag)=0
This method is internally called to parse header information.
TagParser::AbstractTrack::mediaTypeName
const char * mediaTypeName() const
Returns the string representation of the media type of the track.
Definition: abstracttrack.h:308
TagParser::Mpeg4ChannelConfigs::channelConfigString
TAG_PARSER_EXPORT const char * channelConfigString(std::uint8_t config)
Returns the string representation for the specified MPEG-4 channel config.
Definition: mp4ids.cpp:433
TagParser::Size::abbreviation
const char * abbreviation() const
Returns an abbreviation for the current instance, eg.
Definition: size.cpp:9
TagParser::AbstractTrack::extensionChannelConfigString
const char * extensionChannelConfigString() const
Returns a string with the extension channel configuration if available; otherwise returns nullptr.
Definition: abstracttrack.cpp:117
TagParser::MediaFormat::sub
unsigned char sub
Definition: mediaformat.h:259
TagParser::AbstractTrack::name
const std::string name() const
Returns the track name if known; otherwise returns an empty string.
Definition: abstracttrack.h:358
TagParser::MediaFormat
The MediaFormat class specifies the format of media data.
Definition: mediaformat.h:245
TagParser::AbstractTrack::m_istream
std::istream * m_istream
Definition: abstracttrack.h:119
TagParser::MatroskaTrackType::Audio
@ Audio
Definition: matroskaid.h:405
TagParser::AbstractTrack::m_extensionChannelConfig
std::uint8_t m_extensionChannelConfig
Definition: abstracttrack.h:146