libmp4.h 48.6 KB
Newer Older
1
2
3
/*****************************************************************************
 * libmp4.h : LibMP4 library for mp4 module for vlc
 *****************************************************************************
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
4
 * Copyright (C) 2001-2004, 2010 VLC authors and VideoLAN
5
 *
6
 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
Laurent Aimar's avatar
Laurent Aimar committed
7
 *
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
8
9
10
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
11
 * (at your option) any later version.
Laurent Aimar's avatar
Laurent Aimar committed
12
 *
13
14
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
15
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
17
 *
Jean-Baptiste Kempf's avatar
LGPL    
Jean-Baptiste Kempf committed
18
19
20
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21
 *****************************************************************************/
22

23
24
#ifndef _VLC_LIBMP4_H
#define _VLC_LIBMP4_H 1
25

26
#include <vlc_es.h>
27
#include <vlc_codecs.h>
28

29
30
31
/* Use alias for scaled time */
typedef int64_t stime_t;

32
33
#define BLOCK16x16 (1<<16)

34
35
36
37
38
39
40
#define MAJOR_3gp4 VLC_FOURCC( '3', 'g', 'p', '4' )
#define MAJOR_3gp5 VLC_FOURCC( '3', 'g', 'p', '5' )
#define MAJOR_3gp6 VLC_FOURCC( '3', 'g', 'p', '6' )
#define MAJOR_3gp7 VLC_FOURCC( '3', 'g', 'p', '7' )
#define MAJOR_isml VLC_FOURCC( 'i', 's', 'm', 'l' )
#define MAJOR_isom VLC_FOURCC( 'i', 's', 'o', 'm' )
#define MAJOR_qt__ VLC_FOURCC( 'q', 't', ' ', ' ' )
41
#define MAJOR_dash VLC_FOURCC( 'd', 'a', 's', 'h' )
42
43
#define MAJOR_mp41 VLC_FOURCC( 'm', 'p', '4', '1' )
#define MAJOR_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' )
44

45
#define ATOM_root VLC_FOURCC( 'r', 'o', 'o', 't' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
46
47
48
49
50
51
52
53
54
#define ATOM_uuid VLC_FOURCC( 'u', 'u', 'i', 'd' )

#define ATOM_ftyp VLC_FOURCC( 'f', 't', 'y', 'p' )
#define ATOM_moov VLC_FOURCC( 'm', 'o', 'o', 'v' )
#define ATOM_foov VLC_FOURCC( 'f', 'o', 'o', 'v' )
#define ATOM_cmov VLC_FOURCC( 'c', 'm', 'o', 'v' )
#define ATOM_dcom VLC_FOURCC( 'd', 'c', 'o', 'm' )
#define ATOM_cmvd VLC_FOURCC( 'c', 'm', 'v', 'd' )

55
#define ATOM_styp VLC_FOURCC( 's', 't', 'y', 'p' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
56
57
58
59
60
61
#define ATOM_moof VLC_FOURCC( 'm', 'o', 'o', 'f' )
#define ATOM_mdat VLC_FOURCC( 'm', 'd', 'a', 't' )
#define ATOM_skip VLC_FOURCC( 's', 'k', 'i', 'p' )
#define ATOM_free VLC_FOURCC( 'f', 'r', 'e', 'e' )
#define ATOM_udta VLC_FOURCC( 'u', 'd', 't', 'a' )
#define ATOM_wide VLC_FOURCC( 'w', 'i', 'd', 'e' )
62
#define ATOM_binm VLC_FOURCC( 0x82, 0x82, 0x7f, 0x7d ) /* binary Computer Graphics Metafile */
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
63

64
65
66
67
68
/* Quicktime preview */
#define ATOM_pnot VLC_FOURCC( 'p', 'n', 'o', 't' )
#define ATOM_pict VLC_FOURCC( 'p', 'i', 'c', 't' )
#define ATOM_PICT VLC_FOURCC( 'P', 'I', 'C', 'T' )

69
70
#define ATOM_data VLC_FOURCC( 'd', 'a', 't', 'a' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
71
72
73
74
#define ATOM_trak VLC_FOURCC( 't', 'r', 'a', 'k' )
#define ATOM_mvhd VLC_FOURCC( 'm', 'v', 'h', 'd' )
#define ATOM_tkhd VLC_FOURCC( 't', 'k', 'h', 'd' )
#define ATOM_tref VLC_FOURCC( 't', 'r', 'e', 'f' )
75
#define ATOM_load VLC_FOURCC( 'l', 'o', 'a', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
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
#define ATOM_mdia VLC_FOURCC( 'm', 'd', 'i', 'a' )
#define ATOM_mdhd VLC_FOURCC( 'm', 'd', 'h', 'd' )
#define ATOM_hdlr VLC_FOURCC( 'h', 'd', 'l', 'r' )
#define ATOM_minf VLC_FOURCC( 'm', 'i', 'n', 'f' )
#define ATOM_vmhd VLC_FOURCC( 'v', 'm', 'h', 'd' )
#define ATOM_smhd VLC_FOURCC( 's', 'm', 'h', 'd' )
#define ATOM_hmhd VLC_FOURCC( 'h', 'm', 'h', 'd' )
#define ATOM_dinf VLC_FOURCC( 'd', 'i', 'n', 'f' )
#define ATOM_url  VLC_FOURCC( 'u', 'r', 'l', ' ' )
#define ATOM_urn  VLC_FOURCC( 'u', 'r', 'n', ' ' )
#define ATOM_dref VLC_FOURCC( 'd', 'r', 'e', 'f' )
#define ATOM_stbl VLC_FOURCC( 's', 't', 'b', 'l' )
#define ATOM_stts VLC_FOURCC( 's', 't', 't', 's' )
#define ATOM_ctts VLC_FOURCC( 'c', 't', 't', 's' )
#define ATOM_stsd VLC_FOURCC( 's', 't', 's', 'd' )
#define ATOM_stsz VLC_FOURCC( 's', 't', 's', 'z' )
#define ATOM_stz2 VLC_FOURCC( 's', 't', 'z', '2' )
#define ATOM_stsc VLC_FOURCC( 's', 't', 's', 'c' )
#define ATOM_stco VLC_FOURCC( 's', 't', 'c', 'o' )
#define ATOM_co64 VLC_FOURCC( 'c', 'o', '6', '4' )
#define ATOM_stss VLC_FOURCC( 's', 't', 's', 's' )
#define ATOM_stsh VLC_FOURCC( 's', 't', 's', 'h' )
#define ATOM_stdp VLC_FOURCC( 's', 't', 'd', 'p' )
#define ATOM_padb VLC_FOURCC( 'p', 'a', 'd', 'b' )
#define ATOM_edts VLC_FOURCC( 'e', 'd', 't', 's' )
#define ATOM_elst VLC_FOURCC( 'e', 'l', 's', 't' )
#define ATOM_mvex VLC_FOURCC( 'm', 'v', 'e', 'x' )
103
#define ATOM_sdtp VLC_FOURCC( 's', 'd', 't', 'p' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
104
#define ATOM_trex VLC_FOURCC( 't', 'r', 'e', 'x' )
105
#define ATOM_mehd VLC_FOURCC( 'm', 'e', 'h', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
106
107
#define ATOM_mfhd VLC_FOURCC( 'm', 'f', 'h', 'd' )
#define ATOM_traf VLC_FOURCC( 't', 'r', 'a', 'f' )
108
#define ATOM_sidx VLC_FOURCC( 's', 'i', 'd', 'x' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
109
#define ATOM_tfhd VLC_FOURCC( 't', 'f', 'h', 'd' )
110
#define ATOM_tfdt VLC_FOURCC( 't', 'f', 'd', 't' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
111
112
113
#define ATOM_trun VLC_FOURCC( 't', 'r', 'u', 'n' )
#define ATOM_cprt VLC_FOURCC( 'c', 'p', 'r', 't' )
#define ATOM_iods VLC_FOURCC( 'i', 'o', 'd', 's' )
114
#define ATOM_pasp VLC_FOURCC( 'p', 'a', 's', 'p' )
115
116
117
#define ATOM_mfra VLC_FOURCC( 'm', 'f', 'r', 'a' )
#define ATOM_mfro VLC_FOURCC( 'm', 'f', 'r', 'o' )
#define ATOM_tfra VLC_FOURCC( 't', 'f', 'r', 'a' )
118
#define ATOM_keys VLC_FOURCC( 'k', 'e', 'y', 's' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

