summaryrefslogtreecommitdiff
path: root/src/demuxers/matroska.h
blob: 3bfdbdc0c0821b71d7061923bcf00eb1ca9854d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
/*
 * Copyright (C) 2000-2007 the xine project
 *
 * This file is part of xine, a free video player.
 *
 * xine is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * xine is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
 *
 * $Id: matroska.h,v 1.11 2007/01/07 12:33:50 molivier Exp $
 *
 */
#ifndef MATROSKA_H
#define MATROSKA_H

#include "xine_internal.h"
#include "xineutils.h"
#include "demux.h"

#include "ebml.h"

/*
 * Matroska Element IDs
 */

/* Segment */
#define MATROSKA_ID_SEGMENT                       0x18538067

/* Meta Seek Information */
#define MATROSKA_ID_SEEKHEAD                      0x114D9B74
#define MATROSKA_ID_S_ENTRY                       0x4DBB
#define MATROSKA_ID_S_ID                          0x53AB
#define MATROSKA_ID_S_POSITION                    0x53AC

/* Segment Information */
#define MATROSKA_ID_INFO                          0x1549A966
#define MATROSKA_ID_I_SEGMENTUID                  0x73A4
#define MATROSKA_ID_I_FILENAME                    0x7384
#define MATROSKA_ID_I_PREVUID                     0x3CB923
#define MATROSKA_ID_I_PREVFILENAME                0x3C83AB
#define MATROSKA_ID_I_NEXTUID                     0x3EB923
#define MATROSKA_ID_I_NEXTFILENAME                0x3E83BB
#define MATROSKA_ID_I_TIMECODESCALE               0x2AD7B1
#define MATROSKA_ID_I_DURATION                    0x4489
#define MATROSKA_ID_I_DATEUTC                     0x4461
#define MATROSKA_ID_I_TITLE                       0x7BA9
#define MATROSKA_ID_I_MUXINGAPP                   0x4D80
#define MATROSKA_ID_I_WRITINGAPP                  0x5741

/* Cluster */
#define MATROSKA_ID_CLUSTER                       0x1F43B675
#define MATROSKA_ID_CL_TIMECODE                   0xE7
#define MATROSKA_ID_CL_POSITION                   0xA7
#define MATROSKA_ID_CL_PREVSIZE                   0xAB
#define MATROSKA_ID_CL_BLOCKGROUP                 0xA0
#define MATROSKA_ID_CL_BLOCK                      0xA1
#define MATROSKA_ID_CL_BLOCKVIRTUAL               0xA2
#define MATROSKA_ID_CL_BLOCKADDITIONS             0x75A1
#define MATROSKA_ID_CL_BLOCKMORE                  0xA6
#define MATROSKA_ID_CL_BLOCKADDID                 0xEE
#define MATROSKA_ID_CL_BLOCKADDITIONAL            0xA5
#define MATROSKA_ID_CL_BLOCKDURATION              0x9B
#define MATROSKA_ID_CL_REFERENCEPRIORITY          0xFA
#define MATROSKA_ID_CL_REFERENCEBLOCK             0xFB
#define MATROSKA_ID_CL_REFERENCEVIRTUAL           0xFD
#define MATROSKA_ID_CL_CODECSTATE                 0xA4
#define MATROSKA_ID_CL_SLICES                     0x8E
#define MATROSKA_ID_CL_TIMESLICE                  0xE8
#define MATROSKA_ID_CL_LACENUMBER                 0xCC
#define MATROSKA_ID_CL_FRAMENUMBER                0xCD
#define MATROSKA_ID_CL_BLOCKADDITIONID            0xCB
#define MATROSKA_ID_CL_DELAY                      0xCE
#define MATROSKA_ID_CL_DURATION                   0xCF

