libmp4.h 40.3 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 27
#include <vlc_es.h>

28 29
#define BLOCK16x16 (1<<16)

30
#define ATOM_root VLC_FOURCC( 'r', 'o', 'o', 't' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#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' )

#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' )

47 48
#define ATOM_data VLC_FOURCC( 'd', 'a', 't', 'a' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
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
#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' )
#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' )
80
#define ATOM_sdtp VLC_FOURCC( 's', 'd', 't', 'p' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
81
#define ATOM_trex VLC_FOURCC( 't', 'r', 'e', 'x' )
82
#define ATOM_mehd VLC_FOURCC( 'm', 'e', 'h', 'd' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
83 84
#define ATOM_mfhd VLC_FOURCC( 'm', 'f', 'h', 'd' )
#define ATOM_traf VLC_FOURCC( 't', 'r', 'a', 'f' )
85
#define ATOM_sidx VLC_FOURCC( 's', 'i', 'd', 'x' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
86 87 88 89
#define ATOM_tfhd VLC_FOURCC( 't', 'f', 'h', 'd' )
#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' )
90
#define ATOM_pasp VLC_FOURCC( 'p', 'a', 's', 'p' )
91 92 93
#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' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

#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', ' ' )

#define ATOM_isom VLC_FOURCC( 'i', 's', 'o', 'm' )
#define ATOM_3gp4 VLC_FOURCC( '3', 'g', 'p', '4' )
#define ATOM_esds VLC_FOURCC( 'e', 's', 'd', 's' )

115
#define ATOM_lpcm VLC_FOURCC( 'l', 'p', 'c', 'm' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
#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' )
#define ATOM_alac VLC_FOURCC( 'a', 'l', 'a', 'c' )
#define ATOM_dac3 VLC_FOURCC( 'd', 'a', 'c', '3' )
#define ATOM_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' )
138
#define ATOM_dvc1 VLC_FOURCC( 'd', 'v', 'c', '1' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
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
#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' )

#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' )
#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' )

#define ATOM_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' )
#define ATOM_avcC VLC_FOURCC( 'a', 'v', 'c', 'C' )
#define ATOM_m4ds VLC_FOURCC( 'm', '4', 'd', 's' )

Denis Charmet's avatar
Denis Charmet committed
173 174
#define ATOM_hvcC VLC_FOURCC( 'h', 'v', 'c', 'C' )

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
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
#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', ' ' )

#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' )

#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' )

#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' )

#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' )
#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' )
#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' )
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
#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' )
#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' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
262 263 264 265 266
#define ATOM_chpl VLC_FOURCC( 'c', 'h', 'p', 'l' )
#define ATOM_WLOC VLC_FOURCC( 'W', 'L', 'O', 'C' )

#define ATOM_meta VLC_FOURCC( 'm', 'e', 't', 'a' )
#define ATOM_ilst VLC_FOURCC( 'i', 'l', 's', 't' )
267
#define ATOM_covr VLC_FOURCC( 'c', 'o', 'v', 'r' )
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
268 269

#define ATOM_chap VLC_FOURCC( 'c', 'h', 'a', 'p' )
270

271
/* Do you want some debug information on all read boxes ? */
272 273 274
#ifndef NDEBUG
# define MP4_VERBOSE  1
#endif
Laurent Aimar's avatar
Laurent Aimar committed
275

276 277 278 279
struct MP4_Box_s;


/* uuid Universal Unique IDentifiers */
Laurent Aimar's avatar
Laurent Aimar committed
280
typedef struct UUID_s
281
{
282
    uint8_t b[16];
283 284 285 286
} UUID_t;

/* specific structure for all boxes */

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

314 315
typedef struct MP4_Box_data_ftyp_s
{
316 317
    uint32_t i_major_brand;
    uint32_t i_minor_version;
318

319 320
    uint32_t i_compatible_brands_count;
    uint32_t *i_compatible_brands;
321 322 323 324 325

} MP4_Box_data_ftyp_t;

