libmp4.h 52.8 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
#ifndef VLC_MP4_LIBMP4_H_
#define VLC_MP4_LIBMP4_H_
24

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

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

31 32
#define BLOCK16x16 (1<<16)

33 34 35 36 37 38 39
#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', ' ', ' ' )
40
#define MAJOR_dash VLC_FOURCC( 'd', 'a', 's', 'h' )
41 42
#define MAJOR_mp41 VLC_FOURCC( 'm', 'p', '4', '1' )
#define MAJOR_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' )
43

44
#define ATOM_root VLC_FOURCC( 'r', 'o', 'o', 't' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
45 46 47 48 49 50 51 52 53
#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' )

54
#define ATOM_styp VLC_FOURCC( 's', 't', 'y', 'p' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
55 56 57 58 59 60
#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' )
61
#define ATOM_binm VLC_FOURCC( 0x82, 0x82, 0x7f, 0x7d ) /* binary Computer Graphics Metafile */
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
62

63 64 65 66 67
/* 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' )

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

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
70 71 72 73
#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' )
74
#define ATOM_load VLC_FOURCC( 'l', 'o', 'a', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
#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' )
95
#define ATOM_sbgp VLC_FOURCC( 's', 'b', 'g', 'p' )
96
#define ATOM_sgpd VLC_FOURCC( 's', 'g', 'p', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
97 98 99 100 101 102 103
#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' )
104
#define ATOM_sdtp VLC_FOURCC( 's', 'd', 't', 'p' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
105
#define ATOM_trex VLC_FOURCC( 't', 'r', 'e', 'x' )
106
#define ATOM_mehd VLC_FOURCC( 'm', 'e', 'h', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
107 108
#define ATOM_mfhd VLC_FOURCC( 'm', 'f', 'h', 'd' )
#define ATOM_traf VLC_FOURCC( 't', 'r', 'a', 'f' )
109
#define ATOM_sidx VLC_FOURCC( 's', 'i', 'd', 'x' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
110
#define ATOM_tfhd VLC_FOURCC( 't', 'f', 'h', 'd' )
111
#define ATOM_tfdt VLC_FOURCC( 't', 'f', 'd', 't' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
112 113 114
#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' )
115
#define ATOM_pasp VLC_FOURCC( 'p', 'a', 's', 'p' )
116 117 118
#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' )
119
#define ATOM_keys VLC_FOURCC( 'k', 'e', 'y', 's' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
120 121 122 123 124 125 126 127 128 129

#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' )
130
#define ATOM_rrtp VLC_FOURCC( 'r', 'r', 't', 'p' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
131 132

#define ATOM_dpnd VLC_FOURCC( 'd', 'p', 'n', 'd' )
133
#define ATOM_cdsc VLC_FOURCC( 'c', 'd', 's', 'c' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
134 135 136 137
#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', ' ' )
138
#define ATOM_btrt VLC_FOURCC( 'b', 't', 'r', 't' )
139
#define ATOM_sdp  VLC_FOURCC( 's', 'd', 'p', ' ' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
140

141 142 143 144
#define ATOM_tims VLC_FOURCC( 't', 'i', 'm', 's' )
#define ATOM_tsro VLC_FOURCC( 't', 's', 'r', 'o' )
#define ATOM_tssy VLC_FOURCC( 't', 's', 's', 'y' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
145 146
#define ATOM_esds VLC_FOURCC( 'e', 's', 'd', 's' )

147
#define ATOM_lpcm VLC_FOURCC( 'l', 'p', 'c', 'm' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
148 149 150 151 152 153 154 155
#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' )
156
#define ATOM_XiFL VLC_FOURCC( 'X', 'i', 'F', 'L' )
157
#define ATOM_XiVs VLC_FOURCC( 'X', 'i', 'V', 's' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
158 159 160 161 162 163 164 165 166 167 168
#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' )
169
#define ATOM_agsm VLC_FOURCC( 'a', 'g', 's', 'm' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
170
#define ATOM_alac VLC_FOURCC( 'a', 'l', 'a', 'c' )
171 172
#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
173 174
#define ATOM_dac3 VLC_FOURCC( 'd', 'a', 'c', '3' )
#define ATOM_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' )
175
#define ATOM_vc1  VLC_FOURCC( 'v', 'c', '-', '1' )
176
#define ATOM_dvc1 VLC_FOURCC( 'd', 'v', 'c', '1' )
177
#define ATOM_WMA2 VLC_FOURCC( 'W', 'M', 'A', '2' )
178
#define ATOM_wma  VLC_FOURCC( 'w', 'm', 'a', ' ' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
179 180 181
#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' )
182
#define ATOM_chan VLC_FOURCC( 'c', 'h', 'a', 'n' )
183 184 185 186
#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' )
187
#define ATOM_Opus VLC_FOURCC( 'O', 'p', 'u', 's' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
188

189
/* XiphQT */
190
#define ATOM_fCtS VLC_FOURCC( 'f', 'C', 't', 'S' )
191 192 193 194
#define ATOM_vCtH VLC_FOURCC( 'v', 'C', 't', 'H' )
#define ATOM_vCtC VLC_FOURCC( 'v', 'C', 't', 'C' )
#define ATOM_vCtd VLC_FOURCC( 'v', 'C', 't', '#' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
195 196 197 198 199 200 201 202 203 204 205 206
#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' )
207
#define ATOM_FFV1 VLC_FOURCC( 'F', 'F', 'V', '1' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
208 209 210 211 212 213 214 215 216 217 218 219 220
#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' )
221 222 223
#define ATOM_vp08 VLC_FOURCC( 'v', 'p', '0', '8' )
#define ATOM_vp09 VLC_FOURCC( 'v', 'p', '0', '9' )
#define ATOM_vp10 VLC_FOURCC( 'v', 'p', '1', '0' )
224
#define ATOM_WMV3 VLC_FOURCC( 'W', 'M', 'V', '3' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
225 226

