summaryrefslogtreecommitdiff
path: root/gst/matroska/matroska-ids.h
blob: 085bf8409c4b7a1e2148f27f5c895084ba4fe6b6 (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
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
/* 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__

#include <gst/gst.h>

#include "ebml-ids.h"

/*
 * EBML DocType.
 */

#define GST_MATROSKA_DOCTYPE_MATROSKA              "matroska"
#define GST_MATROSKA_DOCTYPE_WEBM                  "webm"

/*
 * Matroska element IDs. max. 32-bit.
 */

/* toplevel Segment */
#define GST_MATROSKA_ID_SEGMENT                    0x18538067

/* matroska top-level master IDs, childs of Segment */
#define GST_MATROSKA_ID_SEGMENTINFO                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
#define GST_MATROSKA_ID_ATTACHMENTS                0x1941A469
#define GST_MATROSKA_ID_CHAPTERS                   0x1043A770

/* IDs in the SegmentInfo 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
#define GST_MATROSKA_ID_SEGMENTUID                 0x73A4
#define GST_MATROSKA_ID_SEGMENTFILENAME            0x7384
#define GST_MATROSKA_ID_PREVUID                    0x3CB923
#define GST_MATROSKA_ID_PREVFILENAME               0x3C83AB
#define GST_MATROSKA_ID_NEXTUID                    0x3EB923
#define GST_MATROSKA_ID_NEXTFILENAME               0x3E83BB
#define GST_MATROSKA_ID_TITLE                      0x7BA9
#define GST_MATROSKA_ID_SEGMENTFAMILY              0x4444
#define GST_MATROSKA_ID_CHAPTERTRANSLATE           0x6924

/* IDs in the ChapterTranslate master */
#define GST_MATROSKA_ID_CHAPTERTRANSLATEEDITIONUID 0x69FC
#define GST_MATROSKA_ID_CHAPTERTRANSLATECODEC      0x69BF
#define GST_MATROSKA_ID_CHAPTERTRANSLATEID         0x69A5

/* 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_CONTENTENCODINGS           0x6D80
#define GST_MATROSKA_ID_CODECID                    0x86
#define GST_MATROSKA_ID_CODECPRIVATE               0x63A2
#define GST_MATROSKA_ID_CODECNAME                  0x258688
#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_TRACKFLAGFORCED            0x55AA
#define GST_MATROSKA_ID_TRACKFLAGLACING            0x9C
#define GST_MATROSKA_ID_TRACKMINCACHE              0x6DE7
#define GST_MATROSKA_ID_TRACKMAXCACHE              0x6DF8
#define GST_MATROSKA_ID_TRACKDEFAULTDURATION       0x23E383
#define GST_MATROSKA_ID_TRACKTIMECODESCALE         0x23314F
#define GST_MATROSKA_ID_MAXBLOCKADDITIONID         0x55EE
#define GST_MATROSKA_ID_TRACKATTACHMENTLINK        0x7446
#define GST_MATROSKA_ID_TRACKOVERLAY               0x6FAB
#define GST_MATROSKA_ID_TRACKTRANSLATE             0x6624
/* semi-draft */
#define GST_MATROSKA_ID_TRACKOFFSET                0x537F
/* semi-draft */
#define GST_MATROSKA_ID_CODECSETTINGS              0x3A9697
/* semi-draft */
#define GST_MATROSKA_ID_CODECINFOURL               0x3B4040
/* semi-draft */
#define GST_MATROSKA_ID_CODECDOWNLOADURL           0x26B240
/* semi-draft */
#define GST_MATROSKA_ID_CODECDECODEALL             0xAA

/* IDs in the TrackTranslate master */
#define GST_MATROSKA_ID_TRACKTRANSLATEEDITIONUID   0x66FC
#define GST_MATROSKA_ID_TRACKTRANSLATECODEC        0x66BF
#define GST_MATROSKA_ID_TRACKTRANSLATETRACKID      0x66A5


/* IDs in the TrackVideo master */
/* NOTE: This one is here only for backward compatibility.
 * Use _TRACKDEFAULDURATION */
#define GST_MATROSKA_ID_VIDEOFRAMERATE             0x2383E3
#define GST_MATROSKA_ID_VIDEODISPLAYWIDTH          0x54B0
#define GST_MATROSKA_ID_VIDEODISPLAYHEIGHT         0x54BA
#define GST_MATROSKA_ID_VIDEODISPLAYUNIT           0x54B2
#define GST_MATROSKA_ID_VIDEOPIXELWIDTH            0xB0
#define GST_MATROSKA_ID_VIDEOPIXELHEIGHT           0xBA
#define GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM       0x54AA
#define GST_MATROSKA_ID_VIDEOPIXELCROPTOP          0x54BB
#define GST_MATROSKA_ID_VIDEOPIXELCROPLEFT         0x54CC
#define GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT        0x54DD
#define GST_MATROSKA_ID_VIDEOFLAGINTERLACED        0x9A
/* semi-draft */
#define GST_MATROSKA_ID_VIDEOSTEREOMODE            0x53B8
#define GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE       0x54B3
#define GST_MATROSKA_ID_VIDEOCOLOURSPACE           0x2EB524
/* semi-draft */
#define GST_MATROSKA_ID_VIDEOGAMMAVALUE            0x2FB523

/* IDs in the TrackAudio master */
#define GST_MATROSKA_ID_AUDIOSAMPLINGFREQ          0xB5
#define GST_MATROSKA_ID_AUDIOBITDEPTH              0x6264
#define GST_MATROSKA_ID_AUDIOCHANNELS              0x9F
/* semi-draft */
#define GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS      0x7D7B
#define GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ    0x78B5

/* IDs in the TrackContentEncoding 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

/* IDs in the ContentEncryption master */
#define GST_MATROSKA_ID_CONTENTENCALGO             0x47E1
#define GST_MATROSKA_ID_CONTENTENCKEYID            0x47E2
#define GST_MATROSKA_ID_CONTENTSIGNATURE           0x47E3
#define GST_MATROSKA_ID_CONTENTSIGKEYID            0x47E4
#define GST_MATROSKA_ID_CONTENTSIGALGO             0x47E5
#define GST_MATROSKA_ID_CONTENTSIGHASHALGO         0x47E6

/* 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_CUETRACKPOSITIONS          0xB7

/* IDs in the CueTrackPositions master */
#define GST_MATROSKA_ID_CUETRACK                   0xF7
#define GST_MATROSKA_ID_CUECLUSTERPOSITION         0xF1
#define GST_MATROSKA_ID_CUEBLOCKNUMBER             0x5378
/* semi-draft */
#define GST_MATROSKA_ID_CUECODECSTATE              0xEA
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFERENCE               0xDB

/* IDs in the CueReference master */
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFTIME                 0x96
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFCLUSTER              0x97
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFNUMBER               0x535F
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFCODECSTATE           0xEB

/* IDs in the Tags master */
#define GST_MATROSKA_ID_TAG                        0x7373

/* in the Tag master */
#define GST_MATROSKA_ID_SIMPLETAG                  0x67C8
#define GST_MATROSKA_ID_TARGETS                    0x63C0

/* in the SimpleTag master */
#define GST_MATROSKA_ID_TAGNAME                    0x45A3
#define GST_MATROSKA_ID_TAGSTRING                  0x4487
#define GST_MATROSKA_ID_TAGLANGUAGE                0x447A
#define GST_MATROSKA_ID_TAGDEFAULT                 0x4484
#define GST_MATROSKA_ID_TAGBINARY                  0x4485

/* in the Targets master */
#define GST_MATROSKA_ID_TARGETTYPEVALUE            0x68CA
#define GST_MATROSKA_ID_TARGETTYPE                 0x63CA
#define GST_MATROSKA_ID_TARGETTRACKUID             0x63C5
#define GST_MATROSKA_ID_TARGETEDITIONUID           0x63C5
#define GST_MATROSKA_ID_TARGETCHAPTERUID           0x63C4
#define GST_MATROSKA_ID_TARGETATTACHMENTUID        0x63C6

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

/* IDs in the SeekEntry 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
#define GST_MATROSKA_ID_SIMPLEBLOCK                0xA3
#define GST_MATROSKA_ID_REFERENCEBLOCK             0xFB
#define GST_MATROSKA_ID_POSITION                   0xA7
#define GST_MATROSKA_ID_PREVSIZE                   0xAB
/* semi-draft */
#define GST_MATROSKA_ID_ENCRYPTEDBLOCK             0xAF
#define GST_MATROSKA_ID_SILENTTRACKS               0x5854

/* IDs in the SilentTracks master */
#define GST_MATROSKA_ID_SILENTTRACKNUMBER          0x58D7

/* IDs in the BlockGroup master */
#define GST_MATROSKA_ID_BLOCK                      0xA1
#define GST_MATROSKA_ID_BLOCKDURATION              0x9B
/* semi-draft */
#define GST_MATROSKA_ID_BLOCKVIRTUAL               0xA2
#define GST_MATROSKA_ID_REFERENCEBLOCK             0xFB
#define GST_MATROSKA_ID_BLOCKADDITIONS             0x75A1
#define GST_MATROSKA_ID_REFERENCEPRIORITY          0xFA
/* semi-draft */
#define GST_MATROSKA_ID_REFERENCEVIRTUAL           0xFD
/* semi-draft */
#define GST_MATROSKA_ID_CODECSTATE                 0xA4
#define GST_MATROSKA_ID_SLICES                     0x8E

/* IDs in the BlockAdditions master */
#define GST_MATROSKA_ID_BLOCKMORE                  0xA6

/* IDs in the BlockMore master */
#define GST_MATROSKA_ID_BLOCKADDID                 0xEE
#define GST_MATROSKA_ID_BLOCKADDITIONAL            0xA5

/* IDs in the Slices master */
#define GST_MATROSKA_ID_TIMESLICE                  0xE8

/* IDs in the TimeSlice master */
#define GST_MATROSKA_ID_LACENUMBER                 0xCC
/* semi-draft */
#define GST_MATROSKA_ID_FRAMENUMBER                0xCD
/* semi-draft */
#define GST_MATROSKA_ID_BLOCKADDITIONID            0xCB
/* semi-draft */
#define GST_MATROSKA_ID_TIMESLICEDELAY             0xCE
#define GST_MATROSKA_ID_TIMESLICEDURATION          0xCF

/* IDs in the Attachments master */
#define GST_MATROSKA_ID_ATTACHEDFILE               0x61A7

/* IDs in the AttachedFile master */
#define GST_MATROSKA_ID_FILEDESCRIPTION            0x467E
#define GST_MATROSKA_ID_FILENAME                   0x466E
#define GST_MATROSKA_ID_FILEMIMETYPE               0x4660
#define GST_MATROSKA_ID_FILEDATA                   0x465C
#define GST_MATROSKA_ID_FILEUID                    0x46AE
/* semi-draft */
#define GST_MATROSKA_ID_FILEREFERRAL               0x4675

/* IDs in the Chapters master */
#define GST_MATROSKA_ID_EDITIONENTRY               0x45B9

/* IDs in the EditionEntry master */
#define GST_MATROSKA_ID_EDITIONUID                 0x45BC
#define GST_MATROSKA_ID_EDITIONFLAGHIDDEN          0x45BD
#define GST_MATROSKA_ID_EDITIONFLAGDEFAULT         0x45DB
#define GST_MATROSKA_ID_EDITIONFLAGORDERED         0x45DD
#define GST_MATROSKA_ID_CHAPTERATOM                0xB6

/* IDs in the ChapterAtom master */
#define GST_MATROSKA_ID_CHAPTERUID                 0x73C4
#define GST_MATROSKA_ID_CHAPTERTIMESTART           0x91
#define GST_MATROSKA_ID_CHAPTERTIMESTOP            0x92
#define GST_MATROSKA_ID_CHAPTERFLAGHIDDEN          0x98
#define GST_MATROSKA_ID_CHAPTERFLAGENABLED         0x4598
#define GST_MATROSKA_ID_CHAPTERSEGMENTUID          0x6E67
#define GST_MATROSKA_ID_CHAPTERSEGMENTEDITIONUID   0x6EBC
#define GST_MATROSKA_ID_CHAPTERPHYSICALEQUIV       0x63C3
#define GST_MATROSKA_ID_CHAPTERTRACK               0x8F
#define GST_MATROSKA_ID_CHAPTERDISPLAY             0x80
#define GST_MATROSKA_ID_CHAPPROCESS                0x6944

/* IDs in the ChapProcess master */
#define GST_MATROSKA_ID_CHAPPROCESSCODECID         0x6955
#define GST_MATROSKA_ID_CHAPPROCESSPRIVATE         0x450D
#define GST_MATROSKA_ID_CHAPPROCESSCOMMAND         0x6911

/* IDs in the ChapProcessCommand master */
#define GST_MATROSKA_ID_CHAPPROCESSTIME            0x6922
#define GST_MATROSKA_ID_CHAPPROCESSDATA            0x6933

/* IDs in the ChapterDisplay master */
#define GST_MATROSKA_ID_CHAPSTRING                 0x85
#define GST_MATROSKA_ID_CHAPLANGUAGE               0x437C
#define GST_MATROSKA_ID_CHAPCOUNTRY                0x437E

/* IDs in the ChapterTrack master */
#define GST_MATROSKA_ID_CHAPTERTRACKNUMBER         0x89

/*
 * 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"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC    "V_MPEG4/ISO/AVC"
#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"
/* FIXME: not (yet) in the spec! */
#define GST_MATROSKA_CODEC_ID_VIDEO_MJPEG        "V_MJPEG"
#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"
#define GST_MATROSKA_CODEC_ID_VIDEO_THEORA       "V_THEORA"
#define GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME    "V_QUICKTIME"
#define GST_MATROSKA_CODEC_ID_VIDEO_SNOW         "V_SNOW"
#define GST_MATROSKA_CODEC_ID_VIDEO_DIRAC        "V_DIRAC"
#define GST_MATROSKA_CODEC_ID_VIDEO_VP8          "V_VP8"

#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_AC3_BSID9      "A_AC3/BSID9"
#define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10     "A_AC3/BSID10"
#define GST_MATROSKA_CODEC_ID_AUDIO_EAC3           "A_EAC3"
#define GST_MATROSKA_CODEC_ID_AUDIO_DTS            "A_DTS"
#define GST_MATROSKA_CODEC_ID_AUDIO_VORBIS         "A_VORBIS"
#define GST_MATROSKA_CODEC_ID_AUDIO_FLAC           "A_FLAC"
/* FIXME: not yet in the spec */
#define GST_MATROSKA_CODEC_ID_AUDIO_SPEEX          "A_SPEEX"
#define GST_MATROSKA_CODEC_ID_AUDIO_ACM            "A_MS/ACM"
#define GST_MATROSKA_CODEC_ID_AUDIO_TTA            "A_TTA1"
#define GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4       "A_WAVPACK4"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4      "A_REAL/14_4"
#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"
#define GST_MATROSKA_CODEC_ID_AUDIO_AAC            "A_AAC"
#define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2      "A_AAC/MPEG2/"
#define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4      "A_AAC/MPEG4/"
#define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC "A_QUICKTIME/QDMC"
#define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2 "A_QUICKTIME/QDM2"
/* Undefined for now:
#define GST_MATROSKA_CODEC_ID_AUDIO_MPC            "A_MPC"
*/

#define GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII     "S_TEXT/ASCII"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8      "S_TEXT/UTF8"
#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"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB    "S_VOBSUB"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS   "S_HDMV/PGS"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_BMP       "S_IMAGE/BMP"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_KATE      "S_KATE"

/*
 * Matroska 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_BPS      "BPS"
#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"
#define GST_MATROSKA_TAG_ID_BPM       "BPM"
#define GST_MATROSKA_TAG_ID_TERMS_OF_USE "TERMS_OF_USE"
#define GST_MATROSKA_TAG_ID_DATE      "DATE"
#define GST_MATROSKA_TAG_ID_COMPOSER  "COMPOSER"
#define GST_MATROSKA_TAG_ID_LEAD_PERFORMER  "LEAD_PERFOMER"
#define GST_MATROSKA_TAG_ID_GENRE     "GENRE"

/*
 * TODO: add this tag & mappings
 * "REPLAYGAIN_GAIN" -> GST_TAG_*_GAIN   see http://replaygain.hydrogenaudio.org/rg_data_format.html
 * "REPLAYGAIN_PEAK" -> GST_TAG_*_PEAK   see http://replaygain.hydrogenaudio.org/peak_data_format.html
 * both are depending on the target (track, album?)
 *
 * "TOTAL_PARTS" -> GST_TAG_TRACK_COUNT    depending on target
 * "PART_NUMBER" -> GST_TAG_TRACK_NUMBER   depending on target
 *
 * "SORT_WITH" -> nested in other elements, GST_TAG_TITLE_SORTNAME, etc
 *
 * TODO: maybe add custom gstreamer tags for other standard matroska tags,
 * see http://matroska.org/technical/specs/tagging/index.html
 *
 * TODO: handle tag targets and nesting correctly
 */

/*
 * Enumerations for various types (mapping from binary
 * value to what it actually means).
 */

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,
  GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11,
  GST_MATROSKA_TRACK_TYPE_BUTTONS  = 0x12,
  GST_MATROSKA_TRACK_TYPE_CONTROL  = 0x20,
} GstMatroskaTrackType;