typedef struct MP4_Box_data_mvhd_s
{
326 327
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
328

329 330 331 332 333 334 335 336 337 338 339 340
    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;
341 342 343 344 345 346 347 348

} 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
{
349 350
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
351

352 353 354 355 356
    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
357

358 359 360
    uint32_t i_reserved2[2];
    int16_t  i_layer;
    int16_t  i_predefined;
Laurent Aimar's avatar
Laurent Aimar committed
361

362 363 364 365 366
    int16_t  i_volume;
    uint16_t i_reserved3;
    int32_t  i_matrix[9];
    int32_t  i_width;
    int32_t  i_height;
367
    float    f_rotation;
Laurent Aimar's avatar
Laurent Aimar committed
368

369 370 371 372
} MP4_Box_data_tkhd_t;

typedef struct MP4_Box_data_mdhd_s
{
373 374
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
375

376 377 378 379
    uint64_t i_creation_time;
    uint64_t i_modification_time;
    uint32_t i_timescale;
    uint64_t i_duration;
380 381

    /* one bit for pad */
382
    uint16_t      i_language_code;
383
    /* unsigned int(5)[3] language difference with 0x60*/
Laurent Aimar's avatar
Laurent Aimar committed
384
    unsigned char i_language[3];
385
    uint16_t i_predefined;
386 387 388 389 390

} MP4_Box_data_mdhd_t;

typedef struct MP4_Box_data_hdlr_s
{
391 392
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
393

394
    uint32_t i_predefined;
Laurent Aimar's avatar
Laurent Aimar committed
395 396
    uint32_t i_handler_type; /* "vide" "soun" "hint" "odsm"
                           "crsm" "sdsm" "m7sm" "ocsm"
397
                           "ipsm" "mjsm" */
Laurent Aimar's avatar
Laurent Aimar committed
398

399 400 401 402 403 404
    unsigned char *psz_name; /* in UTF-8 */

} MP4_Box_data_hdlr_t;

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

408
    int16_t  i_graphics_mode;
Laurent Aimar's avatar
Laurent Aimar committed
409
    int16_t  i_opcolor[3];
410 411 412 413 414

} MP4_Box_data_vmhd_t;

typedef struct MP4_Box_data_smhd_s
{
415 416
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
417

418 419
    int16_t  i_balance;
    int16_t  i_reserved;
420 421 422 423 424

} MP4_Box_data_smhd_t;

typedef struct MP4_Box_data_hmhd_s
{
425 426
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
427

428 429 430 431 432
    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;
433 434 435 436 437

} MP4_Box_data_hmhd_t;

typedef struct MP4_Box_data_url_s
{
438 439
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
440

441
    char *psz_location;
Laurent Aimar's avatar
Laurent Aimar committed
442

443 444 445 446
} MP4_Box_data_url_t;

typedef struct MP4_Box_data_urn_s
{
447 448
    uint8_t  i_version;
    uint32_t i_flags;
449

450 451
    char *psz_name;
    char *psz_location;
Laurent Aimar's avatar
Laurent Aimar committed
452

453 454 455 456
} MP4_Box_data_urn_t;

typedef struct MP4_Box_data_dref_s
{
457 458
    uint8_t  i_version;
    uint32_t i_flags;
459

460
    uint32_t i_entry_count;
461 462 463 464 465
/* XXX it's also a container with i_entry_count entry */
} MP4_Box_data_dref_t;

typedef struct MP4_Box_data_stts_s
{
466 467
    uint8_t  i_version;
    uint32_t i_flags;
468

469
    uint32_t i_entry_count;
470 471
    uint32_t *pi_sample_count; /* these are array */
    int32_t  *pi_sample_delta;
472 473 474 475 476

} MP4_Box_data_stts_t;

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

480
    uint32_t i_entry_count;
481

482 483
    uint32_t *pi_sample_count; /* these are array */
    int32_t *pi_sample_offset;
484 485 486 487 488 489

} MP4_Box_data_ctts_t;


typedef struct MP4_Box_data_sample_soun_s
{
490 491
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
492

493 494 495 496 497
    //uint32_t i_reserved2[2];
    uint16_t i_qt_version;
    uint16_t i_qt_revision_level;
    uint32_t i_qt_vendor;

498 499 500 501 502 503
    uint16_t i_channelcount;
    uint16_t i_samplesize;
    uint16_t i_predefined;
    uint16_t i_reserved3;
    uint16_t i_sampleratehi; /* timescale of track */
    uint16_t i_sampleratelo;
504 505 506 507 508 509

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

511 512 513 514 515 516
    /* v2 */
    uint32_t i_constbitsperchannel; /* consts are nonzero only if constant */
    uint32_t i_formatflags;
    uint32_t i_constbytesperaudiopacket;
    uint32_t i_constLPCMframesperaudiopacket;

517 518 519 520
    /* XXX hack */
    int     i_qt_description;
    uint8_t *p_qt_description;

521 522 523 524
} MP4_Box_data_sample_soun_t;