#define ATOM_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' )
François Cartegnie's avatar
François Cartegnie committed
227
#define ATOM_avc3 VLC_FOURCC( 'a', 'v', 'c', '3' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
228
#define ATOM_avcC VLC_FOURCC( 'a', 'v', 'c', 'C' )
229
#define ATOM_vpcC VLC_FOURCC( 'v', 'p', 'c', 'C' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
230 231
#define ATOM_m4ds VLC_FOURCC( 'm', '4', 'd', 's' )

232
#define ATOM_fiel VLC_FOURCC( 'f', 'i', 'e', 'l' )
233
#define ATOM_glbl VLC_FOURCC( 'g', 'l', 'b', 'l' )
Denis Charmet's avatar
Denis Charmet committed
234 235
#define ATOM_hvcC VLC_FOURCC( 'h', 'v', 'c', 'C' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
236 237 238 239 240
#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', ' ' )
241
#define ATOM_dOps VLC_FOURCC( 'd', 'O', 'p', 's' )
242
#define ATOM_wfex VLC_FOURCC( 'w', 'f', 'e', 'x' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259

#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' )
260
#define ATOM_strf VLC_FOURCC( 's', 't', 'r', 'f' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
261 262 263 264 265 266 267 268 269 270 271 272

#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' )
273
#define ATOM_ASF  VLC_FOURCC( 'A', 'S', 'F', ' ' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
274 275 276 277 278

#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' )
279 280 281
#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
282 283 284 285 286

#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' )
287 288 289
#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
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
#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' )
315
#define ATOM_0xa9mal VLC_FOURCC( 0xa9, 'm', 'a', 'l' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
316 317 318
#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' )
319 320 321 322 323 324 325 326 327 328 329 330
#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' )
331
#define ATOM_0xa9snm VLC_FOURCC( 0xa9, 's', 'n', 'm' )
332 333 334
#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' )
335
#define ATOM_0xa9xyz VLC_FOURCC( 0xa9, 'x', 'y', 'z' )
336
#define ATOM_aART VLC_FOURCC( 'a', 'A', 'R', 'T' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
337
#define ATOM_chpl VLC_FOURCC( 'c', 'h', 'p', 'l' )
338
#define ATOM_HMMT VLC_FOURCC( 'H', 'M', 'M', 'T' )
339
#define ATOM_disk VLC_FOURCC( 'd', 'i', 's', 'k' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
340 341 342
#define ATOM_WLOC VLC_FOURCC( 'W', 'L', 'O', 'C' )