#define ATOM_nmhd VLC_FOURCC( 'n', 'm', 'h', 'd' )
#define ATOM_mp2v VLC_FOURCC( 'm', 'p', '2', 'v' )
#define ATOM_mp4v VLC_FOURCC( 'm', 'p', '4', 'v' )
#define ATOM_mp4a VLC_FOURCC( 'm', 'p', '4', 'a' )
#define ATOM_mp4s VLC_FOURCC( 'm', 'p', '4', 's' )
#define ATOM_vide VLC_FOURCC( 'v', 'i', 'd', 'e' )
#define ATOM_soun VLC_FOURCC( 's', 'o', 'u', 'n' )
#define ATOM_hint VLC_FOURCC( 'h', 'i', 'n', 't' )
#define ATOM_hdv2 VLC_FOURCC( 'h', 'd', 'v', '2' )

#define ATOM_dpnd VLC_FOURCC( 'd', 'p', 'n', 'd' )
#define ATOM_ipir VLC_FOURCC( 'i', 'p', 'i', 'r' )
#define ATOM_mpod VLC_FOURCC( 'm', 'p', 'o', 'd' )
#define ATOM_hnti VLC_FOURCC( 'h', 'n', 't', 'i' )
#define ATOM_rtp  VLC_FOURCC( 'r', 't', 'p', ' ' )
135
#define ATOM_btrt VLC_FOURCC( 'b', 't', 'r', 't' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
136
137
138

#define ATOM_esds VLC_FOURCC( 'e', 's', 'd', 's' )

139
#define ATOM_lpcm VLC_FOURCC( 'l', 'p', 'c', 'm' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#define ATOM__mp3 VLC_FOURCC( '.', 'm', 'p', '3' )
#define ATOM_ms02 VLC_FOURCC( 'm', 's', 0x0, 0x02 )
#define ATOM_ms11 VLC_FOURCC( 'm', 's', 0x0, 0x11 )
#define ATOM_ms55 VLC_FOURCC( 'm', 's', 0x0, 0x55 )
#define ATOM_twos VLC_FOURCC( 't', 'w', 'o', 's' )
#define ATOM_sowt VLC_FOURCC( 's', 'o', 'w', 't' )
#define ATOM_QDMC VLC_FOURCC( 'Q', 'D', 'M', 'C' )
#define ATOM_QDM2 VLC_FOURCC( 'Q', 'D', 'M', '2' )
#define ATOM_ima4 VLC_FOURCC( 'i', 'm', 'a', '4' )
#define ATOM_IMA4 VLC_FOURCC( 'I', 'M', 'A', '4' )
#define ATOM_dvi  VLC_FOURCC( 'd', 'v', 'i', ' ' )
#define ATOM_MAC3 VLC_FOURCC( 'M', 'A', 'C', '3' )
#define ATOM_MAC6 VLC_FOURCC( 'M', 'A', 'C', '6' )
#define ATOM_alaw VLC_FOURCC( 'a', 'l', 'a', 'w' )
#define ATOM_ulaw VLC_FOURCC( 'u', 'l', 'a', 'w' )
#define ATOM_Qclp VLC_FOURCC( 'Q', 'c', 'l', 'p' )
#define ATOM_samr VLC_FOURCC( 's', 'a', 'm', 'r' )
#define ATOM_sawb VLC_FOURCC( 's', 'a', 'w', 'b' )
#define ATOM_OggS VLC_FOURCC( 'O', 'g', 'g', 'S' )
159
#define ATOM_agsm VLC_FOURCC( 'a', 'g', 's', 'm' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
160
#define ATOM_alac VLC_FOURCC( 'a', 'l', 'a', 'c' )
161
162
#define ATOM_ac3  VLC_FOURCC( 'a', 'c', '-', '3' )
#define ATOM_eac3 VLC_FOURCC( 'e', 'c', '-', '3' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
163
164
#define ATOM_dac3 VLC_FOURCC( 'd', 'a', 'c', '3' )
#define ATOM_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' )
165
#define ATOM_vc1  VLC_FOURCC( 'v', 'c', '-', '1' )
166
#define ATOM_dvc1 VLC_FOURCC( 'd', 'v', 'c', '1' )
167
#define ATOM_WMA2 VLC_FOURCC( 'W', 'M', 'A', '2' )
168
#define ATOM_wma  VLC_FOURCC( 'w', 'm', 'a', ' ' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
169
170
171
#define ATOM_enda VLC_FOURCC( 'e', 'n', 'd', 'a' )
#define ATOM_gnre VLC_FOURCC( 'g', 'n', 'r', 'e' )
#define ATOM_trkn VLC_FOURCC( 't', 'r', 'k', 'n' )
172
#define ATOM_chan VLC_FOURCC( 'c', 'h', 'a', 'n' )
173
174
175
176
#define ATOM_in24 VLC_FOURCC( 'i', 'n', '2', '4' )
#define ATOM_in32 VLC_FOURCC( 'i', 'n', '3', '2' )
#define ATOM_fl32 VLC_FOURCC( 'f', 'l', '3', '2' )
#define ATOM_fl64 VLC_FOURCC( 'f', 'l', '6', '4' )
177
#define ATOM_Opus VLC_FOURCC( 'O', 'p', 'u', 's' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
178
179
180
181
182
183
184
185
186
187
188
189
190

#define ATOM_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' )
#define ATOM_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' )
#define ATOM_SVQ3 VLC_FOURCC( 'S', 'V', 'Q', '3' )
#define ATOM_ZyGo VLC_FOURCC( 'Z', 'y', 'G', 'o' )
#define ATOM_3IV1 VLC_FOURCC( '3', 'I', 'V', '1' )
#define ATOM_3iv1 VLC_FOURCC( '3', 'i', 'v', '1' )
#define ATOM_3IV2 VLC_FOURCC( '3', 'I', 'V', '2' )
#define ATOM_3iv2 VLC_FOURCC( '3', 'i', 'v', '2' )
#define ATOM_3IVD VLC_FOURCC( '3', 'I', 'V', 'D' )
#define ATOM_3ivd VLC_FOURCC( '3', 'i', 'v', 'd' )
#define ATOM_3VID VLC_FOURCC( '3', 'V', 'I', 'D' )
#define ATOM_3vid VLC_FOURCC( '3', 'v', 'i', 'd' )
191
#define ATOM_FFV1 VLC_FOURCC( 'F', 'F', 'V', '1' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
192
193
194
195
196
197
198
199
200
201
202
203
204
#define ATOM_h263 VLC_FOURCC( 'h', '2', '6', '3' )
#define ATOM_s263 VLC_FOURCC( 's', '2', '6', '3' )
#define ATOM_DIVX VLC_FOURCC( 'D', 'I', 'V', 'X' )
#define ATOM_XVID VLC_FOURCC( 'X', 'V', 'I', 'D' )
#define ATOM_cvid VLC_FOURCC( 'c', 'v', 'i', 'd' )
#define ATOM_mjpa VLC_FOURCC( 'm', 'j', 'p', 'a' )
#define ATOM_mjpb VLC_FOURCC( 'm', 'j', 'q', 't' )
#define ATOM_mjqt VLC_FOURCC( 'm', 'j', 'h', 't' )
#define ATOM_mjht VLC_FOURCC( 'm', 'j', 'p', 'b' )
#define ATOM_VP31 VLC_FOURCC( 'V', 'P', '3', '1' )
#define ATOM_vp31 VLC_FOURCC( 'v', 'p', '3', '1' )
#define ATOM_h264 VLC_FOURCC( 'h', '2', '6', '4' )
#define ATOM_qdrw VLC_FOURCC( 'q', 'd', 'r', 'w' )
205
#define ATOM_WMV3 VLC_FOURCC( 'W', 'M', 'V', '3' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
206
207