typedef enum {
  GST_MATROSKA_ASPECT_RATIO_MODE_FREE  = 0x0,
  GST_MATROSKA_ASPECT_RATIO_MODE_KEEP  = 0x1,
  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.
 */

typedef enum {
  GST_MATROSKA_TRACK_ENABLED = (1<<0),
  GST_MATROSKA_TRACK_DEFAULT = (1<<1),
  GST_MATROSKA_TRACK_LACING  = (1<<2),
  GST_MATROSKA_TRACK_FORCED  = (1<<3),
  GST_MATROSKA_TRACK_SHIFT   = (1<<16)
} GstMatroskaTrackFlags;

typedef enum {
  GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0)
} GstMatroskaVideoTrackFlags;


typedef struct _GstMatroskaTrackContext GstMatroskaTrackContext;

/* TODO: check if all fields are used */
struct _GstMatroskaTrackContext {
  GstPad       *pad;
  GstCaps      *caps;
  guint         index;
  GstFlowReturn last_flow;
  /* reverse playback */
  GstClockTime  from_time;

  GArray       *index_table;

  gint          index_writer_id;

  /* some often-used info */
  gchar        *codec_id, *codec_name, *name, *language;
  guint8       *codec_priv;
  guint         codec_priv_size;
  guint8       *codec_state;
  guint         codec_state_size;
  GstMatroskaTrackType type;
  guint         uid, num;
  GstMatroskaTrackFlags flags;
  guint64       default_duration;
  guint64       pos;
  gdouble       timecodescale;