#define ATOM_meta VLC_FOURCC( 'm', 'e', 't', 'a' )
343
#define ATOM_atID VLC_FOURCC( 'a', 't', 'I', 'D' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
344
#define ATOM_ilst VLC_FOURCC( 'i', 'l', 's', 't' )
345
#define ATOM_cnID VLC_FOURCC( 'c', 'n', 'I', 'D' )
346
#define ATOM_covr VLC_FOURCC( 'c', 'o', 'v', 'r' )
347
#define ATOM_flvr VLC_FOURCC( 'f', 'l', 'v', 'r' )
348
#define ATOM_rtng VLC_FOURCC( 'r', 't', 'n', 'g' )
349
#define ATOM_tsel VLC_FOURCC( 't', 's', 'e', 'l' )
350
#define ATOM_xid_ VLC_FOURCC( 'x', 'i', 'd', ' ' )
351 352 353 354 355 356
#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' )
Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
357
#define ATOM_colr VLC_FOURCC( 'c', 'o', 'l', 'r' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
358

359 360
#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
361
#define ATOM_chap VLC_FOURCC( 'c', 'h', 'a', 'p' )
362
#define ATOM_MCPS VLC_FOURCC( 'M', 'C', 'P', 'S' )
363 364
#define ATOM_SDLN VLC_FOURCC( 'S', 'D', 'L', 'N' )
#define ATOM_vndr VLC_FOURCC( 'v', 'n', 'd', 'r' )
365

366 367 368
#define HANDLER_mdta VLC_FOURCC('m', 'd', 't', 'a')
#define HANDLER_mdir VLC_FOURCC('m', 'd', 'i', 'r')

369 370
#define SAMPLEGROUP_rap  VLC_FOURCC('r', 'a', 'p', ' ')

371
/* Do you want some debug information on all read boxes ? */
372 373
#ifndef NDEBUG
# define MP4_VERBOSE  1
374
//# define MP4_ULTRA_VERBOSE  1
375
#endif
Laurent Aimar's avatar
Laurent Aimar committed
376

377 378
struct MP4_Box_s;

379
#define MP4_MFRO_BOXSIZE 16
380 381

/* uuid Universal Unique IDentifiers */
Laurent Aimar's avatar
Laurent Aimar committed
382
typedef struct UUID_s
383
{
384
    uint8_t b[16];
385 386 387 388
} UUID_t;

/* specific structure for all boxes */

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

416 417
typedef struct MP4_Box_data_ftyp_s
{
418 419
    uint32_t i_major_brand;
    uint32_t i_minor_version;
420

421 422
    uint32_t i_compatible_brands_count;
    uint32_t *i_compatible_brands;
423 424 425 426 427

} MP4_Box_data_ftyp_t;

typedef struct MP4_Box_data_mvhd_s
{
428 429
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
430

431 432 433 434 435 436 437 438 439 440 441 442
    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;
443 444 445 446 447 448 449 450

} 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
{
451 452
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
453

454 455 456 457 458
    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
459

460 461 462
    uint32_t i_reserved2[2];
    int16_t  i_layer;
    int16_t  i_predefined;
Laurent Aimar's avatar
Laurent Aimar committed
463

464 465 466 467 468
    int16_t  i_volume;
    uint16_t i_reserved3;
    int32_t  i_matrix[9];
    int32_t  i_width;
    int32_t  i_height;
469
    float    f_rotation;
Laurent Aimar's avatar
Laurent Aimar committed
470

471 472
} MP4_Box_data_tkhd_t;

473 474 475 476 477 478 479 480
typedef struct
{
    uint32_t i_start_time;
    int32_t  i_duration;
    uint32_t i_flags;
    uint32_t i_hints;
} MP4_Box_data_load_t;

481 482
typedef struct MP4_Box_data_mdhd_s
{
483 484
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
485

486 487 488 489
    uint64_t i_creation_time;
    uint64_t i_modification_time;
    uint32_t i_timescale;
    uint64_t i_duration;
490

491 492 493
    char     rgs_language[3]; /* ISO-639-2/T or Mac lang table */
    bool     b_mac_encoding;  /* media using mac encoding */

494
    uint16_t i_quality;
495 496 497 498 499

} MP4_Box_data_mdhd_t;

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

503
    uint32_t i_predefined;
