matroska-ids.h 13.2 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* GStreamer Matroska muxer/demuxer
 * (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
 *
 * matroska-ids.h: matroska file/stream data IDs
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifndef __GST_MATROSKA_IDS_H__
#define __GST_MATROSKA_IDS_H__

25
26
#include <gst/gst.h>

27
28
29
#include "ebml-ids.h"

/*
30
 * Matroska element IDs. max. 32-bit.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 */

/* toplevel segment */
#define GST_MATROSKA_ID_SEGMENT    0x18538067

/* matroska top-level master IDs */
#define GST_MATROSKA_ID_INFO       0x1549A966
#define GST_MATROSKA_ID_TRACKS     0x1654AE6B
#define GST_MATROSKA_ID_CUES       0x1C53BB6B
#define GST_MATROSKA_ID_TAGS       0x1254C367
#define GST_MATROSKA_ID_SEEKHEAD   0x114D9B74
#define GST_MATROSKA_ID_CLUSTER    0x1F43B675

/* IDs in the info master */
#define GST_MATROSKA_ID_TIMECODESCALE 0x2AD7B1
#define GST_MATROSKA_ID_DURATION   0x4489
#define GST_MATROSKA_ID_WRITINGAPP 0x5741
#define GST_MATROSKA_ID_MUXINGAPP  0x4D80
#define GST_MATROSKA_ID_DATEUTC    0x4461
50
#define GST_MATROSKA_ID_SEGMENTUID 0x73A4
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

/* ID in the tracks master */
#define GST_MATROSKA_ID_TRACKENTRY 0xAE

/* IDs in the trackentry master */
#define GST_MATROSKA_ID_TRACKNUMBER 0xD7
#define GST_MATROSKA_ID_TRACKUID   0x73C5
#define GST_MATROSKA_ID_TRACKTYPE  0x83
#define GST_MATROSKA_ID_TRACKAUDIO 0xE1
#define GST_MATROSKA_ID_TRACKVIDEO 0xE0
#define GST_MATROSKA_ID_CODECID    0x86
#define GST_MATROSKA_ID_CODECPRIVATE 0x63A2
#define GST_MATROSKA_ID_CODECNAME  0x258688
#define GST_MATROSKA_ID_CODECINFOURL 0x3B4040
#define GST_MATROSKA_ID_CODECDOWNLOADURL 0x26B240
#define GST_MATROSKA_ID_TRACKNAME  0x536E
#define GST_MATROSKA_ID_TRACKLANGUAGE 0x22B59C
#define GST_MATROSKA_ID_TRACKFLAGENABLED 0xB9
#define GST_MATROSKA_ID_TRACKFLAGDEFAULT 0x88
#define GST_MATROSKA_ID_TRACKFLAGLACING 0x9C
#define GST_MATROSKA_ID_TRACKMINCACHE 0x6DE7
#define GST_MATROSKA_ID_TRACKMAXCACHE 0x6DF8
#define GST_MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383
74
#define GST_MATROSKA_ID_CONTENTENCODINGS 0x6D80
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

/* IDs in the trackvideo master */
#define GST_MATROSKA_ID_VIDEOFRAMERATE 0x2383E3
#define GST_MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0
#define GST_MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA
#define GST_MATROSKA_ID_VIDEOPIXELWIDTH 0xB0
#define GST_MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA
#define GST_MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A
#define GST_MATROSKA_ID_VIDEOSTEREOMODE 0x53B9
#define GST_MATROSKA_ID_VIDEOASPECTRATIO 0x54B3
#define GST_MATROSKA_ID_VIDEOCOLOURSPACE 0x2EB524

/* IDs in the trackaudio master */
#define GST_MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5
#define GST_MATROSKA_ID_AUDIOBITDEPTH 0x6264
#define GST_MATROSKA_ID_AUDIOCHANNELS 0x9F

/* ID in the cues master */
#define GST_MATROSKA_ID_POINTENTRY 0xBB

/* IDs in the pointentry master */
#define GST_MATROSKA_ID_CUETIME    0xB3
#define GST_MATROSKA_ID_CUETRACKPOSITION 0xB7

/* IDs in the cuetrackposition master */
#define GST_MATROSKA_ID_CUETRACK   0xF7
#define GST_MATROSKA_ID_CUECLUSTERPOSITION 0xF1

/* IDs in the tags master */
104
105
106
107
108
109
110
111
#define GST_MATROSKA_ID_TAG        0x7373

/* in the tag master */
#define GST_MATROSKA_ID_SIMPLETAG  0x67C8

/* in the simpletag master */
#define GST_MATROSKA_ID_TAGNAME    0x45A3
#define GST_MATROSKA_ID_TAGSTRING  0x4487
112
113
114
115
116
117
118
119
120
121
122

/* IDs in the seekhead master */
#define GST_MATROSKA_ID_SEEKENTRY  0x4DBB

/* IDs in the seekpoint master */
#define GST_MATROSKA_ID_SEEKID     0x53AB
#define GST_MATROSKA_ID_SEEKPOSITION 0x53AC

/* IDs in the cluster master */
#define GST_MATROSKA_ID_CLUSTERTIMECODE 0xE7
#define GST_MATROSKA_ID_BLOCKGROUP 0xA0
123
#define GST_MATROSKA_ID_SIMPLEBLOCK 0xA3
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
124
#define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB
125
126
127
128
129

/* IDs in the blockgroup master */
#define GST_MATROSKA_ID_BLOCK      0xA1
#define GST_MATROSKA_ID_BLOCKDURATION 0x9B

130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* IDs in the contentencodings master */
#define GST_MATROSKA_ID_CONTENTENCODING 0x6240

/* IDS IN THE CONTENTENCODING MASTER */
#define GST_MATROSKA_ID_CONTENTENCODINGORDER 0X5031
#define GST_MATROSKA_ID_CONTENTENCODINGSCOPE 0X5032
#define GST_MATROSKA_ID_CONTENTENCODINGTYPE  0X5033
#define GST_MATROSKA_ID_CONTENTCOMPRESSION   0X5034
#define GST_MATROSKA_ID_CONTENTENCRYPTION    0X5035

/* IDS IN THE CONTENTCOMPRESSION MASTER */
#define GST_MATROSKA_ID_CONTENTCOMPALGO      0X4254
#define GST_MATROSKA_ID_CONTENTCOMPSETTINGS  0X4255


145
146
147
148
149
150
151
152
153
/*
 * Matroska Codec IDs. Strings.
 */

#define GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC   "V_MS/VFW/FOURCC"
#define GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED "V_UNCOMPRESSED"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP     "V_MPEG4/ISO/SP"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP    "V_MPEG4/ISO/ASP"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP     "V_MPEG4/ISO/AP"
154
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC    "V_MPEG4/ISO/AVC"
155
156
157
158
#define GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3    "V_MPEG4/MS/V3"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG1        "V_MPEG1"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG2        "V_MPEG2"
#define GST_MATROSKA_CODEC_ID_VIDEO_MJPEG        "V_MJPEG"
159
160
161
162
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1   "V_REAL/RV10"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2   "V_REAL/RV20"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3   "V_REAL/RV30"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4   "V_REAL/RV40"
163
#define GST_MATROSKA_CODEC_ID_VIDEO_THEORA       "V_THEORA"
164
#define GST_MATROSKA_CODEC_ID_VIDEO_DIRAC        "V_DIRAC"
165
/* TODO: Quicktime */
166
167
168
169
170
171
172
173
174
175

#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1     "A_MPEG/L1"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2     "A_MPEG/L2"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3     "A_MPEG/L3"
#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE   "A_PCM/INT/BIG"
#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE   "A_PCM/INT/LIT"
#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT    "A_PCM/FLOAT/IEEE"
#define GST_MATROSKA_CODEC_ID_AUDIO_AC3          "A_AC3"
#define GST_MATROSKA_CODEC_ID_AUDIO_DTS          "A_DTS"
#define GST_MATROSKA_CODEC_ID_AUDIO_VORBIS       "A_VORBIS"
176
#define GST_MATROSKA_CODEC_ID_AUDIO_FLAC         "A_FLAC"
177
178
179
#define GST_MATROSKA_CODEC_ID_AUDIO_ACM          "A_MS/ACM"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG2        "A_AAC/MPEG2/"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG4        "A_AAC/MPEG4/"
180
#define GST_MATROSKA_CODEC_ID_AUDIO_TTA          "A_TTA1"
181
#define GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4     "A_WAVPACK4"
182
183
184
185
186
187
188
189
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4    "A_REAL/28_8"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_28_8    "A_REAL/28_8"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK    "A_REAL/COOK"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR    "A_REAL/SIPR"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF    "A_REAL/RALF"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC    "A_REAL/ATRC"

/* TODO: AC3-9/10 (?), Musepack, Quicktime */
190

191
#define GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8      "S_TEXT/UTF8"
192
193
194
#define GST_MATROSKA_CODEC_ID_SUBTITLE_SSA       "S_TEXT/SSA"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_ASS       "S_TEXT/ASS" 
#define GST_MATROSKA_CODEC_ID_SUBTITLE_USF       "S_TEXT/USF"
195
#define GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB    "S_VOBSUB"
196

197
198
199
200
201
202
203
204
205
206
207
208
209
210
/*
 * Matrodka tags. Strings.
 */

#define GST_MATROSKA_TAG_ID_TITLE    "TITLE"
#define GST_MATROSKA_TAG_ID_AUTHOR   "AUTHOR"
#define GST_MATROSKA_TAG_ID_ALBUM    "ALBUM"
#define GST_MATROSKA_TAG_ID_COMMENTS "COMMENTS"
#define GST_MATROSKA_TAG_ID_BITSPS   "BITSPS"
#define GST_MATROSKA_TAG_ID_ENCODER  "ENCODER"
#define GST_MATROSKA_TAG_ID_DATE     "DATE"
#define GST_MATROSKA_TAG_ID_ISRC     "ISRC"
#define GST_MATROSKA_TAG_ID_COPYRIGHT "COPYRIGHT"

211
212
213
214
215
/*
 * Enumerations for various types (mapping from binary
 * value to what it actually means).
 */

Johan Dahlin's avatar
Johan Dahlin committed
216
217
218
219
220
typedef enum {
  GST_MATROSKA_TRACK_TYPE_VIDEO    = 0x1,
  GST_MATROSKA_TRACK_TYPE_AUDIO    = 0x2,
  GST_MATROSKA_TRACK_TYPE_COMPLEX  = 0x3,
  GST_MATROSKA_TRACK_TYPE_LOGO     = 0x10,
221
  GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11,
Johan Dahlin's avatar
Johan Dahlin committed
222
  GST_MATROSKA_TRACK_TYPE_CONTROL  = 0x20,
223
224
} GstMatroskaTrackType;

Johan Dahlin's avatar
Johan Dahlin committed
225
226
typedef enum {
  GST_MATROSKA_EYE_MODE_MONO  = 0x0,
227
  GST_MATROSKA_EYE_MODE_RIGHT = 0x1,
Johan Dahlin's avatar
Johan Dahlin committed
228
229
  GST_MATROSKA_EYE_MODE_LEFT  = 0x2,
  GST_MATROSKA_EYE_MODE_BOTH  = 0x3,
230
231
} GstMatroskaEyeMode;

Johan Dahlin's avatar
Johan Dahlin committed
232
233
234
typedef enum {
  GST_MATROSKA_ASPECT_RATIO_MODE_FREE  = 0x0,
  GST_MATROSKA_ASPECT_RATIO_MODE_KEEP  = 0x1,
235
236
237
238
239
240
241
242
  GST_MATROSKA_ASPECT_RATIO_MODE_FIXED = 0x2,
} GstMatroskaAspectRatioMode;

/*
 * These aren't in any way "matroska-form" things,
 * it's just something I use in the muxer/demuxer.
 */

Johan Dahlin's avatar
Johan Dahlin committed
243
244
245
246
247
typedef enum {
  GST_MATROSKA_TRACK_ENABLED = (1<<0),
  GST_MATROSKA_TRACK_DEFAULT = (1<<1),
  GST_MATROSKA_TRACK_LACING  = (1<<2),
  GST_MATROSKA_TRACK_SHIFT   = (1<<16)
248
249
} GstMatroskaTrackFlags;

Johan Dahlin's avatar
Johan Dahlin committed
250
251
typedef enum {
  GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0)
252
253
} GstMatroskaVideoTrackFlags;