typedef struct MP4_Box_data_sample_vide_s
{
525 526
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
527

528 529 530 531 532 533
    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;
534

535 536
    int16_t  i_width;
    int16_t  i_height;
537

538 539
    uint32_t i_horizresolution;
    uint32_t i_vertresolution;
540

541 542 543
    uint32_t i_qt_data_size;
    uint16_t i_qt_frame_count;

544 545
    uint8_t  i_compressorname[32];
    int16_t  i_depth;
546

547 548 549 550 551 552
    int16_t  i_qt_color_table;

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

553 554
} MP4_Box_data_sample_vide_t;

555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
#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)

574 575
typedef struct
{
576 577 578
    uint32_t i_reserved1;
    uint16_t i_reserved2;

579 580
    uint16_t i_data_reference_index;

581 582 583 584 585 586
    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];
587

588 589 590 591
    uint16_t i_text_box_top;
    uint16_t i_text_box_left;
    uint16_t i_text_box_bottom;
    uint16_t i_text_box_right;
592

593 594 595 596 597 598 599
    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

600
    // TODO to complete
601 602
} MP4_Box_data_sample_text_t;

603 604
typedef struct MP4_Box_data_sample_hint_s
{
605 606
    uint8_t  i_reserved1[6];
    uint16_t i_data_reference_index;
607

608
    uint8_t *p_data;
609 610 611 612 613

} MP4_Box_data_sample_hint_t;

typedef struct MP4_Box_data_moviehintinformation_rtp_s
{
614
    uint32_t i_description_format;
615 616 617 618 619 620 621 622
    unsigned char *psz_text;

} MP4_Box_data_moviehintinformation_rtp_t;



typedef struct MP4_Box_data_stsd_s
{
623 624
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
625

626
    uint32_t i_entry_count;
627 628

    /* it contains SampleEntry handled as if it was Box */
Laurent Aimar's avatar
Laurent Aimar committed
629

630 631 632 633 634
} MP4_Box_data_stsd_t;


typedef struct MP4_Box_data_stsz_s
{
635 636
    uint8_t  i_version;
    uint32_t i_flags;
637

638 639
    uint32_t i_sample_size;
    uint32_t i_sample_count;
Laurent Aimar's avatar
Laurent Aimar committed
640

641
    uint32_t *i_entry_size; /* array , empty if i_sample_size != 0 */
642 643 644 645 646

} MP4_Box_data_stsz_t;

typedef struct MP4_Box_data_stz2_s
{
647 648
    uint8_t  i_version;
    uint32_t i_flags;
649

650 651 652
    uint32_t i_sample_size; /* 24 bits */
    uint8_t  i_field_size;
    uint32_t i_sample_count;
653

654
    uint32_t *i_entry_size; /* array: unsigned int(i_field_size) entry_size */
655 656 657 658 659

} MP4_Box_data_stz2_t;

typedef struct MP4_Box_data_stsc_s
{
660 661
    uint8_t  i_version;
    uint32_t i_flags;
662

663
    uint32_t i_entry_count;
664

665 666 667
    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
668

669 670 671 672 673
} MP4_Box_data_stsc_t;


typedef struct MP4_Box_data_co64_s
{
674 675
    uint8_t  i_version;
    uint32_t i_flags;
676

677
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
678

679
    uint64_t *i_chunk_offset;
680 681 682 683 684 685

} MP4_Box_data_co64_t;


typedef struct MP4_Box_data_stss_s
{
686 687
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
688

689
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
690

691
    uint32_t *i_sample_number;
Laurent Aimar's avatar
Laurent Aimar committed
692

693 694 695 696
} MP4_Box_data_stss_t;