#define ATOM_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' )
François Cartegnie's avatar
François Cartegnie committed
208
#define ATOM_avc3 VLC_FOURCC( 'a', 'v', 'c', '3' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
209
210
211
#define ATOM_avcC VLC_FOURCC( 'a', 'v', 'c', 'C' )
#define ATOM_m4ds VLC_FOURCC( 'm', '4', 'd', 's' )

212
#define ATOM_fiel VLC_FOURCC( 'f', 'i', 'e', 'l' )
213
#define ATOM_glbl VLC_FOURCC( 'g', 'l', 'b', 'l' )
Denis Charmet's avatar
Denis Charmet committed
214
215
#define ATOM_hvcC VLC_FOURCC( 'h', 'v', 'c', 'C' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
216
217
218
219
220
#define ATOM_dvc  VLC_FOURCC( 'd', 'v', 'c', ' ' )
#define ATOM_dvp  VLC_FOURCC( 'd', 'v', 'p', ' ' )
#define ATOM_dv5n VLC_FOURCC( 'd', 'v', '5', 'n' )
#define ATOM_dv5p VLC_FOURCC( 'd', 'v', '5', 'p' )
#define ATOM_raw  VLC_FOURCC( 'r', 'a', 'w', ' ' )
221
#define ATOM_dOps VLC_FOURCC( 'd', 'O', 'p', 's' )
222
#define ATOM_wfex VLC_FOURCC( 'w', 'f', 'e', 'x' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239

#define ATOM_jpeg VLC_FOURCC( 'j', 'p', 'e', 'g' )

#define ATOM_yv12 VLC_FOURCC( 'y', 'v', '1', '2' )
#define ATOM_yuv2 VLC_FOURCC( 'y', 'u', 'v', '2' )

#define ATOM_rmra VLC_FOURCC( 'r', 'm', 'r', 'a' )
#define ATOM_rmda VLC_FOURCC( 'r', 'm', 'd', 'a' )
#define ATOM_rdrf VLC_FOURCC( 'r', 'd', 'r', 'f' )
#define ATOM_rmdr VLC_FOURCC( 'r', 'm', 'd', 'r' )
#define ATOM_rmvc VLC_FOURCC( 'r', 'm', 'v', 'c' )
#define ATOM_rmcd VLC_FOURCC( 'r', 'm', 'c', 'd' )
#define ATOM_rmqu VLC_FOURCC( 'r', 'm', 'q', 'u' )
#define ATOM_alis VLC_FOURCC( 'a', 'l', 'i', 's' )

#define ATOM_gmhd VLC_FOURCC( 'g', 'm', 'h', 'd' )
#define ATOM_wave VLC_FOURCC( 'w', 'a', 'v', 'e' )
240
#define ATOM_strf VLC_FOURCC( 's', 't', 'r', 'f' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
241
242
243
244
245
246
247
248
249
250
251
252

#define ATOM_drms VLC_FOURCC( 'd', 'r', 'm', 's' )
#define ATOM_sinf VLC_FOURCC( 's', 'i', 'n', 'f' )
#define ATOM_schi VLC_FOURCC( 's', 'c', 'h', 'i' )
#define ATOM_user VLC_FOURCC( 'u', 's', 'e', 'r' )
#define ATOM_key  VLC_FOURCC( 'k', 'e', 'y', ' ' )
#define ATOM_iviv VLC_FOURCC( 'i', 'v', 'i', 'v' )
#define ATOM_name VLC_FOURCC( 'n', 'a', 'm', 'e' )
#define ATOM_priv VLC_FOURCC( 'p', 'r', 'i', 'v' )
#define ATOM_drmi VLC_FOURCC( 'd', 'r', 'm', 'i' )
#define ATOM_frma VLC_FOURCC( 'f', 'r', 'm', 'a' )
#define ATOM_skcr VLC_FOURCC( 's', 'k', 'c', 'r' )
253
#define ATOM_ASF  VLC_FOURCC( 'A', 'S', 'F', ' ' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
254
255
256
257
258

#define ATOM_text VLC_FOURCC( 't', 'e', 'x', 't' )
#define ATOM_tx3g VLC_FOURCC( 't', 'x', '3', 'g' )
#define ATOM_subp VLC_FOURCC( 's', 'u', 'b', 'p' )
#define ATOM_sbtl VLC_FOURCC( 's', 'b', 't', 'l' )
259
260
261
#define ATOM_clcp VLC_FOURCC( 'c', 'l', 'c', 'p' )
#define ATOM_c608 VLC_FOURCC( 'c', '6', '0', '8' )
#define ATOM_c708 VLC_FOURCC( 'c', '7', '0', '8' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
262
263
264
265
266

#define ATOM_0xa9nam VLC_FOURCC( 0xa9, 'n', 'a', 'm' )
#define ATOM_0xa9aut VLC_FOURCC( 0xa9, 'a', 'u', 't' )
#define ATOM_0xa9cpy VLC_FOURCC( 0xa9, 'c', 'p', 'y' )
#define ATOM_0xa9inf VLC_FOURCC( 0xa9, 'i', 'n', 'f' )
267
268
269
#define ATOM_0xa9isr VLC_FOURCC( 0xa9, 'i', 's', 'r' )
#define ATOM_0xa9lab VLC_FOURCC( 0xa9, 'l', 'a', 'b' )
#define ATOM_0xa9lal VLC_FOURCC( 0xa9, 'l', 'a', 'l' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
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
#define ATOM_0xa9ART VLC_FOURCC( 0xa9, 'A', 'R', 'T' )
#define ATOM_0xa9des VLC_FOURCC( 0xa9, 'd', 'e', 's' )
#define ATOM_0xa9dir VLC_FOURCC( 0xa9, 'd', 'i', 'r' )
#define ATOM_0xa9cmt VLC_FOURCC( 0xa9, 'c', 'm', 't' )
#define ATOM_0xa9req VLC_FOURCC( 0xa9, 'r', 'e', 'q' )
#define ATOM_0xa9day VLC_FOURCC( 0xa9, 'd', 'a', 'y' )
#define ATOM_0xa9fmt VLC_FOURCC( 0xa9, 'f', 'm', 't' )
#define ATOM_0xa9prd VLC_FOURCC( 0xa9, 'p', 'r', 'd' )
#define ATOM_0xa9prf VLC_FOURCC( 0xa9, 'p', 'r', 'f' )
#define ATOM_0xa9src VLC_FOURCC( 0xa9, 's', 'r', 'c' )
#define ATOM_0xa9alb VLC_FOURCC( 0xa9, 'a', 'l', 'b' )
#define ATOM_0xa9dis VLC_FOURCC( 0xa9, 'd', 'i', 's' )
#define ATOM_0xa9enc VLC_FOURCC( 0xa9, 'e', 'n', 'c' )
#define ATOM_0xa9trk VLC_FOURCC( 0xa9, 't', 'r', 'k' )
#define ATOM_0xa9url VLC_FOURCC( 0xa9, 'u', 'r', 'l' )
#define ATOM_0xa9dsa VLC_FOURCC( 0xa9, 'd', 's', 'a' )
#define ATOM_0xa9hst VLC_FOURCC( 0xa9, 'h', 's', 't' )
#define ATOM_0xa9ope VLC_FOURCC( 0xa9, 'o', 'p', 'e' )
#define ATOM_0xa9wrt VLC_FOURCC( 0xa9, 'w', 'r', 't' )
#define ATOM_0xa9com VLC_FOURCC( 0xa9, 'c', 'o', 'm' )
#define ATOM_0xa9gen VLC_FOURCC( 0xa9, 'g', 'e', 'n' )
#define ATOM_0xa9too VLC_FOURCC( 0xa9, 't', 'o', 'o' )
#define ATOM_0xa9wrn VLC_FOURCC( 0xa9, 'w', 'r', 'n' )
#define ATOM_0xa9swr VLC_FOURCC( 0xa9, 's', 'w', 'r' )
#define ATOM_0xa9mak VLC_FOURCC( 0xa9, 'm', 'a', 'k' )
295
#define ATOM_0xa9mal VLC_FOURCC( 0xa9, 'm', 'a', 'l' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
296
297
298
#define ATOM_0xa9mod VLC_FOURCC( 0xa9, 'm', 'o', 'd' )
#define ATOM_0xa9PRD VLC_FOURCC( 0xa9, 'P', 'R', 'D' )
#define ATOM_0xa9grp VLC_FOURCC( 0xa9, 'g', 'r', 'p' )
299
300
301
302
303
304
305
306
307
308
309
310
#define ATOM_0xa9lyr VLC_FOURCC( 0xa9, 'l', 'y', 'r' )
#define ATOM_0xa9gen VLC_FOURCC( 0xa9, 'g', 'e', 'n' )
#define ATOM_0xa9st3 VLC_FOURCC( 0xa9, 's', 't', '3' )
#define ATOM_0xa9ard VLC_FOURCC( 0xa9, 'a', 'r', 'd' )
#define ATOM_0xa9arg VLC_FOURCC( 0xa9, 'a', 'r', 'g' )
#define ATOM_0xa9cak VLC_FOURCC( 0xa9, 'c', 'a', 'k' )
#define ATOM_0xa9con VLC_FOURCC( 0xa9, 'c', 'o', 'n' )
#define ATOM_0xa9des VLC_FOURCC( 0xa9, 'd', 'e', 's' )
#define ATOM_0xa9lnt VLC_FOURCC( 0xa9, 'l', 'n', 't' )
#define ATOM_0xa9phg VLC_FOURCC( 0xa9, 'p', 'h', 'g' )
#define ATOM_0xa9pub VLC_FOURCC( 0xa9, 'p', 'u', 'b' )
#define ATOM_0xa9sne VLC_FOURCC( 0xa9, 's', 'n', 'e' )
311
#define ATOM_0xa9snm VLC_FOURCC( 0xa9, 's', 'n', 'm' )
312
313
314
#define ATOM_0xa9sol VLC_FOURCC( 0xa9, 's', 'o', 'l' )
#define ATOM_0xa9thx VLC_FOURCC( 0xa9, 't', 'h', 'x' )
#define ATOM_0xa9xpd VLC_FOURCC( 0xa9, 'x', 'p', 'd' )
315
#define ATOM_0xa9xyz VLC_FOURCC( 0xa9, 'x', 'y', 'z' )
316
#define ATOM_aART VLC_FOURCC( 'a', 'A', 'R', 'T' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
317
#define ATOM_chpl VLC_FOURCC( 'c', 'h', 'p', 'l' )
318
#define ATOM_disk VLC_FOURCC( 'd', 'i', 's', 'k' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
319
320
321
#define ATOM_WLOC VLC_FOURCC( 'W', 'L', 'O', 'C' )