  gboolean      set_discont; /* TRUE = set DISCONT flag on next buffer */

  /* 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;

  /* 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;

  /* Special flag for Speex, 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_speex_headers;

  /* 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;

  /* 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;

  /* Used for postprocessing a frame before it is pushed from the demuxer */
  GstFlowReturn (*postprocess_frame) (GstElement *element,
                                      GstMatroskaTrackContext *context,
				      GstBuffer **buffer);

  /* Tags to send after newsegment event */
  GstTagList   *pending_tags;

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

  /* Whether the stream is EOS */
  gboolean      eos;
};

typedef struct _GstMatroskaTrackVideoContext {
  GstMatroskaTrackContext parent;

  guint         pixel_width, pixel_height;
  guint         display_width, display_height;
  gdouble       default_fps;
  GstMatroskaAspectRatioMode asr_mode;
  guint32       fourcc;

  GstBuffer     *dirac_unit;
} GstMatroskaTrackVideoContext;

typedef struct _GstMatroskaTrackAudioContext {
  GstMatroskaTrackContext parent;

  guint         samplerate, channels, bitdepth;

  guint32       wvpk_block_index;
} GstMatroskaTrackAudioContext;

typedef struct _GstMatroskaTrackSubtitleContext {
  GstMatroskaTrackContext parent;

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

typedef struct _GstMatroskaIndex {
  guint64        pos;      /* of the corresponding *cluster*! */
  guint16        track;    /* reference to 'num' */
  GstClockTime   time;     /* in nanoseconds */
  guint32        block;    /* number of the block in the cluster */
} GstMatroskaIndex;

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;

typedef enum {
  GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME = (1<<0),
  GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA = (1<<1),
  GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING = (1<<2)
} GstMatroskaTrackEncodingScope;

typedef enum {
  GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_ZLIB = 0,
  GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_BZLIB = 1,
  GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_LZO1X = 2,
  GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_HEADERSTRIP = 3
} GstMatroskaTrackCompressionAlgorithm;

typedef struct _GstMatroskaTrackEncoding {
  guint   order;
  guint   scope     : 3;
  guint   type      : 1;
  guint   comp_algo : 2;
  guint8 *comp_settings;
  guint   comp_settings_length;
} GstMatroskaTrackEncoding;

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);

void gst_matroska_register_tags (void);

#endif /* __GST_MATROSKA_IDS_H__ */