TagLib API Documentation
ebmlelement.h
Go to the documentation of this file.
1/***************************************************************************
2 * This library is free software; you can redistribute it and/or modify *
3 * it under the terms of the GNU Lesser General Public License version *
4 * 2.1 as published by the Free Software Foundation. *
5 * *
6 * This library is distributed in the hope that it will be useful, but *
7 * WITHOUT ANY WARRANTY; without even the implied warranty of *
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
9 * Lesser General Public License for more details. *
10 * *
11 * You should have received a copy of the GNU Lesser General Public *
12 * License along with this library; if not, write to the Free Software *
13 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA *
14 * 02110-1301 USA *
15 * *
16 * Alternatively, this file is available under the Mozilla Public *
17 * License Version 1.1. You may obtain a copy of the License at *
18 * http://www.mozilla.org/MPL/ *
19 ***************************************************************************/
20
21#ifndef TAGLIB_EBMLELEMENT_H
22#define TAGLIB_EBMLELEMENT_H
23#ifndef DO_NOT_DOCUMENT
24
25#include <cstdint>
26#include <memory>
27#include "taglib.h"
28
29namespace TagLib
30{
31 class File;
32 class ByteVector;
33
34 namespace EBML {
35
36 class Element
37 {
38 public:
39 enum class Id : unsigned int
40 {
41 EBMLHeader = 0x1A45DFA3,
42 DocType = 0x4282,
43 DocTypeVersion = 0x4287,
44 VoidElement = 0xEC,
45 MkSegment = 0x18538067,
46 MkTags = 0x1254C367,
47 MkTag = 0x7373,
48 MkTagTargets = 0x63C0,
49 MkTagTargetTypeValue = 0x68CA,
50 MkTagTrackUID = 0x63C5,
51 MkSimpleTag = 0x67C8,
52 MkTagName = 0x45A3,
53 MkTagLanguage = 0x447A,
54 MkTagBinary = 0x4485,
55 MkTagString = 0x4487,
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,
66 MkSeek = 0x4DBB,
67 MkSeekID = 0x53AB,
68 MkSeekPosition = 0x53AC,
69 MkCluster = 0x1F43B675,
70 MkCodecState = 0xA4,
71 MkCues = 0x1C53BB6B,
72 MkCuePoint = 0xBB,
73 MkCueTime = 0xB3,
74 MkCueTrackPositions = 0xB7,
75 MkCueTrack = 0xF7,
76 MkCueClusterPosition = 0xF1,
77 MkCueRelativePosition = 0xF0,
78 MkCueDuration = 0xB2,
79 MkCueBlockNumber = 0x5378,
80 MkCueCodecState = 0xEA,
81 MkCueReference = 0xDB,
82 MkCueRefTime = 0x96,
83 MkInfo = 0x1549A966,
84 MkTimestampScale = 0x2AD7B1,
85 MkDuration = 0x4489,
86 MkTitle = 0x7BA9,
87 MkTracks = 0x1654AE6B,
88 MkTrackEntry = 0xAE,
89 MkCodecID = 0x86,
90 MkAudio = 0xE1,
91 MkSamplingFrequency = 0xB5,
92 MkBitDepth = 0x6264,
93 MkChannels = 0x9F,
94 MkChapters = 0x1043A770,
95 MkEditionEntry = 0x45B9,
96 MkEditionUID = 0x45BC,
97 MkEditionFlagDefault = 0x45DB,
98 MkEditionFlagOrdered = 0x45DD,
99 MkChapterAtom = 0xB6,
100 MkChapterUID = 0x73C4,
101 MkChapterTimeStart = 0x91,
102 MkChapterTimeEnd = 0x92,
103 MkChapterFlagHidden = 0x98,
104 MkChapterDisplay = 0x80,
105 MkChapString = 0x85,
106 MkChapLanguage = 0x437C,
107 };
108
109 Element(Id id, int sizeLength, offset_t dataSize);
110 Element(Id id, int sizeLength, offset_t dataSize, offset_t);
111 virtual ~Element();
112
113 virtual bool read(File &file);
114 void skipData(File &file);
115 Id getId() const;
116 offset_t headSize() const;
117 offset_t getSize() const;
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);
124
125 protected:
126 Id id;
127 int sizeLength;
128 offset_t dataSize;
129 };
130
131 // Template specializations to ensure that elements for the different IDs
132 // are consistently created and cast. They provide a mapping between IDs
133 // and Element subclasses. The switch in factory() makes sure that the
134 // template for all IDs are instantiated, i.e. that every ID has its Element
135 // subclass mapped.
136 class MasterElement;
137 class UIntElement;
138 class BinaryElement;
139 class FloatElement;
140 class MkSegment;
141 class MkInfo;
142 class MkTracks;
143 class MkTags;
144 class MkAttachments;
145 class MkSeekHead;
146 class MkChapters;
147 class MkCues;
148 class VoidElement;
149 class UTF8StringElement;
150 class Latin1StringElement;
151
152 template <Element::Id ID>
153 struct GetElementTypeById;
154
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; };
220
221 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
222 const T *element_cast(const std::unique_ptr<Element> &ptr)
223 {
224 return static_cast<const T *>(ptr.get());
225 }
226
227 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
228 std::unique_ptr<T> element_cast(std::unique_ptr<Element> &&ptr)
229 {
230 return std::unique_ptr<T>(static_cast<T *>(ptr.release()));
231 }
232
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)
235 {
236 return std::make_unique<T>(id, sizeLength, dataSize, offset);
237 }
238
239 template <Element::Id ID, typename T=typename GetElementTypeById<ID>::type>
240 std::unique_ptr<T> make_unique_element()
241 {
242 return std::make_unique<T>(ID, 0, 0, 0);
243 }
244
245 }
246}
247
248#endif
249#endif
A namespace for all TagLib related classes and functions.
Definition apefile.h:41
off_t offset_t
Definition taglib.h:64