Johan Dahlin's avatar
Johan Dahlin committed
254
255
256
typedef struct _GstMatroskaTrackContext {
  GstPad       *pad;
  GstCaps      *caps;
Thomas Vander Stichele's avatar
Thomas Vander Stichele committed
257
  guint         index;
258
259

  /* some often-used info */
Johan Dahlin's avatar
Johan Dahlin committed
260
261
262
  gchar        *codec_id, *codec_name, *name, *language;
  gpointer      codec_priv;
  guint         codec_priv_size;
263
  GstMatroskaTrackType type;
Johan Dahlin's avatar
Johan Dahlin committed
264
  guint         uid, num;
265
  GstMatroskaTrackFlags flags;
Johan Dahlin's avatar
Johan Dahlin committed
266
  guint64       default_duration;
267
  guint64       pos;
268
269

  gboolean      set_discont; /* TRUE = set DISCONT flag on next buffer */
270
271
272
273
274
275

  /* Special flag for Vorbis and Theora, for which we need to send
   * codec_priv first before sending any data, and just testing
   * for time == 0 is not enough to detect that. Used by demuxer */
  gboolean      send_xiph_headers;

276
277
278
279
280
  /* Special flag for Flac, for which we need to reconstruct the header
   * buffer from the codec_priv data before sending any data, and just
   * testing for time == 0 is not enough to detect that. Used by demuxer */
  gboolean      send_flac_headers;

281
282
283
284
285
  /* Special flag for VobSub, for which we have to send colour table info
   * (if available) first before sending any data, and just testing
   * for time == 0 is not enough to detect that. Used by demuxer */
  gboolean      send_dvd_event;

286
287
288
  /* Special counter for muxer to skip the first N vorbis/theora headers -
   * they are put into codec private data, not muxed into the stream */
  guint         xiph_headers_to_skip;
289
290
291

  /* Tags to send after newsegment event */
  GstTagList   *pending_tags;
292
293
294
295

  /* A GArray of GstMatroskaTrackEncoding structures which contain the
   * encoding (compression/encryption) settings for this track, if any */
  GArray       *encodings;
296
297
} GstMatroskaTrackContext;