#define ATOM_meta VLC_FOURCC( 'm', 'e', 't', 'a' )
322
#define ATOM_atID VLC_FOURCC( 'a', 't', 'I', 'D' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
323
#define ATOM_ilst VLC_FOURCC( 'i', 'l', 's', 't' )
324
#define ATOM_cnID VLC_FOURCC( 'c', 'n', 'I', 'D' )
325
#define ATOM_covr VLC_FOURCC( 'c', 'o', 'v', 'r' )
326
#define ATOM_flvr VLC_FOURCC( 'f', 'l', 'v', 'r' )
327
#define ATOM_rtng VLC_FOURCC( 'r', 't', 'n', 'g' )
328
#define ATOM_tsel VLC_FOURCC( 't', 's', 'e', 'l' )
329
#define ATOM_xid_ VLC_FOURCC( 'x', 'i', 'd', ' ' )
330
331
332
333
334
335
#define ATOM_gshh VLC_FOURCC( 'g', 's', 'h', 'h' )
#define ATOM_gspm VLC_FOURCC( 'g', 's', 'p', 'm' )
#define ATOM_gspu VLC_FOURCC( 'g', 's', 'p', 'u' )
#define ATOM_gssd VLC_FOURCC( 'g', 's', 's', 'd' )
#define ATOM_gsst VLC_FOURCC( 'g', 's', 's', 't' )
#define ATOM_gstd VLC_FOURCC( 'g', 's', 't', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
336

337
338
#define ATOM_0x40PRM VLC_FOURCC( '@', 'P', 'R', 'M' )
#define ATOM_0x40PRQ VLC_FOURCC( '@', 'P', 'R', 'Q' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
339
#define ATOM_chap VLC_FOURCC( 'c', 'h', 'a', 'p' )
340
#define ATOM_MCPS VLC_FOURCC( 'M', 'C', 'P', 'S' )
341
342
#define ATOM_SDLN VLC_FOURCC( 'S', 'D', 'L', 'N' )
#define ATOM_vndr VLC_FOURCC( 'v', 'n', 'd', 'r' )
343

344
345
346
#define HANDLER_mdta VLC_FOURCC('m', 'd', 't', 'a')
#define HANDLER_mdir VLC_FOURCC('m', 'd', 'i', 'r')

347
/* Do you want some debug information on all read boxes ? */
348
349
#ifndef NDEBUG
# define MP4_VERBOSE  1
350
//# define MP4_ULTRA_VERBOSE  1
351
#endif
Laurent Aimar's avatar
Laurent Aimar committed
352

353
354
struct MP4_Box_s;

355
#define MP4_MFRO_BOXSIZE 16
356
357

/* uuid Universal Unique IDentifiers */
Laurent Aimar's avatar
Laurent Aimar committed
358
typedef struct UUID_s
359
{
360
    uint8_t b[16];
361
362
363
364
} UUID_t;

/* specific structure for all boxes */

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
typedef struct MP4_Box_data_tfxd_s
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint64_t i_fragment_duration;
    uint64_t i_fragment_abs_time;

} MP4_Box_data_tfxd_t;

typedef struct TfrfBoxDataFields_s
{
    uint64_t i_fragment_duration;
    uint64_t i_fragment_abs_time;

} TfrfBoxDataFields_t;

typedef struct MP4_Box_data_tfrf_s
{
    uint8_t  i_version;
    uint8_t  i_fragment_count;
    uint32_t i_flags;

    TfrfBoxDataFields_t *p_tfrf_data_fields;

} MP4_Box_data_tfrf_t;

392
393
typedef struct MP4_Box_data_ftyp_s
{
394
395
    uint32_t i_major_brand;
    uint32_t i_minor_version;
396

397
398
    uint32_t i_compatible_brands_count;
    uint32_t *i_compatible_brands;
399
400
401
402
403

} MP4_Box_data_ftyp_t;

typedef struct MP4_Box_data_mvhd_s
{
404
405
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
406

407
408
409
410
411
412
413
414
415
416
417
418
    uint64_t i_creation_time;
    uint64_t i_modification_time;
    uint32_t i_timescale;
    uint64_t i_duration;

    int32_t  i_rate;
    int16_t  i_volume;
    int16_t  i_reserved1;
    uint32_t i_reserved2[2];
    int32_t  i_matrix[9];
    uint32_t i_predefined[6];
    uint32_t i_next_track_id;
419
420
421
422
423
424
425
426

} MP4_Box_data_mvhd_t;

#define MP4_TRACK_ENABLED    0x000001
#define MP4_TRACK_IN_MOVIE   0x000002
#define MP4_TRACK_IN_PREVIEW 0x000004
typedef struct MP4_Box_data_tkhd_s
{
427
428
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
429

430
431
432
433
434
    uint64_t i_creation_time;
    uint64_t i_modification_time;
    uint32_t i_track_ID;
    uint32_t i_reserved;
    uint64_t i_duration;
Laurent Aimar's avatar
Laurent Aimar committed
435

436
437
438
    uint32_t i_reserved2[2];
    int16_t  i_layer;
    int16_t  i_predefined;
Laurent Aimar's avatar
Laurent Aimar committed
439

440
441
442
443
444
    int16_t  i_volume;
    uint16_t i_reserved3;
    int32_t  i_matrix[9];
    int32_t  i_width;
    int32_t  i_height;
445
    float    f_rotation;
Laurent Aimar's avatar
Laurent Aimar committed
446

447
448
} MP4_Box_data_tkhd_t;

449
450
451
452
453
454
455
456
typedef struct
{
    uint32_t i_start_time;
    int32_t  i_duration;
    uint32_t i_flags;
    uint32_t i_hints;
} MP4_Box_data_load_t;

