Use an enum for track types.
[libmkv.git] / src / matroska.h
blob6633b3f2e01b9246b00f611defa7367d102adf4e
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"
28 #include "ebml.h"
30 #define CLSIZE 1048576
31 #define CHECK(x) do { if ((x) < 0) return -1; } while (0)
33 /* Matroska version supported */
34 #define MATROSKA_VERSION 2
36 /* Copied from ffmpeg */
38 * Matroska element IDs. max. 32-bit.
41 /* toplevel segment */
42 #define MATROSKA_ID_SEGMENT 0x18538067 /* sub-elements */
44 /* matroska top-level master IDs */
45 #define MATROSKA_ID_SEEKHEAD 0x114D9B74 /* sub-elements */
46 #define MATROSKA_ID_INFO 0x1549A966 /* sub-elements */
47 #define MATROSKA_ID_CLUSTER 0x1F43B675 /* sub-elements */
48 #define MATROSKA_ID_TRACKS 0x1654AE6B /* sub-elements */
49 #define MATROSKA_ID_CUES 0x1C53BB6B /* sub-elements */
50 #define MATROSKA_ID_ATTACHMENTS 0x1941A469 /* sub-elements */
51 #define MATROSKA_ID_CHAPTERS 0x1043A770 /* sub-elements */
52 #define MATROSKA_ID_TAGS 0x1254C367 /* sub-elements */
54 /* IDs in the info master */
55 #define MATROSKA_ID_TIMECODESCALE 0x2AD7B1 /* u-integer */
56 #define MATROSKA_ID_DURATION 0x4489 /* float */
57 #define MATROSKA_ID_TITLE 0x7BA9 /* UTF-8 */
58 #define MATROSKA_ID_WRITINGAPP 0x5741 /* UTF-8 */
59 #define MATROSKA_ID_MUXINGAPP 0x4D80 /* UTF-8 */
60 #define MATROSKA_ID_DATEUTC 0x4461 /* date */
61 #define MATROSKA_ID_SEGMENTUID 0x73A4 /* binary */
63 /* ID in the tracks master */
64 #define MATROSKA_ID_TRACKENTRY 0xAE /* sub-elements */
66 /* IDs in the trackentry master */
67 #define MATROSKA_ID_TRACKNUMBER 0xD7 /* u-integer */
68 #define MATROSKA_ID_TRACKUID 0x73C5 /* u-integer */
69 #define MATROSKA_ID_TRACKTYPE 0x83 /* u-integer */
70 #define MATROSKA_ID_TRACKAUDIO 0xE1 /* sub-elements */
71 #define MATROSKA_ID_TRACKVIDEO 0xE0 /* sub-elements */
72 #define MATROSKA_ID_CODECID 0x86 /* string */
73 #define MATROSKA_ID_CODECPRIVATE 0x63A2 /* binary */
74 #define MATROSKA_ID_CODECNAME 0x258688 /* UTF-8 */
75 #define MATROSKA_ID_CODECINFOURL 0x3B4040 /* string */
76 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240 /* string */
77 #define MATROSKA_ID_TRACKNAME 0x536E /* UTF-8 */
78 #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C /* string */
79 #define MATROSKA_ID_TRACKFLAGENABLED 0xB9 /* u-integer (1 bit) */
80 #define MATROSKA_ID_TRACKFLAGDEFAULT 0x88 /* u-integer (1 bit) */
81 #define MATROSKA_ID_TRACKFLAGLACING 0x9C /* u-integer (1 bit) */
82 #define MATROSKA_ID_TRACKFLAGFORCED 0x55AA /* u-integer (1 bit) */
83 #define MATROSKA_ID_TRACKMINCACHE 0x6DE7 /* u-integer */
84 #define MATROSKA_ID_TRACKMAXCACHE 0x6DF8 /* u-integer */
85 #define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383 /* u-integer */
87 /* IDs in the trackvideo master */
88 #define MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0 /* u-integer */
89 #define MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA /* u-integer */
90 #define MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2 /* u-integer */
91 #define MATROSKA_ID_VIDEOPIXELWIDTH 0xB0 /* u-integer */
92 #define MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA /* u-integer */
93 #define MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A /* u-integer (1 bit) */
94 #define MATROSKA_ID_VIDEOSTEREOMODE 0x53B9 /* u-integer */
95 #define MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3 /* u-integer */
96 #define MATROSKA_ID_VIDEOCOLORSPACE 0x2EB524 /* binary */
97 #define MATROSKA_ID_VIDEOPIXELCROPBOTTOM 0x54AA /* u-integer */
98 #define MATROSKA_ID_VIDEOPIXELCROPTOP 0x54BB /* u-integer */
99 #define MATROSKA_ID_VIDEOPIXELCROPLEFT 0x54CC /* u-integer */
100 #define MATROSKA_ID_VIDEOPIXELCROPRIGHT 0x54DD /* u-integer */
102 /* IDs in the trackaudio master */
103 #define MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5 /* float */
104 #define MATROSKA_ID_AUDIOOUTSAMPLINGFREQ 0x78B5 /* float */
105 #define MATROSKA_ID_AUDIOBITDEPTH 0x6264 /* u-integer */
106 #define MATROSKA_ID_AUDIOCHANNELS 0x9F /* u-integer */
108 /* ID in the cues master */
109 #define MATROSKA_ID_CUEPOINT 0xBB /* sub-elements */
111 /* IDs in the pointentry master */
112 #define MATROSKA_ID_CUETIME 0xB3 /* u-integer */
113 #define MATROSKA_ID_CUETRACKPOSITIONS 0xB7 /* sub-elements */
115 /* IDs in the cuetrackposition master */
116 #define MATROSKA_ID_CUETRACK 0xF7 /* u-integer */
117 #define MATROSKA_ID_CUECLUSTERPOSITION 0xF1 /* u-integer */
118 #define MATROSKA_ID_CUEBLOCKNUMBER 0x5378 /* u-integer */
120 /* IDs in the tags master */
121 /* TODO */
123 /* IDs in the seekhead master */
124 #define MATROSKA_ID_SEEKENTRY 0x4DBB /* sub-elements */
126 /* IDs in the seekpoint master */
127 #define MATROSKA_ID_SEEKID 0x53AB /* binary */
128 #define MATROSKA_ID_SEEKPOSITION 0x53AC /* u-integer */
130 /* IDs in the cluster master */
131 #define MATROSKA_ID_CLUSTERTIMECODE 0xE7 /* u-integer */
132 #define MATROSKA_ID_BLOCKGROUP 0xA0 /* sub-elements */
133 #define MATROSKA_ID_SIMPLEBLOCK 0xA3 /* binary */
135 /* IDs in the blockgroup master */
136 #define MATROSKA_ID_BLOCK 0xA1 /* binary */
137 #define MATROSKA_ID_BLOCKDURATION 0x9B /* u-integer */
138 #define MATROSKA_ID_REFERENCEBLOCK 0xFB /* s-integer */
140 /* IDs in the attachments master */
141 #define MATROSKA_ID_ATTACHEDFILE 0x61A7 /* sub-elements */
142 #define MATROSKA_ID_FILENAME 0x466E /* UTF-8 */
143 #define MATROSKA_ID_FILEMIMETYPE 0x4660 /* string */
144 #define MATROSKA_ID_FILEDATA 0x465C /* binary */
145 #define MATROSKA_ID_FILEUID 0x46AE /* u-integer */
146 /* Above copied from ffmpeg */
148 /* IDs in the chapters master */
149 #define MATROSKA_ID_EDITIONENTRY 0x45B9 /* sub-elements */
151 /* IDs in the edition entry master */
152 #define MATROSKA_ID_EDITIONUID 0x45BC /* u-integer */
153 #define MATROSKA_ID_EDITIONFLAGHIDDEN 0x45BD /* u-integer (1 bit) */
154 #define MATROSKA_ID_EDITIONFLAGDEFAULT 0x45DB /* u-integer (1 bit) */
155 #define MATROSKA_ID_EDITIONFLAGORDERED 0x45DD /* u-integer (1 bit) */
156 #define MATROSKA_ID_CHAPTERATOM 0xB6 /* sub-elements */
158 /* IDs in the chapter atom master */
159 #define MATROSKA_ID_CHAPTERUID 0x73C4 /* u-integer */
160 #define MATROSKA_ID_CHAPTERTIMESTART 0x91 /* u-integer */
161 #define MATROSKA_ID_CHAPTERTIMEEND 0x92 /* u-integer */
162 #define MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98 /* u-integer (1 bit) */
163 #define MATROSKA_ID_CHAPTERFLAGENABLED 0x4598 /* u-integer (1 bit) */
164 #define MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67 /* binary */
165 #define MATROSKA_ID_CHAPTERSEGMENTEDITIONUID 0x6EBC /* binary */
166 #define MATROSKA_ID_CHAPTERPHYSICALEQUIV 0x63C3 /* u-integer */
167 #define MATROSKA_ID_CHAPTERTRACK 0x8F /* sub-elements */
168 #define MATROSKA_ID_CHAPTERDISPLAY 0x80 /* sub-elements */
169 #define MATROSKA_ID_CHAPPROCESS 0x6944 /* sub-elements */
171 /* IDs in the chapter track master */
172 #define MATROSKA_ID_CHAPTERTRACKNUMBER 0x89 /* u-integer */
174 /* IDs in the chapter display master */
175 #define MATROSKA_ID_CHAPTERSTRING 0x85 /* UTF-8 */
176 #define MATROSKA_ID_CHAPTERLANGUAGE 0x437C /* string */
177 #define MATROSKA_ID_CHAPTERCOUNTRY 0x437E /* string */
179 /* IDs in the chap process master */
180 #define MATROSKA_ID_CHAPPROCESSCODECID 0x6955 /* u-integer */
181 #define MATROSKA_ID_CHAPPROCESSPRIVATE 0x450D /* binary */
182 #define MATROSKA_ID_CHAPPROCESSCOMMAND 0x6911 /* sub-elements */
184 /* IDs in the chap proccess command master */
185 #define MATROSKA_ID_CHAPPROCESSTIME 0x6922 /* u-integer */
186 #define MATROSKA_ID_CHAPPROCESSDATA 0x6933 /* binary */
188 typedef struct mk_Seek_s mk_Seek;
189 typedef struct mk_Chapter_s mk_Chapter;
191 struct mk_Writer_s {
192 FILE *fp;
193 uint64_t f_pos;
194 uint64_t f_eof;
196 int64_t duration_ptr;
197 int64_t seekhead_ptr;
198 int64_t segment_ptr;
199 int64_t segmentuid_ptr;
201 mk_Context *root;
202 mk_Context *freelist;
203 mk_Context *actlist;
204 mk_Context *chapters;
205 mk_Context *edition_entry;
206 mk_Context *tracks;
207 mk_Context *cues;
209 uint64_t def_duration;
210 uint64_t timescale;
212 uint8_t wrote_header;
214 uint8_t num_tracks;
215 uint8_t alloc_tracks;
216 mk_Track **tracks_arr;
218 struct {
219 int64_t segmentinfo;
220 int64_t seekhead;
221 int64_t tracks;
222 int64_t cues;
223 int64_t chapters;
224 int64_t attachments;
225 int64_t tags;
226 } seek_data;
228 struct {
229 mk_Context *context;
230 mk_Context *seekhead;
231 uint64_t block_count;
232 uint64_t count;
233 uint64_t pointer;
234 int64_t tc_scaled;
235 } cluster;
237 md5_context segment_md5;
238 uint8_t vlc_compat;
241 struct mk_Track_s {
242 uint8_t track_id;
244 int64_t prev_frame_tc_scaled;
245 int64_t max_frame_tc;
246 uint8_t in_frame;
247 uint64_t default_duration;
248 mk_TrackType track_type;
249 int64_t prev_cue_pos;
251 struct {
252 mk_Context *data;
253 int64_t timecode;
254 uint8_t keyframe;
255 mk_LacingTypes lacing;
256 uint8_t lacing_num_frames;
257 uint64_t *lacing_sizes;
258 } frame;
261 int mk_writeSeek(mk_Writer *w, mk_Context *c, unsigned seek_id, uint64_t seek_pos);
262 int mk_writeSeekHead(mk_Writer *w, int64_t *pointer);
263 int mk_writeTracks(mk_Writer *w, mk_Context *tracks);
264 int mk_writeChapters(mk_Writer *w);
265 int mk_seekFile(mk_Writer *w, uint64_t pos);
267 #endif