Johan Dahlin's avatar
Johan Dahlin committed
298
typedef struct _GstMatroskaTrackVideoContext {
299
300
  GstMatroskaTrackContext parent;

301
302
303
  guint         pixel_width, pixel_height;
  guint         display_width, display_height;
  gdouble       default_fps;
304
305
  GstMatroskaEyeMode eye_mode;
  GstMatroskaAspectRatioMode asr_mode;
Johan Dahlin's avatar
Johan Dahlin committed
306
  guint32       fourcc;
307
308
} GstMatroskaTrackVideoContext;

Johan Dahlin's avatar
Johan Dahlin committed
309
typedef struct _GstMatroskaTrackAudioContext {
310
311
  GstMatroskaTrackContext parent;

Johan Dahlin's avatar
Johan Dahlin committed
312
  guint         samplerate, channels, bitdepth;
313
314
} GstMatroskaTrackAudioContext;

Johan Dahlin's avatar
Johan Dahlin committed
315
typedef struct _GstMatroskaTrackComplexContext {
316
317
318
319
320
  GstMatroskaTrackContext parent;

  /* nothing special goes here, apparently */
} GstMatroskaTrackComplexContext;

Johan Dahlin's avatar
Johan Dahlin committed
321
typedef struct _GstMatroskaTrackSubtitleContext {
322
323
  GstMatroskaTrackContext parent;

324
325
  gboolean    check_utf8;     /* buffers should be valid UTF-8 */
  gboolean    invalid_utf8;   /* work around broken files      */
326
327
} GstMatroskaTrackSubtitleContext;

