Use defines for the matroska element IDs.
[libmkv.git] / src / matroska.h
blobf77fa5ecd407ddd9670bb88f84dcd27516a83a77
1 /*****************************************************************************
2 * matroska.h:
3 *****************************************************************************
4 * Copyright (C) 2005 x264 project
5 * $Id: $
7 * Authors: Mike Matsnev
8 * Nathan Caldwell
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
24 #ifndef _MATROSKA_H
25 #define _MATROSKA_H 1
27 #include "md5.h"
29 #define CLSIZE 1048576
30 #define CHECK(x) do { if ((x) < 0) return -1; } while (0)
32 /* Copied from ffmpeg */
33 /* EBML version supported */
34 #define EBML_VERSION 1
35 #define MATROSKA_VERSION 2
37 /* top-level master-IDs */
38 #define EBML_ID_HEADER 0x1A45DFA3 /* sub-elements */
40 /* IDs in the HEADER master */
41 #define EBML_ID_EBMLVERSION 0x4286 /* u-integer */
42 #define EBML_ID_EBMLREADVERSION 0x42F7 /* u-integer */
43 #define EBML_ID_EBMLMAXIDLENGTH 0x42F2 /* u-integer */
44 #define EBML_ID_EBMLMAXSIZELENGTH 0x42F3 /* u-integer */
45 #define EBML_ID_DOCTYPE 0x4282 /* string */
46 #define EBML_ID_DOCTYPEVERSION 0x4287 /* u-integer */
47 #define EBML_ID_DOCTYPEREADVERSION 0x4285 /* u-integer */
49 /* general EBML types */
50 #define EBML_ID_VOID 0xEC /* binary */
53 * Matroska element IDs. max. 32-bit.
56 /* toplevel segment */
57 #define MATROSKA_ID_SEGMENT 0x18538067 /* sub-elements */
59 /* matroska top-level master IDs */
60 #define MATROSKA_ID_SEEKHEAD 0x114D9B74 /* sub-elements */
61 #define MATROSKA_ID_INFO 0x1549A966 /* sub-elements */
62 #define MATROSKA_ID_CLUSTER 0x1F43B675 /* sub-elements */
63 #define MATROSKA_ID_TRACKS 0x1654AE6B /* sub-elements */
64 #define MATROSKA_ID_CUES 0x1C53BB6B /* sub-elements */
65 #define MATROSKA_ID_ATTACHMENTS 0x1941A469 /* sub-elements */
66 #define MATROSKA_ID_CHAPTERS 0x1043A770 /* sub-elements */
67 #define MATROSKA_ID_TAGS 0x1254C367 /* sub-elements */
69 /* IDs in the info master */
70 #define MATROSKA_ID_TIMECODESCALE 0x2AD7B1 /* u-integer */
71 #define MATROSKA_ID_DURATION 0x4489 /* float */
72 #define MATROSKA_ID_TITLE 0x7BA9 /* UTF-8 */
73 #define MATROSKA_ID_WRITINGAPP 0x5741 /* UTF-8 */
74 #define MATROSKA_ID_MUXINGAPP 0x4D80 /* UTF-8 */
75 #define MATROSKA_ID_DATEUTC 0x4461 /* date */
76 #define MATROSKA_ID_SEGMENTUID 0x73A4 /* binary */
78 /* ID in the tracks master */
79 #define MATROSKA_ID_TRACKENTRY 0xAE /* sub-elements */
81 /* IDs in the trackentry master */
82 #define MATROSKA_ID_TRACKNUMBER 0xD7 /* u-integer */
83 #define MATROSKA_ID_TRACKUID 0x73C5 /* u-integer */
84 #define MATROSKA_ID_TRACKTYPE 0x83 /* u-integer */
85 #define MATROSKA_ID_TRACKAUDIO 0xE1 /* sub-elements */
86 #define MATROSKA_ID_TRACKVIDEO 0xE0 /* sub-elements */
87 #define MATROSKA_ID_CODECID 0x86 /* string */
88 #define MATROSKA_ID_CODECPRIVATE 0x63A2 /* binary */
89 #define MATROSKA_ID_CODECNAME 0x258688 /* UTF-8 */
90 #define MATROSKA_ID_CODECINFOURL 0x3B4040 /* string */
91 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240 /* string */
92 #define MATROSKA_ID_TRACKNAME 0x536E /* UTF-8 */
93 #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C /* string */
94 #define MATROSKA_ID_TRACKFLAGENABLED 0xB9 /* u-integer (1 bit) */
95 #define MATROSKA_ID_TRACKFLAGDEFAULT 0x88 /* u-integer (1 bit) */
96 #define MATROSKA_ID_TRACKFLAGLACING 0x9C /* u-integer (1 bit) */
97 #define MATROSKA_ID_TRACKFLAGFORCED 0x55AA /* u-integer (1 bit) */
98 #define MATROSKA_ID_TRACKMINCACHE 0x6DE7 /* u-integer */
99 #define MATROSKA_ID_TRACKMAXCACHE 0x6DF8 /* u-integer */
100 #define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383 /* u-integer */
102 /* IDs in the trackvideo master */
103 #define MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0 /* u-integer */
104 #define MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA /* u-integer */
105 #define MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2 /* u-integer */
106 #define MATROSKA_ID_VIDEOPIXELWIDTH 0xB0 /* u-integer */
107 #define MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA /* u-integer */
108 #define MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A /* u-integer (1 bit) */
109 #define MATROSKA_ID_VIDEOSTEREOMODE 0x53B9 /* u-integer */
110 #define MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3 /* u-integer */
111 #define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524 /* binary */
112 #define MATROSKA_ID_VIDEOPIXELCROPBOTTOM 0x54AA /* u-integer */
113 #define MATROSKA_ID_VIDEOPIXELCROPTOP 0x54BB /* u-integer */
114 #define MATROSKA_ID_VIDEOPIXELCROPLEFT 0x54CC /* u-integer */
115 #define MATROSKA_ID_VIDEOPIXELCROPRIGHT 0x54DD /* u-integer */
117 /* IDs in the trackaudio master */
118 #define MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5 /* float */
119 #define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ 0x78B5 /* float */
120 #define MATROSKA_ID_AUDIOBITDEPTH 0x6264 /* u-integer */
121 #define MATROSKA_ID_AUDIOCHANNELS 0x9F /* u-integer */
123 /* ID in the cues master */
124 #define MATROSKA_ID_CUEPOINT 0xBB /* sub-elements */
126 /* IDs in the pointentry master */
127 #define MATROSKA_ID_CUETIME 0xB3 /* u-integer */
128 #define MATROSKA_ID_CUETRACKPOSITIONS 0xB7 /* sub-elements */
130 /* IDs in the cuetrackposition master */
131 #define MATROSKA_ID_CUETRACK 0xF7 /* u-integer */
132 #define MATROSKA_ID_CUECLUSTERPOSITION 0xF1 /* u-integer */
133 #define MATROSKA_ID_CUEBLOCKNUMBER 0x5378 /* u-integer */
135 /* IDs in the tags master */
136 /* TODO */
138 /* IDs in the seekhead master */
139 #define MATROSKA_ID_SEEKENTRY 0x4DBB /* sub-elements */
141 /* IDs in the seekpoint master */
142 #define MATROSKA_ID_SEEKID 0x53AB /* binary */
143 #define MATROSKA_ID_SEEKPOSITION 0x53AC /* u-integer */
145 /* IDs in the cluster master */
146 #define MATROSKA_ID_CLUSTERTIMECODE 0xE7 /* u-integer */
147 #define MATROSKA_ID_BLOCKGROUP 0xA0 /* sub-elements */
148 #define MATROSKA_ID_SIMPLEBLOCK 0xA3 /* binary */
150 /* IDs in the blockgroup master */
151 #define MATROSKA_ID_BLOCK 0xA1 /* binary */
152 #define MATROSKA_ID_BLOCKDURATION 0x9B /* u-integer */
153 #define MATROSKA_ID_REFERENCEBLOCK 0xFB /* s-integer */
155 /* IDs in the attachments master */
156 #define MATROSKA_ID_ATTACHEDFILE 0x61A7 /* sub-elements */
157 #define MATROSKA_ID_FILENAME 0x466E /* UTF-8 */
158 #define MATROSKA_ID_FILEMIMETYPE 0x4660 /* string */
159 #define MATROSKA_ID_FILEDATA 0x465C /* binary */
160 #define MATROSKA_ID_FILEUID 0x46AE /* u-integer */
161 /* Above copied from ffmpeg */
163 /* IDs in the chapters master */
164 #define MATROSKA_ID_EDITIONENTRY 0x45B9 /* sub-elements */
166 /* IDs in the edition entry master */
167 #define MATROSKA_ID_EDITIONUID 0x45BC /* u-integer */
168 #define MATROSKA_ID_EDITIONFLAGHIDDEN 0x45BD /* u-integer (1 bit) */
169 #define MATROSKA_ID_EDITIONFLAGDEFAULT 0x45DB /* u-integer (1 bit) */
170 #define MATROSKA_ID_EDITIONFLAGORDERED 0x45DD /* u-integer (1 bit) */
171 #define MATROSKA_ID_CHAPTERATOM 0xB6 /* sub-elements */
173 /* IDs in the chapter atom master */
174 #define MATROSKA_ID_CHAPTERUID 0x73C4 /* u-integer */
175 #define MATROSKA_ID_CHAPTERTIMESTART 0x91 /* u-integer */
176 #define MATROSKA_ID_CHAPTERTIMEEND 0x92 /* u-integer */
177 #define MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98 /* u-integer (1 bit) */
178 #define MATROSKA_ID_CHAPTERFLAGENABLED 0x4598 /* u-integer (1 bit) */
179 #define MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67 /* binary */
180 #define MATROSKA_ID_CHAPTERSEGMENTEDITIONUID 0x6EBC /* binary */
181 #define MATROSKA_ID_CHAPTERPHYSICALEQUIV 0x63C3 /* u-integer */
182 #define MATROSKA_ID_CHAPTERTRACK 0x8F /* sub-elements */
183 #define MATROSKA_ID_CHAPTERDISPLAY 0x80 /* sub-elements */
184 #define MATROSKA_ID_CHAPPROCESS 0x6944 /* sub-elements */
186 /* IDs in the chapter track master */
187 #define MATROSKA_ID_CHAPTERTRACKNUMBER 0x89 /* u-integer */
189 /* IDs in the chapter display master */
190 #define MATROSKA_ID_CHAPTERSTRING 0x85 /* UTF-8 */
191 #define MATROSKA_ID_CHAPTERLANGUAGE 0x437C /* string */
192 #define MATROSKA_ID_CHAPTERCOUNTRY 0x437E /* string */
194 /* IDs in the chap process master */
195 #define MATROSKA_ID_CHAPPROCESSCODECID 0x6955 /* u-integer */
196 #define MATROSKA_ID_CHAPPROCESSPRIVATE 0x450D /* binary */
197 #define MATROSKA_ID_CHAPPROCESSCOMMAND 0x6911 /* sub-elements */
199 /* IDs in the chap proccess command master */
200 #define MATROSKA_ID_CHAPPROCESSTIME 0x6922 /* u-integer */
201 #define MATROSKA_ID_CHAPPROCESSDATA 0x6933 /* binary */
203 typedef struct mk_Context_s mk_Context;
204 typedef struct mk_Seek_s mk_Seek;
205 typedef struct mk_Chapter_s mk_Chapter;
207 struct mk_Context_s {
208 mk_Context *next, **prev, *parent;
209 mk_Writer *owner;
210 unsigned id;
212 void *data;
213 unsigned d_cur, d_max;
216 struct mk_Writer_s {
217 FILE *fp;
218 uint64_t f_pos;
219 uint64_t f_eof;
221 int64_t duration_ptr;
222 int64_t seekhead_ptr;
223 int64_t segment_ptr;
224 int64_t segmentuid_ptr;
226 mk_Context *root;
227 mk_Context *freelist;
228 mk_Context *actlist;
229 mk_Context *chapters;
230 mk_Context *edition_entry;
231 mk_Context *tracks;
232 mk_Context *cues;
234 uint64_t def_duration;
235 uint64_t timescale;
237 uint8_t wrote_header;
239 uint8_t num_tracks;
240 mk_Track **tracks_arr;
242 struct {
243 int64_t segmentinfo;
244 int64_t seekhead;
245 int64_t tracks;
246 int64_t cues;
247 int64_t chapters;
248 int64_t attachments;
249 int64_t tags;
250 } seek_data;
252 struct {
253 mk_Context *context;
254 mk_Context *seekhead;
255 uint64_t block_count;
256 uint64_t count;
257 uint64_t pointer;
258 int64_t tc_scaled;
259 } cluster;
261 md5_context segment_md5;
262 uint8_t vlc_compat;
265 struct mk_Track_s {
266 uint8_t track_id;
268 int64_t prev_frame_tc_scaled;
269 int64_t max_frame_tc;
270 uint8_t in_frame;
271 uint64_t default_duration;
272 uint8_t track_type;
273 int64_t prev_cue_pos;
275 struct {
276 mk_Context *data;
277 int64_t timecode;
278 uint8_t keyframe;
279 uint8_t lacing;
280 uint8_t lacing_num_frames;
281 uint64_t *lacing_sizes;
282 } frame;
285 /* EBML */
286 mk_Context *mk_createContext(mk_Writer *w, mk_Context *parent, unsigned id);
287 int mk_appendContextData(mk_Context *c, const void *data, uint64_t size);
288 int mk_writeID(mk_Context *c, unsigned id);
289 int mk_writeSize(mk_Context *c, uint64_t size);
290 int mk_writeSSize(mk_Context *c, int64_t size);
291 int mk_flushContextID(mk_Context *c);
292 int mk_flushContextData(mk_Context *c);
293 int mk_closeContext(mk_Context *c, int64_t *off);
294 void mk_destroyContexts(mk_Writer *w);
295 int mk_writeStr(mk_Context *c, unsigned id, const char *str);
296 int mk_writeBin(mk_Context *c, unsigned id, const void *data, unsigned size);
297 int mk_writeUInt(mk_Context *c, unsigned id, uint64_t ui);
298 int mk_writeSInt(mk_Context *c, unsigned id, int64_t si);
299 int mk_writeFloatRaw(mk_Context *c, float f);
300 int mk_writeFloat(mk_Context *c, unsigned id, float f);
301 int mk_writeVoid(mk_Context *c, uint64_t length);
302 unsigned mk_ebmlSizeSize(uint64_t s);
303 unsigned mk_ebmlSIntSize(int64_t si);
304 /* EBML */
306 mk_Context *mk_createContext(mk_Writer *w, mk_Context *parent, unsigned id);
307 int mk_writeUInt(mk_Context *c, unsigned id, uint64_t ui);
308 int mk_writeFloat(mk_Context *c, unsigned id, float f);
309 int mk_writeStr(mk_Context *c, unsigned id, const char *str);
310 int mk_writeBin(mk_Context *c, unsigned id, const void *data, unsigned size);
311 int mk_flushContextData(mk_Context *c);
312 int mk_closeContext(mk_Context *c, int64_t *off);
313 int mk_writeSeek(mk_Writer *w, mk_Context *c, unsigned seek_id, uint64_t seek_pos);
314 int mk_writeSeekHead(mk_Writer *w, int64_t *pointer);
315 int mk_writeTracks(mk_Writer *w, mk_Context *tracks);
316 int mk_writeChapters(mk_Writer *w);
317 int mk_seekFile(mk_Writer *w, uint64_t pos);
319 #endif