457
458
typedef struct MP4_Box_data_mdhd_s
{
459
460
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
461

462
463
464
465
    uint64_t i_creation_time;
    uint64_t i_modification_time;
    uint32_t i_timescale;
    uint64_t i_duration;
466

467
468
469
    char     rgs_language[3]; /* ISO-639-2/T or Mac lang table */
    bool     b_mac_encoding;  /* media using mac encoding */

470
    uint16_t i_quality;
471
472
473
474
475

} MP4_Box_data_mdhd_t;

typedef struct MP4_Box_data_hdlr_s
{
476
477
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
478

479
    uint32_t i_predefined;
Laurent Aimar's avatar
Laurent Aimar committed
480
481
    uint32_t i_handler_type; /* "vide" "soun" "hint" "odsm"
                           "crsm" "sdsm" "m7sm" "ocsm"
482
                           "ipsm" "mjsm" */
Laurent Aimar's avatar
Laurent Aimar committed
483

484
485
486
487
488
489
    unsigned char *psz_name; /* in UTF-8 */

} MP4_Box_data_hdlr_t;

typedef struct MP4_Box_data_vmhd_s
{
490
491
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
492

493
    int16_t  i_graphics_mode;
Laurent Aimar's avatar
Laurent Aimar committed
494
    int16_t  i_opcolor[3];
495
496
497
498
499

} MP4_Box_data_vmhd_t;

typedef struct MP4_Box_data_smhd_s
{
500
501
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
502

503
504
    int16_t  i_balance;
    int16_t  i_reserved;
505
506
507
508
509

} MP4_Box_data_smhd_t;

typedef struct MP4_Box_data_hmhd_s
{
510
511
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
512

513
514
515
516
517
    uint16_t i_max_PDU_size;
    uint16_t i_avg_PDU_size;
    uint32_t i_max_bitrate;
    uint32_t i_avg_bitrate;
    uint32_t i_reserved;
518
519
520
521
522

} MP4_Box_data_hmhd_t;

typedef struct MP4_Box_data_url_s
{
523
524
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
525

zorglub's avatar
zorglub committed
526
    char *psz_location;
Laurent Aimar's avatar
Laurent Aimar committed
527

528
529
530
531
} MP4_Box_data_url_t;

typedef struct MP4_Box_data_urn_s
{
532
533
    uint8_t  i_version;
    uint32_t i_flags;
534

zorglub's avatar
zorglub committed
535
536
    char *psz_name;
    char *psz_location;
Laurent Aimar's avatar
Laurent Aimar committed
537

538
539
} MP4_Box_data_urn_t;

540
typedef struct MP4_Box_data_lcont_s
541
{
542
543
    uint8_t  i_version;
    uint32_t i_flags;
544

545
    uint32_t i_entry_count;
546
/* XXX it's also a container with i_entry_count entry */
547
} MP4_Box_data_lcont_t;
548
549
550

typedef struct MP4_Box_data_stts_s
{
551
552
    uint8_t  i_version;
    uint32_t i_flags;
553

554
    uint32_t i_entry_count;
555
556
    uint32_t *pi_sample_count; /* these are array */
    int32_t  *pi_sample_delta;
557
558
559
560
561

} MP4_Box_data_stts_t;

typedef struct MP4_Box_data_ctts_s
{
562
563
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
564

565
    uint32_t i_entry_count;
566

567
568
    uint32_t *pi_sample_count; /* these are array */
    int32_t *pi_sample_offset;
569
570
571
572
573
574

} MP4_Box_data_ctts_t;


typedef struct MP4_Box_data_sample_soun_s
{
575
576
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
577

578
579
580
581
582
    //uint32_t i_reserved2[2];
    uint16_t i_qt_version;
    uint16_t i_qt_revision_level;
    uint32_t i_qt_vendor;

583
584
    uint16_t i_channelcount;
    uint16_t i_samplesize;
François Cartegnie's avatar
François Cartegnie committed
585
    uint16_t i_compressionid;
586
587
588
    uint16_t i_reserved3;
    uint16_t i_sampleratehi; /* timescale of track */
    uint16_t i_sampleratelo;
589
590
591
592
593
594

    /* for version 1 (i_reserved1[0] == 1) */
    uint32_t i_sample_per_packet;
    uint32_t i_bytes_per_packet;
    uint32_t i_bytes_per_frame;
    uint32_t i_bytes_per_sample;
595

596
597
598
599
600
601
    /* v2 */
    uint32_t i_constbitsperchannel; /* consts are nonzero only if constant */
    uint32_t i_formatflags;
    uint32_t i_constbytesperaudiopacket;
    uint32_t i_constLPCMframesperaudiopacket;

602
603
604
605
    /* XXX hack */
    int     i_qt_description;
    uint8_t *p_qt_description;

606
607
608
609
} MP4_Box_data_sample_soun_t;

typedef struct MP4_Box_data_sample_vide_s
{
610
611
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
612

613
614
615
616
617
618
    uint16_t i_qt_version;
    uint16_t i_qt_revision_level;
    uint32_t i_qt_vendor;

    uint32_t i_qt_temporal_quality;
    uint32_t i_qt_spatial_quality;
619

620
621
    int16_t  i_width;
    int16_t  i_height;
622

623
624
    uint32_t i_horizresolution;
    uint32_t i_vertresolution;
625

626
627
628
    uint32_t i_qt_data_size;
    uint16_t i_qt_frame_count;

629
    char     sz_compressorname[32];
630
    int16_t  i_depth;
631

632
633
634
635
636
637
    int16_t  i_qt_color_table;

    /* XXX hack ImageDescription */
    int     i_qt_image_description;
    uint8_t *p_qt_image_description;

638
639
} MP4_Box_data_sample_vide_t;

640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
#define MP4_TEXT_DISPLAY_FLAG_DONT_DISPLAY       (1<<0)
#define MP4_TEXT_DISPLAY_FLAG_AUTO_SCALE         (1<<1)
#define MP4_TEXT_DISPLAY_FLAG_CLIP_TO_TEXT_BOX   (1<<2)
#define MP4_TEXT_DISPLAY_FLAG_USE_MOVIE_BG_COLOR (1<<3)
#define MP4_TEXT_DISPLAY_FLAG_SHRINK_TEXT_BOX_TO_FIT (1<<4)
#define MP4_TEXT_DISPLAY_FLAG_SCROLL_IN          (1<<5)
#define MP4_TEXT_DISPLAY_FLAG_SCROLL_OUT         (1<<6)
#define MP4_TEXT_DISPLAY_FLAG_HORIZONTAL_SCROLL  (1<<7)
#define MP4_TEXT_DISPLAY_FLAG_REVERSE_SCROLL     (1<<8)
#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_SCROLL  (1<<9)
#define MP4_TEXT_DISPLAY_FLAG_FLOW_HORIZONTAL    (1<<10)
#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_KARAOKE (1<<11)
#define MP4_TEXT_DISPLAY_FLAG_DROP_SHADOW        (1<<12)
#define MP4_TEXT_DISPLAY_FLAG_ANTI_ALIAS         (1<<13)
#define MP4_TEXT_DISPLAY_FLAG_KEYED_TEXT         (1<<14)
#define MP4_TEXT_DISPLAY_FLAG_INVERSE_HILITE     (1<<15)
#define MP4_TEXT_DISPLAY_FLAG_COLOR_HILITE       (1<<16)
#define MP4_TEXT_DISPLAY_FLAG_WRITE_VERTICALLY   (1<<17)

659
660
typedef struct
{
661
662
663
    uint32_t i_reserved1;
    uint16_t i_reserved2;

664
665
    uint16_t i_data_reference_index;

666
667
668
669
670
671
    uint32_t i_display_flags;   // TextDescription and Tx3gDescription

    int8_t i_justification_horizontal; // left(0), centered(1), right(-1)
    int8_t i_justification_vertical;   // top(0), centered(1), bottom(-1)

    uint16_t i_background_color[4];
672

673
674
675
676
    uint16_t i_text_box_top;
    uint16_t i_text_box_left;
    uint16_t i_text_box_bottom;
    uint16_t i_text_box_right;
677

678
679
680
681
682
683
684
    uint32_t i_reserved3;

    uint16_t i_font_id;
    uint8_t  i_font_face;
    uint8_t  i_font_size;
    uint32_t i_font_color; //RGBA

685
    // TODO to complete
686
687
} MP4_Box_data_sample_text_t;