typedef struct MP4_Box_data_stsh_s
{
697 698
    uint8_t  i_version;
    uint32_t i_flags;
699

700
    uint32_t i_entry_count;
Laurent Aimar's avatar
Laurent Aimar committed
701

702 703
    uint32_t *i_shadowed_sample_number;
    uint32_t *i_sync_sample_number;
704 705 706 707 708

} MP4_Box_data_stsh_t;

typedef struct MP4_Box_data_stdp_s
{
709 710
    uint8_t  i_version;
    uint32_t i_flags;
711

712
    uint16_t *i_priority;
713 714 715 716 717

} MP4_Box_data_stdp_t;

typedef struct MP4_Box_data_padb_s
{
718 719
    uint8_t  i_version;
    uint32_t i_flags;
720

721
    uint32_t i_sample_count;
722

723 724 725 726
    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
727

728 729 730 731 732 733

} MP4_Box_data_padb_t;


typedef struct MP4_Box_data_elst_s
{
734 735
    uint8_t  i_version;
    uint32_t i_flags;
736

737
    uint32_t i_entry_count;
738

739 740 741 742
    uint64_t *i_segment_duration;
    int64_t  *i_media_time;
    uint16_t *i_media_rate_integer;
    uint16_t *i_media_rate_fraction;
743

Laurent Aimar's avatar
Laurent Aimar committed
744

745 746 747 748
} MP4_Box_data_elst_t;

typedef struct MP4_Box_data_cprt_s
{
749 750
    uint8_t  i_version;
    uint32_t i_flags;
751 752
    /* 1 pad bit */
    unsigned char i_language[3];
Laurent Aimar's avatar
Laurent Aimar committed
753

754
    char *psz_notice;
755 756 757 758 759 760
} MP4_Box_data_cprt_t;


/* DecoderConfigDescriptor */
typedef struct MP4_descriptor_decoder_config_s
{
761 762 763 764 765 766
    uint8_t i_objectTypeIndication;
    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
767

768 769
    int     i_decoder_specific_info_len;
    uint8_t *p_decoder_specific_info;
770
    /* some other stuff */
Laurent Aimar's avatar
Laurent Aimar committed
771

772 773 774 775
} MP4_descriptor_decoder_config_t;

typedef struct MP4_descriptor_SL_config_s
{
776 777

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

779 780 781 782 783
} MP4_descriptor_SL_config_t;


typedef struct MP4_descriptor_ES_s
{
784 785 786 787 788
    uint16_t i_ES_ID;
    int      b_stream_dependence;
    int      b_url;
    int      b_OCRstream;
    int      i_stream_priority;
789

790
    int      i_depend_on_ES_ID; /* if b_stream_dependence set */
791 792 793

    unsigned char *psz_URL;

794
    uint16_t i_OCR_ES_ID;       /* if b_OCRstream */
795
    MP4_descriptor_decoder_config_t *p_decConfigDescr;
Laurent Aimar's avatar
Laurent Aimar committed
796

797 798 799 800 801 802 803 804 805
    MP4_descriptor_SL_config_t *p_slConfigDescr;

    /* some other stuff ... */

} MP4_descriptor_ES_t;

/* ES descriptor */
typedef struct MP4_Box_data_esds_s
{
806 807
    uint8_t  i_version;
    uint32_t i_flags;
Laurent Aimar's avatar
Laurent Aimar committed
808

809
    MP4_descriptor_ES_t es_descriptor;
Laurent Aimar's avatar
Laurent Aimar committed
810

811 812 813 814 815
} MP4_Box_data_esds_t;


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

818 819 820 821
} MP4_Box_data_dcom_t;

typedef struct MP4_Box_data_cmvd_s
{
822 823
    uint32_t i_uncompressed_size;
    uint32_t i_compressed_size;
824

825 826
    int     b_compressed; /* Set to 1 if compressed data, 0 if uncompressed */
    uint8_t *p_data;
827 828 829 830 831 832

} MP4_Box_data_cmvd_t;

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

834 835
} MP4_Box_data_cmov_t;

Iain Wade's avatar
Iain Wade committed
836 837 838 839 840 841 842 843 844 845 846 847
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;

848
typedef struct
849 850 851 852 853 854 855 856 857
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_ref_type;
    char     *psz_ref;

} MP4_Box_data_rdrf_t;

