21#ifndef TAGLIB_EBMLELEMENT_H
22#define TAGLIB_EBMLELEMENT_H
23#ifndef DO_NOT_DOCUMENT
39 enum class Id :
unsigned int
41 EBMLHeader = 0x1A45DFA3,
43 DocTypeVersion = 0x4287,
45 MkSegment = 0x18538067,
48 MkTagTargets = 0x63C0,
49 MkTagTargetTypeValue = 0x68CA,
50 MkTagTrackUID = 0x63C5,
53 MkTagLanguage = 0x447A,
56 MkTagsTagLanguage = 0x447A,
57 MkTagsLanguageDefault = 0x4484,
58 MkAttachments = 0x1941A469,
59 MkAttachedFile = 0x61A7,
60 MkAttachedFileDescription = 0x467E,
61 MkAttachedFileName = 0x466E,
62 MkAttachedFileMediaType = 0x4660,
63 MkAttachedFileData = 0x465C,
64 MkAttachedFileUID = 0x46AE,
65 MkSeekHead = 0x114D9B74,
68 MkSeekPosition = 0x53AC,
69 MkCluster = 0x1F43B675,
74 MkCueTrackPositions = 0xB7,
76 MkCueClusterPosition = 0xF1,
77 MkCueRelativePosition = 0xF0,
79 MkCueBlockNumber = 0x5378,
80 MkCueCodecState = 0xEA,
81 MkCueReference = 0xDB,
84 MkTimestampScale = 0x2AD7B1,
87 MkTracks = 0x1654AE6B,
91 MkSamplingFrequency = 0xB5,
94 MkChapters = 0x1043A770,
95 MkEditionEntry = 0x45B9,
96 MkEditionUID = 0x45BC,
97 MkEditionFlagDefault = 0x45DB,
98 MkEditionFlagOrdered = 0x45DD,
100 MkChapterUID = 0x73C4,
101 MkChapterTimeStart = 0x91,
102 MkChapterTimeEnd = 0x92,
103 MkChapterFlagHidden = 0x98,
104 MkChapterDisplay = 0x80,
106 MkChapLanguage = 0x437C,
109 Element(Id
id,
int sizeLength, offset_t dataSize);
110 Element(Id
id,
int sizeLength, offset_t dataSize, offset_t);
113 virtual bool read(File &file);
114 void skipData(File &file);
118 int getSizeLength()
const;
119 int64_t getDataSize()
const;
120 ByteVector renderId()
const;
121 virtual ByteVector render();
122 static std::unique_ptr<Element> factory(File &file);
123 static unsigned int readId(File &file);
149 class UTF8StringElement;
150 class Latin1StringElement;
152 template <Element::Id ID>
153 struct GetElementTypeById;
155 template <>
struct GetElementTypeById<Element::Id::EBMLHeader> {
using type = MasterElement; };
156 template <>
struct GetElementTypeById<Element::Id::DocType> {
using type = Latin1StringElement; };
157 template <>
struct GetElementTypeById<Element::Id::DocTypeVersion> {
using type = UIntElement; };
158 template <>
struct GetElementTypeById<Element::Id::MkSegment> {
using type = MkSegment; };
159 template <>
struct GetElementTypeById<Element::Id::MkInfo> {
using type = MkInfo; };
160 template <>
struct GetElementTypeById<Element::Id::MkTracks> {
using type = MkTracks; };
161 template <>
struct GetElementTypeById<Element::Id::MkTags> {
using type = MkTags; };
162 template <>
struct GetElementTypeById<Element::Id::MkAttachments> {
using type = MkAttachments; };
163 template <>
struct GetElementTypeById<Element::Id::MkTag> {
using type = MasterElement; };
164 template <>
struct GetElementTypeById<Element::Id::MkTagTargets> {
using type = MasterElement; };
165 template <>
struct GetElementTypeById<Element::Id::MkSimpleTag> {
using type = MasterElement; };
166 template <>
struct GetElementTypeById<Element::Id::MkAttachedFile> {
using type = MasterElement; };
167 template <>
struct GetElementTypeById<Element::Id::MkSeek> {
using type = MasterElement; };
168 template <>
struct GetElementTypeById<Element::Id::MkTrackEntry> {
using type = MasterElement; };
169 template <>
struct GetElementTypeById<Element::Id::MkAudio> {
using type = MasterElement; };
170 template <>
struct GetElementTypeById<Element::Id::MkCuePoint> {
using type = MasterElement; };
171 template <>
struct GetElementTypeById<Element::Id::MkCueTrackPositions> {
using type = MasterElement; };
172 template <>
struct GetElementTypeById<Element::Id::MkCueReference> {
using type = MasterElement; };
173 template <>
struct GetElementTypeById<Element::Id::MkCluster> {
using type = MasterElement; };
174 template <>
struct GetElementTypeById<Element::Id::MkCues> {
using type = MkCues; };
175 template <>
struct GetElementTypeById<Element::Id::MkTagName> {
using type = UTF8StringElement; };
176 template <>
struct GetElementTypeById<Element::Id::MkTagString> {
using type = UTF8StringElement; };
177 template <>
struct GetElementTypeById<Element::Id::MkAttachedFileName> {
using type = UTF8StringElement; };
178 template <>
struct GetElementTypeById<Element::Id::MkAttachedFileDescription> {
using type = UTF8StringElement; };
179 template <>
struct GetElementTypeById<Element::Id::MkTagLanguage> {
using type = Latin1StringElement; };
180 template <>
struct GetElementTypeById<Element::Id::MkAttachedFileMediaType> {
using type = Latin1StringElement; };
181 template <>
struct GetElementTypeById<Element::Id::MkCodecID> {
using type = Latin1StringElement; };
182 template <>
struct GetElementTypeById<Element::Id::MkTagTargetTypeValue> {
using type = UIntElement; };
183 template <>
struct GetElementTypeById<Element::Id::MkTagTrackUID> {
using type = UIntElement; };
184 template <>
struct GetElementTypeById<Element::Id::MkAttachedFileUID> {
using type = UIntElement; };
185 template <>
struct GetElementTypeById<Element::Id::MkSeekPosition> {
using type = UIntElement; };
186 template <>
struct GetElementTypeById<Element::Id::MkTimestampScale> {
using type = UIntElement; };
187 template <>
struct GetElementTypeById<Element::Id::MkBitDepth> {
using type = UIntElement; };
188 template <>
struct GetElementTypeById<Element::Id::MkChannels> {
using type = UIntElement; };
189 template <>
struct GetElementTypeById<Element::Id::MkCueTime> {
using type = UIntElement; };
190 template <>
struct GetElementTypeById<Element::Id::MkCueTrack> {
using type = UIntElement; };
191 template <>
struct GetElementTypeById<Element::Id::MkCueClusterPosition> {
using type = UIntElement; };
192 template <>
struct GetElementTypeById<Element::Id::MkCueRelativePosition> {
using type = UIntElement; };
193 template <>
struct GetElementTypeById<Element::Id::MkCueDuration> {
using type = UIntElement; };
194 template <>
struct GetElementTypeById<Element::Id::MkCueBlockNumber> {
using type = UIntElement; };
195 template <>
struct GetElementTypeById<Element::Id::MkCueCodecState> {
using type = UIntElement; };
196 template <>
struct GetElementTypeById<Element::Id::MkCueRefTime> {
using type = UIntElement; };
197 template <>
struct GetElementTypeById<Element::Id::MkTagsLanguageDefault> {
using type = UIntElement; };
198 template <>
struct GetElementTypeById<Element::Id::MkAttachedFileData> {
using type = BinaryElement; };
199 template <>
struct GetElementTypeById<Element::Id::MkSeekID> {
using type = BinaryElement; };
200 template <>
struct GetElementTypeById<Element::Id::MkTagBinary> {
using type = BinaryElement; };
201 template <>
struct GetElementTypeById<Element::Id::MkCodecState> {
using type = BinaryElement; };
202 template <>
struct GetElementTypeById<Element::Id::MkDuration> {
using type = FloatElement; };
203 template <>
struct GetElementTypeById<Element::Id::MkTitle> {
using type = UTF8StringElement; };
204 template <>
struct GetElementTypeById<Element::Id::MkSamplingFrequency> {
using type = FloatElement; };
205 template <>
struct GetElementTypeById<Element::Id::MkSeekHead> {
using type = MkSeekHead; };
206 template <>
struct GetElementTypeById<Element::Id::MkChapters> {
using type = MkChapters; };
207 template <>
struct GetElementTypeById<Element::Id::MkEditionEntry> {
using type = MasterElement; };
208 template <>
struct GetElementTypeById<Element::Id::MkEditionUID> {
using type = UIntElement; };
209 template <>
struct GetElementTypeById<Element::Id::MkEditionFlagDefault> {
using type = UIntElement; };
210 template <>
struct GetElementTypeById<Element::Id::MkEditionFlagOrdered> {
using type = UIntElement; };
211 template <>
struct GetElementTypeById<Element::Id::MkChapterAtom> {
using type = MasterElement; };
212 template <>
struct GetElementTypeById<Element::Id::MkChapterUID> {
using type = UIntElement; };
213 template <>
struct GetElementTypeById<Element::Id::MkChapterTimeStart> {
using type = UIntElement; };
214 template <>
struct GetElementTypeById<Element::Id::MkChapterTimeEnd> {
using type = UIntElement; };
215 template <>
struct GetElementTypeById<Element::Id::MkChapterFlagHidden> {
using type = UIntElement; };
216 template <>
struct GetElementTypeById<Element::Id::MkChapterDisplay> {
using type = MasterElement; };
217 template <>
struct GetElementTypeById<Element::Id::MkChapString> {
using type = UTF8StringElement; };
218 template <>
struct GetElementTypeById<Element::Id::MkChapLanguage> {
using type = Latin1StringElement; };
219 template <>
struct GetElementTypeById<Element::Id::VoidElement> {
using type = VoidElement; };
221 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
222 const T *element_cast(
const std::unique_ptr<Element> &ptr)
224 return static_cast<const T *
>(ptr.get());
227 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
228 std::unique_ptr<T> element_cast(std::unique_ptr<Element> &&ptr)
230 return std::unique_ptr<T>(
static_cast<T *
>(ptr.release()));
233 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
234 std::unique_ptr<T> make_unique_element(Element::Id
id,
int sizeLength,
offset_t dataSize,
offset_t offset)
236 return std::make_unique<T>(
id, sizeLength, dataSize, offset);
239 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
240 std::unique_ptr<T> make_unique_element()
242 return std::make_unique<T>(ID, 0, 0, 0);
A namespace for all TagLib related classes and functions.
Definition apefile.h:41
off_t offset_t
Definition taglib.h:64