Bump version to 0.6.4.1
[libmkv.git] / src / matroska.h
blob515c5abf08a2373c7c60c618932e1fb4ecf40e36
1 /*****************************************************************************
2 * matroska.h:
3 *****************************************************************************
4 * Copyright (C) 2005 x264 project
6 * Authors: Mike Matsnev
7 * Nathan Caldwell
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
23 #ifndef _MATROSKA_H
24 #define _MATROSKA_H 1
26 #include "md5.h"
27 #include "ebml.h"
29 #define CLSIZE 1048576
30 #define CHECK(x) do { if ((x) < 0) return -1; } while (0)
32 /* Matroska version supported */
33 #define MATROSKA_VERSION 2
35 /* Copied from ffmpeg */
37 * Matroska element IDs. max. 32-bit.
40 /* toplevel segment */
41 #define MATROSKA_ID_SEGMENT 0x18538067 /* sub-elements */
43 /* matroska top-level master IDs */
44 #define MATROSKA_ID_SEEKHEAD 0x114D9B74 /* sub-elements */
45 #define MATROSKA_ID_INFO 0x1549A966 /* sub-elements */
46 #define MATROSKA_ID_CLUSTER 0x1F43B675 /* sub-elements */
47 #define MATROSKA_ID_TRACKS 0x1654AE6B /* sub-elements */
48 #define MATROSKA_ID_CUES 0x1C53BB6B /* sub-elements */
49 #define MATROSKA_ID_ATTACHMENTS 0x1941A469 /* sub-elements */
50 #define MATROSKA_ID_CHAPTERS 0x1043A770 /* sub-elements */
51 #define MATROSKA_ID_TAGS 0x1254C367 /* sub-elements */
53 /* IDs in the info master */
54 #define MATROSKA_ID_TIMECODESCALE 0x2AD7B1 /* u-integer */
55 #define MATROSKA_ID_DURATION 0x4489 /* float */
56 #define MATROSKA_ID_TITLE 0x7BA9 /* UTF-8 */
57 #define MATROSKA_ID_WRITINGAPP 0x5741 /* UTF-8 */
58 #define MATROSKA_ID_MUXINGAPP 0x4D80 /* UTF-8 */
59 #define MATROSKA_ID_DATEUTC 0x4461 /* date */
60 #define MATROSKA_ID_SEGMENTUID 0x73A4 /* binary */
62 /* ID in the tracks master */
63 #define MATROSKA_ID_TRACKENTRY 0xAE /* sub-elements */
65 /* IDs in the trackentry master */
66 #define MATROSKA_ID_TRACKNUMBER 0xD7 /* u-integer */
67 #define MATROSKA_ID_TRACKUID 0x73C5 /* u-integer */
68 #define MATROSKA_ID_TRACKTYPE 0x83 /* u-integer */
69 #define MATROSKA_ID_TRACKAUDIO 0xE1 /* sub-elements */
70 #define MATROSKA_ID_TRACKVIDEO 0xE0 /* sub-elements */
71 #define MATROSKA_ID_CODECID 0x86 /* string */
72 #define MATROSKA_ID_CODECPRIVATE 0x63A2 /* binary */
73 #define MATROSKA_ID_CODECNAME 0x258688 /* UTF-8 */
74 #define MATROSKA_ID_CODECINFOURL 0x3B4040 /* string */
75 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240 /* string */
76 #define MATROSKA_ID_TRACKNAME 0x536E /* UTF-8 */
77 #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C /* string */
78 #define MATROSKA_ID_TRACKFLAGENABLED 0xB9 /* u-integer (1 bit) */
79 #define MATROSKA_ID_TRACKFLAGDEFAULT 0x88 /* u-integer (1 bit) */
80 #define MATROSKA_ID_TRACKFLAGLACING 0x9C /* u-integer (1 bit) */
81 #define MATROSKA_ID_TRACKFLAGFORCED 0x55AA /* u-integer (1 bit) */
82 #define MATROSKA_ID_TRACKMINCACHE 0x6DE7 /* u-integer */
83 #define MATROSKA_ID_TRACKMAXCACHE 0x6DF8 /* u-integer */
84 #define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383 /* u-integer */
86 /* IDs in the trackvideo master */
87 #define MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0 /* u-integer */
88 #define MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA /* u-integer */
89 #define MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2 /* u-integer */
90 #define MATROSKA_ID_VIDEOPIXELWIDTH 0xB0 /* u-integer */
91 #define MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA /* u-integer */
92 #define MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A /* u-integer (1 bit) */
93 #define MATROSKA_ID_VIDEOSTEREOMODE 0x53B9 /* u-integer */
94 #define MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3 /* u-integer */
95 #define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524 /* binary */
96 #define MATROSKA_ID_VIDEOPIXELCROPBOTTOM 0x54AA /* u-integer */
97 #define MATROSKA_ID_VIDEOPIXELCROPTOP 0x54BB /* u-integer */
98 #define MATROSKA_ID_VIDEOPIXELCROPLEFT 0x54CC /* u-integer */
99 #define MATROSKA_ID_VIDEOPIXELCROPRIGHT 0x54DD /* u-integer */
101 /* IDs in the trackaudio master */
102 #define MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5 /* float */
103 #define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ 0x78B5 /* float */
104 #define MATROSKA_ID_AUDIOBITDEPTH 0x6264 /* u-integer */
105 #define MATROSKA_ID_AUDIOCHANNELS 0x9F /* u-integer */
107 /* ID in the cues master */
108 #define MATROSKA_ID_CUEPOINT 0xBB /* sub-elements */
110 /* IDs in the pointentry master */
111 #define MATROSKA_ID_CUETIME 0xB3 /* u-integer */
112 #define MATROSKA_ID_CUETRACKPOSITIONS 0xB7 /* sub-elements */
114 /* IDs in the cuetrackposition master */
115 #define MATROSKA_ID_CUETRACK 0xF7 /* u-integer */
116 #define MATROSKA_ID_CUECLUSTERPOSITION 0xF1 /* u-integer */
117 #define MATROSKA_ID_CUEBLOCKNUMBER 0x5378 /* u-integer */
119 /* IDs in the seekhead master */
120 #define MATROSKA_ID_SEEKENTRY 0x4DBB /* sub-elements */
122 /* IDs in the seekpoint master */
123 #define MATROSKA_ID_SEEKID 0x53AB /* binary */
124 #define MATROSKA_ID_SEEKPOSITION 0x53AC /* u-integer */
126 /* IDs in the cluster master */
127 #define MATROSKA_ID_CLUSTERTIMECODE 0xE7 /* u-integer */
128 #define MATROSKA_ID_BLOCKGROUP 0xA0 /* sub-elements */
129 #define MATROSKA_ID_SIMPLEBLOCK 0xA3 /* binary */
131 /* IDs in the blockgroup master */
132 #define MATROSKA_ID_BLOCK 0xA1 /* binary */
133 #define MATROSKA_ID_BLOCKDURATION 0x9B /* u-integer */
134 #define MATROSKA_ID_REFERENCEBLOCK 0xFB /* s-integer */
136 /* IDs in the attachments master */
137 #define MATROSKA_ID_ATTACHEDFILE 0x61A7 /* sub-elements */
138 #define MATROSKA_ID_FILEDESCRIPTION 0x467E /* UTF-8 */
139 #define MATROSKA_ID_FILENAME 0x466E /* UTF-8 */
140 #define MATROSKA_ID_FILEMIMETYPE 0x4660 /* string */
141 #define MATROSKA_ID_FILEDATA 0x465C /* binary */
142 #define MATROSKA_ID_FILEUID 0x46AE /* u-integer */
143 /* Above copied from ffmpeg */
145 /* IDs in the tags master */
146 #define MATROSKA_ID_TAG 0x7373 /* sub-elements */
148 /* IDs in the tag master */
149 #define MATROSKA_ID_TARGETS 0x63C0 /* sub-elements */
150 #define MATROSKA_ID_SIMPLETAG 0x67C8 /* sub-elements */
152 /* IDs in the targets master */
153 #define MATROSKA_ID_TARGETTYPEVALUE 0x68CA /* u-integer */
154 #define MATROSKA_ID_TARGETTYPE 0x63CA /* string */
155 #define MATROSKA_ID_TARGETTRACKUID 0x63C5 /* u-integer */
156 #define MATROSKA_ID_TARGETEDITIONUID 0x63C9 /* u-integer */
157 #define MATROSKA_ID_TARGETCHAPTERUID 0x63C4 /* u-integer */
158 #define MATROSKA_ID_TARGETATTACHMENTUID 0x63C6 /* u-integer */
160 /* IDs in the simple tag master */
161 #define MATROSKA_ID_TAGNAME 0x45A3 /* UTF-8 */
162 #define MATROSKA_ID_TAGLANGUAGE 0x447A /* string */
163 #define MATROSKA_ID_TAGDEFAULT 0x4484 /* u-integer (1-bit)) */
164 #define MATROSKA_ID_TAGSTRING 0x4487 /* UTF-8 */
165 #define MATROSKA_ID_TAGBINARY 0x4485 /* binary */
167 /* IDs in the chapters master */
168 #define MATROSKA_ID_EDITIONENTRY 0x45B9 /* sub-elements */
170 /* IDs in the edition entry master */
171 #define MATROSKA_ID_EDITIONUID 0x45BC /* u-integer */
172 #define MATROSKA_ID_EDITIONFLAGHIDDEN 0x45BD /* u-integer (1 bit) */
173 #define MATROSKA_ID_EDITIONFLAGDEFAULT 0x45DB /* u-integer (1 bit) */
174 #define MATROSKA_ID_EDITIONFLAGORDERED 0x45DD /* u-integer (1 bit) */
175 #define MATROSKA_ID_CHAPTERATOM 0xB6 /* sub-elements */
177 /* IDs in the chapter atom master */
178 #define MATROSKA_ID_CHAPTERUID 0x73C4 /* u-integer */
179 #define MATROSKA_ID_CHAPTERTIMESTART 0x91 /* u-integer */
180 #define MATROSKA_ID_CHAPTERTIMEEND 0x92 /* u-integer */
181 #define MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98 /* u-integer (1 bit) */
182 #define MATROSKA_ID_CHAPTERFLAGENABLED 0x4598 /* u-integer (1 bit) */
183 #define MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67 /* binary */
184 #define MATROSKA_ID_CHAPTERSEGMENTEDITIONUID 0x6EBC /* binary */
185 #define MATROSKA_ID_CHAPTERPHYSICALEQUIV 0x63C3 /* u-integer */
186 #define MATROSKA_ID_CHAPTERTRACK 0x8F /* sub-elements */
187 #define MATROSKA_ID_CHAPTERDISPLAY 0x80 /* sub-elements */
188 #define MATROSKA_ID_CHAPPROCESS 0x6944 /* sub-elements */
190 /* IDs in the chapter track master */
191 #define MATROSKA_ID_CHAPTERTRACKNUMBER 0x89 /* u-integer */
193 /* IDs in the chapter display master */
194 #define MATROSKA_ID_CHAPTERSTRING 0x85 /* UTF-8 */
195 #define MATROSKA_ID_CHAPTERLANGUAGE 0x437C /* string */
196 #define MATROSKA_ID_CHAPTERCOUNTRY 0x437E /* string */
198 /* IDs in the chap process master */
199 #define MATROSKA_ID_CHAPPROCESSCODECID 0x6955 /* u-integer */
200 #define MATROSKA_ID_CHAPPROCESSPRIVATE 0x450D /* binary */
201 #define MATROSKA_ID_CHAPPROCESSCOMMAND 0x6911 /* sub-elements */
203 /* IDs in the chap proccess command master */
204 #define MATROSKA_ID_CHAPPROCESSTIME 0x6922 /* u-integer */
205 #define MATROSKA_ID_CHAPPROCESSDATA 0x6933 /* binary */
207 typedef struct mk_Seek_s mk_Seek;
208 typedef struct mk_Chapter_s mk_Chapter;
210 struct mk_Writer_s {
211 FILE *fp;
212 uint64_t f_pos;
213 uint64_t f_eof;
215 int64_t duration_ptr;
216 int64_t seekhead_ptr;
217 int64_t segment_ptr;
218 int64_t segmentuid_ptr;
220 mk_Context *root;
221 mk_Context *freelist;
222 mk_Context *actlist;
223 mk_Context *chapters;
224 mk_Context *edition_entry;
225 mk_Context *tags;
226 mk_Context *attachments;
227 mk_Context *tag;
228 mk_Context *tracks;
229 mk_Context *cues;
231 uint64_t def_duration;
232 uint64_t timescale;
234 uint8_t wrote_header;
236 uint8_t num_tracks;
237 uint8_t alloc_tracks;
238 mk_Track **tracks_arr;
240 struct {
241 int64_t segmentinfo;
242 int64_t seekhead;
243 int64_t tracks;
244 int64_t cues;
245 int64_t chapters;
246 int64_t attachments;
247 int64_t tags;
248 } seek_data;
250 struct {
251 mk_Context *context;
252 mk_Context *seekhead;
253 uint64_t block_count;
254 uint64_t count;
255 uint64_t pointer;
256 int64_t tc_scaled;
257 } cluster;
259 md5_context segment_md5;
260 uint8_t vlc_compat;
263 struct mk_Track_s {
264 uint8_t track_id;
266 int64_t prev_frame_tc_scaled;
267 int64_t max_frame_tc;
268 uint8_t in_frame;
269 uint64_t default_duration;
270 mk_TrackType track_type;
271 int64_t prev_cue_pos;
273 struct {
274 mk_Context *data;
275 int64_t timecode;
276 uint8_t keyframe;
277 mk_LacingType lacing;
278 uint8_t lacing_num_frames;
279 uint64_t *lacing_sizes;
280 uint64_t duration;
281 } frame;
284 int mk_writeSeek(mk_Writer *w, mk_Context *c, unsigned seek_id,
285 uint64_t seek_pos);
286 int mk_writeSeekHead(mk_Writer *w, int64_t *pointer);
287 int mk_writeTracks(mk_Writer *w, mk_Context *tracks);
288 int mk_writeChapters(mk_Writer *w);
289 int mk_writeTags(mk_Writer *w);
290 int mk_writeAttachments(mk_Writer *w);
291 int mk_seekFile(mk_Writer *w, uint64_t pos);
293 #endif