/* Track */
#define MATROSKA_ID_TRACKS                        0x1654AE6B
#define MATROSKA_ID_TR_ENTRY                      0xAE
#define MATROSKA_ID_TR_NUMBER                     0xD7
#define MATROSKA_ID_TR_UID                        0x73C5
#define MATROSKA_ID_TR_TYPE                       0x83
#define MATROSKA_ID_TR_FLAGENABLED                0xB9
#define MATROSKA_ID_TR_FLAGDEFAULT                0x88
#define MATROSKA_ID_TR_FLAGLACING                 0x9C
#define MATROSKA_ID_TR_MINCACHE                   0x6DE7
#define MATROSKA_ID_TR_MAXCACHE                   0x6DF8
#define MATROSKA_ID_TR_DEFAULTDURATION            0x23E383
#define MATROSKA_ID_TR_TIMECODESCALE              0x23314F
#define MATROSKA_ID_TR_NAME                       0x536E
#define MATROSKA_ID_TR_LANGUAGE                   0x22B59C
#define MATROSKA_ID_TR_CODECID                    0x86
#define MATROSKA_ID_TR_CODECPRIVATE               0x63A2
#define MATROSKA_ID_TR_CODECNAME                  0x258688
#define MATROSKA_ID_TR_CODECSETTINGS              0x3A9697
#define MATROSKA_ID_TR_CODECINFOURL               0x3B4040
#define MATROSKA_ID_TR_CODECDOWNLOADURL           0x26B240
#define MATROSKA_ID_TR_CODECDECODEALL             0xAA
#define MATROSKA_ID_TR_OVERLAY                    0x6FAB

/* Video */
#define MATROSKA_ID_TV                            0xE0
#define MATROSKA_ID_TV_FLAGINTERLACED             0x9A
#define MATROSKA_ID_TV_STEREOMODE                 0x53B9
#define MATROSKA_ID_TV_PIXELWIDTH                 0xB0
#define MATROSKA_ID_TV_PIXELHEIGHT                0xBA
#define MATROSKA_ID_TV_VIDEODISPLAYWIDTH          0x54B0
#define MATROSKA_ID_TV_VIDEODISPLAYHEIGHT         0x54BA
#define MATROSKA_ID_TV_VIDEOUNIT                  0x54B2
#define MATROSKA_ID_TV_ASPECTRATIOTYPE            0x54B3
#define MATROSKA_ID_TV_COLOURSPACE                0x2EB524
#define MATROSKA_ID_TV_GAMMAVALUE                 0x2FB523

/* Audio */
#define MATROSKA_ID_TA                            0xE1
#define MATROSKA_ID_TA_SAMPLINGFREQUENCY          0xB5
#define MATROSKA_ID_TA_OUTPUTSAMPLINGFREQUENCY    0x78B5
#define MATROSKA_ID_TA_CHANNELS                   0x9F
#define MATROSKA_ID_TA_CHANNELPOSITIONS           0x9F
#define MATROSKA_ID_TA_BITDEPTH                   0x6264

/* Content Encoding */
#define MATROSKA_ID_CONTENTENCODINGS              0x6D80
#define MATROSKA_ID_CONTENTENCODING               0x6240
#define MATROSKA_ID_CE_ORDER                      0x5031
#define MATROSKA_ID_CE_SCOPE                      0x5032
#define MATROSKA_ID_CE_TYPE                       0x5033
#define MATROSKA_ID_CE_COMPRESSION                0x5034
#define MATROSKA_ID_CE_COMPALGO                   0x4254
#define MATROSKA_ID_CE_COMPSETTINGS               0x4255
#define MATROSKA_ID_CE_ENCRYPTION                 0x5035
#define MATROSKA_ID_CE_ENCALGO                    0x47E1
#define MATROSKA_ID_CE_ENCKEYID                   0x47E2
#define MATROSKA_ID_CE_SIGNATURE                  0x47E3
#define MATROSKA_ID_CE_SIGKEYID                   0x47E4
#define MATROSKA_ID_CE_SIGALGO                    0x47E5
#define MATROSKA_ID_CE_SIGHASHALGO                0x47E6

/* Cueing Data */
#define MATROSKA_ID_CUES                          0x1C53BB6B
#define MATROSKA_ID_CU_POINT                      0xBB
#define MATROSKA_ID_CU_TIME                       0xB3
#define MATROSKA_ID_CU_TRACKPOSITION              0xB7
#define MATROSKA_ID_CU_TRACK                      0xF7
#define MATROSKA_ID_CU_CLUSTERPOSITION            0xF1
#define MATROSKA_ID_CU_BLOCKNUMBER                0x5387
#define MATROSKA_ID_CU_CODECSTATE                 0xEA
#define MATROSKA_ID_CU_REFERENCE                  0xDB
#define MATROSKA_ID_CU_REFTIME                    0x96
#define MATROSKA_ID_CU_REFCLUSTER                 0x97
#define MATROSKA_ID_CU_REFNUMBER                  0x535F
#define MATROSKA_ID_CU_REFCODECSTATE              0xEB