Laurent Aimar's avatar
Laurent Aimar committed
504 505
    uint32_t i_handler_type; /* "vide" "soun" "hint" "odsm"
                           "crsm" "sdsm" "m7sm" "ocsm"
506
                           "ipsm" "mjsm" */
Laurent Aimar's avatar
Laurent Aimar committed
507

508 509 510 511 512 513
    unsigned char *psz_name; /* in UTF-8 */

} MP4_Box_data_hdlr_t;

typedef struct MP4_Box_data_vmhd_s
{
514 515
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
516

517
    int16_t  i_graphics_mode;
Laurent Aimar's avatar
Laurent Aimar committed
518
    int16_t  i_opcolor[3];
519 520 521 522 523

} MP4_Box_data_vmhd_t;

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

527 528
    int16_t  i_balance;
    int16_t  i_reserved;
529 530 531 532 533

} MP4_Box_data_smhd_t;

typedef struct MP4_Box_data_hmhd_s
{
534 535
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
536

537 538 539 540 541
    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;
542 543 544 545 546

} MP4_Box_data_hmhd_t;

typedef struct MP4_Box_data_url_s
{
547 548
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
549

zorglub's avatar
zorglub committed
550
    char *psz_location;
Laurent Aimar's avatar
Laurent Aimar committed
551

552 553 554 555
} MP4_Box_data_url_t;

typedef struct MP4_Box_data_urn_s
{
556 557
    uint8_t  i_version;
    uint32_t i_flags;
558

zorglub's avatar
zorglub committed
559 560
    char *psz_name;
    char *psz_location;
Laurent Aimar's avatar
Laurent Aimar committed
561

562 563
} MP4_Box_data_urn_t;

564
typedef struct MP4_Box_data_lcont_s
565
{
566 567
    uint8_t  i_version;
    uint32_t i_flags;
568

569
    uint32_t i_entry_count;
570
/* XXX it's also a container with i_entry_count entry */
571
} MP4_Box_data_lcont_t;
572 573 574

typedef struct MP4_Box_data_stts_s
{
575 576
    uint8_t  i_version;
    uint32_t i_flags;
577

578
    uint32_t i_entry_count;
579 580
    uint32_t *pi_sample_count; /* these are array */
    int32_t  *pi_sample_delta;
581 582 583 584 585

} MP4_Box_data_stts_t;

typedef struct MP4_Box_data_ctts_s
{
586 587
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
588

589
    uint32_t i_entry_count;
590

591 592
    uint32_t *pi_sample_count; /* these are array */
    int32_t *pi_sample_offset;
593 594 595

} MP4_Box_data_ctts_t;

Hugo Beauzée-Luyssen's avatar
Hugo Beauzée-Luyssen committed
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610
// https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-125526
typedef struct MP4_Box_data_colr_s
{
    uint32_t i_type;
    union
    {
        struct
        {
            uint16_t i_primary_idx;
            uint16_t i_transfer_function_idx;
            uint16_t i_matrix_idx;
            uint8_t i_full_range;
        } nclc;
    };
} MP4_Box_data_colr_t;
611 612 613

typedef struct MP4_Box_data_sample_soun_s
{
614 615
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
616

617 618 619 620 621
    //uint32_t i_reserved2[2];
    uint16_t i_qt_version;
    uint16_t i_qt_revision_level;
    uint32_t i_qt_vendor;

622 623
    uint16_t i_channelcount;
    uint16_t i_samplesize;
François Cartegnie's avatar
François Cartegnie committed
624
    uint16_t i_compressionid;
625 626 627
    uint16_t i_reserved3;
    uint16_t i_sampleratehi; /* timescale of track */
    uint16_t i_sampleratelo;
628 629 630 631 632 633

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

635 636 637 638 639 640
    /* v2 */
    uint32_t i_constbitsperchannel; /* consts are nonzero only if constant */
    uint32_t i_formatflags;
    uint32_t i_constbytesperaudiopacket;
    uint32_t i_constLPCMframesperaudiopacket;

641 642 643 644
    /* XXX hack */
    int     i_qt_description;
    uint8_t *p_qt_description;

645 646 647 648
} MP4_Box_data_sample_soun_t;