Johan Dahlin's avatar
Johan Dahlin committed
328
329
330
331
typedef struct _GstMatroskaIndex {
  guint64        pos;   /* of the corresponding *cluster*! */
  guint16        track; /* reference to 'num' */
  guint64        time;  /* in nanoseconds */
332
333
} GstMatroskaIndex;

334
335
336
337
338
339
340
341
342
343
344
345
346
typedef struct _Wavpack4Header {
  guchar  ck_id [4];     /* "wvpk"                                         */
  guint32 ck_size;       /* size of entire frame (minus 8, of course)      */
  guint16 version;       /* 0x403 for now                                  */
  guint8  track_no;      /* track number (0 if not used, like now)         */
  guint8  index_no;      /* remember these? (0 if not used, like now)      */
  guint32 total_samples; /* for entire file (-1 if unknown)                */
  guint32 block_index;   /* index of first sample in block (to file begin) */
  guint32 block_samples; /* # samples in this block                        */
  guint32 flags;         /* various flags for id and decoding              */
  guint32 crc;           /* crc for actual decoded data                    */
} Wavpack4Header;

347
348
349
350
351
352
353
354
355
typedef struct _GstMatroskaTrackEncoding {
  guint   order;
  guint   scope     : 3;
  guint   type      : 1;
  guint   comp_algo : 2;
  guint8 *comp_settings;
  guint   comp_settings_length;
} GstMatroskaTrackEncoding;

356
357
358
359
360
gboolean gst_matroska_track_init_video_context    (GstMatroskaTrackContext ** p_context);
gboolean gst_matroska_track_init_audio_context    (GstMatroskaTrackContext ** p_context);
gboolean gst_matroska_track_init_subtitle_context (GstMatroskaTrackContext ** p_context);
gboolean gst_matroska_track_init_complex_context  (GstMatroskaTrackContext ** p_context);

361
#endif /* __GST_MATROSKA_IDS_H__ */