/* Attachements */
#define MATROSKA_ID_ATTACHMENTS                   0x1941A469
#define MATROSKA_ID_AT_FILE                       0x61A7
#define MATROSKA_ID_AT_FILEDESCRIPTION            0x467E
#define MATROSKA_ID_AT_FILENAME                   0x466E
#define MATROSKA_ID_AT_FILEMIMETYPE               0x4660
#define MATROSKA_ID_AT_FILEDATA                   0x465C
#define MATROSKA_ID_AT_FILEUID                    0x46AE

/* Chapters */
#define MATROSKA_ID_CHAPTERS                      0x1043A770
#define MATROSKA_ID_CH_EDITIONENTRY               0x45B9
#define MATROSKA_ID_CH_ATOM                       0xB6
#define MATROSKA_ID_CH_UID                        0x73C4
#define MATROSKA_ID_CH_TIMESTART                  0x91
#define MATROSKA_ID_CH_TIMEEND                    0x92
#define MATROSKA_ID_CH_TRACK                      0x8F
#define MATROSKA_ID_CH_TRACKNUMBER                0x89
#define MATROSKA_ID_CH_DISPLAY                    0x80
#define MATROSKA_ID_CH_STRING                     0x85
#define MATROSKA_ID_CH_LANGUAGE                   0x437C
#define MATROSKA_ID_CH_COUNTRY                    0x437E

/* Tags */
#define MATROSKA_ID_TAGS                          0x1254C367

/* Matroska Track */
typedef struct {
  int                      flag_interlaced;
  int                      pixel_width;
  int                      pixel_height;
  int                      display_width;
  int                      display_height;
} matroska_video_track_t;

typedef struct {
  int                      sampling_freq;
  int                      output_sampling_freq;
  int                      channels;
  int                      bits_per_sample;
} matroska_audio_track_t;

typedef struct {
  char                     type;

  /* The rest is used for VobSubs (type = 'v'). */
  int                      width;
  int                      height;
  uint32_t                 palette[16];
  int                      custom_colors;
  uint32_t                 colors[4];
  int                      forced_subs_only;
} matroska_sub_track_t;

typedef struct matroska_track_s matroska_track_t;
struct matroska_track_s {
  int                      track_num;
  
  uint32_t                 track_type;
  uint64_t                 default_duration;
  char                    *language;
  char                    *codec_id;
  uint8_t                 *codec_private;
  uint32_t                 codec_private_len;
  int                      default_flag;
  uint32_t                 compress_algo;
  
  uint32_t                 buf_type;
  fifo_buffer_t           *fifo;

  matroska_video_track_t  *video_track;
  matroska_audio_track_t  *audio_track;
  matroska_sub_track_t    *sub_track;

  int64_t                  last_pts;

  void                   (*handle_content) (demux_plugin_t *this_gen,
                                            matroska_track_t *track,
		                            int decoder_flags,
                                            uint8_t *data, int data_len,
                                            int64_t data_pts, int data_duration,
                                            int input_normpos, int input_time);
};

/* IDs in the tags master */

/*
 * Matroska Codec IDs. Strings.
 */

#define MATROSKA_CODEC_ID_V_VFW_FOURCC   "V_MS/VFW/FOURCC"
#define MATROSKA_CODEC_ID_V_UNCOMPRESSED "V_UNCOMPRESSED"
#define MATROSKA_CODEC_ID_V_MPEG4_SP     "V_MPEG4/ISO/SP"
#define MATROSKA_CODEC_ID_V_MPEG4_ASP    "V_MPEG4/ISO/ASP"
#define MATROSKA_CODEC_ID_V_MPEG4_AP     "V_MPEG4/ISO/AP"
#define MATROSKA_CODEC_ID_V_MPEG4_AVC    "V_MPEG4/ISO/AVC"
#define MATROSKA_CODEC_ID_V_MSMPEG4V3    "V_MPEG4/MS/V3"
#define MATROSKA_CODEC_ID_V_MPEG1        "V_MPEG1"
#define MATROSKA_CODEC_ID_V_MPEG2        "V_MPEG2"
#define MATROSKA_CODEC_ID_V_MPEG2        "V_MPEG2"
#define MATROSKA_CODEC_ID_V_REAL_RV10    "V_REAL/RV10"
#define MATROSKA_CODEC_ID_V_REAL_RV20    "V_REAL/RV20"
#define MATROSKA_CODEC_ID_V_REAL_RV30    "V_REAL/RV30"
#define MATROSKA_CODEC_ID_V_REAL_RV40    "V_REAL/RV40"
#define MATROSKA_CODEC_ID_V_MJPEG        "V_MJPEG"