typedef struct MP4_Box_data_sample_vide_s
{
649 650
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
651

652 653 654 655 656 657
    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;
658

659 660
    int16_t  i_width;
    int16_t  i_height;
661

662 663
    uint32_t i_horizresolution;
    uint32_t i_vertresolution;
664

665 666 667
    uint32_t i_qt_data_size;
    uint16_t i_qt_frame_count;

668
    char     sz_compressorname[32];
669
    int16_t  i_depth;
670

671 672 673 674 675 676
    int16_t  i_qt_color_table;

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

677 678
} MP4_Box_data_sample_vide_t;

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
#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)

698 699
typedef struct
{
700 701 702
    uint32_t i_reserved1;
    uint16_t i_reserved2;

703 704
    uint16_t i_data_reference_index;

705 706 707 708 709 710
    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];
711

712 713 714 715
    uint16_t i_text_box_top;
    uint16_t i_text_box_left;
    uint16_t i_text_box_bottom;
    uint16_t i_text_box_right;
716

717 718 719 720 721 722 723
    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

724
    // TODO to complete
725 726
} MP4_Box_data_sample_text_t;

727 728 729 730 731 732 733
typedef struct
{
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;

} MP4_Box_data_sample_clcp_t;

734 735
typedef struct MP4_Box_data_sample_hint_s
{
736 737
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
738

739
    uint8_t *p_data;
740 741 742

} MP4_Box_data_sample_hint_t;

743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770
typedef struct MP4_Box_data_rrtp_sample_s
{
    uint16_t i_hinttrackversion;
    uint16_t i_highestcompatibleversion;
    uint32_t i_maxpacketsize;

    uint8_t *p_additionaldata;

} MP4_Box_data_rrtp_sample_t;

typedef struct MP4_Box_data_timescale_entry_s
{
    uint32_t i_timescale;

} MP4_Box_data_timescale_entry_t;

typedef struct MP4_Box_data_time_offset_s
{
    uint32_t i_offset;

} MP4_Box_data_time_offset_t;

typedef struct MP4_Box_data_timestampsynchrony_s
{
    uint8_t i_reserved_timestamp_sync;

} MP4_Box_data_timestampsynchrony_t;

771 772
typedef struct MP4_Box_data_moviehintinformation_rtp_s
{
773
    uint32_t i_description_format;
774 775 776 777
    unsigned char *psz_text;

} MP4_Box_data_moviehintinformation_rtp_t;

778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
typedef struct MP4_Box_data_sdp_s
{
    char *psz_text;

} MP4_Box_data_sdp_t;

typedef struct MP4_Box_data_tims_s
{
    uint32_t i_timescale;

} MP4_Box_data_tims_t;

typedef struct MP4_Box_data_tsro_s
{
    int32_t i_offset;

} MP4_Box_data_tsro_t;

typedef struct MP4_Box_data_tssy_s
{
    uint8_t i_reserved_timestamp_sync;

} MP4_Box_data_tssy_t;

typedef struct MP4_Box_data_stsd_s
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_entry_count;

    /* it contains SampleEntry handled as if it was Box */

} MP4_Box_data_stsd_t;


814 815
typedef struct MP4_Box_data_stsz_s
{
816 817
    uint8_t  i_version;
    uint32_t i_flags;
818

819 820
    uint32_t i_sample_size;
    uint32_t i_sample_count;
Laurent Aimar's avatar
Laurent Aimar committed
821

822
    uint32_t *i_entry_size; /* array , empty if i_sample_size != 0 */
823 824 825 826 827

} MP4_Box_data_stsz_t;

typedef struct MP4_Box_data_stz2_s
{
828 829
    uint8_t  i_version;
    uint32_t i_flags;
830

831 832 833
    uint32_t i_sample_size; /* 24 bits */
    uint8_t  i_field_size;
    uint32_t i_sample_count;
834

835
    uint32_t *i_entry_size; /* array: unsigned int(i_field_size) entry_size */
836 837 838 839 840

} MP4_Box_data_stz2_t;

typedef struct MP4_Box_data_stsc_s
{
841 842
    uint8_t  i_version;
    uint32_t i_flags;
843

844
    uint32_t i_entry_count;
845

846 847 848
    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
849

850 851 852 853 854
} MP4_Box_data_stsc_t;


typedef struct MP4_Box_data_co64_s
{
855 856
    uint8_t  i_version;
    uint32_t i_flags;
857

858
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
859

860
    uint64_t *i_chunk_offset;
861 862 863 864 865 866

} MP4_Box_data_co64_t;