688
689
690
691
692
693
694
typedef struct
{
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;

} MP4_Box_data_sample_clcp_t;

695
696
typedef struct MP4_Box_data_sample_hint_s
{
697
698
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
699

700
    uint8_t *p_data;
701
702
703
704
705

} MP4_Box_data_sample_hint_t;

typedef struct MP4_Box_data_moviehintinformation_rtp_s
{
706
    uint32_t i_description_format;
707
708
709
710
711
712
    unsigned char *psz_text;

} MP4_Box_data_moviehintinformation_rtp_t;

typedef struct MP4_Box_data_stsz_s
{
713
714
    uint8_t  i_version;
    uint32_t i_flags;
715

716
717
    uint32_t i_sample_size;
    uint32_t i_sample_count;
Laurent Aimar's avatar
Laurent Aimar committed
718

719
    uint32_t *i_entry_size; /* array , empty if i_sample_size != 0 */
720
721
722
723
724

} MP4_Box_data_stsz_t;

typedef struct MP4_Box_data_stz2_s
{
725
726
    uint8_t  i_version;
    uint32_t i_flags;
727

728
729
730
    uint32_t i_sample_size; /* 24 bits */
    uint8_t  i_field_size;
    uint32_t i_sample_count;
731

732
    uint32_t *i_entry_size; /* array: unsigned int(i_field_size) entry_size */
733
734
735
736
737

} MP4_Box_data_stz2_t;

typedef struct MP4_Box_data_stsc_s
{
738
739
    uint8_t  i_version;
    uint32_t i_flags;
740

741
    uint32_t i_entry_count;
742

743
744
745
    uint32_t *i_first_chunk; /* theses are arrays */
    uint32_t *i_samples_per_chunk;
    uint32_t *i_sample_description_index;
Laurent Aimar's avatar
Laurent Aimar committed
746

747
748
749
750
751
} MP4_Box_data_stsc_t;


typedef struct MP4_Box_data_co64_s
{
752
753
    uint8_t  i_version;
    uint32_t i_flags;
754

755
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
756

757
    uint64_t *i_chunk_offset;
758
759
760
761
762
763

} MP4_Box_data_co64_t;


typedef struct MP4_Box_data_stss_s
{
764
765
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
766

767
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
768

769
    uint32_t *i_sample_number;
Laurent Aimar's avatar
Laurent Aimar committed
770

771
772
773
774
} MP4_Box_data_stss_t;

typedef struct MP4_Box_data_stsh_s
{
775
776
    uint8_t  i_version;
    uint32_t i_flags;
777

778
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
779

780
781
    uint32_t *i_shadowed_sample_number;
    uint32_t *i_sync_sample_number;
782
783
784
785
786

} MP4_Box_data_stsh_t;

typedef struct MP4_Box_data_stdp_s
{
787
788
    uint8_t  i_version;
    uint32_t i_flags;
789

790
    uint16_t *i_priority;
791
792
793
794
795

} MP4_Box_data_stdp_t;

typedef struct MP4_Box_data_padb_s
{
796
797
    uint8_t  i_version;
    uint32_t i_flags;
798

799
    uint32_t i_sample_count;
800

801
802
803
804
    uint16_t *i_reserved1;   /* 1bit  */
    uint16_t *i_pad2;        /* 3bits */
    uint16_t *i_reserved2;   /* 1bit  */
    uint16_t *i_pad1;        /* 3bits */
Laurent Aimar's avatar
Laurent Aimar committed
805

806
807
808
809
810
811

} MP4_Box_data_padb_t;


typedef struct MP4_Box_data_elst_s
{
812
813
    uint8_t  i_version;
    uint32_t i_flags;
814

815
    uint32_t i_entry_count;
816

817
818
819
820
    uint64_t *i_segment_duration;
    int64_t  *i_media_time;
    uint16_t *i_media_rate_integer;
    uint16_t *i_media_rate_fraction;
821

Laurent Aimar's avatar
Laurent Aimar committed
822

823
824
825
826
} MP4_Box_data_elst_t;

typedef struct MP4_Box_data_cprt_s
{
827
828
    uint8_t  i_version;
    uint32_t i_flags;
829
830

    char     rgs_language[3]; /* ISO-639-2/T */
Laurent Aimar's avatar
Laurent Aimar committed
831

zorglub's avatar
zorglub committed
832
    char *psz_notice;
833
834
835
836
837
838
} MP4_Box_data_cprt_t;


/* DecoderConfigDescriptor */
typedef struct MP4_descriptor_decoder_config_s
{
839
    uint8_t i_objectProfileIndication;
840
841
842
843
844
    uint8_t i_streamType;
    int     b_upStream;
    int     i_buffer_sizeDB;
    int     i_max_bitrate;
    int     i_avg_bitrate;
Laurent Aimar's avatar
Laurent Aimar committed
845

846
847
    int     i_decoder_specific_info_len;
    uint8_t *p_decoder_specific_info;
848
    /* some other stuff */
Laurent Aimar's avatar
Laurent Aimar committed
849

850
851
852
853
} MP4_descriptor_decoder_config_t;

typedef struct MP4_descriptor_SL_config_s
{
854
855

    int i_dummy; /* ANSI C forbids empty structures */
Laurent Aimar's avatar
Laurent Aimar committed
856

857
858
859
860
861
} MP4_descriptor_SL_config_t;


typedef struct MP4_descriptor_ES_s
{
862
863
864
865
866
    uint16_t i_ES_ID;
    int      b_stream_dependence;
    int      b_url;
    int      b_OCRstream;
    int      i_stream_priority;
867

868
    int      i_depend_on_ES_ID; /* if b_stream_dependence set */
869
870
871

    unsigned char *psz_URL;

872
    uint16_t i_OCR_ES_ID;       /* if b_OCRstream */
873
    MP4_descriptor_decoder_config_t *p_decConfigDescr;
Laurent Aimar's avatar
Laurent Aimar committed
874

875
876
877
878
879
880
881
882
883
    MP4_descriptor_SL_config_t *p_slConfigDescr;

    /* some other stuff ... */

} MP4_descriptor_ES_t;

/* ES descriptor */
typedef struct MP4_Box_data_esds_s
{
884
885
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
886

887
    MP4_descriptor_ES_t es_descriptor;
Laurent Aimar's avatar
Laurent Aimar committed
888

889
890
891
892
893
} MP4_Box_data_esds_t;


typedef struct MP4_Box_data_dcom_s
{
894
    uint32_t i_algorithm; /* fourcc */
Laurent Aimar's avatar
Laurent Aimar committed
895

896
897
898
899
} MP4_Box_data_dcom_t;

typedef struct MP4_Box_data_cmvd_s
{
900
901
    uint32_t i_uncompressed_size;
    uint32_t i_compressed_size;
902

903
904
    int     b_compressed; /* Set to 1 if compressed data, 0 if uncompressed */
    uint8_t *p_data;
905
906
907
908
909
910

} MP4_Box_data_cmvd_t;

typedef struct MP4_Box_data_cmov_s
{
    struct MP4_Box_s *p_moov; /* uncompressed moov */
911

912
913
} MP4_Box_data_cmov_t;

Iain Wade's avatar
Iain Wade committed
914
915
916
917
918
919
920
921
922
923
924
925
typedef struct
{
    uint32_t i_type;
} MP4_Box_data_frma_t;

typedef struct
{
    uint32_t i_init;
    uint32_t i_encr;
    uint32_t i_decr;
} MP4_Box_data_skcr_t;

926
typedef struct
927
928
929
930
931
932
933
934
935
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_ref_type;
    char     *psz_ref;

} MP4_Box_data_rdrf_t;

936
typedef struct
937
938
939
940
941
942
943
944
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_rate;

} MP4_Box_data_rmdr_t;

945
typedef struct
946
947
948
949
950
951
952
953
954
955
956
957
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_gestaltType;
    uint32_t i_val1;
    uint32_t i_val2;
    uint16_t i_checkType;   /* 0: val1 is version min
                               1: gestalt value & val2 == val1 */

} MP4_Box_data_rmvc_t;

