hint: Add Support of RTP Reception Hint Track.
[L-SMASH.git] / core / box.h
blobea96662cf860a8b525fcce830942127d9d13304f
1 /*****************************************************************************
2 * box.h
3 *****************************************************************************
4 * Copyright (C) 2010-2017 L-SMASH project
6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *****************************************************************************/
21 /* This file is available under an ISC license. */
23 #ifndef LSMASH_BOX_H
24 #define LSMASH_BOX_H
26 /* For generating creation_time and modification_time.
27 * According to ISO/IEC-14496-5-2001, the difference between Unix time and Mac OS time is 2082758400.
28 * However this is wrong and 2082844800 is correct. */
29 #include <time.h>
30 #define ISOM_MAC_EPOCH_OFFSET 2082844800
32 #include "box_type.h"
34 /* aliases internally used only for convenience */
35 typedef struct lsmash_file_tag isom_file_abstract_t;
36 typedef struct lsmash_root_tag isom_root_abstract_t;
37 typedef struct isom_unknown_box_tag isom_unknown_t;
38 typedef struct lsmash_box_tag isom_dummy_t; /* for dummy usage */
40 typedef struct lsmash_box_tag isom_box_t;
41 typedef struct isom_unknown_box_tag isom_unknown_box_t;
42 typedef struct isom_mdhd_tag isom_mdhd_t;
43 typedef struct isom_stbl_tag isom_stbl_t;
45 typedef void (*isom_extension_destructor_t)( void *extension_data );
46 typedef int (*isom_extension_writer_t)( lsmash_bs_t *bs, isom_box_t *box );
48 typedef int (*isom_bitrate_updater_t)( isom_stbl_t *stbl, isom_mdhd_t *mdhd, uint32_t sample_description_index );
50 /* If size is 1, then largesize is actual size.
51 * If size is 0, then this box is the last one in the file. */
52 #define ISOM_BASEBOX_COMMON \
53 const lsmash_class_t *class; \
54 lsmash_root_t *root; /* pointer to root */ \
55 lsmash_file_t *file; /* pointer to file */ \
56 isom_box_t *parent; /* pointer to the parent box of this box */ \
57 void *nonexist_ptr; /* pointer to non-existing box constant */ \
58 uint8_t *binary; /* used only when LSMASH_BINARY_CODED_BOX */ \
59 isom_extension_destructor_t destruct; /* box specific destructor */ \
60 isom_extension_writer_t write; /* box specific writer */ \
61 size_t offset_in_parent; /* offset of this box in parent box struct */ \
62 uint32_t manager; /* flags for L-SMASH */ \
63 uint64_t precedence; /* precedence of the box position */ \
64 uint64_t pos; /* starting position of this box in the file */ \
65 lsmash_entry_list_t extensions; /* extension boxes */ \
66 uint64_t size; /* the number of bytes in this box */ \
67 lsmash_box_type_t type
69 #define ISOM_FULLBOX_COMMON \
70 ISOM_BASEBOX_COMMON; \
71 uint8_t version; /* Basically, version is either 0 or 1 */ \
72 uint32_t flags /* In the actual structure of box, flags is 24 bits. */
74 #define ISOM_BASEBOX_COMMON_SIZE 8
75 #define ISOM_FULLBOX_COMMON_SIZE 12
76 #define ISOM_LIST_FULLBOX_COMMON_SIZE 16
78 /* flags for L-SMASH */
79 #define LSMASH_UNKNOWN_BOX 0x001
80 #define LSMASH_ABSENT_IN_FILE 0x002
81 #define LSMASH_QTFF_BASE 0x004
82 #define LSMASH_VIDEO_DESCRIPTION 0x008
83 #define LSMASH_AUDIO_DESCRIPTION 0x010
84 #define LSMASH_FULLBOX 0x020
85 #define LSMASH_LAST_BOX 0x040
86 #define LSMASH_INCOMPLETE_BOX 0x080
87 #define LSMASH_BINARY_CODED_BOX 0x100
88 #define LSMASH_PLACEHOLDER 0x200
89 #define LSMASH_WRITTEN_BOX 0x400
90 #define LSMASH_NON_EXISTING_BOX 0x800 /* This flag indicates a read only non-existing box constant.
91 * Don't use for wild boxes other than non-existing box constants
92 * because this flags prevents attempting to freeing its box. */
94 /* Use these macros for checking existences of boxes.
95 * If the result of LSMASH_IS_EXISTING_BOX is 0, the evaluated box is read only.
96 * If the result of LSMASH_IS_NON_EXISTING_BOX is 1, the evaluated box is read only. */
97 #define LSMASH_IS_EXISTING_BOX( box_ptr ) \
98 ((box_ptr) && !((box_ptr)->manager & LSMASH_NON_EXISTING_BOX))
99 #define LSMASH_IS_NON_EXISTING_BOX( box_ptr ) \
100 (!(box_ptr) || ((box_ptr)->manager & LSMASH_NON_EXISTING_BOX))
102 #define LSMASH_IS_BOX_ADDITION_SUCCESS( box_ptr ) \
103 (!((box_ptr)->manager & LSMASH_NON_EXISTING_BOX))
104 #define LSMASH_IS_BOX_ADDITION_FAILURE( box_ptr ) \
105 (!!((box_ptr)->manager & LSMASH_NON_EXISTING_BOX))
107 /* Use this macro for disabling a predefined child box in struct.
108 * Predefined childs must not be NULL for safety. */
109 #define LSMASH_MAKE_BOX_NON_EXISTING( box_ptr ) \
110 (box_ptr) = (void *)(box_ptr)->nonexist_ptr
112 /* 12-byte ISO reserved value:
113 * 0xXXXXXXXX-0011-0010-8000-00AA00389B71 */
114 static const uint8_t static_lsmash_iso_12_bytes[12]
115 = { 0x00, 0x11, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 };
116 #define LSMASH_ISO_12_BYTES static_lsmash_iso_12_bytes
118 /* L-SMASH original 12-byte QuickTime file format value for CODEC discrimination mainly:
119 * 0xXXXXXXXX-0F11-4DA5-BF4E-F2C48C6AA11E */
120 static const uint8_t static_lsmash_qtff_12_bytes[12]
121 = { 0x0F, 0x11, 0x4D, 0xA5, 0xBF, 0x4E, 0xF2, 0xC4, 0x8C, 0x6A, 0xA1, 0x1E };
122 #define LSMASH_QTFF_12_BYTES static_lsmash_qtff_12_bytes
124 struct lsmash_box_tag
126 ISOM_FULLBOX_COMMON;
129 /* Unknown Box
130 * This structure is for boxes we don't know or define yet.
131 * This box must be always appended as an extension box. */
132 struct isom_unknown_box_tag
134 ISOM_BASEBOX_COMMON;
135 uint32_t unknown_size;
136 uint8_t *unknown_field;
139 /* File Type Box
140 * This box identifies the specifications to which this file complies.
141 * This box shall occur before any variable-length box.
142 * In the absence of this box, the file is QuickTime file format or MP4 version 1 file format.
143 * In MP4 version 1 file format, Object Descriptor Box is mandatory.
144 * In QuickTime file format, Object Descriptor Box isn't defined.
145 * Therefore, if this box and an Object Descriptor Box are absent in the file, the file shall be QuickTime file format. */
146 typedef struct
148 ISOM_BASEBOX_COMMON;
149 uint32_t major_brand; /* brand identifier */
150 uint32_t minor_version; /* the minor version of the major brand */
151 uint32_t *compatible_brands; /* a list, to the end of the box, of brands */
153 uint32_t brand_count; /* the number of factors in compatible_brands array */
154 } isom_ftyp_t;
156 /* Color Table Box
157 * This box defines a list of preferred colors for displaying the movie on devices that support only 256 colors.
158 * The list may contain up to 256 colors. This box contains a Macintosh color table data structure.
159 * This box is defined in QuickTime File Format Specification.
160 * The color table structure is also defined in struct ColorTable defined in Quickdraw.h. */
161 typedef struct
163 /* An array of colors.
164 * Each color is made of four unsigned 16-bit integers. */
165 uint16_t value; /* index or other value
166 * Must be set to 0. */
167 /* true color */
168 uint16_t r; /* magnitude of red component */
169 uint16_t g; /* magnitude of green component */
170 uint16_t b; /* magnitude of blue component */
171 } isom_qt_color_array_t;
173 typedef struct
175 uint32_t seed; /* unique identifier for table
176 * Must be set to 0. */
177 uint16_t flags; /* high bit: 0 = PixMap; 1 = device
178 * Must be set to 0x8000. */
179 uint16_t size; /* the number of colors in the following color array
180 * This is a zero-relative value;
181 * setting this field to 0 means that there is one color in the array. */
182 isom_qt_color_array_t *array;
183 } isom_qt_color_table_t;
185 typedef struct
187 ISOM_BASEBOX_COMMON;
188 isom_qt_color_table_t color_table;
189 } isom_ctab_t;
191 /* Track Header Box
192 * This box specifies the characteristics of a single track. */
193 typedef struct
195 /* version is either 0 or 1
196 * flags
197 * 0x000001: Indicates that the track is enabled.
198 * A disabled track is treated as if it were not present.
199 * 0x000002: Indicates that the track is used in the presentation.
200 * 0x000004: Indicates that the track is used when previewing the presentation.
201 * 0x000008: Indicates that the track is used in the movie's poster. (only defined in QuickTime file format)
202 * ISOM: If in a presentation all tracks have neither track_in_movie nor track_in_preview set,
203 * then all tracks shall be treated as if both flags were set on all tracks. */
204 ISOM_FULLBOX_COMMON;
205 /* version == 0: uint64_t -> uint32_t */
206 uint64_t creation_time; /* the creation time of this track (in seconds since midnight, Jan. 1, 1904, in UTC time) */
207 uint64_t modification_time; /* the most recent time the track was modified (in seconds since midnight, Jan. 1, 1904, in UTC time) */
208 uint32_t track_ID; /* an integer that uniquely identifies the track
209 * Track IDs are never re-used and cannot be zero. */
210 uint32_t reserved1;
211 uint64_t duration; /* the duration of this track expressed in the movie timescale units */
212 /* The following fields are treated as
213 * ISOM: template fields.
214 * MP41: reserved fields.
215 * MP42: ignored fileds since compositions are done using BIFS system.
216 * 3GPP: ignored fields except for alternate_group.
217 * QTFF: usable fields. */
218 uint32_t reserved2[2];
219 int16_t layer; /* the front-to-back ordering of video tracks; tracks with lower numbers are closer to the viewer. */
220 int16_t alternate_group; /* an integer that specifies a group or collection of tracks
221 * If this field is not 0, it should be the same for tracks that contain alternate data for one another
222 * and different for tracks belonging to different such groups.
223 * Only one track within an alternate group should be played or streamed at any one time. */
224 int16_t volume; /* fixed point 8.8 number. 0x0100 is full volume. */
225 uint16_t reserved3;
226 int32_t matrix[9]; /* transformation matrix for the video */
227 /* track's visual presentation size
228 * All images in the sequence are scaled to this size, before any overall transformation of the track represented by the matrix.
229 * Note: these fields are treated as reserved in MP4 version 1. */
230 uint32_t width; /* fixed point 16.16 number */
231 uint32_t height; /* fixed point 16.16 number */
232 /* */
233 } isom_tkhd_t;
235 /* Track Clean Aperture Dimensions Box
236 * A presentation mode where clap and pasp are reflected. */
237 typedef struct
239 ISOM_FULLBOX_COMMON;
240 uint32_t width; /* fixed point 16.16 number */
241 uint32_t height; /* fixed point 16.16 number */
242 } isom_clef_t;
244 /* Track Production Aperture Dimensions Box
245 * A presentation mode where pasp is reflected. */
246 typedef struct
248 ISOM_FULLBOX_COMMON;
249 uint32_t width; /* fixed point 16.16 number */
250 uint32_t height; /* fixed point 16.16 number */
251 } isom_prof_t;
253 /* Track Encoded Pixels Dimensions Box
254 * A presentation mode where clap and pasp are not reflected. */
255 typedef struct
257 ISOM_FULLBOX_COMMON;
258 uint32_t width; /* fixed point 16.16 number */
259 uint32_t height; /* fixed point 16.16 number */
260 } isom_enof_t;
262 /* Track Aperture Mode Dimensions Box */
263 typedef struct
265 ISOM_BASEBOX_COMMON;
266 isom_clef_t *clef; /* Track Clean Aperture Dimensions Box */
267 isom_prof_t *prof; /* Track Production Aperture Dimensions Box */
268 isom_enof_t *enof; /* Track Encoded Pixels Dimensions Box */
269 } isom_tapt_t;
271 /* Edit List Box
272 * This box contains an explicit timeline map.
273 * Each entry defines part of the track timeline: by mapping part of the media timeline, or by indicating 'empty' time,
274 * or by defining a 'dwell', where a single time-point in the media is held for a period.
275 * The last edit in a track shall never be an empty edit.
276 * Any difference between the duration in the Movie Header Box, and the track's duration is expressed as an implicit empty edit at the end.
277 * It is recommended that any edits, explicit or implied, not select any portion of the composition timeline that doesn't map to a sample.
278 * Therefore, if the first sample in the track has non-zero CTS, then this track should have at least one edit and the start time in it should
279 * correspond to the value of the CTS the first sample has or more not to exceed the largest CTS in this track. */
280 typedef struct
282 /* This entry is called Timeline Mapping Edit (TME) entry in UltraViolet Common File Format.
283 * version == 0: 64bits -> 32bits */
284 uint64_t segment_duration; /* the duration of this edit expressed in the movie timescale units */
285 int64_t media_time; /* the starting composition time within the media of this edit segment
286 * If this field is set to -1, it is an empty edit. */
287 int32_t media_rate; /* the relative rate at which to play the media corresponding to this edit segment
288 * If this value is 0, then the edit is specifying a 'dwell':
289 * the media at media_time is presented for the segment_duration.
290 * This field is expressed as 16.16 fixed-point number. */
291 } isom_elst_entry_t;
293 typedef struct
295 ISOM_FULLBOX_COMMON; /* version is either 0 or 1 */
296 lsmash_entry_list_t *list;
297 } isom_elst_t;
299 /* Edit Box
300 * This optional box maps the presentation time-line to the media time-line as it is stored in the file.
301 * In the absence of this box, there is an implicit one-to-one mapping of these time-lines,
302 * and the presentation of a track starts at the beginning of the presentation. */
303 typedef struct
305 ISOM_BASEBOX_COMMON;
306 isom_elst_t *elst; /* Edit List Box */
307 } isom_edts_t;
309 /* Track Reference Box
310 * The Track Reference Box contains Track Reference Type Boxes.
311 * Track Reference Type Boxes define relationships between tracks.
312 * They allow one track to specify how it is related to other tracks. */
313 typedef struct
315 ISOM_BASEBOX_COMMON;
316 uint32_t *track_ID; /* track_IDs of reference tracks / Zero value must not be used */
318 uint32_t ref_count; /* number of reference tracks */
319 } isom_tref_type_t;
321 typedef struct
323 ISOM_BASEBOX_COMMON;
324 lsmash_entry_list_t ref_list; /* Track Reference Type Boxes */
325 } isom_tref_t;
327 /* Media Header Box
328 * This box declares overall information that is media-independent, and relevant to characteristics of the media in a track.*/
329 struct isom_mdhd_tag
331 ISOM_FULLBOX_COMMON; /* version is either 0 or 1 */
332 /* version == 0: uint64_t -> uint32_t */
333 uint64_t creation_time; /* the creation time of the media in this track (in seconds since midnight, Jan. 1, 1904, in UTC time) */
334 uint64_t modification_time; /* the most recent time the media in this track was modified (in seconds since midnight, Jan. 1, 1904, in UTC time) */
335 uint32_t timescale; /* media timescale: timescale for this media */
336 uint64_t duration; /* the duration of this media expressed in the timescale indicated in this box */
337 /* */
338 uint16_t language; /* ISOM: ISO-639-2/T language codes. Most significant 1-bit is 0.
339 * Each character is packed as the difference between its ASCII value and 0x60.
340 * QTFF: Macintosh language codes is usually used.
341 * Mac's value is less than 0x800 while ISO's value is 0x800 or greater. */
342 int16_t quality; /* ISOM: pre_defined / QTFF: the media's playback quality */
345 /* Handler Reference Box
346 * In Media Box, this box is mandatory and (ISOM: should/QTFF: must) come before Media Information Box.
347 * ISOM: this box might be also in Meta Box.
348 * QTFF: this box might be also in Media Information Box. If this box is present there, it must come before Data Information Box. */
349 typedef struct
351 ISOM_FULLBOX_COMMON;
352 uint32_t componentType; /* ISOM: pre_difined = 0
353 * QTFF: 'mhlr' for Media Handler Reference Box and 'dhlr' for Data Handler Reference Box */
354 uint32_t componentSubtype; /* Both ISOM and QT: when present in Media Handler Reference Box, this field defines the type of media data.
355 * ISOM: when present in Metadata Handler Reference Box, this field defines the format of the meta box contents.
356 * QTFF: when present in Data Handler Reference Box, this field defines the data reference type. */
357 /* The following fields are defined in QTFF however these fields aren't mentioned in QuickTime SDK and are reserved in the specification.
358 * In ISOM, these fields are still defined as reserved. */
359 uint32_t componentManufacturer; /* vendor indentification / A value of 0 matches any manufacturer. */
360 uint32_t componentFlags; /* flags describing required component capabilities
361 * The high-order 8 bits should be set to 0.
362 * The low-order 24 bits are specific to each component type. */
363 uint32_t componentFlagsMask; /* This field indicates which flags in the componentFlags field are relevant to this operation. */
364 /* */
365 uint8_t *componentName; /* ISOM: a null-terminated string in UTF-8 characters
366 * QTFF: Pascal string */
368 uint32_t componentName_length;
369 } isom_hdlr_t;
372 /** Media Information Header Boxes
373 ** There is a different media information header for each track type
374 ** (corresponding to the media handler-type); the matching header shall be present. **/
375 /* Video Media Header Box
376 * This box contains general presentation information, independent of the coding, for video media. */
377 typedef struct
379 ISOM_FULLBOX_COMMON; /* flags is 1 */
380 uint16_t graphicsmode; /* template: graphicsmode = 0 */
381 uint16_t opcolor[3]; /* template: opcolor = { 0, 0, 0 } */
382 } isom_vmhd_t;
384 /* Sound Media Header Box
385 * This box contains general presentation information, independent of the coding, for audio media. */
386 typedef struct
388 ISOM_FULLBOX_COMMON;
389 int16_t balance; /* a fixed-point 8.8 number that places mono audio tracks in a stereo space. template: balance = 0 */
390 uint16_t reserved;
391 } isom_smhd_t;
393 /* Hint Media Header Box
394 * This box contains general information, independent of the protocol, for hint tracks. (A PDU is a Protocol Data Unit.) */
395 typedef struct
397 ISOM_FULLBOX_COMMON;
398 uint16_t maxPDUsize; /* the size in bytes of the largest PDU in this (hint) stream */
399 uint16_t avgPDUsize; /* the average size of a PDU over the entire presentation */
400 uint32_t maxbitrate; /* the maximum rate in bits/second over any window of one second */
401 uint32_t avgbitrate; /* the average rate in bits/second over the entire presentation */
402 uint32_t reserved;
403 /* run time variables for calculating avgPDUsize, should not be written to file */
404 uint64_t combinedPDUsize;
405 uint64_t PDUcount;
406 } isom_hmhd_t;
408 /* Null Media Header Box
409 * This box may be used for streams other than visual and audio (e.g., timed metadata streams). */
410 typedef struct
412 /* Streams other than visual and audio may use a Null Media Header Box */
413 ISOM_FULLBOX_COMMON; /* flags is currently all zero */
414 } isom_nmhd_t;
416 /* Generic Media Information Box */
417 typedef struct
419 ISOM_FULLBOX_COMMON;
420 uint16_t graphicsmode;
421 uint16_t opcolor[3];
422 int16_t balance; /* This field is nomally set to 0. */
423 uint16_t reserved; /* Reserved for use by Apple. Set this field to 0. */
424 } isom_gmin_t;
426 /* Text Media Information Box */
427 typedef struct
429 ISOM_BASEBOX_COMMON;
430 int32_t matrix[9]; /* Unkown fields. Default values are probably:
431 * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */
432 } isom_text_t;
434 /* Generic Media Information Header Box */
435 typedef struct
437 ISOM_BASEBOX_COMMON;
438 isom_gmin_t *gmin; /* Generic Media Information Box */
439 isom_text_t *text; /* Text Media Information Box */
440 } isom_gmhd_t;
441 /** **/
443 /* Data Reference Box
444 * name and location fields are expressed in null-terminated string using UTF-8 characters. */
445 typedef struct
447 /* This box is DataEntryUrlBox or DataEntryUrnBox */
448 ISOM_FULLBOX_COMMON; /* flags == 0x000001 means that the media data is in the same file
449 * as the Movie Box containing this data reference. */
450 char *name; /* only for DataEntryUrnBox */
451 char *location; /* a location to find the resource with the given name */
453 uint32_t name_length;
454 uint32_t location_length;
455 lsmash_file_t *ref_file; /* pointer to the handle of the referenced file */
456 } isom_dref_entry_t;
458 typedef struct
460 ISOM_FULLBOX_COMMON;
461 lsmash_entry_list_t list;
462 } isom_dref_t;
464 /* Data Information Box */
465 typedef struct
467 /* This box is in Media Information Box or Meta Box */
468 ISOM_BASEBOX_COMMON;
469 isom_dref_t *dref; /* Data Reference Box */
470 } isom_dinf_t;
472 /** Sample Description **/
473 /* ES Descriptor Box */
474 struct mp4sys_ES_Descriptor_t; /* FIXME: I think these structs using mp4sys should be placed in isom.c */
475 typedef struct
477 ISOM_FULLBOX_COMMON;
478 struct mp4sys_ES_Descriptor_t *ES;
479 } isom_esds_t;
481 /* MPEG-4 Bit Rate Box
482 * This box signals the bit rate information of the AVC video stream. */
483 typedef struct
485 ISOM_BASEBOX_COMMON;
486 uint32_t bufferSizeDB; /* the size of the decoding buffer for the elementary stream in bytes */
487 uint32_t maxBitrate; /* the maximum rate in bits/second over any window of one second */
488 uint32_t avgBitrate; /* the average rate in bits/second over the entire presentation */
489 } isom_btrt_t;
491 typedef struct
493 /* This box is in RTP and RTP reception hint track sample descriptions */
494 ISOM_BASEBOX_COMMON;
495 uint32_t timescale;
496 } isom_tims_t;
498 typedef struct
500 /* This box is in RTP and RTP reception hint track sample descriptions */
501 ISOM_BASEBOX_COMMON;
502 int32_t offset;
503 } isom_tsro_t;
505 typedef struct
507 /* This box is in RTP reception hint track sample description */
508 ISOM_BASEBOX_COMMON;
509 unsigned int reserved : 6;
510 unsigned int timestamp_sync : 2;
511 } isom_tssy_t;
514 /* Global Header Box */
515 typedef struct
517 ISOM_BASEBOX_COMMON;
518 uint32_t header_size;
519 uint8_t *header_data;
520 } isom_glbl_t;
522 /* Clean Aperture Box
523 * There are notionally four values in this box and these parameters are represented as a fraction N/D.
524 * Here, we refer to the pair of parameters fooN and fooD as foo.
525 * Considering the pixel dimensions as defined by the VisualSampleEntry width and height.
526 * If picture centre of the image is at pcX and pcY, then horizOff and vertOff are defined as follows:
527 * pcX = horizOff + (width - 1)/2;
528 * pcY = vertOff + (height - 1)/2;
529 * The leftmost/rightmost pixel and the topmost/bottommost line of the clean aperture fall at:
530 * pcX +/- (cleanApertureWidth - 1)/2;
531 * pcY +/- (cleanApertureHeight - 1)/2;
532 * QTFF: this box is a mandatory extension for all uncompressed Y'CbCr data formats. */
533 typedef struct
535 ISOM_BASEBOX_COMMON;
536 uint32_t cleanApertureWidthN;
537 uint32_t cleanApertureWidthD;
538 uint32_t cleanApertureHeightN;
539 uint32_t cleanApertureHeightD;
540 int32_t horizOffN;
541 uint32_t horizOffD;
542 int32_t vertOffN;
543 uint32_t vertOffD;
544 } isom_clap_t;
546 /* Pixel Aspect Ratio Box
547 * This box specifies the aspect ratio of a pixel, in arbitrary units.
548 * If a pixel appears H wide and V tall, then hSpacing/vSpacing is equal to H/V.
549 * When adjusting pixel aspect ratio, normally, the horizontal dimension of the video is scaled, if needed. */
550 typedef struct
552 ISOM_BASEBOX_COMMON;
553 uint32_t hSpacing; /* horizontal spacing */
554 uint32_t vSpacing; /* vertical spacing */
555 } isom_pasp_t;
557 /* ISOM: Colour Information Box / QTFF: Color Parameter Box
558 * This box is used to map the numerical values of pixels in the file to a common representation of color
559 * in which images can be correctly compared, combined, and displayed.
560 * If colour information is supplied in both this box, and also in the video bitstream,
561 * this box takes precedence, and over-rides the information in the bitstream.
562 * For QuickTime file format:
563 * This box ('colr') supersedes the Gamma Level Box ('gama').
564 * Writers of QTFF should never write both into an Image Description, and readers of QTFF should ignore 'gama' if 'colr' is present.
565 * Note: this box is a mandatory extension for all uncompressed Y'CbCr data formats.
566 * For ISO Base Media file format:
567 * Colour information may be supplied in one or more Colour Information Boxes placed in a VisualSampleEntry.
568 * These should be placed in order in the sample entry starting with the most accurate (and potentially the most difficult to process), in progression to the least.
569 * These are advisory and concern rendering and colour conversion, and there is no normative behaviour associated with them; a reader may choose to use the most suitable. */
570 typedef struct
572 ISOM_BASEBOX_COMMON;
573 uint32_t color_parameter_type; /* QTFF: 'nclc' or 'prof'
574 * ISOM: 'nclx', 'rICC' or 'prof' */
575 /* for 'nclc' and 'nclx' */
576 uint16_t primaries_index; /* CIE 1931 xy chromaticity coordinates */
577 uint16_t transfer_function_index; /* nonlinear transfer function from RGB to ErEgEb */
578 uint16_t matrix_index; /* matrix from ErEgEb to EyEcbEcr */
579 /* for 'nclx' */
580 unsigned full_range_flag : 1;
581 unsigned reserved : 7;
582 } isom_colr_t;
584 /* Gamma Level Box
585 * This box is used to indicate that the decompressor corrects gamma level at display time.
586 * This box is defined in QuickTime File Format Specification and ImageCompression.h. */
587 typedef struct
589 ISOM_BASEBOX_COMMON;
590 uint32_t level; /* A fixed-point 16.16 number indicating the gamma level at which the image was captured.
591 * Zero value indicates platform's standard gamma. */
592 } isom_gama_t;
594 /* Field/Frame Information Box
595 * This box is used by applications to modify decompressed image data or by decompressor components to determine field display order.
596 * This box is defined in QuickTime File Format Specification, dispatch019 and ImageCodec.h.
597 * Note: this box is a mandatory extension for all uncompressed Y'CbCr data formats. */
598 typedef struct
600 ISOM_BASEBOX_COMMON;
601 uint8_t fields; /* the number of fields per frame
602 * 1: progressive scan
603 * 2: 2:1 interlaced */
604 uint8_t detail; /* field ordering */
605 } isom_fiel_t;
607 /* Colorspace Box
608 * This box is defined in ImageCompression.h. */
609 typedef struct
611 ISOM_BASEBOX_COMMON;
612 uint32_t pixel_format; /* the native pixel format of an image */
613 } isom_cspc_t;
615 /* Significant Bits Box
616 * This box is defined in Letters from the Ice Floe dispatch019.
617 * Note: this box is a mandatory extension for 'v216' (Uncompressed Y'CbCr, 10, 12, 14, or 16-bit-per-component 4:2:2). */
618 typedef struct
620 ISOM_BASEBOX_COMMON;
621 uint8_t significantBits; /* the number of significant bits per component */
622 } isom_sgbt_t;
624 /* Sample Scale Box
625 * If this box is present and can be interpreted by the decoder,
626 * all samples shall be displayed according to the scaling behaviour that is specified in this box.
627 * Otherwise, all samples are scaled to the size that is indicated by the width and height field in the Track Header Box.
628 * This box is defined in ISO Base Media file format. */
629 typedef struct
631 ISOM_FULLBOX_COMMON;
632 uint8_t constraint_flag; /* Upper 7-bits are reserved.
633 * If this flag is set, all samples described by this sample entry shall be scaled
634 * according to the method specified by the field 'scale_method'. */
635 uint8_t scale_method; /* The semantics of the values for scale_method are as specified for the 'fit' attribute of regions in SMIL 1.0. */
636 int16_t display_center_x;
637 int16_t display_center_y;
638 } isom_stsl_t;
640 /* Sample Entry */
641 #define ISOM_SAMPLE_ENTRY \
642 ISOM_BASEBOX_COMMON; \
643 uint8_t reserved[6]; \
644 uint16_t data_reference_index
646 typedef struct
648 ISOM_SAMPLE_ENTRY;
649 } isom_sample_entry_t;
651 /* Mpeg Sample Entry */
652 typedef struct
654 ISOM_SAMPLE_ENTRY;
655 } isom_mp4s_entry_t;
657 /* ISOM: Visual Sample Entry / QTFF: Image Description
658 * For maximum compatibility, the following extension boxes should follow, not precede,
659 * any extension boxes defined in or required by derived specifications.
660 * Clean Aperture Box
661 * Pixel Aspect Ratio Box */
662 typedef struct
664 ISOM_SAMPLE_ENTRY;
665 int16_t version; /* ISOM: pre_defined / QTFF: sample description version */
666 int16_t revision_level; /* ISOM: reserved / QTFF: version of the CODEC */
667 int32_t vendor; /* ISOM: pre_defined / QTFF: whose CODEC */
668 uint32_t temporalQuality; /* ISOM: pre_defined / QTFF: the temporal quality factor */
669 uint32_t spatialQuality; /* ISOM: pre_defined / QTFF: the spatial quality factor */
670 /* The width and height are the maximum pixel counts that the codec will deliver.
671 * Since these are counts they do not take into account pixel aspect ratio. */
672 uint16_t width;
673 uint16_t height;
674 /* */
675 uint32_t horizresolution; /* 16.16 fixed-point / template: horizresolution = 0x00480000 / 72 dpi */
676 uint32_t vertresolution; /* 16.16 fixed-point / template: vertresolution = 0x00480000 / 72 dpi */
677 uint32_t dataSize; /* ISOM: reserved / QTFF: if known, the size of data for this descriptor */
678 uint16_t frame_count; /* frame per sample / template: frame_count = 1 */
679 char compressorname[33]; /* a fixed 32-byte field, with the first byte set to the number of bytes to be displayed */
680 uint16_t depth; /* ISOM: template: depth = 0x0018
681 * AVC : 0x0018: colour with no alpha
682 * 0x0028: grayscale with no alpha
683 * 0x0020: gray or colour with alpha
684 * QTFF: depth of this data (1-32) or (33-40 grayscale) */
685 int16_t color_table_ID; /* ISOM: template: pre_defined = -1
686 * QTFF: color table ID
687 * If this field is set to -1, the default color table should be used for the specified depth
688 * If the color table ID is set to 0, a color table is contained within the sample description itself.
689 * The color table immediately follows the color table ID field. */
690 /* Color table follows color_table_ID only when color_table_ID is set to 0. */
691 isom_qt_color_table_t color_table; /* a list of preferred colors for displaying the movie on devices that support only 256 colors */
692 } isom_visual_entry_t;
694 /* Format Box
695 * This box shows the data format of the stored sound media.
696 * ISO base media file format also defines the same four-character-code for the type field,
697 * however, that is used to indicate original sample description of the media when a protected sample entry is used. */
698 typedef struct
700 ISOM_BASEBOX_COMMON;
701 uint32_t data_format; /* copy of sample description type */
702 } isom_frma_t;
704 /* Audio Endian Box */
705 typedef struct
707 ISOM_BASEBOX_COMMON;
708 int16_t littleEndian;
709 } isom_enda_t;
711 /* MPEG-4 Audio Box */
712 typedef struct
714 ISOM_BASEBOX_COMMON;
715 uint32_t unknown; /* always 0? */
716 } isom_mp4a_t;
718 /* Terminator Box
719 * This box is present to indicate the end of the sound description. It contains no data. */
720 typedef struct
722 ISOM_BASEBOX_COMMON; /* size = 8, type = 0x00000000 */
723 } isom_terminator_t;
725 /* Sound Information Decompression Parameters Box
726 * This box is defined in QuickTime file format.
727 * This box provides the ability to store data specific to a given audio decompressor in the sound description.
728 * The contents of this box are dependent on the audio decompressor. */
729 typedef struct
731 ISOM_BASEBOX_COMMON;
732 isom_frma_t *frma; /* Format Box */
733 isom_enda_t *enda; /* Audio Endian Box */
734 isom_mp4a_t *mp4a; /* MPEG-4 Audio Box */
735 isom_terminator_t *terminator; /* Terminator Box */
736 } isom_wave_t;
738 /* Audio Channel Layout Box
739 * This box is defined in QuickTime file format or Apple Lossless Audio inside ISO Base Media. */
740 typedef struct
742 uint32_t channelLabel; /* the channelLabel that describes the channel */
743 uint32_t channelFlags; /* flags that control the interpretation of coordinates */
744 uint32_t coordinates[3]; /* an ordered triple that specifies a precise speaker location / 32-bit floating point */
745 } isom_channel_description_t;
747 typedef struct
749 ISOM_FULLBOX_COMMON;
750 uint32_t channelLayoutTag; /* the channelLayoutTag indicates the layout */
751 uint32_t channelBitmap; /* If channelLayoutTag is set to 0x00010000, this field is the channel usage bitmap. */
752 uint32_t numberChannelDescriptions; /* the number of items in the Channel Descriptions array */
753 /* Channel Descriptions array */
754 isom_channel_description_t *channelDescriptions;
755 } isom_chan_t;
757 /* Sampling Rate Box
758 * This box may be present only in an AudioSampleEntryV1, and when present,
759 * it overrides the samplerate field and documents the actual sampling rate.
760 * When this box is present, the media timescale should be the same as the
761 * sampling rate, or an integer division or multiple of it. */
762 typedef struct
764 ISOM_FULLBOX_COMMON;
765 uint32_t sampling_rate; /* the actual sampling rate of the audio media, expressed as a 32-bit integer
766 * The value of this field overrides the samplerate field in the AudioSampleEntryV1
767 * and documents the actual sampling rate. */
768 } isom_srat_t;
770 /* ISOM: Audio Sample Entry / QTFF: Sound Description */
771 typedef struct
773 ISOM_SAMPLE_ENTRY;
774 int16_t version; /* ISOM: version = 0 is used to support non-high samplerate audio format.
775 * version = 1, called AudioSampleEntryV1, is used to support high samplerate audio format.
776 * An AudioSampleEntryV1 requires that the enclosing Sample Description Box also takes the version 1.
777 * For maximum compatibility, an AudioSampleEntryV1 should only be used when needed.
778 * QTFF: version = 0 supports only 'raw ' or 'twos' audio format.
779 * version = 1 is used to support out-of-band configuration settings for decompression.
780 * version = 2 is used to support high samplerate, or 3 or more multichannel audio format. */
781 int16_t revision_level; /* ISOM: reserved / QTFF: version of the CODEC */
782 int32_t vendor; /* ISOM: reserved / QTFF: whose CODEC */
783 uint16_t channelcount; /* ISOM: template: channelcount = 2
784 * channelcount is a value greater than zero that indicates the maximum number of channels that the
785 * audio could deliver.
786 * A channelcount of 1 indicates mono audio, and 2 indicates stereo (left/right).
787 * When values greater than 2 are used, the codec configuration should identify the channel assignment.
788 * QTFF: the number of audio channels
789 * Allowable values are 1 (mono) or 2 (stereo).
790 * For more than 2, set this field to 3 and use numAudioChannels instead of this field. */
791 uint16_t samplesize; /* ISOM: template: samplesize = 16
792 * QTFF: the number of bits in each uncompressed sample for a single channel
793 * Allowable values are 8 or 16.
794 * For non-mod8, set this field to 16 and use constBitsPerChannel instead of this field.
795 * For more than 16, set this field to 16 and use bytesPerPacket instead of this field. */
796 int16_t compression_ID; /* ISOM: pre_defined
797 * QTFF: version = 0 -> must be set to 0.
798 * version = 2 -> must be set to -2. */
799 uint16_t packet_size; /* ISOM: reserved / QTFF: must be set to 0. */
800 uint32_t samplerate; /* the sampling rate expressed as a 16.16 fixed-point number
801 * ISOM: template: samplerate = {default samplerate of media}<<16
802 * When it is desired to indicate an audio sampling rate greater than the value that can be represented in
803 * this field, this field should contain a value left-shifted 16 bits that matches the media timescale,
804 * or be an integer division or multiple of it.
805 * QTFF: the integer portion should match the media's timescale.
806 * If this field is invalid because of higher samplerate,
807 * then set this field to 0x00010000 and use audioSampleRate instead of this field. */
808 /* QTFF-based version 1 fields
809 * These fields are for description of the compression ratio of fixed ratio audio compression algorithms.
810 * If these fields are not used, they are set to 0. */
811 uint32_t samplesPerPacket; /* For compressed audio, be set to the number of uncompressed frames generated by a compressed frame.
812 * For uncompressed audio, shall be set to 1. */
813 uint32_t bytesPerPacket; /* the number of bytes in a sample for a single channel */
814 uint32_t bytesPerFrame; /* the number of bytes in a frame */
815 uint32_t bytesPerSample; /* 8-bit audio: 1, other audio: 2 */
816 /* QTFF-based version 2 fields
817 * LPCMFrame: one sample from each channel.
818 * AudioPacket: For uncompressed audio, an AudioPacket is simply one LPCMFrame.
819 * For compressed audio, an AudioPacket is the natural compressed access unit of that format. */
820 uint32_t sizeOfStructOnly; /* offset to extensions */
821 uint64_t audioSampleRate; /* 64-bit floating point */
822 uint32_t numAudioChannels; /* any channel assignment info will be in Audio Channel Layout Box. */
823 int32_t always7F000000; /* always 0x7F000000 */
824 uint32_t constBitsPerChannel; /* only set if constant (and only for uncompressed audio) */
825 uint32_t formatSpecificFlags;
826 uint32_t constBytesPerAudioPacket; /* only set if constant */
827 uint32_t constLPCMFramesPerAudioPacket; /* only set if constant */
828 } isom_audio_entry_t;
830 /* Hint Sample Entry data field for
831 * rtp hint track,
832 * srtp hint track,
833 * rtp reception hint track and
834 * srtp reception hint track
835 * rtcp reception hint track
836 * srtcp reception hint track
838 typedef struct
840 ISOM_SAMPLE_ENTRY;
841 uint16_t hinttrackversion; /* = 1 */
842 uint16_t highestcompatibleversion; /* = 1 */
843 uint32_t maxpacketsize;
844 } isom_hint_entry_t;
846 /* Metadata Sample Entry */
847 #define ISOM_METADATA_SAMPLE_ENTRY \
848 ISOM_SAMPLE_ENTRY
850 typedef struct
852 ISOM_METADATA_SAMPLE_ENTRY;
853 } isom_metadata_entry_t;
855 /* QuickTime Text Sample Description */
856 typedef struct
858 ISOM_SAMPLE_ENTRY;
859 int32_t displayFlags;
860 int32_t textJustification;
861 uint16_t bgColor[3]; /* background RGB color */
862 /* defaultTextBox */
863 int16_t top;
864 int16_t left;
865 int16_t bottom;
866 int16_t right;
867 /* defaultStyle */
868 int32_t scrpStartChar; /* starting character position */
869 int16_t scrpHeight;
870 int16_t scrpAscent;
871 int16_t scrpFont;
872 uint16_t scrpFace; /* only first 8-bits are used */
873 int16_t scrpSize;
874 uint16_t scrpColor[3]; /* foreground RGB color */
875 /* defaultFontName is Pascal string */
876 uint8_t font_name_length;
877 char *font_name;
878 } isom_qt_text_entry_t;
880 /* FontRecord */
881 typedef struct
883 uint16_t font_ID;
884 /* Pascal string */
885 uint8_t font_name_length;
886 char *font_name;
887 } isom_font_record_t;
889 /* Font Table Box */
890 typedef struct
892 ISOM_BASEBOX_COMMON;
893 /* FontRecord
894 * entry_count is uint16_t. */
895 lsmash_entry_list_t *list;
896 } isom_ftab_t;
898 /* 3GPP Timed Text Sample Entry */
899 typedef struct
901 ISOM_SAMPLE_ENTRY;
902 uint32_t displayFlags;
903 int8_t horizontal_justification;
904 int8_t vertical_justification;
905 uint8_t background_color_rgba[4];
906 /* BoxRecord default_text_box */
907 int16_t top;
908 int16_t left;
909 int16_t bottom;
910 int16_t right;
911 /* StyleRecord default_style */
912 uint16_t startChar; /* always 0 */
913 uint16_t endChar; /* always 0 */
914 uint16_t font_ID;
915 uint8_t face_style_flags;
916 uint8_t font_size;
917 uint8_t text_color_rgba[4];
918 /* Font Table Box font_table */
919 isom_ftab_t *ftab;
920 } isom_tx3g_entry_t;
922 /* Sample Description Box */
923 typedef struct
925 ISOM_FULLBOX_COMMON;
926 uint32_t entry_count; /* print only */
927 lsmash_entry_list_t list;
928 } isom_stsd_t;
929 /** **/
931 /* Decoding Time to Sample Box
932 * This box contains a compact version of a table that allows indexing from decoding time to sample number.
933 * Each entry in the table gives the number of consecutive samples with the same time delta, and the delta of those samples.
934 * By adding the deltas a complete time-to-sample map may be built.
935 * All samples must have non-zero durations except for the last one.
936 * The sum of all deltas gives the media duration in the track (not mapped to the movie timescale, and not considering any edit list).
937 * DTS is an abbreviation of 'decoding time stamp'. */
938 typedef struct
940 uint32_t sample_count; /* number of consecutive samples that have the given sample_delta */
941 uint32_t sample_delta; /* DTS[0] = 0; DTS[n+1] = DTS[n] + sample_delta[n]; */
942 } isom_stts_entry_t;
944 typedef struct
946 ISOM_FULLBOX_COMMON;
947 lsmash_entry_list_t *list;
948 } isom_stts_t;
950 /* Composition Time to Sample Box
951 * This box provides the offset between decoding time and composition time.
952 * CTS is an abbreviation of 'composition time stamp'.
953 * This box is optional and must only be present if DTS and CTS differ for any samples. */
954 typedef struct
956 #define ISOM_NON_OUTPUT_SAMPLE_OFFSET 0x80000000
957 uint32_t sample_count; /* number of consecutive samples that have the given sample_offset */
958 uint32_t sample_offset; /* CTS[n] = DTS[n] + sample_offset[n];
959 * ISOM: if version is set to 1, sample_offset is signed 32-bit integer.
960 * QTFF: sample_offset is always signed 32-bit integer. */
961 } isom_ctts_entry_t;
963 typedef struct
965 ISOM_FULLBOX_COMMON;
966 lsmash_entry_list_t *list;
967 } isom_ctts_t;
969 /* Composition to Decode Box (Composition Shift Least Greatest Box)
970 * This box may be used to relate the composition and decoding timelines,
971 * and deal with some of the ambiguities that signed composition offsets introduce. */
972 typedef struct
974 ISOM_FULLBOX_COMMON;
975 int32_t compositionToDTSShift; /* If this value is added to the composition times (as calculated by the CTS offsets from the DTS),
976 * then for all samples, their CTS is guaranteed to be greater than or equal to their DTS,
977 * and the buffer model implied by the indicated profile/level will be honoured;
978 * if leastDecodeToDisplayDelta is positive or zero, this field can be 0;
979 * otherwise it should be at least (- leastDecodeToDisplayDelta). */
980 int32_t leastDecodeToDisplayDelta; /* the smallest sample_offset in this track */
981 int32_t greatestDecodeToDisplayDelta; /* the largest sample_offset in this track */
982 int32_t compositionStartTime; /* the smallest CTS for any sample */
983 int32_t compositionEndTime; /* the CTS plus the composition duration, of the sample with the largest CTS in this track */
984 } isom_cslg_t;
986 /* Sample Size Box / Compact Sample Size Box
987 * This box contains the sample count and a table giving the size in bytes of each sample.
988 * The total number of samples in the media within the initial movie is always indicated in the sample_count.
989 * Note: a sample size of zero is not prohibited in general, but it must be valid and defined for the coding system,
990 * as defined by the sample entry, that the sample belongs to. */
991 typedef struct
993 uint32_t entry_size; /* the size of a sample */
994 } isom_stsz_entry_t;
996 typedef struct
998 ISOM_FULLBOX_COMMON;
999 uint32_t sample_size; /* the default sample size
1000 * If this field is set to 0, then the samples have different sizes. */
1001 uint32_t sample_count; /* the number of samples in the media within the initial movie */
1002 lsmash_entry_list_t *list; /* available if sample_size == 0 */
1003 } isom_stsz_t;
1005 typedef struct
1007 ISOM_FULLBOX_COMMON;
1008 unsigned int reserved : 24; /* 0 */
1009 unsigned int field_size : 8; /* the size in bits of the entries in the following table
1010 * It shall take the value 4, 8 or 16. If the value 4 is used, then each byte contains two values
1011 * entry[i]<<4 + entry[i+1]; if the sizes do not fill an integral number of bytes, the last byte is
1012 * padded with zero. */
1013 uint32_t sample_count; /* the number of entries in the following table */
1014 lsmash_entry_list_t *list; /* L-SMASH uses isom_stsz_entry_t for its internal processes. */
1015 } isom_stz2_t;
1017 /* Sync Sample Box
1018 * If this box is not present, every sample is a random access point.
1019 * In AVC streams, this box cannot point non-IDR samples.
1020 * The table is arranged in strictly increasing order of sample number. */
1021 typedef struct
1023 uint32_t sample_number; /* the numbers of the samples that are random access points in the stream. */
1024 } isom_stss_entry_t;
1026 typedef struct
1028 ISOM_FULLBOX_COMMON;
1029 lsmash_entry_list_t *list;
1030 } isom_stss_t;
1032 /* Partial Sync Sample Box
1033 * Tip from QT engineering - Open-GOP intra frames need to be marked as "partial sync samples".
1034 * Partial sync frames perform a partial reset of inter-frame dependencies;
1035 * decoding two partial sync frames and the non-droppable difference frames between them is
1036 * sufficient to prepare a decompressor for correctly decoding the difference frames that follow. */
1037 typedef struct
1039 uint32_t sample_number; /* the numbers of the samples that are partial sync samples in the stream. */
1040 } isom_stps_entry_t;
1042 typedef struct
1044 ISOM_FULLBOX_COMMON;
1045 lsmash_entry_list_t *list;
1046 } isom_stps_t;
1048 /* Independent and Disposable Samples Box */
1049 typedef struct
1051 unsigned is_leading : 2; /* ISOM: leading / QTFF: samples later in decode order may have earlier display times */
1052 unsigned sample_depends_on : 2; /* independency */
1053 unsigned sample_is_depended_on : 2; /* disposable */
1054 unsigned sample_has_redundancy : 2; /* redundancy */
1055 } isom_sdtp_entry_t;
1057 typedef struct
1059 ISOM_FULLBOX_COMMON;
1060 /* According to the specification, the size of the table, sample_count, doesn't exist in this box.
1061 * Instead of this, it is taken from the sample_count in the stsz or the stz2 box. */
1062 lsmash_entry_list_t *list;
1063 } isom_sdtp_t;
1065 /* Sample To Chunk Box
1066 * This box can be used to find the chunk that contains a sample, its position, and the associated sample description.
1067 * The table is compactly coded. Each entry gives the index of the first chunk of a run of chunks with the same characteristics.
1068 * By subtracting one entry here from the previous one, you can compute how many chunks are in this run.
1069 * You can convert this to a sample count by multiplying by the appropriate samples_per_chunk. */
1070 typedef struct
1072 uint32_t first_chunk; /* the index of the first chunk in this run of chunks that share the same samples_per_chunk and sample_description_index */
1073 uint32_t samples_per_chunk; /* the number of samples in each of these chunks */
1074 uint32_t sample_description_index; /* the index of the sample entry that describes the samples in this chunk */
1075 } isom_stsc_entry_t;
1077 typedef struct
1079 ISOM_FULLBOX_COMMON;
1080 lsmash_entry_list_t *list;
1081 } isom_stsc_t;
1083 /* Chunk Offset Box
1084 * chunk_offset is the offset of the start of a chunk into its containing media file.
1085 * Offsets are file offsets, not the offset into any box within the file. */
1086 typedef struct
1088 uint32_t chunk_offset;
1089 } isom_stco_entry_t;
1091 typedef struct
1093 /* for large presentations */
1094 uint64_t chunk_offset;
1095 } isom_co64_entry_t;
1097 typedef struct
1099 ISOM_FULLBOX_COMMON; /* type = 'stco': 32-bit chunk offsets / type = 'co64': 64-bit chunk offsets */
1100 lsmash_entry_list_t *list;
1102 uint8_t large_presentation; /* Set 1 to this if 64-bit chunk-offset are needed. */
1103 } isom_stco_t; /* share with co64 box */
1105 /* Sample Group Description Box
1106 * This box gives information about the characteristics of sample groups. */
1107 typedef struct
1109 ISOM_FULLBOX_COMMON; /* Use of version 0 entries is deprecated. */
1110 uint32_t grouping_type; /* an integer that identifies the sbgp that is associated with this sample group description */
1111 uint32_t default_length; /* the length of every group entry (if the length is constant), or zero (if it is variable)
1112 * This field is available only if version == 1. */
1113 lsmash_entry_list_t *list;
1114 } isom_sgpd_t;
1116 /* Random Access Entry
1117 * Samples marked by this group must be random access points, and may also be sync points. */
1118 typedef struct
1120 /* grouping_type is 'rap ' */
1121 uint32_t description_length; /* This field is available only if version == 1 and default_length == 0. */
1122 unsigned num_leading_samples_known : 1; /* the value of one indicates that the number of leading samples is known for each sample in this group,
1123 * and the number is specified by num_leading_samples. */
1124 unsigned num_leading_samples : 7; /* the number of leading samples for each sample in this group
1125 * Note: when num_leading_samples_known is equal to 0, this field should be ignored. */
1126 } isom_rap_entry_t;
1128 /* Roll Recovery Entry
1129 * This grouping type is defined as that group of samples having the same roll distance. */
1130 typedef struct
1132 /* grouping_type is 'roll' */
1133 uint32_t description_length; /* This field is available only if version == 1 and default_length == 0. */
1134 int16_t roll_distance; /* the number of samples that must be decoded in order for a sample to be decoded correctly
1135 * A positive value indicates post-roll, and a negative value indicates pre-roll.
1136 * The value zero must not be used. */
1137 } isom_roll_entry_t;
1139 /* Sample to Group Box
1140 * This box is used to find the group that a sample belongs to and the associated description of that sample group. */
1141 typedef struct
1143 ISOM_FULLBOX_COMMON;
1144 uint32_t grouping_type; /* Links it to its sample group description table with the same value for grouping type. */
1145 uint32_t grouping_type_parameter; /* an indication of the sub-type of the grouping
1146 * This field is available only if version == 1. */
1147 lsmash_entry_list_t *list;
1148 } isom_sbgp_t;
1150 typedef struct
1152 uint32_t sample_count; /* the number of consecutive samples with the same sample group descriptor */
1153 uint32_t group_description_index; /* the index of the sample group entry which describes the samples in this group
1154 * The index ranges from 1 to the number of sample group entries in the Sample Group Description Box,
1155 * or takes the value 0 to indicate that this sample is a member of no group of this type.
1156 * Within the Sample to Group Box in movie fragment, the group description indexes for groups defined
1157 * within the same fragment start at 0x10001, i.e. the index value 1, with the value 1 in the top 16 bits. */
1158 } isom_group_assignment_entry_t;
1160 /* Sample Table Box */
1161 struct isom_stbl_tag
1163 ISOM_BASEBOX_COMMON;
1164 isom_stsd_t *stsd; /* Sample Description Box */
1165 isom_stts_t *stts; /* Decoding Time to Sample Box */
1166 isom_ctts_t *ctts; /* Composition Time to Sample Box */
1167 isom_cslg_t *cslg; /* ISOM: Composition to Decode Box / QTFF: Composition Shift Least Greatest Box */
1168 isom_stss_t *stss; /* Sync Sample Box */
1169 isom_stps_t *stps; /* ISOM: null / QTFF: Partial Sync Sample Box */
1170 isom_sdtp_t *sdtp; /* Independent and Disposable Samples Box */
1171 isom_stsc_t *stsc; /* Sample To Chunk Box */
1172 isom_stsz_t *stsz; /* Sample Size Box */
1173 isom_stz2_t *stz2; /* Compact Sample Size Box */
1174 isom_stco_t *stco; /* Chunk Offset Box */
1175 lsmash_entry_list_t sgpd_list; /* Sample Group Description Boxes */
1176 lsmash_entry_list_t sbgp_list; /* Sample To Group Boxes */
1178 /* Use 'stz2' instead of 'stsz' if possible. (write mode only) */
1179 int (*compress_sample_size_table)( isom_stbl_t *stbl );
1180 /* Add independent and disposable info for each sample if possible. (write mode only) */
1181 int (*add_dependency_type)( isom_stbl_t *stbl, lsmash_file_t *file, lsmash_sample_property_t *prop );
1184 /* Media Information Box */
1185 typedef struct
1187 ISOM_BASEBOX_COMMON;
1188 /* Media Information Header Boxes */
1189 isom_vmhd_t *vmhd; /* Video Media Header Box */
1190 isom_smhd_t *smhd; /* Sound Media Header Box */
1191 isom_hmhd_t *hmhd; /* ISOM: Hint Media Header Box / QTFF: null */
1192 isom_nmhd_t *nmhd; /* ISOM: Null Media Header Box / QTFF: null */
1193 isom_gmhd_t *gmhd; /* ISOM: null / QTFF: Generic Media Information Header Box */
1194 /* */
1195 isom_hdlr_t *hdlr; /* ISOM: null / QTFF: Data Handler Reference Box
1196 * Note: this box must come before Data Information Box. */
1197 isom_dinf_t *dinf; /* Data Information Box */
1198 isom_stbl_t *stbl; /* Sample Table Box */
1199 } isom_minf_t;
1201 /* Media Box */
1202 typedef struct
1204 ISOM_BASEBOX_COMMON;
1205 isom_mdhd_t *mdhd; /* Media Header Box */
1206 isom_hdlr_t *hdlr; /* ISOM: Handler Reference Box / QTFF: Media Handler Reference Box
1207 * Note: this box must come before Media Information Box. */
1208 isom_minf_t *minf; /* Media Information Box */
1209 } isom_mdia_t;
1211 /* Movie Header Box
1212 * This box defines overall information which is media-independent, and relevant to the entire presentation considered as a whole. */
1213 typedef struct
1215 ISOM_FULLBOX_COMMON; /* version is either 0 or 1 */
1216 /* version == 0: uint64_t -> uint32_t */
1217 uint64_t creation_time; /* the creation time of the presentation (in seconds since midnight, Jan. 1, 1904, in UTC time) */
1218 uint64_t modification_time; /* the most recent time the presentation was modified (in seconds since midnight, Jan. 1, 1904, in UTC time) */
1219 uint32_t timescale; /* movie timescale: timescale for the entire presentation */
1220 uint64_t duration; /* the duration, expressed in movie timescale, of the longest track */
1221 /* The following fields are treated as
1222 * ISOM: template fields.
1223 * MP41: reserved fields.
1224 * MP42: ignored fileds since compositions are done using BIFS system.
1225 * 3GPP: ignored fields.
1226 * QTFF: usable fields. */
1227 int32_t rate; /* fixed point 16.16 number. 0x00010000 is normal forward playback. */
1228 int16_t volume; /* fixed point 8.8 number. 0x0100 is full volume. */
1229 int16_t reserved;
1230 int32_t preferredLong[2]; /* ISOM: reserved / QTFF: unknown */
1231 int32_t matrix[9]; /* transformation matrix for the video */
1232 /* The following fields are defined in QuickTime file format.
1233 * In ISO Base Media file format, these fields are treated as pre_defined. */
1234 int32_t previewTime; /* the time value in the movie at which the preview begins */
1235 int32_t previewDuration; /* the duration of the movie preview in movie timescale units */
1236 int32_t posterTime; /* the time value of the time of the movie poster */
1237 int32_t selectionTime; /* the time value for the start time of the current selection */
1238 int32_t selectionDuration; /* the duration of the current selection in movie timescale units */
1239 int32_t currentTime; /* the time value for current time position within the movie */
1240 /* */
1241 uint32_t next_track_ID; /* larger than the largest track-ID in use */
1242 } isom_mvhd_t;
1244 /* Object Descriptor Box
1245 * Note that this box is mandatory under 14496-1:2001 (mp41) while not mandatory under 14496-14:2003 (mp42). */
1246 struct mp4sys_ObjectDescriptor_t; /* FIXME: I think these structs using mp4sys should be placed in isom.c */
1247 typedef struct
1249 ISOM_FULLBOX_COMMON;
1250 struct mp4sys_ObjectDescriptor_t *OD;
1251 } isom_iods_t;
1253 /* Media Data Box
1254 * This box contains the media data.
1255 * A presentation may contain zero or more Media Data Boxes.*/
1256 typedef struct
1258 ISOM_BASEBOX_COMMON; /* If size is 0, then this box is the last box. */
1260 uint64_t media_size; /* the total media size already written in this box */
1261 uint64_t reserved_size; /* the reserved total media size in this box
1262 * If 'media_size' > 'reserved_size' occurs when finishing a non-fragmented movie,
1263 * rewrite the size of this box. */
1264 } isom_mdat_t;
1266 /* Free Space Box
1267 * The contents of a free-space box are irrelevant and may be ignored without affecting the presentation. */
1268 typedef struct
1270 ISOM_BASEBOX_COMMON; /* type is 'free' or 'skip' */
1271 uint32_t length;
1272 uint8_t *data;
1273 } isom_free_t;
1275 typedef isom_free_t isom_skip_t;
1277 /* Chapter List Box
1278 * This box is NOT defined in the ISO/MPEG-4 specs.
1279 * Basically, this box exists in User Data Box inside Movie Box if present. */
1280 typedef struct
1282 uint64_t start_time; /* version = 0: expressed in movie timescale units
1283 * version = 1: expressed in 100 nanoseconds */
1284 /* Chapter name is Pascal string */
1285 uint8_t chapter_name_length;
1286 char *chapter_name;
1287 } isom_chpl_entry_t;
1289 typedef struct
1291 ISOM_FULLBOX_COMMON; /* version = 0 is defined in F4V file format. */
1292 uint8_t unknown; /* only available under version = 1 */
1293 lsmash_entry_list_t *list; /* if version is set to 0, entry_count is uint8_t. */
1294 } isom_chpl_t;
1296 typedef struct
1298 char *chapter_name;
1299 uint64_t start_time;
1300 } isom_chapter_entry_t;
1302 /* Metadata Item Keys Box */
1303 typedef struct
1305 ISOM_FULLBOX_COMMON;
1306 lsmash_entry_list_t *list;
1307 } isom_keys_t;
1309 typedef struct
1311 uint32_t key_size; /* the size of the entire structure containing a key definition
1312 * key_size = sizeof(key_size) + sizeof(key_namespace) + sizeof(key_value) */
1313 uint32_t key_namespace; /* a naming scheme used for metadata keys
1314 * Location metadata keys, for example, use the 'mdta' key namespace. */
1315 uint8_t *key_value; /* the actual name of the metadata key
1316 * Keys with the 'mdta' namespace use a reverse DNS naming convention. */
1317 } isom_keys_entry_t;
1319 /* Meaning Box */
1320 typedef struct
1322 ISOM_FULLBOX_COMMON;
1323 uint8_t *meaning_string; /* to fill the box */
1325 uint32_t meaning_string_length;
1326 } isom_mean_t;
1328 /* Name Box */
1329 typedef struct
1331 ISOM_FULLBOX_COMMON;
1332 uint8_t *name; /* to fill the box */
1334 uint32_t name_length;
1335 } isom_name_t;
1337 /* Data Box */
1338 typedef struct
1340 ISOM_BASEBOX_COMMON;
1341 /* type indicator */
1342 uint16_t reserved; /* always 0 */
1343 uint8_t type_set_identifier; /* 0: type set of the common basic data types */
1344 uint8_t type_code; /* type of data code */
1345 /* */
1346 uint32_t the_locale; /* reserved to be 0 */
1347 uint8_t *value; /* to fill the box */
1349 uint32_t value_length;
1350 } isom_data_t;
1352 /* Metadata Item Box */
1353 typedef struct
1355 ISOM_BASEBOX_COMMON;
1356 isom_mean_t *mean; /* Meaning Box */
1357 isom_name_t *name; /* Name Box */
1358 isom_data_t *data; /* Data Box */
1359 } isom_metaitem_t;
1361 /* Metadata Item List Box */
1362 typedef struct
1364 ISOM_BASEBOX_COMMON;
1365 lsmash_entry_list_t metaitem_list; /* Metadata Item Box List
1366 * There is no entry_count field. */
1367 } isom_ilst_t;
1369 /* Meta Box */
1370 typedef struct
1372 ISOM_FULLBOX_COMMON; /* ISOM: FullBox / QTFF: BaseBox */
1373 isom_hdlr_t *hdlr; /* Metadata Handler Reference Box */
1374 isom_dinf_t *dinf; /* ISOM: Data Information Box / QTFF: null */
1375 isom_keys_t *keys; /* ISOM: null / QTFF: Metadata Item Keys Box */
1376 isom_ilst_t *ilst; /* Metadata Item List Box only defined in Apple MPEG-4 and QTFF */
1377 } isom_meta_t;
1379 /* Window Location Box */
1380 typedef struct
1382 ISOM_BASEBOX_COMMON;
1383 /* default window location for movie */
1384 uint16_t x;
1385 uint16_t y;
1386 } isom_WLOC_t;
1388 /* Looping Box */
1389 typedef struct
1391 ISOM_BASEBOX_COMMON;
1392 uint32_t looping_mode; /* 0 for none, 1 for looping, 2 for palindromic looping */
1393 } isom_LOOP_t;
1395 /* Play Selection Only Box */
1396 typedef struct
1398 ISOM_BASEBOX_COMMON;
1399 uint8_t selection_only; /* whether only the selected area of the movie should be played */
1400 } isom_SelO_t;
1402 /* Play All Frames Box */
1403 typedef struct
1405 ISOM_BASEBOX_COMMON;
1406 uint8_t play_all_frames; /* whether all frames of video should be played, regardless of timing */
1407 } isom_AllF_t;
1409 /* Copyright Box
1410 * The Copyright box contains a copyright declaration which applies to the entire presentation,
1411 * when contained within the Movie Box, or, when contained in a track, to that entire track.
1412 * There may be multiple copyright boxes using different language codes. */
1413 typedef struct
1415 ISOM_FULLBOX_COMMON;
1416 uint16_t language; /* ISO-639-2/T language codes. Most significant 1-bit is 0.
1417 * Each character is packed as the difference between its ASCII value and 0x60. */
1418 uint8_t *notice; /* a null-terminated string in either UTF-8 or UTF-16 characters, giving a copyright notice.
1419 * If UTF-16 is used, the string shall start with the BYTE ORDER MARK (0xFEFF), to distinguish it from a UTF-8 string.
1420 * This mark does not form part of the final string. */
1421 uint32_t notice_length;
1422 } isom_cprt_t;
1424 /* Movie SDP Information box */
1425 typedef struct
1427 ISOM_BASEBOX_COMMON;
1428 uint32_t descriptionformat;
1429 uint8_t *sdptext;
1430 uint32_t sdp_length;
1431 }isom_rtp_t;
1433 /* Track SDP Information box */
1434 typedef struct
1436 ISOM_BASEBOX_COMMON;
1437 uint8_t *sdptext;
1438 uint32_t sdp_length;
1439 }isom_sdp_t;
1441 typedef struct
1443 ISOM_BASEBOX_COMMON;
1444 isom_rtp_t *rtp; /* Movie-level SDP box*/
1445 isom_sdp_t *sdp; /* Track-level SDP box*/
1446 } isom_hnti_t;
1448 /* User Data Box
1449 * This box is a container box for informative user-data.
1450 * This user data is formatted as a set of boxes with more specific box types, which declare more precisely their content.
1451 * QTFF: for historical reasons, this box is optionally terminated by a 32-bit integer set to 0. */
1452 typedef struct
1454 ISOM_BASEBOX_COMMON;
1455 isom_chpl_t *chpl; /* Chapter List Box */
1456 isom_meta_t *meta; /* Meta Box extended by Apple for iTunes movie */
1457 /* QuickTime user data */
1458 isom_WLOC_t *WLOC; /* Window Location Box */
1459 isom_LOOP_t *LOOP; /* Looping Box */
1460 isom_SelO_t *SelO; /* Play Selection Only Box */
1461 isom_AllF_t *AllF; /* Play All Frames Box */
1462 /* Copyright Box List */
1463 lsmash_entry_list_t cprt_list; /* Copyright Boxes is defined in ISO Base Media and 3GPP file format */
1464 /* Hint information box */
1465 isom_hnti_t *hnti;
1466 } isom_udta_t;
1468 /** Caches for handling tracks **/
1469 typedef struct
1471 uint64_t alloc; /* total buffer size for the pool */
1472 uint64_t size; /* total size of samples in the pool */
1473 uint32_t sample_count; /* number of samples in the pool */
1474 uint8_t *data; /* actual data of samples in the pool */
1475 } isom_sample_pool_t;
1477 typedef struct
1479 uint32_t chunk_number; /* chunk number */
1480 uint32_t sample_description_index; /* sample description index */
1481 uint64_t first_dts; /* the first DTS in chunk */
1482 isom_sample_pool_t *pool; /* samples pooled to interleave */
1483 } isom_chunk_t;
1485 typedef struct
1487 uint64_t dts;
1488 uint64_t cts;
1489 int32_t ctd_shift;
1490 } isom_timestamp_t;
1492 typedef struct
1494 isom_group_assignment_entry_t *assignment; /* the address corresponding to the entry in Sample to Group Box */
1495 isom_group_assignment_entry_t *prev_assignment; /* the address of the previous assignment */
1496 isom_rap_entry_t *random_access; /* the address corresponding to the random access entry in Sample Group Description Box */
1497 uint8_t is_prev_rap; /* whether the previous sample is a random access point or not */
1498 } isom_rap_group_t;
1500 typedef struct
1502 isom_group_assignment_entry_t *assignment; /* the address corresponding to the entry in Sample to Group Box */
1503 isom_sgpd_t *sgpd; /* the address to the active Sample Group Description Box */
1504 uint32_t first_sample; /* the number of the first sample of the group */
1505 uint32_t recovery_point; /* the identifier necessary for the recovery from its starting point to be completed */
1506 uint64_t rp_cts; /* the CTS of the recovery point */
1507 int16_t roll_distance; /* the current roll_distance
1508 * The value may be updated when 'described' is set to ROLL_DISTANCE_INITIALIZED. */
1509 #define MAX_ROLL_WAIT_AND_SEE_COUNT 64
1510 uint8_t wait_and_see_count; /* Wait-and-see after initialization of roll_distance until reaching MAX_ROLL_WAIT_AND_SEE. */
1511 uint8_t is_fragment; /* the flag if the current group is in fragment */
1512 uint8_t prev_is_recovery_start; /* whether the previous sample is a starting point of recovery or not */
1513 uint8_t delimited; /* the flag if the sample_count is determined */
1514 #define ROLL_DISTANCE_INITIALIZED 1
1515 #define ROLL_DISTANCE_DETERMINED 2
1516 uint8_t described; /* the status of the group description */
1517 } isom_roll_group_t;
1519 typedef struct
1521 lsmash_entry_list_t *pool; /* grouping pooled to delimit and describe */
1522 } isom_grouping_t;
1524 typedef struct
1526 uint64_t segment_duration; /* the sum of the subsegment_duration of preceeding subsegments */
1527 uint64_t largest_cts; /* the largest CTS of a subsegment of the reference stream */
1528 uint64_t smallest_cts; /* the smallest CTS of a subsegment of the reference stream */
1529 uint64_t first_sample_cts; /* the CTS of the first sample of a subsegment of the reference stream */
1530 /* SAP related info within the active subsegment of the reference stream */
1531 uint64_t first_ed_cts; /* the earliest CTS of decodable samples after the first recovery point */
1532 uint64_t first_rp_cts; /* the CTS of the first recovery point */
1533 uint32_t first_rp_number; /* the number of the first recovery point */
1534 uint32_t first_ra_number; /* the number of the first random accessible sample */
1535 lsmash_random_access_flag first_ra_flags; /* the flags of the first random accessible sample */
1536 int is_first_recovery_point;
1537 int decodable;
1538 } isom_subsegment_t;
1540 typedef struct
1542 uint8_t has_samples; /* Whether whole movie has any sample or not. */
1543 uint8_t roll_grouping;
1544 uint8_t rap_grouping;
1545 uint32_t traf_number;
1546 uint32_t last_duration; /* the last sample duration in this track fragment */
1547 uint64_t largest_cts; /* the largest CTS in this track fragment */
1548 uint32_t sample_count; /* the number of samples in this track fragment */
1549 uint32_t output_sample_count; /* the number of output samples in this track fragment */
1550 isom_subsegment_t subsegment;
1551 } isom_fragment_t;
1553 typedef struct
1555 uint8_t all_sync; /* if all samples are sync sample */
1556 uint8_t is_audio;
1557 isom_chunk_t chunk;
1558 isom_timestamp_t timestamp; /* Each field stores the last valid value. */
1559 isom_grouping_t roll;
1560 isom_rap_group_t *rap;
1561 isom_fragment_t *fragment;
1562 } isom_cache_t;
1564 /** Movie Fragments Boxes **/
1565 /* Track Fragments Flags ('tf_flags') */
1566 typedef enum
1568 ISOM_TF_FLAGS_BASE_DATA_OFFSET_PRESENT = 0x000001, /* base-data-offset-present:
1569 * This flag indicates the presence of the base_data_offset field.
1570 * The base_data_offset is the base offset to use when calculating data offsets.
1571 * Offsets are file offsets as like as chunk_offset in Chunk Offset Box.
1572 * If this flag is set and default-base-is-moof is not set, the base_data_offset
1573 * for the first track in the movie fragment is the position of the first byte
1574 * of the enclosing Movie Fragment Box, and for second and subsequent track
1575 * fragments, the default is the end of the data defined by the preceding fragment. */
1576 ISOM_TF_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT = 0x000002, /* sample-description-index-present
1577 * This flag indicates the presence of the sample_description_index field. */
1578 ISOM_TF_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT = 0x000008, /* default-sample-duration-present:
1579 * This flag indicates the presence of the default_sample_duration field. */
1580 ISOM_TF_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT = 0x000010, /* default-sample-size-present:
1581 * This flag indicates the presence of the default_sample_size field. */
1582 ISOM_TF_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT = 0x000020, /* default-sample-flags-present:
1583 * This flag indicates the presence of the default_sample_flags field. */
1584 ISOM_TF_FLAGS_DURATION_IS_EMPTY = 0x010000, /* duration-is-empty:
1585 * This flag indicates there are no samples for this time interval. */
1586 ISOM_TF_FLAGS_DEFAULT_BASE_IS_MOOF = 0x020000, /* default-base-is-moof:
1587 * If base-data-offset-present is not set, this flag indicates the implicit
1588 * base_data_offset is always equal to the position of the first byte of the
1589 * enclosing Movie Fragment BOX.
1590 * This flag is only available under the 'iso5' or later brands and cannot be set
1591 * when earlier brands are included in the File Type box. */
1592 } isom_tf_flags_code;
1594 /* Track Run Flags ('tr_flags') */
1595 typedef enum
1597 ISOM_TR_FLAGS_DATA_OFFSET_PRESENT = 0x000001, /* data-offset-present:
1598 * This flag indicates the presence of the data_offset field. */
1599 ISOM_TR_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT = 0x000004, /* first-sample-flags-present:
1600 * This flag indicates the presence of the first_sample_flags field. */
1601 ISOM_TR_FLAGS_SAMPLE_DURATION_PRESENT = 0x000100, /* sample-duration-present:
1602 * This flag indicates the presence of the sample_duration field. */
1603 ISOM_TR_FLAGS_SAMPLE_SIZE_PRESENT = 0x000200, /* sample-size-present:
1604 * This flag indicates the presence of the sample_size field. */
1605 ISOM_TR_FLAGS_SAMPLE_FLAGS_PRESENT = 0x000400, /* sample-flags-present:
1606 * This flag indicates the presence of the sample_flags field. */
1607 ISOM_TR_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT = 0x000800, /* sample-composition-time-offsets-present:
1608 * This flag indicates the presence of the sample_composition_time_offset field. */
1609 } isom_tr_flags_code;
1611 /* Sample Flags */
1612 typedef struct
1614 unsigned reserved : 4;
1615 /* The definition of the following fields is quite the same as Independent and Disposable Samples Box. */
1616 unsigned is_leading : 2;
1617 unsigned sample_depends_on : 2;
1618 unsigned sample_is_depended_on : 2;
1619 unsigned sample_has_redundancy : 2;
1620 /* */
1621 unsigned sample_padding_value : 3; /* the number of bits at the end of this sample */
1622 unsigned sample_is_non_sync_sample : 1; /* 0 value means this sample is sync sample. */
1623 uint16_t sample_degradation_priority;
1624 } isom_sample_flags_t;
1626 /* Movie Extends Header Box
1627 * This box is omitted when used in live streaming.
1628 * If this box is not present, the overall duration must be computed by examining each fragment. */
1629 typedef struct
1631 ISOM_FULLBOX_COMMON;
1632 /* version == 0: uint64_t -> uint32_t */
1633 uint64_t fragment_duration; /* the duration of the longest track, in the timescale indicated in the Movie Header Box, including movie fragments. */
1634 } isom_mehd_t;
1636 /* Track Extends Box
1637 * This box sets up default values used by the movie fragments. */
1638 typedef struct
1640 ISOM_FULLBOX_COMMON;
1641 uint32_t track_ID; /* identifier of the track; this shall be the track ID of a track in the Movie Box */
1642 uint32_t default_sample_description_index;
1643 uint32_t default_sample_duration;
1644 uint32_t default_sample_size;
1645 isom_sample_flags_t default_sample_flags;
1646 } isom_trex_t;
1648 /* Movie Extends Box
1649 * This box warns readers that there might be Movie Fragment Boxes in this file. */
1650 typedef struct
1652 ISOM_BASEBOX_COMMON;
1653 isom_mehd_t *mehd; /* Movie Extends Header Box / omitted when used in live streaming */
1654 lsmash_entry_list_t trex_list; /* Track Extends Box */
1655 } isom_mvex_t;
1657 /* Movie Fragment Header Box
1658 * This box contains a sequence number, as a safety check.
1659 * The sequence number 'usually' starts at 1 and must increase for each movie fragment in the file, in the order in which they occur. */
1660 typedef struct
1662 ISOM_FULLBOX_COMMON;
1663 uint32_t sequence_number; /* the ordinal number of this fragment, in increasing order */
1664 } isom_mfhd_t;
1666 /* Track Fragment Header Box
1667 * Each movie fragment can contain zero or more fragments for each track;
1668 * and a track fragment can contain zero or more contiguous runs of samples.
1669 * This box sets up information and defaults used for those runs of samples. */
1670 typedef struct
1672 ISOM_FULLBOX_COMMON; /* flags field is used for 'tf_flags'. */
1673 uint32_t track_ID;
1674 /* all the following are optional fields */
1675 uint64_t base_data_offset; /* an explicit anchor for the data offsets in each track run
1676 * To avoid the case this field might overflow, e.g. semi-permanent live streaming and broadcasting,
1677 * you shall not use this optional field. */
1678 uint32_t sample_description_index; /* override default_sample_description_index in Track Extends Box */
1679 uint32_t default_sample_duration; /* override default_sample_duration in Track Extends Box */
1680 uint32_t default_sample_size; /* override default_sample_size in Track Extends Box */
1681 isom_sample_flags_t default_sample_flags; /* override default_sample_flags in Track Extends Box */
1682 } isom_tfhd_t;
1684 /* Track Fragment Base Media Decode Time Box
1685 * This box provides the absolute decode time, measured on the media timeline, of the first sample in decode order in the track fragment.
1686 * This can be useful, for example, when performing random access in a file;
1687 * it is not necessary to sum the sample durations of all preceding samples in previous fragments to find this value
1688 * (where the sample durations are the deltas in the Decoding Time to Sample Box and the sample_durations in the preceding track runs).
1689 * This box, if present, shall be positioned after the Track Fragment Header Box and before the first Track Fragment Run box. */
1690 typedef struct
1692 ISOM_FULLBOX_COMMON; /* version is either 0 or 1 */
1693 /* version == 0: 64bits -> 32bits */
1694 uint64_t baseMediaDecodeTime; /* an integer equal to the sum of the decode durations of all earlier samples in the media, expressed in the media's timescale
1695 * It does not include the samples added in the enclosing track fragment.
1696 * NOTE: the decode timeline is a media timeline, established before any explicit or implied mapping of media time to presentation time,
1697 * for example by an edit list or similar structure. */
1698 } isom_tfdt_t;
1700 /* Track Fragment Run Box
1701 * Within the Track Fragment Box, there are zero or more Track Fragment Run Boxes.
1702 * If the duration-is-empty flag is set in the tf_flags, there are no track runs.
1703 * A track run documents a contiguous set of samples for a track. */
1704 typedef struct
1706 ISOM_FULLBOX_COMMON; /* flags field is used for 'tr_flags'. */
1707 uint32_t sample_count; /* the number of samples being added in this run; also the number of rows in the following table */
1708 /* The following are optional fields. */
1709 int32_t data_offset; /* This value is added to the implicit or explicit data_offset established in the Track Fragment Header Box.
1710 * If this field is not present, then the data for this run starts immediately after the data of the previous run,
1711 * or at the base_data_offset defined by the Track Fragment Header Box if this is the first run in a track fragment. */
1712 isom_sample_flags_t first_sample_flags; /* a set of flags for the first sample only of this run */
1713 lsmash_entry_list_t *optional; /* all fields in this array are optional. */
1714 } isom_trun_t;
1716 typedef struct
1718 /* If the following fields is present, each field overrides default value described in Track Fragment Header Box or Track Extends Box. */
1719 uint32_t sample_duration; /* override default_sample_duration */
1720 uint32_t sample_size; /* override default_sample_size */
1721 isom_sample_flags_t sample_flags; /* override default_sample_flags */
1722 /* */
1723 uint32_t sample_composition_time_offset; /* composition time offset
1724 * If version == 0, unsigned 32-bit integer.
1725 * Otherwise, signed 32-bit integer. */
1726 } isom_trun_optional_row_t;
1728 /* Track Fragment Box */
1729 typedef struct
1731 ISOM_BASEBOX_COMMON;
1732 isom_tfhd_t *tfhd; /* Track Fragment Header Box */
1733 isom_tfdt_t *tfdt; /* Track Fragment Base Media Decode Time Box */
1734 lsmash_entry_list_t trun_list; /* Track Fragment Run Box List
1735 * If the duration-is-empty flag is set in the tf_flags, there are no track runs. */
1736 isom_sdtp_t *sdtp; /* Independent and Disposable Samples Box (available under Protected Interoperable File Format) */
1737 lsmash_entry_list_t sgpd_list; /* Sample Group Description Boxes (available under ISO Base Media version 6 or later) */
1738 lsmash_entry_list_t sbgp_list; /* Sample To Group Boxes */
1740 isom_cache_t *cache; /* taken over from corresponding 'trak' */
1741 } isom_traf_t;
1743 /* Movie Fragment Box */
1744 typedef struct
1746 ISOM_BASEBOX_COMMON;
1747 isom_mfhd_t *mfhd; /* Movie Fragment Header Box */
1748 lsmash_entry_list_t traf_list; /* Track Fragment Box List */
1749 } isom_moof_t;
1751 /* Track Fragment Random Access Box
1752 * Each entry in this box contains the location and the presentation time of the sync sample.
1753 * Note that not every sync sample in the track needs to be listed in the table.
1754 * The absence of this box does not mean that all the samples are sync samples. */
1755 typedef struct
1757 ISOM_FULLBOX_COMMON;
1758 uint32_t track_ID;
1759 unsigned int reserved : 26;
1760 unsigned int length_size_of_traf_num : 2; /* the length in byte of the traf_number field minus one */
1761 unsigned int length_size_of_trun_num : 2; /* the length in byte of the trun_number field minus one */
1762 unsigned int length_size_of_sample_num : 2; /* the length in byte of the sample_number field minus one */
1763 uint32_t number_of_entry; /* the number of the entries for this track
1764 * Value zero indicates that every sample is a sync sample and no table entry follows. */
1765 lsmash_entry_list_t *list; /* entry_count corresponds to number_of_entry. */
1766 } isom_tfra_t;
1768 typedef struct
1770 /* version == 0: 64bits -> 32bits */
1771 uint64_t time; /* the presentation time of the sync sample in units defined in the Media Header Box of the associated track
1772 * For segments based on movie sample tables or movie fragments, presentation times are in the movie timeline,
1773 * that is they are composition times after the application of any edit list for the track.
1774 * Note: the definition of segment is portion of an ISO base media file format file, consisting of either
1775 * (a) a movie box, with its associated media data (if any) and other associated boxes
1776 * or
1777 * (b) one or more movie fragment boxes, with their associated media data, and other associated boxes. */
1778 uint64_t moof_offset; /* the offset of the Movie Fragment Box used in this entry
1779 * Offset is the byte-offset between the beginning of the file and the beginning of the Movie Fragment Box. */
1780 /* */
1781 uint32_t traf_number; /* the Track Fragment Box ('traf') number that contains the sync sample
1782 * The number ranges from 1 in each Movie Fragment Box ('moof'). */
1783 uint32_t trun_number; /* the Track Fragment Run Box ('trun') number that contains the sync sample
1784 * The number ranges from 1 in each Track Fragment Box ('traf'). */
1785 uint32_t sample_number; /* the sample number that contains the sync sample
1786 * The number ranges from 1 in each Track Fragment Run Box ('trun'). */
1787 } isom_tfra_location_time_entry_t;
1789 /* Movie Fragment Random Access Offset Box
1790 * This box provides a copy of the length field from the enclosing Movie Fragment Random Access Box. */
1791 typedef struct
1793 ISOM_FULLBOX_COMMON;
1794 uint32_t length; /* an integer gives the number of bytes of the enclosing Movie Fragment Random Access Box
1795 * This field is placed at the last of the enclosing box to assist readers scanning
1796 * from the end of the file in finding the Movie Fragment Random Access Box. */
1797 } isom_mfro_t;
1799 /* Movie Fragment Random Access Box
1800 * This box provides a table which may assist readers in finding sync samples in a file using movie fragments,
1801 * and is usually placed at or near the end of the file.
1802 * The last box within the Movie Fragment Random Access Box, which is called Movie Fragment Random Access Offset Box,
1803 * provides a copy of the length field from the Movie Fragment Random Access Box. */
1804 typedef struct
1806 ISOM_BASEBOX_COMMON;
1807 lsmash_entry_list_t tfra_list; /* Track Fragment Random Access Box */
1808 isom_mfro_t *mfro; /* Movie Fragment Random Access Offset Box */
1809 } isom_mfra_t;
1811 /* Movie fragment manager
1812 * The presence of this means we use the structure of movie fragments. */
1813 typedef struct
1815 #define FIRST_MOOF_POS_UNDETERMINED UINT64_MAX
1816 isom_moof_t *movie; /* the address corresponding to the current Movie Fragment Box */
1817 uint64_t first_moof_pos;
1818 uint64_t pool_size; /* the total sample size in the current movie fragment */
1819 uint64_t sample_count; /* the number of samples within the current movie fragment */
1820 lsmash_entry_list_t *pool; /* samples pooled to interleave for the current movie fragment */
1821 } isom_fragment_manager_t;
1823 /** **/
1825 /* Track Box */
1826 typedef struct
1828 ISOM_BASEBOX_COMMON;
1829 isom_tkhd_t *tkhd; /* Track Header Box */
1830 isom_tapt_t *tapt; /* ISOM: null / QTFF: Track Aperture Mode Dimensions Box */
1831 isom_edts_t *edts; /* Edit Box */
1832 isom_tref_t *tref; /* Track Reference Box */
1833 isom_mdia_t *mdia; /* Media Box */
1834 isom_udta_t *udta; /* User Data Box */
1835 isom_meta_t *meta; /* Meta Box */
1837 isom_cache_t *cache;
1838 uint32_t related_track_ID;
1839 uint8_t is_chapter;
1840 } isom_trak_t;
1842 /* Movie Box */
1843 typedef struct
1845 ISOM_BASEBOX_COMMON;
1846 isom_mvhd_t *mvhd; /* Movie Header Box */
1847 isom_iods_t *iods; /* MP4: Object Descriptor Box */
1848 lsmash_entry_list_t trak_list; /* Track Box List */
1849 isom_udta_t *udta; /* User Data Box */
1850 isom_ctab_t *ctab; /* ISOM: null / QTFF: Color Table Box */
1851 isom_meta_t *meta; /* Meta Box */
1852 isom_mvex_t *mvex; /* Movie Extends Box */
1853 } isom_moov_t;
1855 /** Segments
1856 * segment
1857 * portion of an ISO base media file format file, consisting of either (a) a movie box, with its associated media data
1858 * (if any) and other associated boxes or (b) one or more movie fragment boxes, with their associated media data, and
1859 * and other associated boxes
1860 * subsegment
1861 * time interval of a segment formed from movie fragment boxes, that is also a valid segment
1862 * A subsegment is defined as a time interval of the containing (sub)segment, and corresponds to a single range of
1863 * bytes of the containing (sub)segment. The durations of all the subsegments sum to the duration of the containing
1864 * (sub)segment.
1866 /* Segment Type Box
1867 * Media presentations may be divided into segments for delivery, for example, it is possible (e.g. in HTTP streaming) to
1868 * form files that contain a segment ? or concatenated segments ? which would not necessarily form ISO Base Media file
1869 * format compliant files (e.g. they do not contain a Movie Box).
1870 * If segments are stored in separate files (e.g. on a standard HTTP server) it is recommended that these 'segment files'
1871 * contain a Segment Type Box, which must be first if present, to enable identification of those files, and declaration of
1872 * the specifications with which they are compliant.
1873 * Segment Type Boxes that are not first in a file may be ignored.
1874 * Valid Segment Type Boxes shall be the first box in a segment.
1875 * Note:
1876 * The 'valid' here does not always mean that any brand of that segment has compatibility against other brands of it.
1877 * After concatenations of segments, the result file might contain incompatibilities among brands. */
1878 typedef isom_ftyp_t isom_styp_t;
1880 /* Segment Index Box
1881 * This box provides a compact index of one media stream within the media segment to which it applies.
1883 * Each Segment Index Box documents how a (sub)segment is divided into one or more subsegments (which may themselves be
1884 * further subdivided using Segment Index boxes).
1886 * Each entry in the Segment Index Box contains a reference type that indicates whether the reference points directly to
1887 * the media bytes of a referenced leaf subsegment, which is a subsegment that does not contain any indexing information
1888 * that would enable its further division into subsegments, or to a Segment Index box that describes how the referenced
1889 * subsegment is further subdivided; as a result, the segment may be indexed in a 'hierarchical' or 'daisy-chain' or
1890 * other form by documenting time and byte offset information for other Segment Index Boxes applying to portions of the
1891 * same (sub)segment.
1893 * For segments based on ISO Base Media file format (i.e. based on movie sample tables or movie fragments):
1894 * ! an access unit is a sample;
1895 * ! a subsegment is a self-contained set of one or more consecutive movie fragments; a self-contained set contains
1896 * one or more Movie Fragment Boxes with the corresponding Media Data Box(es), and a Media Data Box containing data
1897 * referenced by a Movie Fragment Box must follow that Movie Fragment Box and precede the next Movie Fragment box
1898 * containing information about the same track;
1899 * ! Segment Index Boxes shall be placed before subsegment material they document, that is, before any Movie Fragment
1900 * Box of the documented material of the subsegment;
1901 * ! streams are tracks in the file format, and stream IDs are track IDs;
1902 * ! a subsegment contains a stream access point if a track fragment within the subsegment for the track with track_ID
1903 * equal to reference_ID contains a stream access point;
1904 * ! initialisation data for SAPs consists of the Movie Box;
1905 * ! presentation times are in the movie timeline, that is they are composition times after the application of any edit
1906 * list for the track;
1907 * ! the ISAP is a position exactly pointing to the start of a top-level box, such as a Movie Fragment Box;
1908 * ! a SAP of type 1 or type 2 is indicated as a sync sample;
1909 * ! a SAP of type 3 is marked as a member of a sample group of type 'rap ';
1910 * ! a SAP of type 4 is marked as a member of a sample group of type 'roll' where the value of the roll_distance field
1911 * is greater than 0.
1912 * For SAPs of type 5 and 6, no specific signalling in the ISO Base Media file format is supported. */
1913 typedef struct
1915 unsigned int reference_type : 1; /* 1: the reference is to a Segment Index Box
1916 * 0: the reference is to media content
1917 * For files based on the ISO Base Media file format, the reference is to a
1918 * Movie Fragment Box.
1919 * If a separate index segment is used, then entries with reference type 1 are
1920 * in the index segment, and entries with reference type 0 are in the media file. */
1921 unsigned int reference_size : 31; /* the distance in bytes from the first byte of the referenced item to the first
1922 * byte of the next referenced item, or in the case of the last entry, the end of
1923 * the referenced material */
1924 uint32_t subsegment_duration; /* when the reference is to Segment Index Box, i.e. reference_type is equal to 1:
1925 * this field carries the sum of the subsegment_duration fields in that box;
1926 * when the reference is to a subsegment:
1927 * this field carries the difference between the earliest presentation time of
1928 * any access unit of the reference stream in the next subsegment (or the first
1929 * subsegment of the next segment, if this is the last subsegment of the segment,
1930 * or the end presentation time of the reference stream if this is the last
1931 * subsegment of the stream) and the earliest presentation time of any access
1932 * unit of the reference stream in the referenced subsegment;
1933 * The duration is expressed in the timescale of the enclosing Segment Index Box. */
1934 unsigned int starts_with_SAP : 1; /* whether the referenced subsegments start with a SAP */
1935 unsigned int SAP_type : 3; /* a SAP type or the value 0
1936 * When starting with a SAP, the value 0 means a SAP may be of an unknown type.
1937 * Otherwise, the value 0 means no information of SAPs is provided. */
1938 unsigned int SAP_delta_time : 28; /* TSAP of the first SAP, in decoding order, in the referenced subsegment for
1939 * the reference stream
1940 * If the referenced subsegments do not contain a SAP, SAP_delta_time is
1941 * reserved with the value 0, otherwise SAP_delta_time is the difference between
1942 * the earliest presentation time of the subsegment, and the TSAP.
1943 * Note that this difference may be zero, in the case that the subsegment starts
1944 * with a SAP. */
1945 } isom_sidx_referenced_item_t;
1947 typedef struct
1949 ISOM_FULLBOX_COMMON;
1950 uint32_t reference_ID; /* the stream ID for the reference stream
1951 * If this Segment Index box is referenced from a "parent" Segment Index box, the value
1952 * of the value of reference_ID shall be the same as the value of reference_ID of the
1953 * "parent" Segment Index Box. */
1954 uint32_t timescale; /* the timescale, in ticks per second, for the time and duration fields within this box
1955 * It is recommended that this match the timescale of the reference stream or track.
1956 * For files based on the ISO Base Media file format, that is the timescale field of
1957 * the Media Header Box of the track. */
1958 /* version == 0: 64bits -> 32bits */
1959 uint64_t earliest_presentation_time; /* the earliest presentation time of any access unit in the reference stream
1960 * in the first subsegment, in the timescale indicated in the timescale field */
1961 uint64_t first_offset; /* the distance in bytes, in the file containing media, from the anchor point,
1962 * to the first byte of the indexed material */
1963 /* */
1964 uint16_t reserved; /* 0 */
1965 uint16_t reference_count; /* the number of referenced items */
1966 lsmash_entry_list_t *list; /* entry_count corresponds to reference_count. */
1967 } isom_sidx_t;
1969 /** **/
1971 /* File */
1972 struct lsmash_file_tag
1974 ISOM_FULLBOX_COMMON; /* The 'size' field indicates total file size.
1975 * The 'flags' field indicates file mode. */
1976 isom_ftyp_t *ftyp; /* File Type Box */
1977 lsmash_entry_list_t styp_list; /* Segment Type Box List */
1978 isom_moov_t *moov; /* Movie Box */
1979 lsmash_entry_list_t sidx_list; /* Segment Index Box List */
1980 lsmash_entry_list_t moof_list; /* Movie Fragment Box List */
1981 isom_mdat_t *mdat; /* Media Data Box */
1982 isom_meta_t *meta; /* Meta Box */
1983 isom_mfra_t *mfra; /* Movie Fragment Random Access Box */
1985 lsmash_bs_t *bs; /* bytestream manager */
1986 isom_fragment_manager_t *fragment; /* movie fragment manager */
1987 lsmash_entry_list_t *print;
1988 lsmash_entry_list_t *timeline;
1989 lsmash_file_t *initializer; /* A file containing the initialization information of whole movie including subsequent segments
1990 * For ISOBMFF, an initializer corresponds to a file containing the 'moov' box.
1991 * ROOT-to-initializer is designed to be a one-to-one relationship while initializer-to-file
1992 * is designed to be a one-to-many relationship. */
1993 struct importer_tag *importer; /* An importer of this file
1994 * Importer-to-file is designed to be a one-to-one relationship. */
1995 uint64_t fragment_count; /* the number of movie fragments we created */
1996 double max_chunk_duration; /* max duration per chunk in seconds */
1997 double max_async_tolerance; /* max tolerance, in seconds, for amount of interleaving asynchronization between tracks */
1998 uint64_t max_chunk_size; /* max size per chunk in bytes. */
1999 uint32_t brand_count;
2000 uint32_t *compatible_brands; /* the backup of the compatible brands in the File Type Box or the valid Segment Type Box */
2001 uint8_t fake_file_mode; /* If set to 1, the bytestream manager handles fake-file stream. */
2002 /* flags for compatibility */
2003 #define COMPAT_FLAGS_OFFSET offsetof( lsmash_file_t, qt_compatible )
2004 uint8_t qt_compatible; /* compatibility with QuickTime file format */
2005 uint8_t isom_compatible; /* compatibility with ISO Base Media file format */
2006 uint8_t avc_extensions; /* compatibility with AVC extensions */
2007 uint8_t mp4_version1; /* compatibility with MP4 ver.1 file format */
2008 uint8_t mp4_version2; /* compatibility with MP4 ver.2 file format */
2009 uint8_t itunes_movie; /* compatibility with iTunes Movie */
2010 uint8_t max_3gpp_version; /* maximum 3GPP version */
2011 uint8_t max_isom_version; /* maximum ISO Base Media file format version */
2012 uint8_t min_isom_version; /* minimum ISO Base Media file format version */
2013 uint8_t forbid_tref; /* If set to 1, track reference is forbidden. */
2014 uint8_t undefined_64_ver; /* If set to 1, 64-bit version fields, e.g. duration, are undefined. */
2015 uint8_t allow_moof_base; /* If set to 1, default-base-is-moof is available for muxing. */
2016 uint8_t media_segment; /* If set to 1, this file is a media segment. */
2019 /* fake-file stream */
2020 typedef struct
2022 uint32_t size;
2023 uint8_t *data;
2024 uint32_t pos;
2025 } fake_file_stream_t;
2027 /* ROOT */
2028 struct lsmash_root_tag
2030 ISOM_FULLBOX_COMMON; /* The 'file' field contains the address of the current active file. */
2031 lsmash_entry_list_t file_abstract_list; /* the list of all files the ROOT contains */
2034 /** **/
2036 /* Pre-defined precedence */
2037 #define LSMASH_BOX_PRECEDENCE_ISOM_FTYP (LSMASH_BOX_PRECEDENCE_H - 0 * LSMASH_BOX_PRECEDENCE_S)
2038 #define LSMASH_BOX_PRECEDENCE_ISOM_STYP (LSMASH_BOX_PRECEDENCE_H - 0 * LSMASH_BOX_PRECEDENCE_S)
2039 #define LSMASH_BOX_PRECEDENCE_ISOM_SIDX (LSMASH_BOX_PRECEDENCE_N + 1 * LSMASH_BOX_PRECEDENCE_S) /* shall be placed before any 'moof' of the documented subsegments */
2040 #define LSMASH_BOX_PRECEDENCE_ISOM_MOOV (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2041 #define LSMASH_BOX_PRECEDENCE_ISOM_MVHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2042 #define LSMASH_BOX_PRECEDENCE_ISOM_IODS (LSMASH_BOX_PRECEDENCE_HM - 2 * LSMASH_BOX_PRECEDENCE_S)
2043 #define LSMASH_BOX_PRECEDENCE_ISOM_TRAK (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2044 #define LSMASH_BOX_PRECEDENCE_ISOM_TKHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2045 #define LSMASH_BOX_PRECEDENCE_QTFF_TAPT (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2046 #define LSMASH_BOX_PRECEDENCE_QTFF_CLEF (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2047 #define LSMASH_BOX_PRECEDENCE_QTFF_PROF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2048 #define LSMASH_BOX_PRECEDENCE_QTFF_ENOF (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2049 #define LSMASH_BOX_PRECEDENCE_ISOM_EDTS (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2050 #define LSMASH_BOX_PRECEDENCE_ISOM_ELST (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2051 #define LSMASH_BOX_PRECEDENCE_ISOM_TREF (LSMASH_BOX_PRECEDENCE_N - 3 * LSMASH_BOX_PRECEDENCE_S)
2052 #define LSMASH_BOX_PRECEDENCE_ISOM_TREF_TYPE (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2053 #define LSMASH_BOX_PRECEDENCE_ISOM_MDIA (LSMASH_BOX_PRECEDENCE_N - 4 * LSMASH_BOX_PRECEDENCE_S)
2054 #define LSMASH_BOX_PRECEDENCE_ISOM_MDHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2055 #define LSMASH_BOX_PRECEDENCE_ISOM_HDLR (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2056 #define LSMASH_BOX_PRECEDENCE_ISOM_MINF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2057 #define LSMASH_BOX_PRECEDENCE_ISOM_VMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2058 #define LSMASH_BOX_PRECEDENCE_ISOM_SMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2059 #define LSMASH_BOX_PRECEDENCE_ISOM_HMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2060 #define LSMASH_BOX_PRECEDENCE_ISOM_NMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2061 #define LSMASH_BOX_PRECEDENCE_QTFF_GMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2062 #define LSMASH_BOX_PRECEDENCE_QTFF_GMIN (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2063 #define LSMASH_BOX_PRECEDENCE_QTFF_TEXT (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2064 #define LSMASH_BOX_PRECEDENCE_ISOM_DINF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2065 #define LSMASH_BOX_PRECEDENCE_ISOM_DREF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2066 #define LSMASH_BOX_PRECEDENCE_ISOM_DREF_ENTRY (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2067 #define LSMASH_BOX_PRECEDENCE_ISOM_STBL (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2068 #define LSMASH_BOX_PRECEDENCE_ISOM_STSD (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2069 #define LSMASH_BOX_PRECEDENCE_QTFF_GLBL (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2070 #define LSMASH_BOX_PRECEDENCE_ISOM_ESDS (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2071 #define LSMASH_BOX_PRECEDENCE_QTFF_ESDS (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S) /* preceded by 'frma' and 'mp4a' */
2072 #define LSMASH_BOX_PRECEDENCE_ISOM_BTRT (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S)
2073 #define LSMASH_BOX_PRECEDENCE_ISOM_TIMS (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2074 #define LSMASH_BOX_PRECEDENCE_ISOM_TSRO (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S)
2075 #define LSMASH_BOX_PRECEDENCE_ISOM_TSSY (LSMASH_BOX_PRECEDENCE_HM - 2 * LSMASH_BOX_PRECEDENCE_S)
2076 #define LSMASH_BOX_PRECEDENCE_ISOM_COLR (LSMASH_BOX_PRECEDENCE_LP + 2 * LSMASH_BOX_PRECEDENCE_S)
2077 #define LSMASH_BOX_PRECEDENCE_QTFF_COLR (LSMASH_BOX_PRECEDENCE_LP + 2 * LSMASH_BOX_PRECEDENCE_S)
2078 #define LSMASH_BOX_PRECEDENCE_QTFF_GAMA (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2079 #define LSMASH_BOX_PRECEDENCE_QTFF_FIEL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2080 #define LSMASH_BOX_PRECEDENCE_QTFF_CSPC (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2081 #define LSMASH_BOX_PRECEDENCE_QTFF_SGBT (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S) /* 'v216' specific */
2082 #define LSMASH_BOX_PRECEDENCE_ISOM_CLAP (LSMASH_BOX_PRECEDENCE_LP + 1 * LSMASH_BOX_PRECEDENCE_S)
2083 #define LSMASH_BOX_PRECEDENCE_ISOM_PASP (LSMASH_BOX_PRECEDENCE_LP - 0 * LSMASH_BOX_PRECEDENCE_S)
2084 #define LSMASH_BOX_PRECEDENCE_ISOM_STSL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2085 #define LSMASH_BOX_PRECEDENCE_ISOM_CHAN (LSMASH_BOX_PRECEDENCE_LP - 0 * LSMASH_BOX_PRECEDENCE_S)
2086 #define LSMASH_BOX_PRECEDENCE_QTFF_CHAN (LSMASH_BOX_PRECEDENCE_LP - 0 * LSMASH_BOX_PRECEDENCE_S)
2087 #define LSMASH_BOX_PRECEDENCE_QTFF_WAVE (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2088 #define LSMASH_BOX_PRECEDENCE_QTFF_FRMA (LSMASH_BOX_PRECEDENCE_HM + 1 * LSMASH_BOX_PRECEDENCE_S) /* precede any as much as possible */
2089 #define LSMASH_BOX_PRECEDENCE_QTFF_ENDA (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2090 #define LSMASH_BOX_PRECEDENCE_QTFF_MP4A (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2091 #define LSMASH_BOX_PRECEDENCE_QTFF_TERMINATOR (LSMASH_BOX_PRECEDENCE_L - 0 * LSMASH_BOX_PRECEDENCE_S)
2092 #define LSMASH_BOX_PRECEDENCE_ISOM_SRAT (LSMASH_BOX_PRECEDENCE_LP - 1 * LSMASH_BOX_PRECEDENCE_S) /* place at the end for maximum compatibility */
2093 #define LSMASH_BOX_PRECEDENCE_ISOM_FTAB (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2094 #define LSMASH_BOX_PRECEDENCE_ISOM_STTS (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2095 #define LSMASH_BOX_PRECEDENCE_ISOM_CTTS (LSMASH_BOX_PRECEDENCE_N - 4 * LSMASH_BOX_PRECEDENCE_S)
2096 #define LSMASH_BOX_PRECEDENCE_ISOM_CSLG (LSMASH_BOX_PRECEDENCE_N - 6 * LSMASH_BOX_PRECEDENCE_S)
2097 #define LSMASH_BOX_PRECEDENCE_ISOM_STSS (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2098 #define LSMASH_BOX_PRECEDENCE_QTFF_STPS (LSMASH_BOX_PRECEDENCE_N - 10 * LSMASH_BOX_PRECEDENCE_S)
2099 #define LSMASH_BOX_PRECEDENCE_ISOM_SDTP (LSMASH_BOX_PRECEDENCE_N - 12 * LSMASH_BOX_PRECEDENCE_S)
2100 #define LSMASH_BOX_PRECEDENCE_ISOM_STSC (LSMASH_BOX_PRECEDENCE_N - 14 * LSMASH_BOX_PRECEDENCE_S)
2101 #define LSMASH_BOX_PRECEDENCE_ISOM_STSZ (LSMASH_BOX_PRECEDENCE_N - 16 * LSMASH_BOX_PRECEDENCE_S)
2102 #define LSMASH_BOX_PRECEDENCE_ISOM_STZ2 (LSMASH_BOX_PRECEDENCE_N - 16 * LSMASH_BOX_PRECEDENCE_S)
2103 #define LSMASH_BOX_PRECEDENCE_ISOM_STCO (LSMASH_BOX_PRECEDENCE_N - 18 * LSMASH_BOX_PRECEDENCE_S)
2104 #define LSMASH_BOX_PRECEDENCE_ISOM_CO64 (LSMASH_BOX_PRECEDENCE_N - 18 * LSMASH_BOX_PRECEDENCE_S)
2105 #define LSMASH_BOX_PRECEDENCE_ISOM_SGPD (LSMASH_BOX_PRECEDENCE_N - 20 * LSMASH_BOX_PRECEDENCE_S)
2106 #define LSMASH_BOX_PRECEDENCE_ISOM_SBGP (LSMASH_BOX_PRECEDENCE_N - 22 * LSMASH_BOX_PRECEDENCE_S)
2107 #define LSMASH_BOX_PRECEDENCE_ISOM_UDTA (LSMASH_BOX_PRECEDENCE_N - 5 * LSMASH_BOX_PRECEDENCE_S)
2108 #define LSMASH_BOX_PRECEDENCE_ISOM_MEAN (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2109 #define LSMASH_BOX_PRECEDENCE_ISOM_NAME (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2110 #define LSMASH_BOX_PRECEDENCE_ISOM_DATA (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2111 #define LSMASH_BOX_PRECEDENCE_QTFF_KEYS (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2112 #define LSMASH_BOX_PRECEDENCE_ISOM_ILST (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2113 #define LSMASH_BOX_PRECEDENCE_ISOM_METAITEM (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2114 #define LSMASH_BOX_PRECEDENCE_ISOM_CHPL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2115 #define LSMASH_BOX_PRECEDENCE_ISOM_META (LSMASH_BOX_PRECEDENCE_N - 7 * LSMASH_BOX_PRECEDENCE_S)
2116 #define LSMASH_BOX_PRECEDENCE_ISOM_HNTI (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2117 #define LSMASH_BOX_PRECEDENCE_ISOM_RTP (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2118 #define LSMASH_BOX_PRECEDENCE_ISOM_SDP (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2119 #define LSMASH_BOX_PRECEDENCE_QTFF_WLOC (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2120 #define LSMASH_BOX_PRECEDENCE_QTFF_LOOP (LSMASH_BOX_PRECEDENCE_N - 9 * LSMASH_BOX_PRECEDENCE_S)
2121 #define LSMASH_BOX_PRECEDENCE_QTFF_SELO (LSMASH_BOX_PRECEDENCE_N - 10 * LSMASH_BOX_PRECEDENCE_S)
2122 #define LSMASH_BOX_PRECEDENCE_QTFF_ALLF (LSMASH_BOX_PRECEDENCE_N - 11 * LSMASH_BOX_PRECEDENCE_S)
2123 #define LSMASH_BOX_PRECEDENCE_ISOM_CPRT (LSMASH_BOX_PRECEDENCE_N - 12 * LSMASH_BOX_PRECEDENCE_S)
2124 #define LSMASH_BOX_PRECEDENCE_QTFF_CTAB (LSMASH_BOX_PRECEDENCE_N - 6 * LSMASH_BOX_PRECEDENCE_S)
2125 #define LSMASH_BOX_PRECEDENCE_ISOM_MVEX (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2126 #define LSMASH_BOX_PRECEDENCE_ISOM_MEHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2127 #define LSMASH_BOX_PRECEDENCE_ISOM_TREX (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2128 #define LSMASH_BOX_PRECEDENCE_ISOM_MOOF (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2129 #define LSMASH_BOX_PRECEDENCE_ISOM_MFHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2130 #define LSMASH_BOX_PRECEDENCE_ISOM_TRAF (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2131 #define LSMASH_BOX_PRECEDENCE_ISOM_TFHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2132 #define LSMASH_BOX_PRECEDENCE_ISOM_TFDT (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S) /* shall be positioned after 'tfhd' and before 'trun' */
2133 #define LSMASH_BOX_PRECEDENCE_ISOM_TRUN (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2134 #define LSMASH_BOX_PRECEDENCE_ISOM_MFRA (LSMASH_BOX_PRECEDENCE_L - 0 * LSMASH_BOX_PRECEDENCE_S)
2135 #define LSMASH_BOX_PRECEDENCE_ISOM_TFRA (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2136 #define LSMASH_BOX_PRECEDENCE_ISOM_MFRO (LSMASH_BOX_PRECEDENCE_L - 0 * LSMASH_BOX_PRECEDENCE_S)
2137 #define LSMASH_BOX_PRECEDENCE_ISOM_MDAT (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2138 #define LSMASH_BOX_PRECEDENCE_ISOM_FREE (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2139 #define LSMASH_BOX_PRECEDENCE_ISOM_SKIP (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2141 /* Track reference types */
2142 typedef enum
2144 ISOM_TREF_TYPE_AVCP = LSMASH_4CC( 'a', 'v', 'c', 'p' ), /* AVC parameter set stream link */
2145 ISOM_TREF_TYPE_CDSC = LSMASH_4CC( 'c', 'd', 's', 'c' ), /* This track describes the referenced track. */
2146 ISOM_TREF_TYPE_DPND = LSMASH_4CC( 'd', 'p', 'n', 'd' ), /* This track has an MPEG-4 dependency on the referenced track. */
2147 ISOM_TREF_TYPE_HIND = LSMASH_4CC( 'h', 'i', 'n', 'd' ), /* Hint dependency */
2148 ISOM_TREF_TYPE_HINT = LSMASH_4CC( 'h', 'i', 'n', 't' ), /* Links hint track to original media track */
2149 ISOM_TREF_TYPE_IPIR = LSMASH_4CC( 'i', 'p', 'i', 'r' ), /* This track contains IPI declarations for the referenced track. */
2150 ISOM_TREF_TYPE_MPOD = LSMASH_4CC( 'm', 'p', 'o', 'd' ), /* This track is an OD track which uses the referenced track as an included elementary stream track. */
2151 ISOM_TREF_TYPE_SBAS = LSMASH_4CC( 's', 'b', 'a', 's' ), /* Scalable base */
2152 ISOM_TREF_TYPE_SCAL = LSMASH_4CC( 's', 'c', 'a', 'l' ), /* Scalable extraction */
2153 ISOM_TREF_TYPE_SWFR = LSMASH_4CC( 's', 'w', 'f', 'r' ), /* AVC Switch from */
2154 ISOM_TREF_TYPE_SWTO = LSMASH_4CC( 's', 'w', 't', 'o' ), /* AVC Switch to */
2155 ISOM_TREF_TYPE_SYNC = LSMASH_4CC( 's', 'y', 'n', 'c' ), /* This track uses the referenced track as its synchronization source. */
2156 ISOM_TREF_TYPE_VDEP = LSMASH_4CC( 'v', 'd', 'e', 'p' ), /* Auxiliary video depth */
2157 ISOM_TREF_TYPE_VPLX = LSMASH_4CC( 'v', 'p', 'l', 'x' ), /* Auxiliary video parallax */
2159 QT_TREF_TYPE_CHAP = LSMASH_4CC( 'c', 'h', 'a', 'p' ), /* Chapter or scene list. Usually references a text track. */
2160 QT_TREF_TYPE_SCPT = LSMASH_4CC( 's', 'c', 'p', 't' ), /* Transcript. Usually references a text track. */
2161 QT_TREF_TYPE_SSRC = LSMASH_4CC( 's', 's', 'r', 'c' ), /* Nonprimary source. Indicates that the referenced track should send its data to this track, rather than presenting it. */
2162 QT_TREF_TYPE_TMCD = LSMASH_4CC( 't', 'm', 'c', 'd' ), /* Time code. Usually references a time code track. */
2163 } isom_track_reference_type;
2165 /* Handler types */
2166 enum isom_handler_type
2168 QT_HANDLER_TYPE_DATA = LSMASH_4CC( 'd', 'h', 'l', 'r' ),
2169 QT_HANDLER_TYPE_MEDIA = LSMASH_4CC( 'm', 'h', 'l', 'r' ),
2172 enum isom_meta_type
2174 ISOM_META_HANDLER_TYPE_ITUNES_METADATA = LSMASH_4CC( 'm', 'd', 'i', 'r' ),
2177 /* Data reference types */
2178 enum isom_data_reference_type
2180 ISOM_REFERENCE_HANDLER_TYPE_URL = LSMASH_4CC( 'u', 'r', 'l', ' ' ),
2181 ISOM_REFERENCE_HANDLER_TYPE_URN = LSMASH_4CC( 'u', 'r', 'n', ' ' ),
2183 QT_REFERENCE_HANDLER_TYPE_ALIAS = LSMASH_4CC( 'a', 'l', 'i', 's' ),
2184 QT_REFERENCE_HANDLER_TYPE_RESOURCE = LSMASH_4CC( 'r', 's', 'r', 'c' ),
2185 QT_REFERENCE_HANDLER_TYPE_URL = LSMASH_4CC( 'u', 'r', 'l', ' ' ),
2188 /* Lanuage codes */
2189 typedef struct
2191 uint16_t mac_value;
2192 uint16_t iso_name;
2193 } isom_language_t;
2195 static const isom_language_t isom_languages[] =
2197 { 0, ISOM_LANGUAGE_CODE_ENGLISH },
2198 { 1, ISOM_LANGUAGE_CODE_FRENCH },
2199 { 2, ISOM_LANGUAGE_CODE_GERMAN },
2200 { 3, ISOM_LANGUAGE_CODE_ITALIAN },
2201 { 4, ISOM_LANGUAGE_CODE_DUTCH_M },
2202 { 5, ISOM_LANGUAGE_CODE_SWEDISH },
2203 { 6, ISOM_LANGUAGE_CODE_SPANISH },
2204 { 7, ISOM_LANGUAGE_CODE_DANISH },
2205 { 8, ISOM_LANGUAGE_CODE_PORTUGUESE },
2206 { 9, ISOM_LANGUAGE_CODE_NORWEGIAN },
2207 { 10, ISOM_LANGUAGE_CODE_HEBREW },
2208 { 11, ISOM_LANGUAGE_CODE_JAPANESE },
2209 { 12, ISOM_LANGUAGE_CODE_ARABIC },
2210 { 13, ISOM_LANGUAGE_CODE_FINNISH },
2211 { 14, ISOM_LANGUAGE_CODE_GREEK },
2212 { 15, ISOM_LANGUAGE_CODE_ICELANDIC },
2213 { 16, ISOM_LANGUAGE_CODE_MALTESE },
2214 { 17, ISOM_LANGUAGE_CODE_TURKISH },
2215 { 18, ISOM_LANGUAGE_CODE_CROATIAN },
2216 { 19, ISOM_LANGUAGE_CODE_CHINESE },
2217 { 20, ISOM_LANGUAGE_CODE_URDU },
2218 { 21, ISOM_LANGUAGE_CODE_HINDI },
2219 { 22, ISOM_LANGUAGE_CODE_THAI },
2220 { 23, ISOM_LANGUAGE_CODE_KOREAN },
2221 { 24, ISOM_LANGUAGE_CODE_LITHUANIAN },
2222 { 25, ISOM_LANGUAGE_CODE_POLISH },
2223 { 26, ISOM_LANGUAGE_CODE_HUNGARIAN },
2224 { 27, ISOM_LANGUAGE_CODE_ESTONIAN },
2225 { 28, ISOM_LANGUAGE_CODE_LATVIAN },
2226 { 29, ISOM_LANGUAGE_CODE_SAMI },
2227 { 30, ISOM_LANGUAGE_CODE_FAROESE },
2228 { 32, ISOM_LANGUAGE_CODE_RUSSIAN },
2229 { 33, ISOM_LANGUAGE_CODE_CHINESE },
2230 { 34, ISOM_LANGUAGE_CODE_DUTCH },
2231 { 35, ISOM_LANGUAGE_CODE_IRISH },
2232 { 36, ISOM_LANGUAGE_CODE_ALBANIAN },
2233 { 37, ISOM_LANGUAGE_CODE_ROMANIAN },
2234 { 38, ISOM_LANGUAGE_CODE_CZECH },
2235 { 39, ISOM_LANGUAGE_CODE_SLOVAK },
2236 { 40, ISOM_LANGUAGE_CODE_SLOVENIA },
2237 { 41, ISOM_LANGUAGE_CODE_YIDDISH },
2238 { 42, ISOM_LANGUAGE_CODE_SERBIAN },
2239 { 43, ISOM_LANGUAGE_CODE_MACEDONIAN },
2240 { 44, ISOM_LANGUAGE_CODE_BULGARIAN },
2241 { 45, ISOM_LANGUAGE_CODE_UKRAINIAN },
2242 { 46, ISOM_LANGUAGE_CODE_BELARUSIAN },
2243 { 47, ISOM_LANGUAGE_CODE_UZBEK },
2244 { 48, ISOM_LANGUAGE_CODE_KAZAKH },
2245 { 49, ISOM_LANGUAGE_CODE_AZERBAIJANI },
2246 { 51, ISOM_LANGUAGE_CODE_ARMENIAN },
2247 { 52, ISOM_LANGUAGE_CODE_GEORGIAN },
2248 { 53, ISOM_LANGUAGE_CODE_MOLDAVIAN },
2249 { 54, ISOM_LANGUAGE_CODE_KIRGHIZ },
2250 { 55, ISOM_LANGUAGE_CODE_TAJIK },
2251 { 56, ISOM_LANGUAGE_CODE_TURKMEN },
2252 { 57, ISOM_LANGUAGE_CODE_MONGOLIAN },
2253 { 59, ISOM_LANGUAGE_CODE_PASHTO },
2254 { 60, ISOM_LANGUAGE_CODE_KURDISH },
2255 { 61, ISOM_LANGUAGE_CODE_KASHMIRI },
2256 { 62, ISOM_LANGUAGE_CODE_SINDHI },
2257 { 63, ISOM_LANGUAGE_CODE_TIBETAN },
2258 { 64, ISOM_LANGUAGE_CODE_NEPALI },
2259 { 65, ISOM_LANGUAGE_CODE_SANSKRIT },
2260 { 66, ISOM_LANGUAGE_CODE_MARATHI },
2261 { 67, ISOM_LANGUAGE_CODE_BENGALI },
2262 { 68, ISOM_LANGUAGE_CODE_ASSAMESE },
2263 { 69, ISOM_LANGUAGE_CODE_GUJARATI },
2264 { 70, ISOM_LANGUAGE_CODE_PUNJABI },
2265 { 71, ISOM_LANGUAGE_CODE_ORIYA },
2266 { 72, ISOM_LANGUAGE_CODE_MALAYALAM },
2267 { 73, ISOM_LANGUAGE_CODE_KANNADA },
2268 { 74, ISOM_LANGUAGE_CODE_TAMIL },
2269 { 75, ISOM_LANGUAGE_CODE_TELUGU },
2270 { 76, ISOM_LANGUAGE_CODE_SINHALESE },
2271 { 77, ISOM_LANGUAGE_CODE_BURMESE },
2272 { 78, ISOM_LANGUAGE_CODE_KHMER },
2273 { 79, ISOM_LANGUAGE_CODE_LAO },
2274 { 80, ISOM_LANGUAGE_CODE_VIETNAMESE },
2275 { 81, ISOM_LANGUAGE_CODE_INDONESIAN },
2276 { 82, ISOM_LANGUAGE_CODE_TAGALOG },
2277 { 83, ISOM_LANGUAGE_CODE_MALAY_ROMAN },
2278 { 84, ISOM_LANGUAGE_CODE_MAYAY_ARABIC },
2279 { 85, ISOM_LANGUAGE_CODE_AMHARIC },
2280 { 87, ISOM_LANGUAGE_CODE_OROMO },
2281 { 88, ISOM_LANGUAGE_CODE_SOMALI },
2282 { 89, ISOM_LANGUAGE_CODE_SWAHILI },
2283 { 90, ISOM_LANGUAGE_CODE_KINYARWANDA },
2284 { 91, ISOM_LANGUAGE_CODE_RUNDI },
2285 { 92, ISOM_LANGUAGE_CODE_CHEWA },
2286 { 93, ISOM_LANGUAGE_CODE_MALAGASY },
2287 { 94, ISOM_LANGUAGE_CODE_ESPERANTO },
2288 { 128, ISOM_LANGUAGE_CODE_WELSH },
2289 { 129, ISOM_LANGUAGE_CODE_BASQUE },
2290 { 130, ISOM_LANGUAGE_CODE_CATALAN },
2291 { 131, ISOM_LANGUAGE_CODE_LATIN },
2292 { 132, ISOM_LANGUAGE_CODE_QUECHUA },
2293 { 133, ISOM_LANGUAGE_CODE_GUARANI },
2294 { 134, ISOM_LANGUAGE_CODE_AYMARA },
2295 { 135, ISOM_LANGUAGE_CODE_TATAR },
2296 { 136, ISOM_LANGUAGE_CODE_UIGHUR },
2297 { 137, ISOM_LANGUAGE_CODE_DZONGKHA },
2298 { 138, ISOM_LANGUAGE_CODE_JAVANESE },
2299 { UINT16_MAX, 0 }
2302 /* Color parameters */
2303 enum isom_color_patameter_type
2305 ISOM_COLOR_PARAMETER_TYPE_NCLX = LSMASH_4CC( 'n', 'c', 'l', 'x' ), /* on-screen colours */
2306 ISOM_COLOR_PARAMETER_TYPE_RICC = LSMASH_4CC( 'r', 'I', 'C', 'C' ), /* restricted ICC profile */
2307 ISOM_COLOR_PARAMETER_TYPE_PROF = LSMASH_4CC( 'p', 'r', 'o', 'f' ), /* unrestricted ICC profile */
2309 QT_COLOR_PARAMETER_TYPE_NCLC = LSMASH_4CC( 'n', 'c', 'l', 'c' ), /* NonConstant Luminance Coding */
2310 QT_COLOR_PARAMETER_TYPE_PROF = LSMASH_4CC( 'p', 'r', 'o', 'f' ), /* ICC profile */
2313 /* Sample grouping types */
2314 typedef enum
2316 ISOM_GROUP_TYPE_3GAG = LSMASH_4CC( '3', 'g', 'a', 'g' ), /* Text track3GPP PSS Annex G video buffer parameters */
2317 ISOM_GROUP_TYPE_ALST = LSMASH_4CC( 'a', 'l', 's', 't' ), /* Alternative startup sequence */
2318 ISOM_GROUP_TYPE_AVCB = LSMASH_4CC( 'a', 'v', 'c', 'b' ), /* AVC HRD parameters */
2319 ISOM_GROUP_TYPE_AVLL = LSMASH_4CC( 'a', 'v', 'l', 'l' ), /* AVC Layer */
2320 ISOM_GROUP_TYPE_AVSS = LSMASH_4CC( 'a', 'v', 's', 's' ), /* AVC Sub Sequence */
2321 ISOM_GROUP_TYPE_DTRT = LSMASH_4CC( 'd', 't', 'r', 't' ), /* Decode re-timing */
2322 ISOM_GROUP_TYPE_MVIF = LSMASH_4CC( 'm', 'v', 'i', 'f' ), /* MVC Scalability Information */
2323 ISOM_GROUP_TYPE_PROL = LSMASH_4CC( 'p', 'r', 'o', 'l' ), /* Pre-roll */
2324 ISOM_GROUP_TYPE_RAP = LSMASH_4CC( 'r', 'a', 'p', ' ' ), /* Random Access Point */
2325 ISOM_GROUP_TYPE_RASH = LSMASH_4CC( 'r', 'a', 's', 'h' ), /* Rate Share */
2326 ISOM_GROUP_TYPE_ROLL = LSMASH_4CC( 'r', 'o', 'l', 'l' ), /* Pre-roll/Post-roll */
2327 ISOM_GROUP_TYPE_SCIF = LSMASH_4CC( 's', 'c', 'i', 'f' ), /* SVC Scalability Information */
2328 ISOM_GROUP_TYPE_SCNM = LSMASH_4CC( 's', 'c', 'n', 'm' ), /* AVC/SVC/MVC map groups */
2329 ISOM_GROUP_TYPE_VIPR = LSMASH_4CC( 'v', 'i', 'p', 'r' ), /* View priority */
2330 } isom_grouping_type;
2332 /* wrapper to avoid boring cast */
2333 #define isom_init_box_common( box, parent, box_type, precedence, destructor ) \
2334 isom_init_box_common_orig( box, parent, box_type, precedence, (isom_extension_destructor_t)(destructor) )
2336 void isom_init_box_common_orig
2338 void *box,
2339 void *parent,
2340 lsmash_box_type_t box_type,
2341 uint64_t precedence,
2342 isom_extension_destructor_t destructor
2345 int isom_is_fullbox( const void *box );
2346 int isom_is_lpcm_audio( const void *box );
2347 int isom_is_qt_audio( lsmash_codec_type_t type );
2348 int isom_is_uncompressed_ycbcr( lsmash_codec_type_t type );
2349 int isom_is_waveform_audio( lsmash_box_type_t type );
2351 size_t isom_skip_box_common
2353 uint8_t **p_data
2356 uint8_t *isom_get_child_box_position
2358 uint8_t *parent_data,
2359 uint32_t parent_size,
2360 lsmash_box_type_t child_type,
2361 uint32_t *child_size
2364 void isom_bs_put_basebox_common( lsmash_bs_t *bs, isom_box_t *box );
2365 void isom_bs_put_fullbox_common( lsmash_bs_t *bs, isom_box_t *box );
2366 void isom_bs_put_box_common( lsmash_bs_t *bs, void *box );
2368 #define isom_is_printable_char( c ) ((c) >= 32 && (c) < 128)
2369 #define isom_is_printable_4cc( fourcc ) \
2370 (isom_is_printable_char( ((fourcc) >> 24) & 0xff ) \
2371 && isom_is_printable_char( ((fourcc) >> 16) & 0xff ) \
2372 && isom_is_printable_char( ((fourcc) >> 8) & 0xff ) \
2373 && isom_is_printable_char( (fourcc) & 0xff ))
2375 #define isom_4cc2str( fourcc ) (const char [5]){ (fourcc) >> 24, (fourcc) >> 16, (fourcc) >> 8, (fourcc), 0 }
2377 int isom_check_initializer_present( lsmash_root_t *root );
2379 isom_trak_t *isom_get_trak( lsmash_file_t *file, uint32_t track_ID );
2380 isom_trex_t *isom_get_trex( isom_mvex_t *mvex, uint32_t track_ID );
2381 isom_traf_t *isom_get_traf( isom_moof_t *moof, uint32_t track_ID );
2382 isom_tfra_t *isom_get_tfra( isom_mfra_t *mfra, uint32_t track_ID );
2383 isom_sgpd_t *isom_get_sample_group_description( isom_stbl_t *stbl, uint32_t grouping_type );
2384 isom_sbgp_t *isom_get_sample_to_group( isom_stbl_t *stbl, uint32_t grouping_type );
2385 isom_sgpd_t *isom_get_roll_recovery_sample_group_description( lsmash_entry_list_t *list );
2386 isom_sbgp_t *isom_get_roll_recovery_sample_to_group( lsmash_entry_list_t *list );
2387 isom_sgpd_t *isom_get_fragment_sample_group_description( isom_traf_t *traf, uint32_t grouping_type );
2388 isom_sbgp_t *isom_get_fragment_sample_to_group( isom_traf_t *traf, uint32_t grouping_type );
2390 isom_trak_t *isom_track_create( lsmash_file_t *file, lsmash_media_type media_type );
2391 isom_moov_t *isom_movie_create( lsmash_file_t *file );
2393 int isom_setup_handler_reference( isom_hdlr_t *hdlr, uint32_t media_type );
2394 int isom_setup_iods( isom_moov_t *moov );
2396 uint32_t isom_get_sample_count
2398 isom_trak_t *trak
2401 isom_sample_pool_t *isom_create_sample_pool
2403 uint64_t size
2406 int isom_update_sample_tables
2408 isom_trak_t *trak,
2409 lsmash_sample_t *sample,
2410 uint32_t *samples_per_packet,
2411 isom_sample_entry_t *sample_entry
2414 int isom_pool_sample
2416 isom_sample_pool_t *pool,
2417 lsmash_sample_t *sample,
2418 uint32_t samples_per_packet
2421 int isom_append_sample_by_type
2423 void *track,
2424 lsmash_sample_t *sample,
2425 isom_sample_entry_t *sample_entry,
2426 int (*func_append_sample)( void *, lsmash_sample_t *, isom_sample_entry_t * )
2429 int isom_calculate_bitrate_description
2431 isom_stbl_t *stbl,
2432 isom_mdhd_t *mdhd,
2433 uint32_t *bufferSizeDB,
2434 uint32_t *maxBitrate,
2435 uint32_t *avgBitrate,
2436 uint32_t sample_description_index
2439 int isom_is_variable_size
2441 isom_stbl_t *stbl
2444 uint32_t isom_get_first_sample_size
2446 isom_stbl_t *stbl
2450 void isom_update_cache_timestamp
2452 isom_cache_t *cache,
2453 uint64_t dts,
2454 uint64_t cts,
2455 int32_t ctd_shift,
2456 uint32_t sample_duration,
2457 int non_output_sample
2460 /* Make CTS from DTS and sample_offset.
2461 * This function does NOT add the value of composition to decode timeline shift to the result. */
2462 static inline uint64_t isom_make_cts
2464 uint64_t dts,
2465 uint32_t sample_offset,
2466 int32_t ctd_shift
2469 if( sample_offset != ISOM_NON_OUTPUT_SAMPLE_OFFSET )
2470 return ctd_shift ? (dts + (int32_t)sample_offset) : (dts + sample_offset);
2471 else
2472 return LSMASH_TIMESTAMP_UNDEFINED;
2475 /* Make CTS from DTS and sample_offset.
2476 * This function adds the value of composition to decode timeline shift to the result. */
2477 static inline uint64_t isom_make_cts_adjust
2479 uint64_t dts,
2480 uint32_t sample_offset,
2481 int32_t ctd_shift
2484 if( sample_offset != ISOM_NON_OUTPUT_SAMPLE_OFFSET )
2485 return ctd_shift ? (dts + (int32_t)sample_offset + ctd_shift) : (dts + sample_offset);
2486 else
2487 return LSMASH_TIMESTAMP_UNDEFINED;
2490 /* Utilities for sample entry type decision
2491 * NOTE: This implementation does not work when 'mdia' and/or 'hdlr' is stored as binary string. */
2492 static inline int isom_check_media_hdlr_from_stsd( isom_stsd_t *stsd )
2494 return ((isom_stbl_t *)stsd->parent
2495 && (isom_minf_t *)stsd->parent->parent
2496 && (isom_mdia_t *)stsd->parent->parent->parent
2497 && ((isom_mdia_t *)stsd->parent->parent->parent)->hdlr);
2499 static inline lsmash_media_type isom_get_media_type_from_stsd( isom_stsd_t *stsd )
2501 assert( isom_check_media_hdlr_from_stsd( stsd ) );
2502 return ((isom_mdia_t *)stsd->parent->parent->parent)->hdlr->componentSubtype;
2505 int isom_add_sample_grouping( isom_box_t *parent, isom_grouping_type grouping_type );
2506 int isom_group_random_access( isom_box_t *parent, isom_cache_t *cache, lsmash_sample_t *sample );
2507 int isom_group_roll_recovery( isom_box_t *parent, isom_cache_t *cache, lsmash_sample_t *sample );
2509 int isom_update_tkhd_duration( isom_trak_t *trak );
2510 int isom_update_bitrate_description( isom_mdia_t *mdia );
2511 int isom_complement_data_reference( isom_minf_t *minf );
2512 int isom_check_large_offset_requirement( isom_moov_t *moov, uint64_t meta_size );
2513 void isom_add_preceding_box_size( isom_moov_t *moov, uint64_t preceding_size );
2514 int isom_establish_movie( lsmash_file_t *file );
2515 int isom_rap_grouping_established( isom_rap_group_t *group, int num_leading_samples_known, isom_sgpd_t *sgpd, int is_fragment );
2516 int isom_all_recovery_completed( isom_sbgp_t *sbgp, lsmash_entry_list_t *pool );
2518 lsmash_file_t *isom_add_file_abstract( lsmash_root_t *root );
2519 isom_ftyp_t *isom_add_ftyp( lsmash_file_t *file );
2520 isom_moov_t *isom_add_moov( lsmash_file_t *file );
2521 isom_mvhd_t *isom_add_mvhd( isom_moov_t *moov );
2522 isom_iods_t *isom_add_iods( isom_moov_t *moov );
2523 isom_ctab_t *isom_add_ctab( void *parent_box );
2524 isom_trak_t *isom_add_trak( isom_moov_t *moov );
2525 isom_tkhd_t *isom_add_tkhd( isom_trak_t *trak );
2526 isom_tapt_t *isom_add_tapt( isom_trak_t *trak );
2527 isom_clef_t *isom_add_clef( isom_tapt_t *tapt );
2528 isom_prof_t *isom_add_prof( isom_tapt_t *tapt );
2529 isom_enof_t *isom_add_enof( isom_tapt_t *tapt );
2530 isom_edts_t *isom_add_edts( isom_trak_t *trak );
2531 isom_elst_t *isom_add_elst( isom_edts_t *edts );
2532 isom_tref_t *isom_add_tref( isom_trak_t *trak );
2533 isom_tref_type_t *isom_add_track_reference_type( isom_tref_t *tref, isom_track_reference_type type );
2534 isom_mdia_t *isom_add_mdia( isom_trak_t *trak );
2535 isom_mdhd_t *isom_add_mdhd( isom_mdia_t *mdia );
2536 isom_hdlr_t *isom_add_hdlr( void *parent_box );
2537 isom_minf_t *isom_add_minf( isom_mdia_t *mdia );
2538 isom_vmhd_t *isom_add_vmhd( isom_minf_t *minf );
2539 isom_smhd_t *isom_add_smhd( isom_minf_t *minf );
2540 isom_hmhd_t *isom_add_hmhd( isom_minf_t *minf );
2541 isom_nmhd_t *isom_add_nmhd( isom_minf_t *minf );
2542 isom_gmhd_t *isom_add_gmhd( isom_minf_t *minf );
2543 isom_gmin_t *isom_add_gmin( isom_gmhd_t *gmhd );
2544 isom_text_t *isom_add_text( isom_gmhd_t *gmhd );
2545 isom_dinf_t *isom_add_dinf( void *parent_box );
2546 isom_dref_t *isom_add_dref( isom_dinf_t *dinf );
2547 isom_dref_entry_t *isom_add_dref_entry( isom_dref_t *dref, lsmash_box_type_t type );
2548 isom_stbl_t *isom_add_stbl( isom_minf_t *minf );
2549 isom_stsd_t *isom_add_stsd( isom_stbl_t *stbl );
2550 isom_visual_entry_t *isom_add_visual_description( isom_stsd_t *stsd, lsmash_codec_type_t sample_type );
2551 isom_audio_entry_t *isom_add_audio_description( isom_stsd_t *stsd, lsmash_codec_type_t sample_type );
2552 isom_hint_entry_t *isom_add_hint_description(isom_stsd_t *stsd, lsmash_codec_type_t sample_type);
2553 isom_qt_text_entry_t *isom_add_qt_text_description( isom_stsd_t *stsd );
2554 isom_tx3g_entry_t *isom_add_tx3g_description( isom_stsd_t *stsd );
2555 isom_esds_t *isom_add_esds( void *parent_box );
2556 isom_glbl_t *isom_add_glbl( void *parent_box );
2557 isom_clap_t *isom_add_clap( isom_visual_entry_t *visual );
2558 isom_pasp_t *isom_add_pasp( isom_visual_entry_t *visual );
2559 isom_colr_t *isom_add_colr( isom_visual_entry_t *visual );
2560 isom_gama_t *isom_add_gama( isom_visual_entry_t *visual );
2561 isom_fiel_t *isom_add_fiel( isom_visual_entry_t *visual );
2562 isom_cspc_t *isom_add_cspc( isom_visual_entry_t *visual );
2563 isom_sgbt_t *isom_add_sgbt( isom_visual_entry_t *visual );
2564 isom_stsl_t *isom_add_stsl( isom_visual_entry_t *visual );
2565 isom_btrt_t *isom_add_btrt( isom_visual_entry_t *visual );
2566 isom_tims_t *isom_add_tims( isom_hint_entry_t *hint );
2567 isom_tsro_t *isom_add_tsro( isom_hint_entry_t *hint );
2568 isom_tssy_t *isom_add_tssy( isom_hint_entry_t *hint );
2569 isom_wave_t *isom_add_wave( isom_audio_entry_t *audio );
2570 isom_frma_t *isom_add_frma( isom_wave_t *wave );
2571 isom_enda_t *isom_add_enda( isom_wave_t *wave );
2572 isom_mp4a_t *isom_add_mp4a( isom_wave_t *wave );
2573 isom_terminator_t *isom_add_terminator( isom_wave_t *wave );
2574 isom_chan_t *isom_add_chan( isom_audio_entry_t *audio );
2575 isom_srat_t *isom_add_srat( isom_audio_entry_t *audio );
2576 isom_ftab_t *isom_add_ftab( isom_tx3g_entry_t *tx3g );
2577 isom_stts_t *isom_add_stts( isom_stbl_t *stbl );
2578 isom_ctts_t *isom_add_ctts( isom_stbl_t *stbl );
2579 isom_cslg_t *isom_add_cslg( isom_stbl_t *stbl );
2580 isom_stsc_t *isom_add_stsc( isom_stbl_t *stbl );
2581 isom_stsz_t *isom_add_stsz( isom_stbl_t *stbl );
2582 isom_stz2_t *isom_add_stz2( isom_stbl_t *stbl );
2583 isom_stss_t *isom_add_stss( isom_stbl_t *stbl );
2584 isom_stps_t *isom_add_stps( isom_stbl_t *stbl );
2585 isom_sdtp_t *isom_add_sdtp( isom_box_t *parent );
2586 isom_sgpd_t *isom_add_sgpd( void *parent_box );
2587 isom_sbgp_t *isom_add_sbgp( void *parent_box );
2588 isom_stco_t *isom_add_stco( isom_stbl_t *stbl );
2589 isom_stco_t *isom_add_co64( isom_stbl_t *stbl );
2590 isom_udta_t *isom_add_udta( void *parent_box );
2591 isom_cprt_t *isom_add_cprt( isom_udta_t *udta );
2592 isom_hnti_t *isom_add_hnti( isom_udta_t *udta );
2593 isom_rtp_t *isom_add_rtp( isom_hnti_t *hnti );
2594 isom_sdp_t *isom_add_sdp( isom_hnti_t *hnti );
2595 isom_WLOC_t *isom_add_WLOC( isom_udta_t *udta );
2596 isom_LOOP_t *isom_add_LOOP( isom_udta_t *udta );
2597 isom_SelO_t *isom_add_SelO( isom_udta_t *udta );
2598 isom_AllF_t *isom_add_AllF( isom_udta_t *udta );
2599 isom_chpl_t *isom_add_chpl( isom_udta_t *udta );
2600 isom_meta_t *isom_add_meta( void *parent_box );
2601 isom_keys_t *isom_add_keys( isom_meta_t *meta );
2602 isom_ilst_t *isom_add_ilst( isom_meta_t *meta );
2603 isom_metaitem_t *isom_add_metaitem( isom_ilst_t *ilst, lsmash_itunes_metadata_item item );
2604 isom_mean_t *isom_add_mean( isom_metaitem_t *metaitem );
2605 isom_name_t *isom_add_name( isom_metaitem_t *metaitem );
2606 isom_data_t *isom_add_data( isom_metaitem_t *metaitem );
2607 isom_mvex_t *isom_add_mvex( isom_moov_t *moov );
2608 isom_mehd_t *isom_add_mehd( isom_mvex_t *mvex );
2609 isom_trex_t *isom_add_trex( isom_mvex_t *mvex );
2610 isom_moof_t *isom_add_moof( lsmash_file_t *file );
2611 isom_mfhd_t *isom_add_mfhd( isom_moof_t *moof );
2612 isom_traf_t *isom_add_traf( isom_moof_t *moof );
2613 isom_tfhd_t *isom_add_tfhd( isom_traf_t *traf );
2614 isom_tfdt_t *isom_add_tfdt( isom_traf_t *traf );
2615 isom_trun_t *isom_add_trun( isom_traf_t *traf );
2616 isom_mfra_t *isom_add_mfra( lsmash_file_t *file );
2617 isom_tfra_t *isom_add_tfra( isom_mfra_t *mfra );
2618 isom_mfro_t *isom_add_mfro( isom_mfra_t *mfra );
2619 isom_mdat_t *isom_add_mdat( lsmash_file_t *file );
2620 isom_free_t *isom_add_free( void *parent_box );
2621 isom_styp_t *isom_add_styp( lsmash_file_t *file );
2622 isom_sidx_t *isom_add_sidx( lsmash_file_t *file );
2624 void isom_remove_extension_box( isom_box_t *ext );
2625 void isom_remove_sample_description( isom_sample_entry_t *sample );
2626 void isom_remove_unknown_box( isom_unknown_box_t *unknown_box );
2627 void isom_remove_sample_pool( isom_sample_pool_t *pool );
2629 uint64_t isom_update_box_size( void *box );
2631 int isom_add_extension_binary( void *parent_box, lsmash_box_type_t box_type, uint64_t precedence, uint8_t *box_data, uint32_t box_size );
2632 void isom_remove_all_extension_boxes( lsmash_entry_list_t *extensions );
2633 isom_box_t *isom_get_extension_box( lsmash_entry_list_t *extensions, lsmash_box_type_t box_type );
2634 void *isom_get_extension_box_format( lsmash_entry_list_t *extensions, lsmash_box_type_t box_type );
2635 void isom_remove_box_by_itself( void *opaque_box );
2637 #endif