858
typedef struct
859 860 861 862 863 864 865 866
{
    uint8_t  i_version;
    uint32_t i_flags;

    uint32_t i_rate;

} MP4_Box_data_rmdr_t;

867
typedef struct
868 869 870 871 872 873 874 875 876 877 878 879
{
    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;

880
typedef struct
881 882 883 884 885 886 887
{
    uint8_t  i_version;
    uint32_t i_flags;


} MP4_Box_data_rmcd_t;

888
typedef struct
889 890 891 892 893
{
    uint32_t i_quality;

} MP4_Box_data_rmqu_t;

894 895
typedef struct MP4_Box_data_mfhd_s
{
F. Yhuel's avatar
F. Yhuel committed
896 897
    uint8_t  i_version;
    uint32_t i_flags;
898

F. Yhuel's avatar
F. Yhuel committed
899
    uint32_t i_sequence_number;
900 901 902

} MP4_Box_data_mfhd_t;

903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928
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;

929 930 931 932 933
#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
934
#define MP4_TFHD_DURATION_IS_EMPTY    (1LL<<16)
935
#define MP4_TFHD_DEFAULT_BASE_IS_MOOF (1LL<<17)
936 937 938
typedef struct MP4_Box_data_tfhd_s
{
    uint8_t  i_version;
Frédéric Yhuel's avatar
Frédéric Yhuel committed
939
    bool     b_empty;
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962
    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;
963
    uint32_t i_composition_time_offset; /* version == 0 ? signed : unsigned */
964 965 966 967 968 969 970 971 972
} 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 */
973
    int32_t i_data_offset;
974 975 976 977 978 979 980
    uint32_t i_first_sample_flags;

    MP4_descriptor_trun_sample_t *p_samples;

} MP4_Box_data_trun_t;


981 982 983 984 985 986
typedef struct
{
    char *psz_text;

} MP4_Box_data_0xa9xxx_t;

987 988 989 990 991 992
typedef struct
{
    char *psz_text;

} MP4_Box_data_name_t;

993 994 995 996 997 998 999
typedef struct
{
    uint32_t i_entry_count;
    uint32_t *i_track_ID;

} MP4_Box_data_tref_generic_t;

1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
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;

1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
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;

1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
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;

1049 1050 1051 1052 1053 1054 1055 1056 1057
typedef struct
{
    uint8_t i_profile_level;

    int i_vc1;
    uint8_t *p_vc1;

} MP4_Box_data_dvc1_t;

1058 1059 1060 1061 1062 1063
typedef struct
{
    uint16_t i_little_endian;

} MP4_Box_data_enda_t;

1064 1065 1066 1067 1068 1069
typedef struct
{
    uint16_t i_genre;

} MP4_Box_data_gnre_t;

1070 1071 1072 1073 1074 1075 1076
typedef struct
{
    uint32_t i_track_number;
    uint32_t i_track_total;

} MP4_Box_data_trkn_t;

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090
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;

1091 1092 1093 1094 1095 1096
typedef struct
{
    uint32_t i_horizontal_spacing;
    uint32_t i_vertical_spacing;
} MP4_Box_data_pasp_t;

1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
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;

1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151
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;

1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167
typedef struct
{
    uint64_t i_duration;
    uint32_t i_timescale;
    uint16_t i_track_ID;
    uint8_t  i_es_cat;

    uint32_t FourCC;
    uint32_t Bitrate;
    uint32_t MaxWidth;
    uint32_t MaxHeight;
    uint32_t SamplingRate;
    uint32_t Channels;
    uint32_t BitsPerSample;
    uint32_t AudioTag;
    uint16_t nBlockAlign;
1168 1169
    uint8_t  cpd_len;
    uint8_t  *CodecPrivateData;
1170 1171
} MP4_Box_data_stra_t;

Denis Charmet's avatar
Denis Charmet committed
1172 1173 1174 1175 1176 1177
typedef struct
{
    uint32_t i_hvcC;
    uint8_t *p_hvcC;
} MP4_Box_data_hvcC_t;

1178 1179 1180 1181 1182 1183
typedef struct
{
    uint8_t *p_blob;
    uint32_t i_blob;
} MP4_Box_data_data_t;

1184
/*
1185
typedef struct MP4_Box_data__s
1186
{
1187 1188
    uint8_t  i_version;
    uint32_t i_flags;
1189 1190 1191 1192 1193 1194 1195 1196 1197

} MP4_Box_data__t;

*/