#define MATROSKA_CODEC_ID_A_MPEG1_L1     "A_MPEG/L1"
#define MATROSKA_CODEC_ID_A_MPEG1_L2     "A_MPEG/L2"
#define MATROSKA_CODEC_ID_A_MPEG1_L3     "A_MPEG/L3"
#define MATROSKA_CODEC_ID_A_PCM_INT_BE   "A_PCM/INT/BIG"
#define MATROSKA_CODEC_ID_A_PCM_INT_LE   "A_PCM/INT/LIT"
#define MATROSKA_CODEC_ID_A_PCM_FLOAT    "A_PCM/FLOAT/IEEE"
#define MATROSKA_CODEC_ID_A_AC3          "A_AC3"
#define MATROSKA_CODEC_ID_A_DTS          "A_DTS"
#define MATROSKA_CODEC_ID_A_VORBIS       "A_VORBIS"
#define MATROSKA_CODEC_ID_A_ACM          "A_MS/ACM"
#define MATROSKA_CODEC_ID_A_AAC          "A_AAC"
#define MATROSKA_CODEC_ID_A_REAL_14_4    "A_REAL/14_4"
#define MATROSKA_CODEC_ID_A_REAL_28_8    "A_REAL/28_8"
#define MATROSKA_CODEC_ID_A_REAL_COOK    "A_REAL/COOK"
#define MATROSKA_CODEC_ID_A_REAL_SIPR    "A_REAL/SIPR"
#define MATROSKA_CODEC_ID_A_REAL_RALF    "A_REAL/RALF"
#define MATROSKA_CODEC_ID_A_REAL_ATRC    "A_REAL/ATRC"

#define MATROSKA_CODEC_ID_S_TEXT_UTF8    "S_TEXT/UTF8"
#define MATROSKA_CODEC_ID_S_TEXT_SSA     "S_TEXT/SSA"
#define MATROSKA_CODEC_ID_S_TEXT_ASS     "S_TEXT/ASS"
#define MATROSKA_CODEC_ID_S_TEXT_USF     "S_TEXT/USF"
#define MATROSKA_CODEC_ID_S_UTF8         "S_UTF8"        /* deprecated */
#define MATROSKA_CODEC_ID_S_SSA          "S_SSA"         /* deprecated */
#define MATROSKA_CODEC_ID_S_ASS          "S_ASS"         /* deprecated */
#define MATROSKA_CODEC_ID_S_VOBSUB       "S_VOBSUB"

/* block lacing */
#define MATROSKA_NO_LACING               0x0
#define MATROSKA_XIPH_LACING             0x1
#define MATROSKA_FIXED_SIZE_LACING       0x2
#define MATROSKA_EBML_LACING             0x3

/* track types */
#define MATROSKA_TRACK_VIDEO             0x01
#define MATROSKA_TRACK_AUDIO             0x02
#define MATROSKA_TRACK_COMPLEX           0x03
#define MATROSKA_TRACK_LOGO              0x10
#define MATROSKA_TRACK_SUBTITLE          0x11
#define MATROSKA_TRACK_CONTROL           0x20

/* compression algorithms */
#define MATROSKA_COMPRESS_ZLIB           0x00
#define MATROSKA_COMPRESS_BZLIB          0x01
#define MATROSKA_COMPRESS_LZO1X          0x02
#define MATROSKA_COMPRESS_HEADER_STRIP   0x03
#define MATROSKA_COMPRESS_UNKNOWN        0xFFFFFFFE  /* Xine internal type */
#define MATROSKA_COMPRESS_NONE           0xFFFFFFFF  /* Xine internal type */

#endif /* MATROSKA_H */