Tag Parser 11.3.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 "./mediaformat.h"
4
5#include "./mp4/mp4ids.h"
6
8
9using namespace std;
10using namespace CppUtilities;
11
12namespace TagParser {
13
30AbstractTrack::AbstractTrack(istream &inputStream, ostream &outputStream, std::uint64_t startOffset)
31 : m_istream(&inputStream)
32 , m_ostream(&outputStream)
33 , m_reader(BinaryReader(&inputStream))
34 , m_writer(BinaryWriter(&outputStream))
35 , m_startOffset(startOffset)
37 , m_format()
38 , m_mediaType(MediaType::Unknown)
39 , m_version(0.0)
40 , m_size(0)
41 , m_trackNumber(0)
42 , m_id(0)
43 , m_bitrate(0.0)
44 , m_maxBitrate(0.0)
45 , m_samplingFrequency(0)
46 , m_extensionSamplingFrequency(0)
47 , m_bitsPerSample(0)
48 , m_bytesPerSecond(0)
49 , m_channelCount(0)
50 , m_channelConfig(0)
51 , m_extensionChannelConfig(0)
52 , m_sampleCount(0)
53 , m_quality(0)
54 , m_depth(0)
55 , m_fps(0)
56 , m_timeScale(0)
57 , m_colorSpace(0)
58 , m_fieldOrder(FieldOrder::Undetermined)
59 , m_stereoMode(StereoMode::Unknown)
60 , m_alphaMode(AlphaMode::Unknown)
61 , m_displayUnit(DisplayUnit::Unknown)
62 , m_aspectRatioType(AspectRatioType::Unknown)
63{
64}
65
73AbstractTrack::AbstractTrack(std::iostream &stream, std::uint64_t startOffset)
74 : AbstractTrack(stream, stream, startOffset)
75{
76}
77
82{
83}
84
88std::string_view AbstractTrack::channelConfigString() const
89{
90 switch (m_format.general) {
96 default:
97 return std::string_view();
98 }
99}
100
105{
107}
108
113{
114 switch (m_format.general) {
117 default:
118 return std::string_view();
119 }
120}
121
129{
130 stringstream ss;
131 ss << "ID: " << id();
132 ss << ", type: " << mediaTypeName();
133 if (!name().empty()) {
134 ss << ", name: \"" << name() << "\"";
135 }
136 if (const auto &language = locale().fullOrSomeAbbreviatedName(); !language.empty()) {
137 ss << ", language: " << language << "";
138 }
139 return ss.str();
140}
141
143string AbstractTrack::makeDescription(bool verbose) const
144{
145 // use abbreviated format
146 const auto format = MediaFormat(m_format.general, verbose ? m_format.sub : 0, verbose ? m_format.extension : 0);
148 if (formatName.empty()) {
149 // fall back to media type name if no abbreviation available
151 }
152
153 // find additional info and level
154 auto additionalInfoRef = std::string_view();
155 auto level = std::string();
156 switch (m_mediaType) {
157 case MediaType::Video:
158 if (!pixelSize().isNull()) {
159 additionalInfoRef = pixelSize().abbreviation();
160 } else if (!displaySize().isNull()) {
161 additionalInfoRef = displaySize().abbreviation();
162 }
163 if (verbose) {
164 switch (format.general) {
168 if (version() != 0.0) {
169 level = "@L" + numberToString(version());
170 }
171 break;
172 default:;
173 }
174 }
175 break;
176 case MediaType::Audio:
177 case MediaType::Text:
178 if (channelCount()) {
179 if (const auto &localeName = locale().someAbbreviatedName(); !localeName.empty()) {
180 return argsToString(formatName, '-', channelCount(), "ch-", localeName);
181 } else {
182 return argsToString(formatName, '-', channelCount(), 'c', 'h');
183 }
184 } else if (const auto &localeName = locale().someAbbreviatedName(); !localeName.empty()) {
185 additionalInfoRef = localeName;
186 }
187 break;
188 default:;
189 }
190
191 if (!additionalInfoRef.empty()) {
192 return argsToString(formatName, level, '-', additionalInfoRef);
193 }
194 return argsToString(formatName, level);
195}
197
210{
211 return makeDescription(true);
212}
213
224{
225 return makeDescription(false);
226}
227
241{
243 m_istream->seekg(static_cast<streamoff>(m_startOffset), ios_base::beg);
244 try {
245 internalParseHeader(diag, progress);
247 } catch (const Failure &) {
248 throw;
249 }
250}
251
262} // namespace TagParser
The AbortableProgressFeedback class provides feedback about an ongoing operation via callbacks.
The AbstractTrack class parses and stores technical information about video, audio and other kinds of...
std::uint64_t id() const
Returns the track ID if known; otherwise returns 0.
std::string label() const
Returns a label for the track.
std::uint8_t m_extensionChannelConfig
const Locale & locale() const
Returns the locale of the track if known; otherwise returns an empty locale.
std::string_view extensionChannelConfigString() const
Returns a string with the extension channel configuration if available; otherwise returns nullptr.
std::string_view formatName() const
Returns the format of the track as C-style string if known; otherwise returns the format abbreviation...
const Size & displaySize() const
Returns the size of the video frames to display if known; otherwise returns a zero size.
double version() const
Returns the version/level of the track if known; otherwise returns 0.
const Size & pixelSize() const
Returns the size of the encoded video frames if known; otherwise returns a zero size.
std::uint8_t extensionChannelConfig() const
Returns the extension channel configuration if available; otherwise returns nullptr.
AbstractTrack(std::istream &inputStream, std::ostream &outputStream, std::uint64_t startOffset)
Constructs a new track.
std::uint8_t m_channelConfig
std::string shortDescription() const
Returns a short description about the track.
std::string_view mediaTypeName() const
Returns the string representation of the media type of the track.
std::uint64_t m_startOffset
void parseHeader(Diagnostics &diag, AbortableProgressFeedback &progress)
Parses technical information about the track from the header.
std::uint16_t channelCount() const
Returns the number of channels if known; otherwise returns 0.
std::string_view channelConfigString() const
Returns a string with the channel configuration if available; otherwise returns nullptr.
virtual void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress)=0
This method is internally called to parse header information.
const std::string name() const
Returns the track name if known; otherwise returns an empty string.
std::istream * m_istream
std::string description() const
Returns a description about the track.
MediaFormat format() const
Returns the format of the track if known; otherwise returns MediaFormat::Unknown.
virtual ~AbstractTrack()
Destroys the track.
The Diagnostics class is a container for DiagMessage.
Definition: diagnostics.h:156
The class inherits from std::exception and serves as base class for exceptions thrown by the elements...
Definition: exceptions.h:11
The MediaFormat class specifies the format of media data.
Definition: mediaformat.h:246
std::string_view shortAbbreviation() const
Returns a short abbreviation of the media format as C-style string.
unsigned char extension
Definition: mediaformat.h:261
GeneralMediaFormat general
Definition: mediaformat.h:259
std::string_view abbreviation() const
Returns an abbreviation for the current instance, eg.
Definition: size.cpp:17
constexpr TAG_PARSER_EXPORT std::string_view language()
TAG_PARSER_EXPORT std::string_view channelConfigString(std::uint8_t config)
Returns the string representation for the specified MPEG-4 channel config.
Definition: mp4ids.cpp:434
Contains all classes and functions of the TagInfo library.
Definition: aaccodebook.h:10
AspectRatioType
The AspectRatioType enum specifies the possible modifications to the aspect ratio.
Definition: abstracttrack.h:94
TAG_PARSER_EXPORT std::string_view mpegChannelModeString(MpegChannelMode channelMode)
Returns the string representation for the specified channelMode.
StereoMode
The StereoMode enum specifies the Stereo-3D video mode.
Definition: abstracttrack.h:75
DisplayUnit
The DisplayUnit enum specifies how display width and heigh are interpreted.
Definition: abstracttrack.h:89
AlphaMode
The AlphaMode enum specifies the alpha video mode.
Definition: abstracttrack.h:82
MediaType
The MediaType enum specifies the type of media data (audio, video, text, ...).
Definition: mediaformat.h:14
FieldOrder
The FieldOrder enum declares the field ordering of the video.
Definition: abstracttrack.h:62
MpegChannelMode
Specifies the channel mode.
TrackFlags
The TrackFlags enum specifies miscellaneous boolean properties of a track.
Definition: abstracttrack.h:46