Move #defines to before the includes where they'll have an effect.
[libmkv.git] / src / matroska.h
blob6d225f28730c318cd41d1e2e7bac0bdb3bebbe58
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 #define CLSIZE 1048576
28 #define CHECK(x) do { if ((x) < 0) return -1; } while (0)
30 typedef struct mk_Context_s mk_Context;
31 typedef struct mk_Seek_s mk_Seek;
32 typedef struct mk_Chapter_s mk_Chapter;
34 struct mk_Context_s {
35 mk_Context *next, **prev, *parent;
36 mk_Writer *owner;
37 unsigned id;
39 void *data;
40 unsigned d_cur, d_max;
43 struct mk_Writer_s {
44 FILE *fp;
45 uint64_t f_pos;
46 uint64_t f_eof;
49 int64_t duration_ptr;
50 int64_t seekhead_ptr;
51 int64_t segment_ptr;
53 mk_Context *root;
54 mk_Context *freelist;
55 mk_Context *actlist;
56 mk_Context *chapters;
57 mk_Context *edition_entry;
58 mk_Context *tracks;
59 mk_Context *cues;
61 uint64_t def_duration;
62 uint64_t timescale;
64 uint8_t wrote_header;
66 uint8_t num_tracks;
67 mk_Track **tracks_arr;
69 struct {
70 int64_t segmentinfo;
71 int64_t seekhead;
72 int64_t tracks;
73 int64_t cues;
74 int64_t chapters;
75 int64_t attachments;
76 int64_t tags;
77 } seek_data;
79 struct {
80 mk_Context *context;
81 mk_Context *seekhead;
82 uint64_t block_count;
83 uint64_t count;
84 uint64_t pointer;
85 int64_t tc_scaled;
86 } cluster;
88 int chapter_uid;
89 uint8_t vlc_compat;
92 struct mk_Track_s {
93 uint8_t track_id;
95 int64_t prev_frame_tc_scaled;
96 int64_t max_frame_tc;
97 uint8_t in_frame;
98 uint64_t default_duration;
99 uint8_t track_type;
100 int64_t prev_cue_pos;
102 struct {
103 mk_Context *data;
104 int64_t timecode;
105 uint8_t keyframe;
106 uint8_t lacing;
107 uint8_t lacing_num_frames;
108 uint64_t *lacing_sizes;
109 } frame;
112 /* EBML */
113 mk_Context *mk_createContext(mk_Writer *w, mk_Context *parent, unsigned id);
114 int mk_appendContextData(mk_Context *c, const void *data, uint64_t size);
115 int mk_writeID(mk_Context *c, unsigned id);
116 int mk_writeSize(mk_Context *c, uint64_t size);
117 int mk_writeSSize(mk_Context *c, int64_t size);
118 int mk_flushContextID(mk_Context *c);
119 int mk_flushContextData(mk_Context *c);
120 int mk_closeContext(mk_Context *c, int64_t *off);
121 void mk_destroyContexts(mk_Writer *w);
122 int mk_writeStr(mk_Context *c, unsigned id, const char *str);
123 int mk_writeBin(mk_Context *c, unsigned id, const void *data, unsigned size);
124 int mk_writeUInt(mk_Context *c, unsigned id, uint64_t ui);
125 int mk_writeSInt(mk_Context *c, unsigned id, int64_t si);
126 int mk_writeFloatRaw(mk_Context *c, float f);
127 int mk_writeFloat(mk_Context *c, unsigned id, float f);
128 int mk_writeVoid(mk_Context *c, uint64_t length);
129 unsigned mk_ebmlSizeSize(uint64_t s);
130 unsigned mk_ebmlSIntSize(int64_t si);
131 /* EBML */
133 mk_Context *mk_createContext(mk_Writer *w, mk_Context *parent, unsigned id);
134 int mk_writeUInt(mk_Context *c, unsigned id, uint64_t ui);
135 int mk_writeFloat(mk_Context *c, unsigned id, float f);
136 int mk_writeStr(mk_Context *c, unsigned id, const char *str);
137 int mk_writeBin(mk_Context *c, unsigned id, const void *data, unsigned size);
138 int mk_flushContextData(mk_Context *c);
139 int mk_closeContext(mk_Context *c, int64_t *off);
140 int mk_writeSeek(mk_Writer *w, mk_Context *c, unsigned seek_id, uint64_t seek_pos);
141 int mk_writeSeekHead(mk_Writer *w, int64_t *pointer);
142 int mk_writeTracks(mk_Writer *w, mk_Context *tracks);
143 int mk_writeChapters(mk_Writer *w);
144 int mk_seekFile(mk_Writer *w, uint64_t pos);
146 #endif