958
typedef struct
959
960
961
962
963
964
965
{
    uint8_t  i_version;
    uint32_t i_flags;


} MP4_Box_data_rmcd_t;

966
typedef struct
967
968
969
970
971
{
    uint32_t i_quality;

} MP4_Box_data_rmqu_t;

972
973
typedef struct MP4_Box_data_mfhd_s
{
F. Yhuel's avatar
F. Yhuel committed
974
975
    uint8_t  i_version;
    uint32_t i_flags;
976

F. Yhuel's avatar
F. Yhuel committed
977
    uint32_t i_sequence_number;
978
979
980

} MP4_Box_data_mfhd_t;

981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
typedef struct MP4_Box_sidx_item_s
{
    bool     b_reference_type;
    uint32_t i_referenced_size;
    uint32_t i_subsegment_duration;
    bool     b_starts_with_SAP;
    uint8_t  i_SAP_type;
    uint32_t i_SAP_delta_time;

} MP4_Box_sidx_item_t;

typedef struct MP4_Box_data_sidx_s
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_reference_ID;
    uint32_t i_timescale;
    uint64_t i_earliest_presentation_time;
    uint64_t i_first_offset;
    uint16_t i_reference_count;

    MP4_Box_sidx_item_t *p_items;

} MP4_Box_data_sidx_t;

1007
1008
1009
1010
1011
#define MP4_TFHD_BASE_DATA_OFFSET     (1LL<<0)
#define MP4_TFHD_SAMPLE_DESC_INDEX    (1LL<<1)
#define MP4_TFHD_DFLT_SAMPLE_DURATION (1LL<<3)
#define MP4_TFHD_DFLT_SAMPLE_SIZE     (1LL<<4)
#define MP4_TFHD_DFLT_SAMPLE_FLAGS    (1LL<<5)
Frédéric Yhuel's avatar
Frédéric Yhuel committed
1012
#define MP4_TFHD_DURATION_IS_EMPTY    (1LL<<16)
1013
#define MP4_TFHD_DEFAULT_BASE_IS_MOOF (1LL<<17)
1014
1015
1016
typedef struct MP4_Box_data_tfhd_s
{
    uint8_t  i_version;
Frédéric Yhuel's avatar
Frédéric Yhuel committed
1017
    bool     b_empty;
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
    uint32_t i_flags;
    uint32_t i_track_ID;

    /* optional fields */
    uint64_t i_base_data_offset;
    uint32_t i_sample_description_index;
    uint32_t i_default_sample_duration;
    uint32_t i_default_sample_size;
    uint32_t i_default_sample_flags;

} MP4_Box_data_tfhd_t;

#define MP4_TRUN_DATA_OFFSET         (1<<0)
#define MP4_TRUN_FIRST_FLAGS         (1<<2)
#define MP4_TRUN_SAMPLE_DURATION     (1<<8)
#define MP4_TRUN_SAMPLE_SIZE         (1<<9)
#define MP4_TRUN_SAMPLE_FLAGS        (1<<10)
#define MP4_TRUN_SAMPLE_TIME_OFFSET  (1<<11)
typedef struct MP4_descriptor_trun_sample_t
{
    uint32_t i_duration;
    uint32_t i_size;
    uint32_t i_flags;
1041
    uint32_t i_composition_time_offset; /* version == 0 ? signed : unsigned */
1042
1043
1044
1045
1046
1047
1048
1049
1050
} MP4_descriptor_trun_sample_t;

typedef struct MP4_Box_data_trun_s
{
    uint8_t  i_version;
    uint32_t i_flags;
    uint32_t i_sample_count;

    /* optional fields */
1051
    int32_t i_data_offset;
1052
1053
1054
1055
1056
1057
    uint32_t i_first_sample_flags;

    MP4_descriptor_trun_sample_t *p_samples;

} MP4_Box_data_trun_t;

1058
1059
1060
1061
1062
1063
1064
1065
typedef struct MP4_Box_data_tfdt_s
{
    uint8_t  i_version;
    uint32_t i_flags;
    int64_t  i_base_media_decode_time;

} MP4_Box_data_tfdt_t;

1066
1067
1068
1069
1070
1071
1072
typedef struct
{
    uint32_t i_date;
    uint32_t i_type;
    uint16_t i_index;
} MP4_Box_data_pnot_t;

1073
1074
1075
1076
typedef struct
{
    char *psz_text;

1077
} MP4_Box_data_string_t;
1078

1079
1080
1081
1082
1083
1084
typedef struct
{
    uint8_t *p_blob;
    uint32_t i_blob;
} MP4_Box_data_binary_t;

1085
1086
1087
1088
1089
1090
1091
typedef struct
{
    uint32_t i_entry_count;
    uint32_t *i_track_ID;

} MP4_Box_data_tref_generic_t;

1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint8_t i_chapter;
    struct
    {
        char    *psz_name;
        int64_t  i_start;
    } chapter[256];
} MP4_Box_data_chpl_t;

1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
typedef struct
{
    uint8_t i_version;
    uint8_t i_profile;
    uint8_t i_profile_compatibility;
    uint8_t i_level;

    uint8_t i_reserved1;     /* 6 bits */
    uint8_t i_length_size;

    uint8_t i_reserved2;    /* 3 bits */
    uint8_t  i_sps;
    uint16_t *i_sps_length;
    uint8_t  **sps;

    uint8_t  i_pps;
    uint16_t *i_pps_length;
    uint8_t  **pps;

    /* XXX: Hack raw avcC atom payload */
    int     i_avcC;
    uint8_t *p_avcC;

} MP4_Box_data_avcC_t;

1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
typedef struct
{
    WAVEFORMATEX Format;
    uint32_t i_extra;
    char    *p_extra;
} MP4_Box_data_WMA2_t;

typedef struct
{
    VLC_BITMAPINFOHEADER bmiHeader;
    uint32_t i_extra;
    char    *p_extra;
} MP4_Box_data_strf_t;

1144
1145
1146
1147
1148
typedef struct
{
    uint8_t i_stream_number;
} MP4_Box_data_ASF_t;

1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
/* According to Apple's CoreAudio/CoreAudioTypes.h */
#define MP4_CHAN_USE_CHANNELS_DESC           0
#define MP4_CHAN_USE_CHANNELS_BITMAP         (1<<16)

#define MP4_CHAN_BITMAP_LEFT                 (1<<0)
#define MP4_CHAN_BITMAP_RIGHT                (1<<1)
#define MP4_CHAN_BITMAP_CENTER               (1<<2)
#define MP4_CHAN_BITMAP_LFESCREEN            (1<<3)
#define MP4_CHAN_BITMAP_BACKLEFT             (1<<4)
#define MP4_CHAN_BITMAP_BACKRIGHT            (1<<5)
#define MP4_CHAN_BITMAP_LEFTCENTER           (1<<6)
#define MP4_CHAN_BITMAP_RIGHTCENTER          (1<<7)
#define MP4_CHAN_BITMAP_BACKCENTER           (1<<8)
#define MP4_CHAN_BITMAP_SIDELEFT             (1<<9)
#define MP4_CHAN_BITMAP_SIDERIGHT            (1<<10)
#define MP4_CHAN_BITMAP_TOPCENTER            (1<<11)
#define MP4_CHAN_BITMAP_TOPFRONTLEFT         (1<<12)
#define MP4_CHAN_BITMAP_TOPFRONTENTER        (1<<13)
#define MP4_CHAN_BITMAP_TOPFRONTRIGHT        (1<<14)
#define MP4_CHAN_BITMAP_TOPBACKLEFT          (1<<15)
#define MP4_CHAN_BITMAP_TOPBACKCENTER        (1<<16)
#define MP4_CHAN_BITMAP_TOPBACKRIGHT         (1<<17)