typedef struct MP4_Box_data_stss_s
{
867 868
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
869

870
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
871

872
    uint32_t *i_sample_number;
Laurent Aimar's avatar
Laurent Aimar committed
873

874 875 876 877
} MP4_Box_data_stss_t;

typedef struct MP4_Box_data_stsh_s
{
878 879
    uint8_t  i_version;
    uint32_t i_flags;
880

881
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
882

883 884
    uint32_t *i_shadowed_sample_number;
    uint32_t *i_sync_sample_number;
885 886 887 888 889

} MP4_Box_data_stsh_t;

typedef struct MP4_Box_data_stdp_s
{
890 891
    uint8_t  i_version;
    uint32_t i_flags;
892

893
    uint16_t *i_priority;
894 895 896 897 898

} MP4_Box_data_stdp_t;

typedef struct MP4_Box_data_padb_s
{
899 900
    uint8_t  i_version;
    uint32_t i_flags;
901

902
    uint32_t i_sample_count;
903

904 905 906 907
    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
908

909 910 911 912 913 914

} MP4_Box_data_padb_t;


typedef struct MP4_Box_data_elst_s
{
915 916
    uint8_t  i_version;
    uint32_t i_flags;
917

918
    uint32_t i_entry_count;
919

920 921 922 923
    uint64_t *i_segment_duration;
    int64_t  *i_media_time;
    uint16_t *i_media_rate_integer;
    uint16_t *i_media_rate_fraction;
924

Laurent Aimar's avatar
Laurent Aimar committed
925

926 927 928 929
} MP4_Box_data_elst_t;

typedef struct MP4_Box_data_cprt_s
{
930 931
    uint8_t  i_version;
    uint32_t i_flags;
932 933

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

zorglub's avatar
zorglub committed
935
    char *psz_notice;
936 937 938 939 940 941
} MP4_Box_data_cprt_t;


/* DecoderConfigDescriptor */
typedef struct MP4_descriptor_decoder_config_s
{
942
    uint8_t i_objectProfileIndication;
943 944 945 946 947
    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
948

949 950
    int     i_decoder_specific_info_len;
    uint8_t *p_decoder_specific_info;
951
    /* some other stuff */
Laurent Aimar's avatar
Laurent Aimar committed
952

953 954 955 956
} MP4_descriptor_decoder_config_t;

typedef struct MP4_descriptor_SL_config_s
{
957 958

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

960 961 962 963 964
} MP4_descriptor_SL_config_t;


typedef struct MP4_descriptor_ES_s
{
965 966 967 968 969
    uint16_t i_ES_ID;
    int      b_stream_dependence;
    int      b_url;
    int      b_OCRstream;
    int      i_stream_priority;
970

971
    int      i_depend_on_ES_ID; /* if b_stream_dependence set */
972 973 974

    unsigned char *psz_URL;

975
    uint16_t i_OCR_ES_ID;       /* if b_OCRstream */
976
    MP4_descriptor_decoder_config_t *p_decConfigDescr;
Laurent Aimar's avatar
Laurent Aimar committed
977

978 979 980 981 982 983 984 985 986
    MP4_descriptor_SL_config_t *p_slConfigDescr;

    /* some other stuff ... */

} MP4_descriptor_ES_t;

/* ES descriptor */
typedef struct MP4_Box_data_esds_s
{
987 988
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
989

990
    MP4_descriptor_ES_t es_descriptor;
Laurent Aimar's avatar
Laurent Aimar committed
991

992 993 994 995 996
} MP4_Box_data_esds_t;


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

999 1000 1001 1002
} MP4_Box_data_dcom_t;

typedef struct MP4_Box_data_cmvd_s
{
1003 1004
    uint32_t i_uncompressed_size;
    uint32_t i_compressed_size;
1005

1006 1007
    int     b_compressed; /* Set to 1 if compressed data, 0 if uncompressed */
    uint8_t *p_data;
1008 1009 1010 1011 1012 1013

} MP4_Box_data_cmvd_t;

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

1015 1016
} MP4_Box_data_cmov_t;

Iain Wade's avatar
Iain Wade committed
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
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;

1029
typedef struct
1030 1031 1032 1033 1034 1035 1036 1037