Use random() to create Track, Chapter, and Edition UIDs.
[libmkv.git] / src / matroska.h
blob33924a2b2ff5c1e55e894c59401ada58c0562c34
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 uint8_t vlc_compat;
91 struct mk_Track_s {
92 uint8_t track_id;
94 int64_t prev_frame_tc_scaled;
95 int64_t max_frame_tc;
96 uint8_t in_frame;
97 uint64_t default_duration;
98 uint8_t track_type;
99 int64_t prev_cue_pos;
101 struct {
102 mk_Context *data;
103 int64_t timecode;
104 uint8_t keyframe;
105 uint8_t lacing;
106 uint8_t lacing_num_frames;
107 uint64_t *lacing_sizes;
108 } frame;
111 /* EBML */
112 mk_Context *mk_createContext(mk_Writer *w, mk_Context *parent, unsigned id);
113 int mk_appendContextData(mk_Context *c, const void *data, uint64_t size);
114 int mk_writeID(mk_Context *c, unsigned id);
115 int mk_writeSize(mk_Context *c, uint64_t size);
116 int mk_writeSSize(mk_Context *c, int64_t size);
117 int mk_flushContextID(mk_Context *c);
118 int mk_flushContextData(mk_Context *c);
119 int mk_closeContext(mk_Context *c, int64_t *off);
120 void mk_destroyContexts(mk_Writer *w);
121 int mk_writeStr(mk_Context *c, unsigned id, const char *str);
122 int mk_writeBin(mk_Context *c, unsigned id, const void *data, unsigned size);
123 int mk_writeUInt(mk_Context *c, unsigned id, uint64_t ui);
124 int mk_writeSInt(mk_Context *c, unsigned id, int64_t si);
125 int mk_writeFloatRaw(mk_Context *c, float f);
126 int mk_writeFloat(mk_Context *c, unsigned id, float f);
127 int mk_writeVoid(mk_Context *c, uint64_t length);
128 unsigned mk_ebmlSizeSize(uint64_t s);
129 unsigned mk_ebmlSIntSize(int64_t si);
130 /* EBML */
132 mk_Context *mk_createContext(mk_Writer *w, mk_Context *parent, unsigned id);
133 int mk_writeUInt(mk_Context *c, unsigned id, uint64_t ui);
134 int mk_writeFloat(mk_Context *c, unsigned id, float f);
135 int mk_writeStr(mk_Context *c, unsigned id, const char *str);
136 int mk_writeBin(mk_Context *c, unsigned id, const void *data, unsigned size);
137 int mk_flushContextData(mk_Context *c);
138 int mk_closeContext(mk_Context *c, int64_t *off);
139 int mk_writeSeek(mk_Writer *w, mk_Context *c, unsigned seek_id, uint64_t seek_pos);
140 int mk_writeSeekHead(mk_Writer *w, int64_t *pointer);
141 int mk_writeTracks(mk_Writer *w, mk_Context *tracks);
142 int mk_writeChapters(mk_Writer *w);
143 int mk_seekFile(mk_Writer *w, uint64_t pos);
145 #endif