#define MP4_CHAN_BITMAP_MAPPING_COUNT 18
static const struct
{
    uint32_t i_bitmap;
    uint32_t i_vlc;
} chan_bitmap_mapping[MP4_CHAN_BITMAP_MAPPING_COUNT] = {
    { MP4_CHAN_BITMAP_LEFT,         AOUT_CHAN_LEFT },
    { MP4_CHAN_BITMAP_RIGHT,        AOUT_CHAN_RIGHT },
    { MP4_CHAN_BITMAP_CENTER,       AOUT_CHAN_CENTER },
    { MP4_CHAN_BITMAP_LFESCREEN,    AOUT_CHAN_LFE },
    { MP4_CHAN_BITMAP_BACKLEFT,     AOUT_CHAN_REARLEFT },
    { MP4_CHAN_BITMAP_BACKRIGHT,    AOUT_CHAN_REARRIGHT },
    { MP4_CHAN_BITMAP_LEFTCENTER,   AOUT_CHAN_MIDDLELEFT },
    { MP4_CHAN_BITMAP_RIGHTCENTER,  AOUT_CHAN_MIDDLERIGHT },
    { MP4_CHAN_BITMAP_BACKCENTER,   AOUT_CHAN_REARCENTER },
    { MP4_CHAN_BITMAP_SIDELEFT,     AOUT_CHAN_LEFT },
    { MP4_CHAN_BITMAP_SIDERIGHT,    AOUT_CHAN_RIGHT },
    { MP4_CHAN_BITMAP_TOPCENTER,    AOUT_CHAN_CENTER },
    { MP4_CHAN_BITMAP_TOPFRONTLEFT, AOUT_CHAN_LEFT },
    { MP4_CHAN_BITMAP_TOPFRONTENTER,AOUT_CHAN_CENTER },
    { MP4_CHAN_BITMAP_TOPFRONTRIGHT,AOUT_CHAN_RIGHT },
    { MP4_CHAN_BITMAP_TOPBACKLEFT,  AOUT_CHAN_REARLEFT },
    { MP4_CHAN_BITMAP_TOPBACKCENTER,AOUT_CHAN_REARCENTER },
    { MP4_CHAN_BITMAP_TOPBACKRIGHT, AOUT_CHAN_REARRIGHT },
};

1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
typedef struct
{
    uint8_t i_version;
    uint32_t i_channels_flags; /* 24 bits */
    struct
    {
        uint32_t i_channels_layout_tag;
        uint32_t i_channels_bitmap;
        uint32_t i_channels_description_count;
        struct
        {
            uint32_t i_channel_label;
            uint32_t i_channel_flags;
            float    f_coordinates[3];
        } *p_descriptions;
    } layout;
} MP4_Box_data_chan_t;

Rafaël Carré's avatar
Rafaël Carré committed
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
typedef struct
{
    uint16_t i_data_rate;
    uint8_t i_num_ind_sub;
    struct
    {
        uint8_t i_fscod;
        uint8_t i_bsid;
        uint8_t i_bsmod;
        uint8_t i_acmod;
        uint8_t i_lfeon;
        uint8_t i_num_dep_sub;
        uint16_t i_chan_loc;
    } stream[8];

} MP4_Box_data_dec3_t;

1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
typedef struct
{
    uint8_t i_fscod;
    uint8_t i_bsid;
    uint8_t i_bsmod;
    uint8_t i_acmod;
    uint8_t i_lfeon;
    uint8_t i_bitrate_code;

} MP4_Box_data_dac3_t;

1244
1245
1246
1247
typedef struct
{
    uint8_t i_profile_level;

1248
    uint32_t i_vc1;
1249
1250
1251
1252
    uint8_t *p_vc1;

} MP4_Box_data_dvc1_t;

1253
1254
1255
1256
1257
typedef struct
{
    uint32_t i_flags;
} MP4_Box_data_fiel_t;

1258
1259
1260
1261
1262
1263
typedef struct
{
    uint16_t i_little_endian;

} MP4_Box_data_enda_t;

1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
typedef struct
{
    uint32_t i_entry_count;
    struct
    {
        uint32_t i_namespace;
        char    *psz_value;
    } *p_entries;
} MP4_Box_data_keys_t;

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint16_t i_object_descriptor;
    uint8_t i_OD_profile_level;
    uint8_t i_scene_profile_level;
    uint8_t i_audio_profile_level;
    uint8_t i_visual_profile_level;
    uint8_t i_graphics_profile_level;

} MP4_Box_data_iods_t;

1288
1289
1290
1291
1292
1293
1294
typedef struct
{
    uint32_t i_buffer_size;
    uint32_t i_max_bitrate;
    uint32_t i_avg_bitrate;
} MP4_Box_data_btrt_t;

1295
1296
1297
1298
1299
1300
typedef struct
{
    uint32_t i_horizontal_spacing;
    uint32_t i_vertical_spacing;
} MP4_Box_data_pasp_t;

1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint64_t i_fragment_duration;
} MP4_Box_data_mehd_t;

typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_track_ID;
    uint32_t i_default_sample_description_index;
    uint32_t i_default_sample_duration;
    uint32_t i_default_sample_size;
    uint32_t i_default_sample_flags;
} MP4_Box_data_trex_t;

typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint8_t *p_sample_table;
} MP4_Box_data_sdtp_t;

1329
1330
1331
1332
1333
typedef struct
{
    uint32_t i_switch_group;
} MP4_Box_data_tsel_t;

1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_size;
} MP4_Box_data_mfro_t;

typedef struct
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_track_ID;
    uint32_t i_number_of_entries;

    uint8_t i_length_size_of_traf_num;
    uint8_t i_length_size_of_trun_num;
    uint8_t i_length_size_of_sample_num;

    uint32_t *p_time;
    uint32_t *p_moof_offset;
    uint8_t *p_traf_number;
    uint8_t *p_trun_number;
    uint8_t *p_sample_number;
} MP4_Box_data_tfra_t;

1361
1362
typedef struct
{
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
    enum
    {
        DATA_WKT_RESERVED = 0,
        DATA_WKT_UTF8 = 1,
        DATA_WKT_UTF16 = 2,
        DATA_WKT_SJIS = 3,
        DATA_WKT_UTF8_SORT = 4,
        DATA_WKT_UTF16_SORT = 5,
        DATA_WKT_JPEG = 13,
        DATA_WKT_PNG = 14,
        DATA_WKT_BE_SIGNED = 21,
        DATA_WKT_BE_UNSIGNED = 22,
        DATA_WKT_BE_FLOAT32 = 23,
        DATA_WKT_BE_FLOAT64 = 24,
        DATA_WKT_BMP = 27,
        DATA_WKT_QUICKTIME_METADATA_ATOM = 28,
    } e_wellknowntype;
    struct
    {
        uint16_t i_country;
        uint16_t i_language;
    } locale;
1385
1386
1387
1388
    uint8_t *p_blob;
    uint32_t i_blob;
} MP4_Box_data_data_t;

1389
/*
1390
typedef struct MP4_Box_data__s
1391
{
1392
1393
    uint8_t  i_version;
    uint32_t i_flags;
1394
1395
1396
1397
1398
1399
1400
1401
1402

} MP4_Box_data__t;

*/

typedef union MP4_Box_data_s
{
    MP4_Box_data_ftyp_t *p_ftyp;
    MP4_Box_data_mvhd_t *p_mvhd;
1403
    MP4_Box_data_mfhd_t *p_mfhd;
1404
    MP4_Box_data_sidx_t *p_sidx;
1405
1406
    MP4_Box_data_tfhd_t *p_tfhd;
    MP4_Box_data_trun_t *p_trun;
1407
    MP4_Box_data_tfdt_t *p_tfdt;
1408
1409
1410
1411
1412
1413
1414
1415
    MP4_Box_data_tkhd_t *p_tkhd;
    MP4_Box_data_mdhd_t *p_mdhd;
    MP4_Box_data_hdlr_t *p_hdlr;
    MP4_Box_data_vmhd_t *p_vmhd;
    MP4_Box_data_smhd_t *p_smhd;
    MP4_Box_data_hmhd_t *p_hmhd;
    MP4_Box_data_url_t  *p_url;
    MP4_Box_data_urn_t  *p_urn;
1416
    MP4_Box_data_lcont_t *p_lcont;
1417
1418
    MP4_Box_data_stts_t *p_stts;
    MP4_Box_data_ctts_t *p_ctts;
1419
1420
1421
    MP4_Box_data_sample_vide_t *p_sample_vide;
    MP4_Box_data_sample_soun_t *p_sample_soun;
    MP4_Box_data_sample_text_t *p_sample_text;
1422
    MP4_Box_data_sample_clcp_t *p_sample_clcp;