typedef union MP4_Box_data_s
{
    MP4_Box_data_ftyp_t *p_ftyp;
    MP4_Box_data_mvhd_t *p_mvhd;
1198
    MP4_Box_data_mfhd_t *p_mfhd;
1199
    MP4_Box_data_sidx_t *p_sidx;
1200 1201
    MP4_Box_data_tfhd_t *p_tfhd;
    MP4_Box_data_trun_t *p_trun;
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
    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;
    MP4_Box_data_dref_t *p_dref;
    MP4_Box_data_stts_t *p_stts;
    MP4_Box_data_ctts_t *p_ctts;
    MP4_Box_data_stsd_t *p_stsd;
1214 1215 1216 1217 1218 1219 1220 1221
    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;
    MP4_Box_data_sample_hint_t *p_sample_hint;

    MP4_Box_data_esds_t *p_esds;
    MP4_Box_data_avcC_t *p_avcC;
    MP4_Box_data_dac3_t *p_dac3;
1222
    MP4_Box_data_dvc1_t *p_dvc1;
1223 1224 1225
    MP4_Box_data_enda_t *p_enda;
    MP4_Box_data_gnre_t *p_gnre;
    MP4_Box_data_trkn_t *p_trkn;
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
1226
    MP4_Box_data_iods_t *p_iods;
1227
    MP4_Box_data_pasp_t *p_pasp;
1228 1229 1230
    MP4_Box_data_trex_t *p_trex;
    MP4_Box_data_mehd_t *p_mehd;
    MP4_Box_data_sdtp_t *p_sdtp;
1231

1232 1233
    MP4_Box_data_tfra_t *p_tfra;
    MP4_Box_data_mfro_t *p_mfro;
1234
    MP4_Box_data_stra_t *p_stra;
1235

1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
    MP4_Box_data_stsz_t *p_stsz;
    MP4_Box_data_stz2_t *p_stz2;
    MP4_Box_data_stsc_t *p_stsc;
    MP4_Box_data_co64_t *p_co64;
    MP4_Box_data_stss_t *p_stss;
    MP4_Box_data_stsh_t *p_stsh;
    MP4_Box_data_stdp_t *p_stdp;
    MP4_Box_data_padb_t *p_padb;
    MP4_Box_data_elst_t *p_elst;
    MP4_Box_data_cprt_t *p_cprt;

    MP4_Box_data_dcom_t *p_dcom;
    MP4_Box_data_cmvd_t *p_cmvd;
    MP4_Box_data_cmov_t *p_cmov;

    MP4_Box_data_moviehintinformation_rtp_t p_moviehintinformation_rtp;
1252

Iain Wade's avatar
Iain Wade committed
1253 1254 1255
    MP4_Box_data_frma_t *p_frma;
    MP4_Box_data_skcr_t *p_skcr;

1256 1257 1258 1259 1260
    MP4_Box_data_rdrf_t *p_rdrf;
    MP4_Box_data_rmdr_t *p_rmdr;
    MP4_Box_data_rmqu_t *p_rmqu;
    MP4_Box_data_rmvc_t *p_rmvc;

1261
    MP4_Box_data_0xa9xxx_t *p_0xa9xxx;
1262
    MP4_Box_data_chpl_t *p_chpl;
1263
    MP4_Box_data_tref_generic_t *p_tref_generic;
1264
    MP4_Box_data_name_t *p_name;
1265

1266 1267
    MP4_Box_data_tfrf_t *p_tfrf;
    MP4_Box_data_tfxd_t *p_tfxd;
Denis Charmet's avatar
Denis Charmet committed
1268
    MP4_Box_data_hvcC_t *p_hvcC;
1269

1270 1271
    MP4_Box_data_data_t *p_data;

1272
    void                *p_payload; /* for unknow type */
1273 1274 1275 1276 1277 1278 1279
} MP4_Box_data_t;



/* the most basic structure */
typedef struct MP4_Box_s
{
1280
    off_t        i_pos;      /* absolute position */
Laurent Aimar's avatar
Laurent Aimar committed
1281

1282 1283
    uint32_t     i_type;
    uint32_t     i_shortsize;