1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2010-2014 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. */
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. */
30 #define ISOM_MAC_EPOCH_OFFSET 2082844800
32 typedef struct lsmash_box_tag isom_box_t
;
33 typedef void (*isom_extension_destructor_t
)( void *extension_data
);
34 typedef int (*isom_extension_writer_t
)( lsmash_bs_t
*bs
, isom_box_t
*box
);
36 /* If size is 1, then largesize is actual size.
37 * If size is 0, then this box is the last one in the file. */
38 #define ISOM_BASEBOX_COMMON \
39 const lsmash_class_t *class; \
40 lsmash_root_t *root; /* pointer of root */ \
41 lsmash_file_t *file; /* pointer of file */ \
42 isom_box_t *parent; /* pointer of the parent box of this box */ \
43 uint8_t *binary; /* used only when LSMASH_BINARY_CODED_BOX */ \
44 isom_extension_destructor_t destruct; /* box specific destructor */ \
45 isom_extension_writer_t write; /* box specific writer */ \
46 uint32_t manager; /* flags for L-SMASH */ \
47 uint64_t precedence; /* precedence of the box position */ \
48 uint64_t pos; /* starting position of this box in the file */ \
49 lsmash_entry_list_t extensions; /* extension boxes */ \
50 uint64_t size; /* the number of bytes in this box */ \
51 lsmash_box_type_t type
53 #define ISOM_FULLBOX_COMMON \
54 ISOM_BASEBOX_COMMON; \
55 uint8_t version; /* Basically, version is either 0 or 1 */ \
56 uint32_t flags /* In the actual structure of box, flags is 24 bits. */
58 #define ISOM_BASEBOX_COMMON_SIZE 8
59 #define ISOM_FULLBOX_COMMON_SIZE 12
60 #define ISOM_LIST_FULLBOX_COMMON_SIZE 16
62 /* flags for L-SMASH */
63 #define LSMASH_UNKNOWN_BOX 0x001
64 #define LSMASH_ABSENT_IN_FILE 0x002
65 #define LSMASH_QTFF_BASE 0x004
66 #define LSMASH_VIDEO_DESCRIPTION 0x008
67 #define LSMASH_AUDIO_DESCRIPTION 0x010
68 #define LSMASH_FULLBOX 0x020
69 #define LSMASH_LAST_BOX 0x040
70 #define LSMASH_INCOMPLETE_BOX 0x080
71 #define LSMASH_BINARY_CODED_BOX 0x100
72 #define LSMASH_PLACEHOLDER 0x200
73 #define LSMASH_WRITTEN_BOX 0x400
75 /* 12-byte ISO reserved value:
76 * 0xXXXXXXXX-0011-0010-8000-00AA00389B71 */
77 static const uint8_t static_lsmash_iso_12_bytes
[12]
78 = { 0x00, 0x11, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 };
79 #define LSMASH_ISO_12_BYTES static_lsmash_iso_12_bytes
81 /* L-SMASH original 12-byte QuickTime file format value for CODEC discrimination mainly:
82 * 0xXXXXXXXX-0F11-4DA5-BF4E-F2C48C6AA11E */
83 static const uint8_t static_lsmash_qtff_12_bytes
[12]
84 = { 0x0F, 0x11, 0x4D, 0xA5, 0xBF, 0x4E, 0xF2, 0xC4, 0x8C, 0x6A, 0xA1, 0x1E };
85 #define LSMASH_QTFF_12_BYTES static_lsmash_qtff_12_bytes
93 * This structure is for boxes we don't know or define yet.
94 * This box must be always appended as an extension box. */
98 uint32_t unknown_size
;
99 uint8_t *unknown_field
;
100 } isom_unknown_box_t
;
103 * This box identifies the specifications to which this file complies.
104 * This box shall occur before any variable-length box.
105 * In the absence of this box, the file is QuickTime file format or MP4 version 1 file format.
106 * In MP4 version 1 file format, Object Descriptor Box is mandatory.
107 * In QuickTime file format, Object Descriptor Box isn't defined.
108 * Therefore, if this box and an Object Descriptor Box are absent in the file, the file shall be QuickTime file format. */
112 uint32_t major_brand
; /* brand identifier */
113 uint32_t minor_version
; /* the minor version of the major brand */
114 uint32_t *compatible_brands
; /* a list, to the end of the box, of brands */
116 uint32_t brand_count
; /* the number of factors in compatible_brands array */
120 * This box defines a list of preferred colors for displaying the movie on devices that support only 256 colors.
121 * The list may contain up to 256 colors. This box contains a Macintosh color table data structure.
122 * This box is defined in QuickTime File Format Specification.
123 * The color table structure is also defined in struct ColorTable defined in Quickdraw.h. */
126 /* An array of colors.
127 * Each color is made of four unsigned 16-bit integers. */
128 uint16_t value
; /* index or other value
129 * Must be set to 0. */
131 uint16_t r
; /* magnitude of red component */
132 uint16_t g
; /* magnitude of green component */
133 uint16_t b
; /* magnitude of blue component */
134 } isom_qt_color_array_t
;
138 uint32_t seed
; /* unique identifier for table
139 * Must be set to 0. */
140 uint16_t flags
; /* high bit: 0 = PixMap; 1 = device
141 * Must be set to 0x8000. */
142 uint16_t size
; /* the number of colors in the following color array
143 * This is a zero-relative value;
144 * setting this field to 0 means that there is one color in the array. */
145 isom_qt_color_array_t
*array
;
146 } isom_qt_color_table_t
;
151 isom_qt_color_table_t color_table
;
155 * This box specifies the characteristics of a single track. */
158 /* version is either 0 or 1
160 * 0x000001: Indicates that the track is enabled.
161 * A disabled track is treated as if it were not present.
162 * 0x000002: Indicates that the track is used in the presentation.
163 * 0x000004: Indicates that the track is used when previewing the presentation.
164 * 0x000008: Indicates that the track is used in the movie's poster. (only defined in QuickTime file format)
165 * ISOM: If in a presentation all tracks have neither track_in_movie nor track_in_preview set,
166 * then all tracks shall be treated as if both flags were set on all tracks. */
168 /* version == 0: uint64_t -> uint32_t */
169 uint64_t creation_time
; /* the creation time of this track (in seconds since midnight, Jan. 1, 1904, in UTC time) */
170 uint64_t modification_time
; /* the most recent time the track was modified (in seconds since midnight, Jan. 1, 1904, in UTC time) */
171 uint32_t track_ID
; /* an integer that uniquely identifies the track
172 * Track IDs are never re-used and cannot be zero. */
174 uint64_t duration
; /* the duration of this track expressed in the movie timescale units */
175 /* The following fields are treated as
176 * ISOM: template fields.
177 * MP41: reserved fields.
178 * MP42: ignored fileds since compositions are done using BIFS system.
179 * 3GPP: ignored fields except for alternate_group.
180 * QTFF: usable fields. */
181 uint32_t reserved2
[2];
182 int16_t layer
; /* the front-to-back ordering of video tracks; tracks with lower numbers are closer to the viewer. */
183 int16_t alternate_group
; /* an integer that specifies a group or collection of tracks
184 * If this field is not 0, it should be the same for tracks that contain alternate data for one another
185 * and different for tracks belonging to different such groups.
186 * Only one track within an alternate group should be played or streamed at any one time. */
187 int16_t volume
; /* fixed point 8.8 number. 0x0100 is full volume. */
189 int32_t matrix
[9]; /* transformation matrix for the video */
190 /* track's visual presentation size
191 * All images in the sequence are scaled to this size, before any overall transformation of the track represented by the matrix.
192 * Note: these fields are treated as reserved in MP4 version 1. */
193 uint32_t width
; /* fixed point 16.16 number */
194 uint32_t height
; /* fixed point 16.16 number */
198 /* Track Clean Aperture Dimensions Box
199 * A presentation mode where clap and pasp are reflected. */
203 uint32_t width
; /* fixed point 16.16 number */
204 uint32_t height
; /* fixed point 16.16 number */
207 /* Track Production Aperture Dimensions Box
208 * A presentation mode where pasp is reflected. */
212 uint32_t width
; /* fixed point 16.16 number */
213 uint32_t height
; /* fixed point 16.16 number */
216 /* Track Encoded Pixels Dimensions Box
217 * A presentation mode where clap and pasp are not reflected. */
221 uint32_t width
; /* fixed point 16.16 number */
222 uint32_t height
; /* fixed point 16.16 number */
225 /* Track Aperture Mode Dimensions Box */
229 isom_clef_t
*clef
; /* Track Clean Aperture Dimensions Box */
230 isom_prof_t
*prof
; /* Track Production Aperture Dimensions Box */
231 isom_enof_t
*enof
; /* Track Encoded Pixels Dimensions Box */
235 * This box contains an explicit timeline map.
236 * Each entry defines part of the track timeline: by mapping part of the media timeline, or by indicating 'empty' time,
237 * or by defining a 'dwell', where a single time-point in the media is held for a period.
238 * The last edit in a track shall never be an empty edit.
239 * 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.
240 * It is recommended that any edits, explicit or implied, not select any portion of the composition timeline that doesn't map to a sample.
241 * 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
242 * correspond to the value of the CTS the first sample has or more not to exceed the largest CTS in this track. */
245 /* This entry is called Timeline Mapping Edit (TME) entry in UltraViolet Common File Format.
246 * version == 0: 64bits -> 32bits */
247 uint64_t segment_duration
; /* the duration of this edit expressed in the movie timescale units */
248 int64_t media_time
; /* the starting composition time within the media of this edit segment
249 * If this field is set to -1, it is an empty edit. */
250 int32_t media_rate
; /* the relative rate at which to play the media corresponding to this edit segment
251 * If this value is 0, then the edit is specifying a 'dwell':
252 * the media at media_time is presented for the segment_duration.
253 * This field is expressed as 16.16 fixed-point number. */
258 ISOM_FULLBOX_COMMON
; /* version is either 0 or 1 */
259 lsmash_entry_list_t
*list
;
263 * This optional box maps the presentation time-line to the media time-line as it is stored in the file.
264 * In the absence of this box, there is an implicit one-to-one mapping of these time-lines,
265 * and the presentation of a track starts at the beginning of the presentation. */
269 isom_elst_t
*elst
; /* Edit List Box */
272 /* Track Reference Box
273 * The Track Reference Box contains Track Reference Type Boxes.
274 * Track Reference Type Boxes define relationships between tracks.
275 * They allow one track to specify how it is related to other tracks. */
279 uint32_t *track_ID
; /* track_IDs of reference tracks / Zero value must not be used */
281 uint32_t ref_count
; /* number of reference tracks */
287 lsmash_entry_list_t ref_list
; /* Track Reference Type Boxes */
291 * This box declares overall information that is media-independent, and relevant to characteristics of the media in a track.*/
294 ISOM_FULLBOX_COMMON
; /* version is either 0 or 1 */
295 /* version == 0: uint64_t -> uint32_t */
296 uint64_t creation_time
; /* the creation time of the media in this track (in seconds since midnight, Jan. 1, 1904, in UTC time) */
297 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) */
298 uint32_t timescale
; /* media timescale: timescale for this media */
299 uint64_t duration
; /* the duration of this media expressed in the timescale indicated in this box */
301 uint16_t language
; /* ISOM: ISO-639-2/T language codes. Most significant 1-bit is 0.
302 * Each character is packed as the difference between its ASCII value and 0x60.
303 * QTFF: Macintosh language codes is usually used.
304 * Mac's value is less than 0x800 while ISO's value is 0x800 or greater. */
305 int16_t quality
; /* ISOM: pre_defined / QTFF: the media's playback quality */
308 /* Handler Reference Box
309 * In Media Box, this box is mandatory and (ISOM: should/QTFF: must) come before Media Information Box.
310 * ISOM: this box might be also in Meta Box.
311 * QTFF: this box might be also in Media Information Box. If this box is present there, it must come before Data Information Box. */
315 uint32_t componentType
; /* ISOM: pre_difined = 0
316 * QTFF: 'mhlr' for Media Handler Reference Box and 'dhlr' for Data Handler Reference Box */
317 uint32_t componentSubtype
; /* Both ISOM and QT: when present in Media Handler Reference Box, this field defines the type of media data.
318 * ISOM: when present in Metadata Handler Reference Box, this field defines the format of the meta box contents.
319 * QTFF: when present in Data Handler Reference Box, this field defines the data reference type. */
320 /* The following fields are defined in QTFF however these fields aren't mentioned in QuickTime SDK and are reserved in the specification.
321 * In ISOM, these fields are still defined as reserved. */
322 uint32_t componentManufacturer
; /* vendor indentification / A value of 0 matches any manufacturer. */
323 uint32_t componentFlags
; /* flags describing required component capabilities
324 * The high-order 8 bits should be set to 0.
325 * The low-order 24 bits are specific to each component type. */
326 uint32_t componentFlagsMask
; /* This field indicates which flags in the componentFlags field are relevant to this operation. */
328 uint8_t *componentName
; /* ISOM: a null-terminated string in UTF-8 characters
329 * QTFF: Pascal string */
331 uint32_t componentName_length
;
335 /** Media Information Header Boxes
336 ** There is a different media information header for each track type
337 ** (corresponding to the media handler-type); the matching header shall be present. **/
338 /* Video Media Header Box
339 * This box contains general presentation information, independent of the coding, for video media. */
342 ISOM_FULLBOX_COMMON
; /* flags is 1 */
343 uint16_t graphicsmode
; /* template: graphicsmode = 0 */
344 uint16_t opcolor
[3]; /* template: opcolor = { 0, 0, 0 } */
347 /* Sound Media Header Box
348 * This box contains general presentation information, independent of the coding, for audio media. */
352 int16_t balance
; /* a fixed-point 8.8 number that places mono audio tracks in a stereo space. template: balance = 0 */
356 /* Hint Media Header Box
357 * This box contains general information, independent of the protocol, for hint tracks. (A PDU is a Protocol Data Unit.) */
361 uint16_t maxPDUsize
; /* the size in bytes of the largest PDU in this (hint) stream */
362 uint16_t avgPDUsize
; /* the average size of a PDU over the entire presentation */
363 uint32_t maxbitrate
; /* the maximum rate in bits/second over any window of one second */
364 uint32_t avgbitrate
; /* the average rate in bits/second over the entire presentation */
368 /* Null Media Header Box
369 * This box may be used for streams other than visual and audio (e.g., timed metadata streams). */
372 /* Streams other than visual and audio may use a Null Media Header Box */
373 ISOM_FULLBOX_COMMON
; /* flags is currently all zero */
376 /* Generic Media Information Box */
380 uint16_t graphicsmode
;
382 int16_t balance
; /* This field is nomally set to 0. */
383 uint16_t reserved
; /* Reserved for use by Apple. Set this field to 0. */
386 /* Text Media Information Box */
390 int32_t matrix
[9]; /* Unkown fields. Default values are probably:
391 * { 0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000 } */
394 /* Generic Media Information Header Box */
398 isom_gmin_t
*gmin
; /* Generic Media Information Box */
399 isom_text_t
*text
; /* Text Media Information Box */
403 /* Data Reference Box
404 * name and location fields are expressed in null-terminated string using UTF-8 characters. */
407 /* This box is DataEntryUrlBox or DataEntryUrnBox */
408 ISOM_FULLBOX_COMMON
; /* flags == 0x000001 means that the media data is in the same file
409 * as the Movie Box containing this data reference. */
410 char *name
; /* only for DataEntryUrnBox */
411 char *location
; /* a location to find the resource with the given name */
413 uint32_t name_length
;
414 uint32_t location_length
;
415 lsmash_file_t
*ref_file
; /* pointer to the handle of the referenced file */
421 lsmash_entry_list_t list
;
424 /* Data Information Box */
427 /* This box is in Media Information Box or Meta Box */
429 isom_dref_t
*dref
; /* Data Reference Box */
432 /** Sample Description **/
433 /* ES Descriptor Box */
434 struct mp4sys_ES_Descriptor_t
; /* FIXME: I think these structs using mp4sys should be placed in isom.c */
438 struct mp4sys_ES_Descriptor_t
*ES
;
441 /* Parameter Set Entry within AVC/HEVC Decoder Configuration Record */
444 uint16_t nalUnitLength
;
448 } isom_dcr_ps_entry_t
;
450 /* MPEG-4 Bit Rate Box
451 * This box signals the bit rate information of the AVC video stream. */
455 uint32_t bufferSizeDB
; /* the size of the decoding buffer for the elementary stream in bytes */
456 uint32_t maxBitrate
; /* the maximum rate in bits/second over any window of one second */
457 uint32_t avgBitrate
; /* the average rate in bits/second over the entire presentation */
460 /* Global Header Box */
464 uint32_t header_size
;
465 uint8_t *header_data
;
468 /* Clean Aperture Box
469 * There are notionally four values in this box and these parameters are represented as a fraction N/D.
470 * Here, we refer to the pair of parameters fooN and fooD as foo.
471 * Considering the pixel dimensions as defined by the VisualSampleEntry width and height.
472 * If picture centre of the image is at pcX and pcY, then horizOff and vertOff are defined as follows:
473 * pcX = horizOff + (width - 1)/2;
474 * pcY = vertOff + (height - 1)/2;
475 * The leftmost/rightmost pixel and the topmost/bottommost line of the clean aperture fall at:
476 * pcX +/- (cleanApertureWidth - 1)/2;
477 * pcY +/- (cleanApertureHeight - 1)/2;
478 * QTFF: this box is a mandatory extension for all uncompressed Y'CbCr data formats. */
482 uint32_t cleanApertureWidthN
;
483 uint32_t cleanApertureWidthD
;
484 uint32_t cleanApertureHeightN
;
485 uint32_t cleanApertureHeightD
;
492 /* Pixel Aspect Ratio Box
493 * This box specifies the aspect ratio of a pixel, in arbitrary units.
494 * If a pixel appears H wide and V tall, then hSpacing/vSpacing is equal to H/V.
495 * When adjusting pixel aspect ratio, normally, the horizontal dimension of the video is scaled, if needed. */
499 uint32_t hSpacing
; /* horizontal spacing */
500 uint32_t vSpacing
; /* vertical spacing */
503 /* ISOM: Colour Information Box / QTFF: Color Parameter Box
504 * This box is used to map the numerical values of pixels in the file to a common representation of color
505 * in which images can be correctly compared, combined, and displayed.
506 * If colour information is supplied in both this box, and also in the video bitstream,
507 * this box takes precedence, and over-rides the information in the bitstream.
508 * For QuickTime file format:
509 * This box ('colr') supersedes the Gamma Level Box ('gama').
510 * Writers of QTFF should never write both into an Image Description, and readers of QTFF should ignore 'gama' if 'colr' is present.
511 * Note: this box is a mandatory extension for all uncompressed Y'CbCr data formats.
512 * For ISO Base Media file format:
513 * Colour information may be supplied in one or more Colour Information Boxes placed in a VisualSampleEntry.
514 * 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.
515 * 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. */
519 uint32_t color_parameter_type
; /* QTFF: 'nclc' or 'prof'
520 * ISOM: 'nclx', 'rICC' or 'prof' */
521 /* for 'nclc' and 'nclx' */
522 uint16_t primaries_index
; /* CIE 1931 xy chromaticity coordinates */
523 uint16_t transfer_function_index
; /* nonlinear transfer function from RGB to ErEgEb */
524 uint16_t matrix_index
; /* matrix from ErEgEb to EyEcbEcr */
526 unsigned full_range_flag
: 1;
527 unsigned reserved
: 7;
531 * This box is used to indicate that the decompressor corrects gamma level at display time.
532 * This box is defined in QuickTime File Format Specification and ImageCompression.h. */
536 uint32_t level
; /* A fixed-point 16.16 number indicating the gamma level at which the image was captured.
537 * Zero value indicates platform's standard gamma. */
540 /* Field/Frame Information Box
541 * This box is used by applications to modify decompressed image data or by decompressor components to determine field display order.
542 * This box is defined in QuickTime File Format Specification, dispatch019 and ImageCodec.h.
543 * Note: this box is a mandatory extension for all uncompressed Y'CbCr data formats. */
547 uint8_t fields
; /* the number of fields per frame
548 * 1: progressive scan
549 * 2: 2:1 interlaced */
550 uint8_t detail
; /* field ordering */
554 * This box is defined in ImageCompression.h. */
558 uint32_t pixel_format
; /* the native pixel format of an image */
561 /* Significant Bits Box
562 * This box is defined in Letters from the Ice Floe dispatch019.
563 * Note: this box is a mandatory extension for 'v216' (Uncompressed Y'CbCr, 10, 12, 14, or 16-bit-per-component 4:2:2). */
567 uint8_t significantBits
; /* the number of significant bits per component */
571 * If this box is present and can be interpreted by the decoder,
572 * all samples shall be displayed according to the scaling behaviour that is specified in this box.
573 * Otherwise, all samples are scaled to the size that is indicated by the width and height field in the Track Header Box.
574 * This box is defined in ISO Base Media file format. */
578 uint8_t constraint_flag
; /* Upper 7-bits are reserved.
579 * If this flag is set, all samples described by this sample entry shall be scaled
580 * according to the method specified by the field 'scale_method'. */
581 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. */
582 int16_t display_center_x
;
583 int16_t display_center_y
;
587 #define ISOM_SAMPLE_ENTRY \
588 ISOM_BASEBOX_COMMON; \
589 uint8_t reserved[6]; \
590 uint16_t data_reference_index
595 } isom_sample_entry_t
;
597 /* Mpeg Sample Entry */
603 /* ISOM: Visual Sample Entry / QTFF: Image Description
604 * For maximum compatibility, the following extension boxes should follow, not precede,
605 * any extension boxes defined in or required by derived specifications.
607 * Pixel Aspect Ratio Box */
611 int16_t version
; /* ISOM: pre_defined / QTFF: sample description version */
612 int16_t revision_level
; /* ISOM: reserved / QTFF: version of the CODEC */
613 int32_t vendor
; /* ISOM: pre_defined / QTFF: whose CODEC */
614 uint32_t temporalQuality
; /* ISOM: pre_defined / QTFF: the temporal quality factor */
615 uint32_t spatialQuality
; /* ISOM: pre_defined / QTFF: the spatial quality factor */
616 /* The width and height are the maximum pixel counts that the codec will deliver.
617 * Since these are counts they do not take into account pixel aspect ratio. */
621 uint32_t horizresolution
; /* 16.16 fixed-point / template: horizresolution = 0x00480000 / 72 dpi */
622 uint32_t vertresolution
; /* 16.16 fixed-point / template: vertresolution = 0x00480000 / 72 dpi */
623 uint32_t dataSize
; /* ISOM: reserved / QTFF: if known, the size of data for this descriptor */
624 uint16_t frame_count
; /* frame per sample / template: frame_count = 1 */
625 char compressorname
[33]; /* a fixed 32-byte field, with the first byte set to the number of bytes to be displayed */
626 uint16_t depth
; /* ISOM: template: depth = 0x0018
627 * AVC : 0x0018: colour with no alpha
628 * 0x0028: grayscale with no alpha
629 * 0x0020: gray or colour with alpha
630 * QTFF: depth of this data (1-32) or (33-40 grayscale) */
631 int16_t color_table_ID
; /* ISOM: template: pre_defined = -1
632 * QTFF: color table ID
633 * If this field is set to -1, the default color table should be used for the specified depth
634 * If the color table ID is set to 0, a color table is contained within the sample description itself.
635 * The color table immediately follows the color table ID field. */
636 /* Color table follows color_table_ID only when color_table_ID is set to 0. */
637 isom_qt_color_table_t color_table
; /* a list of preferred colors for displaying the movie on devices that support only 256 colors */
638 } isom_visual_entry_t
;
641 * This box shows the data format of the stored sound media.
642 * ISO base media file format also defines the same four-character-code for the type field,
643 * however, that is used to indicate original sample description of the media when a protected sample entry is used. */
647 uint32_t data_format
; /* copy of sample description type */
650 /* Audio Endian Box */
654 int16_t littleEndian
;
657 /* MPEG-4 Audio Box */
661 uint32_t unknown
; /* always 0? */
665 * This box is present to indicate the end of the sound description. It contains no data. */
668 ISOM_BASEBOX_COMMON
; /* size = 8, type = 0x00000000 */
671 /* Sound Information Decompression Parameters Box
672 * This box is defined in QuickTime file format.
673 * This box provides the ability to store data specific to a given audio decompressor in the sound description.
674 * The contents of this box are dependent on the audio decompressor. */
678 isom_frma_t
*frma
; /* Format Box */
679 isom_enda_t
*enda
; /* Audio Endian Box */
680 isom_mp4a_t
*mp4a
; /* MPEG-4 Audio Box */
681 isom_terminator_t
*terminator
; /* Terminator Box */
684 /* Audio Channel Layout Box
685 * This box is defined in QuickTime file format or Apple Lossless Audio inside ISO Base Media. */
688 uint32_t channelLabel
; /* the channelLabel that describes the channel */
689 uint32_t channelFlags
; /* flags that control the interpretation of coordinates */
690 uint32_t coordinates
[3]; /* an ordered triple that specifies a precise speaker location / 32-bit floating point */
691 } isom_channel_description_t
;
696 uint32_t channelLayoutTag
; /* the channelLayoutTag indicates the layout */
697 uint32_t channelBitmap
; /* If channelLayoutTag is set to 0x00010000, this field is the channel usage bitmap. */
698 uint32_t numberChannelDescriptions
; /* the number of items in the Channel Descriptions array */
699 /* Channel Descriptions array */
700 isom_channel_description_t
*channelDescriptions
;
704 * This box may be present only in an AudioSampleEntryV1, and when present,
705 * it overrides the samplerate field and documents the actual sampling rate.
706 * When this box is present, the media timescale should be the same as the
707 * sampling rate, or an integer division or multiple of it. */
711 uint32_t sampling_rate
; /* the actual sampling rate of the audio media, expressed as a 32-bit integer
712 * The value of this field overrides the samplerate field in the AudioSampleEntryV1
713 * and documents the actual sampling rate. */
716 /* ISOM: Audio Sample Entry / QTFF: Sound Description */
720 int16_t version
; /* ISOM: version = 0 is used to support non-high samplerate audio format.
721 * version = 1, called AudioSampleEntryV1, is used to support high samplerate audio format.
722 * An AudioSampleEntryV1 requires that the enclosing Sample Description Box also takes the version 1.
723 * For maximum compatibility, an AudioSampleEntryV1 should only be used when needed.
724 * QTFF: version = 0 supports only 'raw ' or 'twos' audio format.
725 * version = 1 is used to support out-of-band configuration settings for decompression.
726 * version = 2 is used to support high samplerate, or 3 or more multichannel audio format. */
727 int16_t revision_level
; /* ISOM: reserved / QTFF: version of the CODEC */
728 int32_t vendor
; /* ISOM: reserved / QTFF: whose CODEC */
729 uint16_t channelcount
; /* ISOM: template: channelcount = 2
730 * channelcount is a value greater than zero that indicates the maximum number of channels that the
731 * audio could deliver.
732 * A channelcount of 1 indicates mono audio, and 2 indicates stereo (left/right).
733 * When values greater than 2 are used, the codec configuration should identify the channel assignment.
734 * QTFF: the number of audio channels
735 * Allowable values are 1 (mono) or 2 (stereo).
736 * For more than 2, set this field to 3 and use numAudioChannels instead of this field. */
737 uint16_t samplesize
; /* ISOM: template: samplesize = 16
738 * QTFF: the number of bits in each uncompressed sample for a single channel
739 * Allowable values are 8 or 16.
740 * For non-mod8, set this field to 16 and use constBitsPerChannel instead of this field.
741 * For more than 16, set this field to 16 and use bytesPerPacket instead of this field. */
742 int16_t compression_ID
; /* ISOM: pre_defined
743 * QTFF: version = 0 -> must be set to 0.
744 * version = 2 -> must be set to -2. */
745 uint16_t packet_size
; /* ISOM: reserved / QTFF: must be set to 0. */
746 uint32_t samplerate
; /* the sampling rate expressed as a 16.16 fixed-point number
747 * ISOM: template: samplerate = {default samplerate of media}<<16
748 * When it is desired to indicate an audio sampling rate greater than the value that can be represented in
749 * this field, this field should contain a value left-shifted 16 bits that matches the media timescale,
750 * or be an integer division or multiple of it.
751 * QTFF: the integer portion should match the media's timescale.
752 * If this field is invalid because of higher samplerate,
753 * then set this field to 0x00010000 and use audioSampleRate instead of this field. */
754 /* QTFF-based version 1 fields
755 * These fields are for description of the compression ratio of fixed ratio audio compression algorithms.
756 * If these fields are not used, they are set to 0. */
757 uint32_t samplesPerPacket
; /* For compressed audio, be set to the number of uncompressed frames generated by a compressed frame.
758 * For uncompressed audio, shall be set to 1. */
759 uint32_t bytesPerPacket
; /* the number of bytes in a sample for a single channel */
760 uint32_t bytesPerFrame
; /* the number of bytes in a frame */
761 uint32_t bytesPerSample
; /* 8-bit audio: 1, other audio: 2 */
762 /* QTFF-based version 2 fields
763 * LPCMFrame: one sample from each channel.
764 * AudioPacket: For uncompressed audio, an AudioPacket is simply one LPCMFrame.
765 * For compressed audio, an AudioPacket is the natural compressed access unit of that format. */
766 uint32_t sizeOfStructOnly
; /* offset to extensions */
767 uint64_t audioSampleRate
; /* 64-bit floating point */
768 uint32_t numAudioChannels
; /* any channel assignment info will be in Audio Channel Layout Box. */
769 int32_t always7F000000
; /* always 0x7F000000 */
770 uint32_t constBitsPerChannel
; /* only set if constant (and only for uncompressed audio) */
771 uint32_t formatSpecificFlags
;
772 uint32_t constBytesPerAudioPacket
; /* only set if constant */
773 uint32_t constLPCMFramesPerAudioPacket
; /* only set if constant */
774 } isom_audio_entry_t
;
776 /* Hint Sample Entry */
777 #define ISOM_HINT_SAMPLE_ENTRY \
783 ISOM_HINT_SAMPLE_ENTRY
;
784 uint32_t data_length
;
787 /* Metadata Sample Entry */
788 #define ISOM_METADATA_SAMPLE_ENTRY \
793 ISOM_METADATA_SAMPLE_ENTRY
;
794 } isom_metadata_entry_t
;
796 /* QuickTime Text Sample Description */
800 int32_t displayFlags
;
801 int32_t textJustification
;
802 uint16_t bgColor
[3]; /* background RGB color */
809 int32_t scrpStartChar
; /* starting character position */
813 uint16_t scrpFace
; /* only first 8-bits are used */
815 uint16_t scrpColor
[3]; /* foreground RGB color */
816 /* defaultFontName is Pascal string */
817 uint8_t font_name_length
;
819 } isom_qt_text_entry_t
;
826 uint8_t font_name_length
;
828 } isom_font_record_t
;
835 * entry_count is uint16_t. */
836 lsmash_entry_list_t
*list
;
839 /* 3GPP Timed Text Sample Entry */
843 uint32_t displayFlags
;
844 int8_t horizontal_justification
;
845 int8_t vertical_justification
;
846 uint8_t background_color_rgba
[4];
847 /* BoxRecord default_text_box */
852 /* StyleRecord default_style */
853 uint16_t startChar
; /* always 0 */
854 uint16_t endChar
; /* always 0 */
856 uint8_t face_style_flags
;
858 uint8_t text_color_rgba
[4];
859 /* Font Table Box font_table */
863 /* Sample Description Box */
867 uint32_t entry_count
; /* print only */
868 lsmash_entry_list_t list
;
872 /* Decoding Time to Sample Box
873 * This box contains a compact version of a table that allows indexing from decoding time to sample number.
874 * Each entry in the table gives the number of consecutive samples with the same time delta, and the delta of those samples.
875 * By adding the deltas a complete time-to-sample map may be built.
876 * All samples must have non-zero durations except for the last one.
877 * The sum of all deltas gives the media duration in the track (not mapped to the movie timescale, and not considering any edit list).
878 * DTS is an abbreviation of 'decoding time stamp'. */
881 uint32_t sample_count
; /* number of consecutive samples that have the given sample_delta */
882 uint32_t sample_delta
; /* DTS[0] = 0; DTS[n+1] = DTS[n] + sample_delta[n]; */
888 lsmash_entry_list_t
*list
;
891 /* Composition Time to Sample Box
892 * This box provides the offset between decoding time and composition time.
893 * CTS is an abbreviation of 'composition time stamp'.
894 * This box is optional and must only be present if DTS and CTS differ for any samples. */
897 uint32_t sample_count
; /* number of consecutive samples that have the given sample_offset */
898 uint32_t sample_offset
; /* CTS[n] = DTS[n] + sample_offset[n];
899 * ISOM: if version is set to 1, sample_offset is signed 32-bit integer.
900 * QTFF: sample_offset is always signed 32-bit integer. */
906 lsmash_entry_list_t
*list
;
909 /* Composition to Decode Box (Composition Shift Least Greatest Box)
910 * This box may be used to relate the composition and decoding timelines,
911 * and deal with some of the ambiguities that signed composition offsets introduce. */
915 int32_t compositionToDTSShift
; /* If this value is added to the composition times (as calculated by the CTS offsets from the DTS),
916 * then for all samples, their CTS is guaranteed to be greater than or equal to their DTS,
917 * and the buffer model implied by the indicated profile/level will be honoured;
918 * if leastDecodeToDisplayDelta is positive or zero, this field can be 0;
919 * otherwise it should be at least (- leastDecodeToDisplayDelta). */
920 int32_t leastDecodeToDisplayDelta
; /* the smallest sample_offset in this track */
921 int32_t greatestDecodeToDisplayDelta
; /* the largest sample_offset in this track */
922 int32_t compositionStartTime
; /* the smallest CTS for any sample */
923 int32_t compositionEndTime
; /* the CTS plus the composition duration, of the sample with the largest CTS in this track */
927 * This box contains the sample count and a table giving the size in bytes of each sample.
928 * The total number of samples in the media is always indicated in the sample_count.
929 * Note: a sample size of zero is not prohibited in general, but it must be valid and defined for the coding system,
930 * as defined by the sample entry, that the sample belongs to. */
933 uint32_t entry_size
; /* the size of a sample */
939 uint32_t sample_size
; /* If this field is set to 0, then the samples have different sizes. */
940 uint32_t sample_count
; /* the number of samples in the track */
941 lsmash_entry_list_t
*list
; /* available if sample_size == 0 */
945 * If this box is not present, every sample is a random access point.
946 * In AVC streams, this box cannot point non-IDR samples.
947 * The table is arranged in strictly increasing order of sample number. */
950 uint32_t sample_number
; /* the numbers of the samples that are random access points in the stream. */
956 lsmash_entry_list_t
*list
;
959 /* Partial Sync Sample Box
960 * Tip from QT engineering - Open-GOP intra frames need to be marked as "partial sync samples".
961 * Partial sync frames perform a partial reset of inter-frame dependencies;
962 * decoding two partial sync frames and the non-droppable difference frames between them is
963 * sufficient to prepare a decompressor for correctly decoding the difference frames that follow. */
966 uint32_t sample_number
; /* the numbers of the samples that are partial sync samples in the stream. */
972 lsmash_entry_list_t
*list
;
975 /* Independent and Disposable Samples Box */
978 unsigned is_leading
: 2; /* ISOM: leading / QTFF: samples later in decode order may have earlier display times */
979 unsigned sample_depends_on
: 2; /* independency */
980 unsigned sample_is_depended_on
: 2; /* disposable */
981 unsigned sample_has_redundancy
: 2; /* redundancy */
987 /* According to the specification, the size of the table, sample_count, doesn't exist in this box.
988 * Instead of this, it is taken from the sample_count in the stsz or the stz2 box. */
989 lsmash_entry_list_t
*list
;
992 /* Sample To Chunk Box
993 * This box can be used to find the chunk that contains a sample, its position, and the associated sample description.
994 * The table is compactly coded. Each entry gives the index of the first chunk of a run of chunks with the same characteristics.
995 * By subtracting one entry here from the previous one, you can compute how many chunks are in this run.
996 * You can convert this to a sample count by multiplying by the appropriate samples_per_chunk. */
999 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 */
1000 uint32_t samples_per_chunk
; /* the number of samples in each of these chunks */
1001 uint32_t sample_description_index
; /* the index of the sample entry that describes the samples in this chunk */
1002 } isom_stsc_entry_t
;
1006 ISOM_FULLBOX_COMMON
;
1007 lsmash_entry_list_t
*list
;
1011 * chunk_offset is the offset of the start of a chunk into its containing media file.
1012 * Offsets are file offsets, not the offset into any box within the file. */
1015 uint32_t chunk_offset
;
1016 } isom_stco_entry_t
;
1020 /* for large presentations */
1021 uint64_t chunk_offset
;
1022 } isom_co64_entry_t
;
1026 ISOM_FULLBOX_COMMON
; /* type = 'stco': 32-bit chunk offsets / type = 'co64': 64-bit chunk offsets */
1027 lsmash_entry_list_t
*list
;
1029 uint8_t large_presentation
; /* Set 1 to this if 64-bit chunk-offset are needed. */
1030 } isom_stco_t
; /* share with co64 box */
1032 /* Sample Group Description Box
1033 * This box gives information about the characteristics of sample groups. */
1036 ISOM_FULLBOX_COMMON
; /* Use of version 0 entries is deprecated. */
1037 uint32_t grouping_type
; /* an integer that identifies the sbgp that is associated with this sample group description */
1038 uint32_t default_length
; /* the length of every group entry (if the length is constant), or zero (if it is variable)
1039 * This field is available only if version == 1. */
1040 lsmash_entry_list_t
*list
;
1043 /* Random Access Entry
1044 * Samples marked by this group must be random access points, and may also be sync points. */
1047 /* grouping_type is 'rap ' */
1048 uint32_t description_length
; /* This field is available only if version == 1 and default_length == 0. */
1049 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,
1050 * and the number is specified by num_leading_samples. */
1051 unsigned num_leading_samples
: 7; /* the number of leading samples for each sample in this group
1052 * Note: when num_leading_samples_known is equal to 0, this field should be ignored. */
1055 /* Roll Recovery Entry
1056 * This grouping type is defined as that group of samples having the same roll distance. */
1059 /* grouping_type is 'roll' */
1060 uint32_t description_length
; /* This field is available only if version == 1 and default_length == 0. */
1061 int16_t roll_distance
; /* the number of samples that must be decoded in order for a sample to be decoded correctly
1062 * A positive value indicates post-roll, and a negative value indicates pre-roll.
1063 * The value zero must not be used. */
1064 } isom_roll_entry_t
;
1066 /* Sample to Group Box
1067 * This box is used to find the group that a sample belongs to and the associated description of that sample group. */
1070 ISOM_FULLBOX_COMMON
;
1071 uint32_t grouping_type
; /* Links it to its sample group description table with the same value for grouping type. */
1072 uint32_t grouping_type_parameter
; /* an indication of the sub-type of the grouping
1073 * This field is available only if version == 1. */
1074 lsmash_entry_list_t
*list
;
1079 uint32_t sample_count
; /* the number of consecutive samples with the same sample group descriptor */
1080 uint32_t group_description_index
; /* the index of the sample group entry which describes the samples in this group
1081 * The index ranges from 1 to the number of sample group entries in the Sample Group Description Box,
1082 * or takes the value 0 to indicate that this sample is a member of no group of this type.
1083 * Within the Sample to Group Box in movie fragment, the group description indexes for groups defined
1084 * within the same fragment start at 0x10001, i.e. the index value 1, with the value 1 in the top 16 bits. */
1085 } isom_group_assignment_entry_t
;
1087 /* Sample Table Box */
1090 ISOM_BASEBOX_COMMON
;
1091 isom_stsd_t
*stsd
; /* Sample Description Box */
1092 isom_stts_t
*stts
; /* Decoding Time to Sample Box */
1093 isom_ctts_t
*ctts
; /* Composition Time to Sample Box */
1094 isom_cslg_t
*cslg
; /* ISOM: Composition to Decode Box / QTFF: Composition Shift Least Greatest Box */
1095 isom_stss_t
*stss
; /* Sync Sample Box */
1096 isom_stps_t
*stps
; /* ISOM: null / QTFF: Partial Sync Sample Box */
1097 isom_sdtp_t
*sdtp
; /* Independent and Disposable Samples Box */
1098 isom_stsc_t
*stsc
; /* Sample To Chunk Box */
1099 isom_stsz_t
*stsz
; /* Sample Size Box */
1100 isom_stco_t
*stco
; /* Chunk Offset Box */
1101 lsmash_entry_list_t sgpd_list
; /* Sample Group Description Boxes */
1102 lsmash_entry_list_t sbgp_list
; /* Sample To Group Boxes */
1105 /* Media Information Box */
1108 ISOM_BASEBOX_COMMON
;
1109 /* Media Information Header Boxes */
1110 isom_vmhd_t
*vmhd
; /* Video Media Header Box */
1111 isom_smhd_t
*smhd
; /* Sound Media Header Box */
1112 isom_hmhd_t
*hmhd
; /* ISOM: Hint Media Header Box / QTFF: null */
1113 isom_nmhd_t
*nmhd
; /* ISOM: Null Media Header Box / QTFF: null */
1114 isom_gmhd_t
*gmhd
; /* ISOM: null / QTFF: Generic Media Information Header Box */
1116 isom_hdlr_t
*hdlr
; /* ISOM: null / QTFF: Data Handler Reference Box
1117 * Note: this box must come before Data Information Box. */
1118 isom_dinf_t
*dinf
; /* Data Information Box */
1119 isom_stbl_t
*stbl
; /* Sample Table Box */
1125 ISOM_BASEBOX_COMMON
;
1126 isom_mdhd_t
*mdhd
; /* Media Header Box */
1127 isom_hdlr_t
*hdlr
; /* ISOM: Handler Reference Box / QTFF: Media Handler Reference Box
1128 * Note: this box must come before Media Information Box. */
1129 isom_minf_t
*minf
; /* Media Information Box */
1133 * This box defines overall information which is media-independent, and relevant to the entire presentation considered as a whole. */
1136 ISOM_FULLBOX_COMMON
; /* version is either 0 or 1 */
1137 /* version == 0: uint64_t -> uint32_t */
1138 uint64_t creation_time
; /* the creation time of the presentation (in seconds since midnight, Jan. 1, 1904, in UTC time) */
1139 uint64_t modification_time
; /* the most recent time the presentation was modified (in seconds since midnight, Jan. 1, 1904, in UTC time) */
1140 uint32_t timescale
; /* movie timescale: timescale for the entire presentation */
1141 uint64_t duration
; /* the duration, expressed in movie timescale, of the longest track */
1142 /* The following fields are treated as
1143 * ISOM: template fields.
1144 * MP41: reserved fields.
1145 * MP42: ignored fileds since compositions are done using BIFS system.
1146 * 3GPP: ignored fields.
1147 * QTFF: usable fields. */
1148 int32_t rate
; /* fixed point 16.16 number. 0x00010000 is normal forward playback. */
1149 int16_t volume
; /* fixed point 8.8 number. 0x0100 is full volume. */
1151 int32_t preferredLong
[2]; /* ISOM: reserved / QTFF: unknown */
1152 int32_t matrix
[9]; /* transformation matrix for the video */
1153 /* The following fields are defined in QuickTime file format.
1154 * In ISO Base Media file format, these fields are treated as pre_defined. */
1155 int32_t previewTime
; /* the time value in the movie at which the preview begins */
1156 int32_t previewDuration
; /* the duration of the movie preview in movie timescale units */
1157 int32_t posterTime
; /* the time value of the time of the movie poster */
1158 int32_t selectionTime
; /* the time value for the start time of the current selection */
1159 int32_t selectionDuration
; /* the duration of the current selection in movie timescale units */
1160 int32_t currentTime
; /* the time value for current time position within the movie */
1162 uint32_t next_track_ID
; /* larger than the largest track-ID in use */
1165 /* Object Descriptor Box
1166 * Note that this box is mandatory under 14496-1:2001 (mp41) while not mandatory under 14496-14:2003 (mp42). */
1167 struct mp4sys_ObjectDescriptor_t
; /* FIXME: I think these structs using mp4sys should be placed in isom.c */
1170 ISOM_FULLBOX_COMMON
;
1171 struct mp4sys_ObjectDescriptor_t
*OD
;
1175 * This box contains the media data.
1176 * A presentation may contain zero or more Media Data Boxes.*/
1179 ISOM_BASEBOX_COMMON
; /* If size is 0, then this box is the last box. */
1181 uint64_t media_size
; /* the total media size already written in this box */
1185 * The contents of a free-space box are irrelevant and may be ignored without affecting the presentation. */
1188 ISOM_BASEBOX_COMMON
; /* type is 'free' or 'skip' */
1193 typedef isom_free_t isom_skip_t
;
1196 * This box is NOT defined in the ISO/MPEG-4 specs.
1197 * Basically, this box exists in User Data Box inside Movie Box if present. */
1200 uint64_t start_time
; /* version = 0: expressed in movie timescale units
1201 * version = 1: expressed in 100 nanoseconds */
1202 /* Chapter name is Pascal string */
1203 uint8_t chapter_name_length
;
1205 } isom_chpl_entry_t
;
1209 ISOM_FULLBOX_COMMON
; /* version = 0 is defined in F4V file format. */
1210 uint8_t unknown
; /* only available under version = 1 */
1211 lsmash_entry_list_t
*list
; /* if version is set to 0, entry_count is uint8_t. */
1217 uint64_t start_time
;
1218 } isom_chapter_entry_t
;
1220 /* Metadata Item Keys Box */
1223 ISOM_FULLBOX_COMMON
;
1224 lsmash_entry_list_t
*list
;
1229 uint32_t key_size
; /* the size of the entire structure containing a key definition
1230 * key_size = sizeof(key_size) + sizeof(key_namespace) + sizeof(key_value) */
1231 uint32_t key_namespace
; /* a naming scheme used for metadata keys
1232 * Location metadata keys, for example, use the 'mdta' key namespace. */
1233 uint8_t *key_value
; /* the actual name of the metadata key
1234 * Keys with the 'mdta' namespace use a reverse DNS naming convention. */
1235 } isom_keys_entry_t
;
1240 ISOM_FULLBOX_COMMON
;
1241 uint8_t *meaning_string
; /* to fill the box */
1243 uint32_t meaning_string_length
;
1249 ISOM_FULLBOX_COMMON
;
1250 uint8_t *name
; /* to fill the box */
1252 uint32_t name_length
;
1258 ISOM_BASEBOX_COMMON
;
1259 /* type indicator */
1260 uint16_t reserved
; /* always 0 */
1261 uint8_t type_set_identifier
; /* 0: type set of the common basic data types */
1262 uint8_t type_code
; /* type of data code */
1264 uint32_t the_locale
; /* reserved to be 0 */
1265 uint8_t *value
; /* to fill the box */
1267 uint32_t value_length
;
1270 /* Metadata Item Box */
1273 ISOM_BASEBOX_COMMON
;
1274 isom_mean_t
*mean
; /* Meaning Box */
1275 isom_name_t
*name
; /* Name Box */
1276 isom_data_t
*data
; /* Data Box */
1279 /* Metadata Item List Box */
1282 ISOM_BASEBOX_COMMON
;
1283 lsmash_entry_list_t metaitem_list
; /* Metadata Item Box List
1284 * There is no entry_count field. */
1290 ISOM_FULLBOX_COMMON
; /* ISOM: FullBox / QTFF: BaseBox */
1291 isom_hdlr_t
*hdlr
; /* Metadata Handler Reference Box */
1292 isom_dinf_t
*dinf
; /* ISOM: Data Information Box / QTFF: null */
1293 isom_keys_t
*keys
; /* ISOM: null / QTFF: Metadata Item Keys Box */
1294 isom_ilst_t
*ilst
; /* Metadata Item List Box only defined in Apple MPEG-4 and QTFF */
1297 /* Window Location Box */
1300 ISOM_BASEBOX_COMMON
;
1301 /* default window location for movie */
1309 ISOM_BASEBOX_COMMON
;
1310 uint32_t looping_mode
; /* 0 for none, 1 for looping, 2 for palindromic looping */
1313 /* Play Selection Only Box */
1316 ISOM_BASEBOX_COMMON
;
1317 uint8_t selection_only
; /* whether only the selected area of the movie should be played */
1320 /* Play All Frames Box */
1323 ISOM_BASEBOX_COMMON
;
1324 uint8_t play_all_frames
; /* whether all frames of video should be played, regardless of timing */
1328 * The Copyright box contains a copyright declaration which applies to the entire presentation,
1329 * when contained within the Movie Box, or, when contained in a track, to that entire track.
1330 * There may be multiple copyright boxes using different language codes. */
1333 ISOM_FULLBOX_COMMON
;
1334 uint16_t language
; /* ISO-639-2/T language codes. Most significant 1-bit is 0.
1335 * Each character is packed as the difference between its ASCII value and 0x60. */
1336 uint8_t *notice
; /* a null-terminated string in either UTF-8 or UTF-16 characters, giving a copyright notice.
1337 * If UTF-16 is used, the string shall start with the BYTE ORDER MARK (0xFEFF), to distinguish it from a UTF-8 string.
1338 * This mark does not form part of the final string. */
1339 uint32_t notice_length
;
1343 * This box is a container box for informative user-data.
1344 * This user data is formatted as a set of boxes with more specific box types, which declare more precisely their content.
1345 * QTFF: for historical reasons, this box is optionally terminated by a 32-bit integer set to 0. */
1348 ISOM_BASEBOX_COMMON
;
1349 isom_chpl_t
*chpl
; /* Chapter List Box */
1350 isom_meta_t
*meta
; /* Meta Box extended by Apple for iTunes movie */
1351 /* QuickTime user data */
1352 isom_WLOC_t
*WLOC
; /* Window Location Box */
1353 isom_LOOP_t
*LOOP
; /* Looping Box */
1354 isom_SelO_t
*SelO
; /* Play Selection Only Box */
1355 isom_AllF_t
*AllF
; /* Play All Frames Box */
1356 /* Copyright Box List */
1357 lsmash_entry_list_t cprt_list
; /* Copyright Boxes is defined in ISO Base Media and 3GPP file format */
1360 /** Caches for handling tracks **/
1363 uint64_t alloc
; /* total buffer size for the pool */
1364 uint64_t size
; /* total size of samples in the pool */
1365 uint32_t sample_count
; /* number of samples in the pool */
1366 uint8_t *data
; /* actual data of samples in the pool */
1367 } isom_sample_pool_t
;
1371 uint32_t chunk_number
; /* chunk number */
1372 uint32_t sample_description_index
; /* sample description index */
1373 uint64_t first_dts
; /* the first DTS in chunk */
1374 isom_sample_pool_t
*pool
; /* samples pooled to interleave */
1386 isom_group_assignment_entry_t
*assignment
; /* the address corresponding to the entry in Sample to Group Box */
1387 isom_group_assignment_entry_t
*prev_assignment
; /* the address of the previous assignment */
1388 isom_rap_entry_t
*random_access
; /* the address corresponding to the random access entry in Sample Group Description Box */
1389 uint8_t is_prev_rap
; /* whether the previous sample is a random access point or not */
1394 isom_group_assignment_entry_t
*assignment
; /* the address corresponding to the entry in Sample to Group Box */
1395 isom_sgpd_t
*sgpd
; /* the address to the active Sample Group Description Box */
1396 uint32_t first_sample
; /* the number of the first sample of the group */
1397 uint32_t recovery_point
; /* the identifier necessary for the recovery from its starting point to be completed */
1398 uint64_t rp_cts
; /* the CTS of the recovery point */
1399 int16_t roll_distance
; /* the current roll_distance
1400 * The value may be updated when 'described' is set to ROLL_DISTANCE_INITIALIZED. */
1401 #define MAX_ROLL_WAIT_AND_SEE_COUNT 64
1402 uint8_t wait_and_see_count
; /* Wait-and-see after initialization of roll_distance until reaching MAX_ROLL_WAIT_AND_SEE. */
1403 uint8_t is_fragment
; /* the flag if the current group is in fragment */
1404 uint8_t prev_is_recovery_start
; /* whether the previous sample is a starting point of recovery or not */
1405 uint8_t delimited
; /* the flag if the sample_count is determined */
1406 #define ROLL_DISTANCE_INITIALIZED 1
1407 #define ROLL_DISTANCE_DETERMINED 2
1408 uint8_t described
; /* the status of the group description */
1409 } isom_roll_group_t
;
1413 lsmash_entry_list_t
*pool
; /* grouping pooled to delimit and describe */
1418 uint64_t largest_cts
; /* the largest CTS of a subsegment of the reference stream */
1419 uint64_t smallest_cts
; /* the smallest CTS of a subsegment of the reference stream */
1420 uint64_t first_cts
; /* the CTS of the first sample of a subsegment of the reference stream */
1421 uint64_t segment_duration
; /* the sum of the subsegment_duration of preceeding subsegments */
1422 /* SAP related info within the active subsegment of the reference stream */
1423 uint64_t first_ed_cts
; /* the earliest CTS of decodable samples after the first recovery point */
1424 uint64_t first_rp_cts
; /* the CTS of the first recovery point */
1425 uint32_t first_rp_number
; /* the number of the first recovery point */
1426 uint32_t first_ra_number
; /* the number of the first random accessible sample */
1427 lsmash_random_access_flag first_ra_flags
; /* the flags of the first random accessible sample */
1429 } isom_subsegment_t
;
1433 uint8_t has_samples
;
1434 uint8_t roll_grouping
;
1435 uint8_t rap_grouping
;
1436 uint32_t traf_number
;
1437 uint32_t last_duration
; /* the last sample duration in this track fragment */
1438 uint64_t largest_cts
; /* the largest CTS in this track fragment */
1439 uint64_t sample_count
; /* the number of samples in this track fragment */
1440 isom_subsegment_t subsegment
;
1445 uint8_t all_sync
; /* if all samples are sync sample */
1448 isom_timestamp_t timestamp
;
1449 isom_grouping_t roll
;
1450 isom_rap_group_t
*rap
;
1451 isom_fragment_t
*fragment
;
1454 /** Movie Fragments Boxes **/
1455 /* Track Fragments Flags ('tf_flags') */
1458 ISOM_TF_FLAGS_BASE_DATA_OFFSET_PRESENT
= 0x000001, /* base-data-offset-present:
1459 * This flag indicates the presence of the base_data_offset field.
1460 * The base_data_offset is the base offset to use when calculating data offsets.
1461 * Offsets are file offsets as like as chunk_offset in Chunk Offset Box.
1462 * If this flag is set and default-base-is-moof is not set, the base_data_offset
1463 * for the first track in the movie fragment is the position of the first byte
1464 * of the enclosing Movie Fragment Box, and for second and subsequent track
1465 * fragments, the default is the end of the data defined by the preceding fragment. */
1466 ISOM_TF_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT
= 0x000002, /* sample-description-index-present
1467 * This flag indicates the presence of the sample_description_index field. */
1468 ISOM_TF_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT
= 0x000008, /* default-sample-duration-present:
1469 * This flag indicates the presence of the default_sample_duration field. */
1470 ISOM_TF_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT
= 0x000010, /* default-sample-size-present:
1471 * This flag indicates the presence of the default_sample_size field. */
1472 ISOM_TF_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT
= 0x000020, /* default-sample-flags-present:
1473 * This flag indicates the presence of the default_sample_flags field. */
1474 ISOM_TF_FLAGS_DURATION_IS_EMPTY
= 0x010000, /* duration-is-empty:
1475 * This flag indicates there are no samples for this time interval. */
1476 ISOM_TF_FLAGS_DEFAULT_BASE_IS_MOOF
= 0x020000, /* default-base-is-moof:
1477 * If base-data-offset-present is not set, this flag indicates the implicit
1478 * base_data_offset is always equal to the position of the first byte of the
1479 * enclosing Movie Fragment BOX.
1480 * This flag is only available under the 'iso5' or later brands and cannot be set
1481 * when earlier brands are included in the File Type box. */
1482 } isom_tf_flags_code
;
1484 /* Track Run Flags ('tr_flags') */
1487 ISOM_TR_FLAGS_DATA_OFFSET_PRESENT
= 0x000001, /* data-offset-present:
1488 * This flag indicates the presence of the data_offset field. */
1489 ISOM_TR_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT
= 0x000004, /* first-sample-flags-present:
1490 * This flag indicates the presence of the first_sample_flags field. */
1491 ISOM_TR_FLAGS_SAMPLE_DURATION_PRESENT
= 0x000100, /* sample-duration-present:
1492 * This flag indicates the presence of the sample_duration field. */
1493 ISOM_TR_FLAGS_SAMPLE_SIZE_PRESENT
= 0x000200, /* sample-size-present:
1494 * This flag indicates the presence of the sample_size field. */
1495 ISOM_TR_FLAGS_SAMPLE_FLAGS_PRESENT
= 0x000400, /* sample-flags-present:
1496 * This flag indicates the presence of the sample_flags field. */
1497 ISOM_TR_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT
= 0x000800, /* sample-composition-time-offsets-present:
1498 * This flag indicates the presence of the sample_composition_time_offset field. */
1499 } isom_tr_flags_code
;
1504 unsigned reserved
: 4;
1505 /* The definition of the following fields is quite the same as Independent and Disposable Samples Box. */
1506 unsigned is_leading
: 2;
1507 unsigned sample_depends_on
: 2;
1508 unsigned sample_is_depended_on
: 2;
1509 unsigned sample_has_redundancy
: 2;
1511 unsigned sample_padding_value
: 3; /* the number of bits at the end of this sample */
1512 unsigned sample_is_non_sync_sample
: 1; /* 0 value means this sample is sync sample. */
1513 uint16_t sample_degradation_priority
;
1514 } isom_sample_flags_t
;
1516 /* Movie Extends Header Box
1517 * This box is omitted when used in live streaming.
1518 * If this box is not present, the overall duration must be computed by examining each fragment. */
1521 ISOM_FULLBOX_COMMON
;
1522 /* version == 0: uint64_t -> uint32_t */
1523 uint64_t fragment_duration
; /* the duration of the longest track, in the timescale indicated in the Movie Header Box, including movie fragments. */
1526 /* Track Extends Box
1527 * This box sets up default values used by the movie fragments. */
1530 ISOM_FULLBOX_COMMON
;
1531 uint32_t track_ID
; /* identifier of the track; this shall be the track ID of a track in the Movie Box */
1532 uint32_t default_sample_description_index
;
1533 uint32_t default_sample_duration
;
1534 uint32_t default_sample_size
;
1535 isom_sample_flags_t default_sample_flags
;
1538 /* Movie Extends Box
1539 * This box warns readers that there might be Movie Fragment Boxes in this file. */
1542 ISOM_BASEBOX_COMMON
;
1543 isom_mehd_t
*mehd
; /* Movie Extends Header Box / omitted when used in live streaming */
1544 lsmash_entry_list_t trex_list
; /* Track Extends Box */
1547 /* Movie Fragment Header Box
1548 * This box contains a sequence number, as a safety check.
1549 * The sequence number 'usually' starts at 1 and must increase for each movie fragment in the file, in the order in which they occur. */
1552 ISOM_FULLBOX_COMMON
;
1553 uint32_t sequence_number
; /* the ordinal number of this fragment, in increasing order */
1556 /* Track Fragment Header Box
1557 * Each movie fragment can contain zero or more fragments for each track;
1558 * and a track fragment can contain zero or more contiguous runs of samples.
1559 * This box sets up information and defaults used for those runs of samples. */
1562 ISOM_FULLBOX_COMMON
; /* flags field is used for 'tf_flags'. */
1564 /* all the following are optional fields */
1565 uint64_t base_data_offset
; /* an explicit anchor for the data offsets in each track run
1566 * To avoid the case this field might overflow, e.g. semi-permanent live streaming and broadcasting,
1567 * you shall not use this optional field. */
1568 uint32_t sample_description_index
; /* override default_sample_description_index in Track Extends Box */
1569 uint32_t default_sample_duration
; /* override default_sample_duration in Track Extends Box */
1570 uint32_t default_sample_size
; /* override default_sample_size in Track Extends Box */
1571 isom_sample_flags_t default_sample_flags
; /* override default_sample_flags in Track Extends Box */
1574 /* Track Fragment Base Media Decode Time Box
1575 * This box provides the absolute decode time, measured on the media timeline, of the first sample in decode order in the track fragment.
1576 * This can be useful, for example, when performing random access in a file;
1577 * it is not necessary to sum the sample durations of all preceding samples in previous fragments to find this value
1578 * (where the sample durations are the deltas in the Decoding Time to Sample Box and the sample_durations in the preceding track runs).
1579 * This box, if present, shall be positioned after the Track Fragment Header Box and before the first Track Fragment Run box. */
1582 ISOM_FULLBOX_COMMON
; /* version is either 0 or 1 */
1583 /* version == 0: 64bits -> 32bits */
1584 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
1585 * It does not include the samples added in the enclosing track fragment.
1586 * NOTE: the decode timeline is a media timeline, established before any explicit or implied mapping of media time to presentation time,
1587 * for example by an edit list or similar structure. */
1590 /* Track Fragment Run Box
1591 * Within the Track Fragment Box, there are zero or more Track Fragment Run Boxes.
1592 * If the duration-is-empty flag is set in the tf_flags, there are no track runs.
1593 * A track run documents a contiguous set of samples for a track. */
1596 ISOM_FULLBOX_COMMON
; /* flags field is used for 'tr_flags'. */
1597 uint32_t sample_count
; /* the number of samples being added in this run; also the number of rows in the following table */
1598 /* The following are optional fields. */
1599 int32_t data_offset
; /* This value is added to the implicit or explicit data_offset established in the Track Fragment Header Box.
1600 * If this field is not present, then the data for this run starts immediately after the data of the previous run,
1601 * or at the base_data_offset defined by the Track Fragment Header Box if this is the first run in a track fragment. */
1602 isom_sample_flags_t first_sample_flags
; /* a set of flags for the first sample only of this run */
1603 lsmash_entry_list_t
*optional
; /* all fields in this array are optional. */
1608 /* If the following fields is present, each field overrides default value described in Track Fragment Header Box or Track Extends Box. */
1609 uint32_t sample_duration
; /* override default_sample_duration */
1610 uint32_t sample_size
; /* override default_sample_size */
1611 isom_sample_flags_t sample_flags
; /* override default_sample_flags */
1613 uint32_t sample_composition_time_offset
; /* composition time offset
1614 * If version == 0, unsigned 32-bit integer.
1615 * Otherwise, signed 32-bit integer. */
1616 } isom_trun_optional_row_t
;
1618 /* Track Fragment Box */
1621 ISOM_BASEBOX_COMMON
;
1622 isom_tfhd_t
*tfhd
; /* Track Fragment Header Box */
1623 isom_tfdt_t
*tfdt
; /* Track Fragment Base Media Decode Time Box */
1624 lsmash_entry_list_t trun_list
; /* Track Fragment Run Box List
1625 * If the duration-is-empty flag is set in the tf_flags, there are no track runs. */
1626 isom_sdtp_t
*sdtp
; /* Independent and Disposable Samples Box (available under Protected Interoperable File Format) */
1627 lsmash_entry_list_t sgpd_list
; /* Sample Group Description Boxes (available under ISO Base Media version 6 or later) */
1628 lsmash_entry_list_t sbgp_list
; /* Sample To Group Boxes */
1630 isom_cache_t
*cache
; /* taken over from corresponding 'trak' */
1633 /* Movie Fragment Box */
1636 ISOM_BASEBOX_COMMON
;
1637 isom_mfhd_t
*mfhd
; /* Movie Fragment Header Box */
1638 lsmash_entry_list_t traf_list
; /* Track Fragment Box List */
1641 /* Track Fragment Random Access Box
1642 * Each entry in this box contains the location and the presentation time of the sync sample.
1643 * Note that not every sync sample in the track needs to be listed in the table.
1644 * The absence of this box does not mean that all the samples are sync samples. */
1647 ISOM_FULLBOX_COMMON
;
1649 unsigned int reserved
: 26;
1650 unsigned int length_size_of_traf_num
: 2; /* the length in byte of the traf_number field minus one */
1651 unsigned int length_size_of_trun_num
: 2; /* the length in byte of the trun_number field minus one */
1652 unsigned int length_size_of_sample_num
: 2; /* the length in byte of the sample_number field minus one */
1653 uint32_t number_of_entry
; /* the number of the entries for this track
1654 * Value zero indicates that every sample is a sync sample and no table entry follows. */
1655 lsmash_entry_list_t
*list
; /* entry_count corresponds to number_of_entry. */
1660 /* version == 0: 64bits -> 32bits */
1661 uint64_t time
; /* the presentation time of the sync sample in units defined in the Media Header Box of the associated track
1662 * For segments based on movie sample tables or movie fragments, presentation times are in the movie timeline,
1663 * that is they are composition times after the application of any edit list for the track.
1664 * Note: the definition of segment is portion of an ISO base media file format file, consisting of either
1665 * (a) a movie box, with its associated media data (if any) and other associated boxes
1667 * (b) one or more movie fragment boxes, with their associated media data, and other associated boxes. */
1668 uint64_t moof_offset
; /* the offset of the Movie Fragment Box used in this entry
1669 * Offset is the byte-offset between the beginning of the file and the beginning of the Movie Fragment Box. */
1671 uint32_t traf_number
; /* the Track Fragment Box ('traf') number that contains the sync sample
1672 * The number ranges from 1 in each Movie Fragment Box ('moof'). */
1673 uint32_t trun_number
; /* the Track Fragment Run Box ('trun') number that contains the sync sample
1674 * The number ranges from 1 in each Track Fragment Box ('traf'). */
1675 uint32_t sample_number
; /* the sample number that contains the sync sample
1676 * The number ranges from 1 in each Track Fragment Run Box ('trun'). */
1677 } isom_tfra_location_time_entry_t
;
1679 /* Movie Fragment Random Access Offset Box
1680 * This box provides a copy of the length field from the enclosing Movie Fragment Random Access Box. */
1683 ISOM_FULLBOX_COMMON
;
1684 uint32_t length
; /* an integer gives the number of bytes of the enclosing Movie Fragment Random Access Box
1685 * This field is placed at the last of the enclosing box to assist readers scanning
1686 * from the end of the file in finding the Movie Fragment Random Access Box. */
1689 /* Movie Fragment Random Access Box
1690 * This box provides a table which may assist readers in finding sync samples in a file using movie fragments,
1691 * and is usually placed at or near the end of the file.
1692 * The last box within the Movie Fragment Random Access Box, which is called Movie Fragment Random Access Offset Box,
1693 * provides a copy of the length field from the Movie Fragment Random Access Box. */
1696 ISOM_BASEBOX_COMMON
;
1697 lsmash_entry_list_t tfra_list
; /* Track Fragment Random Access Box */
1698 isom_mfro_t
*mfro
; /* Movie Fragment Random Access Offset Box */
1701 /* Movie fragment manager
1702 * The presence of this means we use the structure of movie fragments. */
1705 #define FIRST_MOOF_POS_UNDETERMINED UINT64_MAX
1706 isom_moof_t
*movie
; /* the address corresponding to the current Movie Fragment Box */
1707 uint64_t first_moof_pos
;
1708 uint64_t pool_size
; /* the total sample size in the current movie fragment */
1709 uint64_t sample_count
; /* the number of samples within the current movie fragment */
1710 lsmash_entry_list_t
*pool
; /* samples pooled to interleave for the current movie fragment */
1711 } isom_fragment_manager_t
;
1718 ISOM_BASEBOX_COMMON
;
1719 isom_tkhd_t
*tkhd
; /* Track Header Box */
1720 isom_tapt_t
*tapt
; /* ISOM: null / QTFF: Track Aperture Mode Dimensions Box */
1721 isom_edts_t
*edts
; /* Edit Box */
1722 isom_tref_t
*tref
; /* Track Reference Box */
1723 isom_mdia_t
*mdia
; /* Media Box */
1724 isom_udta_t
*udta
; /* User Data Box */
1725 isom_meta_t
*meta
; /* Meta Box */
1727 isom_cache_t
*cache
;
1728 uint32_t related_track_ID
;
1735 ISOM_BASEBOX_COMMON
;
1736 isom_mvhd_t
*mvhd
; /* Movie Header Box */
1737 isom_iods_t
*iods
; /* MP4: Object Descriptor Box */
1738 lsmash_entry_list_t trak_list
; /* Track Box List */
1739 isom_udta_t
*udta
; /* User Data Box */
1740 isom_ctab_t
*ctab
; /* ISOM: null / QTFF: Color Table Box */
1741 isom_meta_t
*meta
; /* Meta Box */
1742 isom_mvex_t
*mvex
; /* Movie Extends Box */
1747 * portion of an ISO base media file format file, consisting of either (a) a movie box, with its associated media data
1748 * (if any) and other associated boxes or (b) one or more movie fragment boxes, with their associated media data, and
1749 * and other associated boxes
1751 * time interval of a segment formed from movie fragment boxes, that is also a valid segment
1752 * A subsegment is defined as a time interval of the containing (sub)segment, and corresponds to a single range of
1753 * bytes of the containing (sub)segment. The durations of all the subsegments sum to the duration of the containing
1757 * Media presentations may be divided into segments for delivery, for example, it is possible (e.g. in HTTP streaming) to
1758 * form files that contain a segment ? or concatenated segments ? which would not necessarily form ISO Base Media file
1759 * format compliant files (e.g. they do not contain a Movie Box).
1760 * If segments are stored in separate files (e.g. on a standard HTTP server) it is recommended that these 'segment files'
1761 * contain a Segment Type Box, which must be first if present, to enable identification of those files, and declaration of
1762 * the specifications with which they are compliant.
1763 * Segment Type Boxes that are not first in a file may be ignored.
1764 * Valid Segment Type Boxes shall be the first box in a segment.
1766 * The 'valid' here does not always mean that any brand of that segment has compatibility against other brands of it.
1767 * After concatenations of segments, the result file might contain incompatibilities among brands. */
1768 typedef isom_ftyp_t isom_styp_t
;
1770 /* Segment Index Box
1771 * This box provides a compact index of one media stream within the media segment to which it applies.
1773 * Each Segment Index Box documents how a (sub)segment is divided into one or more subsegments (which may themselves be
1774 * further subdivided using Segment Index boxes).
1776 * Each entry in the Segment Index Box contains a reference type that indicates whether the reference points directly to
1777 * the media bytes of a referenced leaf subsegment, which is a subsegment that does not contain any indexing information
1778 * that would enable its further division into subsegments, or to a Segment Index box that describes how the referenced
1779 * subsegment is further subdivided; as a result, the segment may be indexed in a 'hierarchical' or 'daisy-chain' or
1780 * other form by documenting time and byte offset information for other Segment Index Boxes applying to portions of the
1781 * same (sub)segment.
1783 * For segments based on ISO Base Media file format (i.e. based on movie sample tables or movie fragments):
1784 * ! an access unit is a sample;
1785 * ! a subsegment is a self-contained set of one or more consecutive movie fragments; a self-contained set contains
1786 * one or more Movie Fragment Boxes with the corresponding Media Data Box(es), and a Media Data Box containing data
1787 * referenced by a Movie Fragment Box must follow that Movie Fragment Box and precede the next Movie Fragment box
1788 * containing information about the same track;
1789 * ! Segment Index Boxes shall be placed before subsegment material they document, that is, before any Movie Fragment
1790 * Box of the documented material of the subsegment;
1791 * ! streams are tracks in the file format, and stream IDs are track IDs;
1792 * ! a subsegment contains a stream access point if a track fragment within the subsegment for the track with track_ID
1793 * equal to reference_ID contains a stream access point;
1794 * ! initialisation data for SAPs consists of the Movie Box;
1795 * ! presentation times are in the movie timeline, that is they are composition times after the application of any edit
1796 * list for the track;
1797 * ! the ISAP is a position exactly pointing to the start of a top-level box, such as a Movie Fragment Box;
1798 * ! a SAP of type 1 or type 2 is indicated as a sync sample;
1799 * ! a SAP of type 3 is marked as a member of a sample group of type 'rap ';
1800 * ! 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
1801 * is greater than 0.
1802 * For SAPs of type 5 and 6, no specific signalling in the ISO Base Media file format is supported. */
1805 unsigned int reference_type
: 1; /* 1: the reference is to a Segment Index Box
1806 * 0: the reference is to media content
1807 * For files based on the ISO Base Media file format, the reference is to a
1808 * Movie Fragment Box.
1809 * If a separate index segment is used, then entries with reference type 1 are
1810 * in the index segment, and entries with reference type 0 are in the media file. */
1811 unsigned int reference_size
: 31; /* the distance in bytes from the first byte of the referenced item to the first
1812 * byte of the next referenced item, or in the case of the last entry, the end of
1813 * the referenced material */
1814 uint32_t subsegment_duration
; /* when the reference is to Segment Index Box, i.e. reference_type is equal to 1:
1815 * this field carries the sum of the subsegment_duration fields in that box;
1816 * when the reference is to a subsegment:
1817 * this field carries the difference between the earliest presentation time of
1818 * any access unit of the reference stream in the next subsegment (or the first
1819 * subsegment of the next segment, if this is the last subsegment of the segment,
1820 * or the end presentation time of the reference stream if this is the last
1821 * subsegment of the stream) and the earliest presentation time of any access
1822 * unit of the reference stream in the referenced subsegment;
1823 * The duration is expressed in the timescale of the enclosing Segment Index Box. */
1824 unsigned int starts_with_SAP
: 1; /* whether the referenced subsegments start with a SAP */
1825 unsigned int SAP_type
: 3; /* a SAP type or the value 0
1826 * When starting with a SAP, the value 0 means a SAP may be of an unknown type.
1827 * Otherwise, the value 0 means no information of SAPs is provided. */
1828 unsigned int SAP_delta_time
: 28; /* TSAP of the first SAP, in decoding order, in the referenced subsegment for
1829 * the reference stream
1830 * If the referenced subsegments do not contain a SAP, SAP_delta_time is
1831 * reserved with the value 0, otherwise SAP_delta_time is the difference between
1832 * the earliest presentation time of the subsegment, and the TSAP.
1833 * Note that this difference may be zero, in the case that the subsegment starts
1835 } isom_sidx_referenced_item_t
;
1839 ISOM_FULLBOX_COMMON
;
1840 uint32_t reference_ID
; /* the stream ID for the reference stream
1841 * If this Segment Index box is referenced from a "parent" Segment Index box, the value
1842 * of the value of reference_ID shall be the same as the value of reference_ID of the
1843 * "parent" Segment Index Box. */
1844 uint32_t timescale
; /* the timescale, in ticks per second, for the time and duration fields within this box
1845 * It is recommended that this match the timescale of the reference stream or track.
1846 * For files based on the ISO Base Media file format, that is the timescale field of
1847 * the Media Header Box of the track. */
1848 /* version == 0: 64bits -> 32bits */
1849 uint64_t earliest_presentation_time
; /* the earliest presentation time of any access unit in the reference stream
1850 * in the first subsegment, in the timescale indicated in the timescale field */
1851 uint64_t first_offset
; /* the distance in bytes, in the file containing media, from the anchor point,
1852 * to the first byte of the indexed material */
1854 uint16_t reserved
; /* 0 */
1855 uint16_t reference_count
; /* the number of referenced items */
1856 lsmash_entry_list_t
*list
; /* entry_count corresponds to reference_count. */
1862 struct lsmash_file_tag
1864 ISOM_FULLBOX_COMMON
; /* The 'size' field indicates total file size.
1865 * The 'flags' field indicates file mode. */
1866 isom_ftyp_t
*ftyp
; /* File Type Box */
1867 lsmash_entry_list_t styp_list
; /* Segment Type Box List */
1868 isom_moov_t
*moov
; /* Movie Box */
1869 lsmash_entry_list_t sidx_list
; /* Segment Index Box List */
1870 lsmash_entry_list_t moof_list
; /* Movie Fragment Box List */
1871 isom_mdat_t
*mdat
; /* Media Data Box */
1872 isom_free_t
*free
; /* Free Space Box */
1873 isom_meta_t
*meta
; /* Meta Box */
1874 isom_mfra_t
*mfra
; /* Movie Fragment Random Access Box */
1876 lsmash_bs_t
*bs
; /* bytestream manager */
1877 isom_fragment_manager_t
*fragment
; /* movie fragment manager */
1878 lsmash_entry_list_t
*print
;
1879 lsmash_entry_list_t
*timeline
;
1880 lsmash_file_t
*initializer
;
1881 uint64_t fragment_count
; /* the number of movie fragments we created */
1882 double max_chunk_duration
; /* max duration per chunk in seconds */
1883 double max_async_tolerance
; /* max tolerance, in seconds, for amount of interleaving asynchronization between tracks */
1884 uint64_t max_chunk_size
; /* max size per chunk in bytes. */
1885 uint32_t brand_count
;
1886 uint32_t *compatible_brands
; /* the backup of the compatible brands in the File Type Box or the valid Segment Type Box */
1887 uint8_t fake_file_mode
; /* If set to 1, the bytestream manager handles fake-file stream. */
1888 /* flags for compatibility */
1889 #define COMPAT_FLAGS_OFFSET offsetof( lsmash_file_t, qt_compatible )
1890 uint8_t qt_compatible
; /* compatibility with QuickTime file format */
1891 uint8_t isom_compatible
; /* compatibility with ISO Base Media file format */
1892 uint8_t avc_extensions
; /* compatibility with AVC extensions */
1893 uint8_t mp4_version1
; /* compatibility with MP4 ver.1 file format */
1894 uint8_t mp4_version2
; /* compatibility with MP4 ver.2 file format */
1895 uint8_t itunes_movie
; /* compatibility with iTunes Movie */
1896 uint8_t max_3gpp_version
; /* maximum 3GPP version */
1897 uint8_t max_isom_version
; /* maximum ISO Base Media file format version */
1898 uint8_t min_isom_version
; /* minimum ISO Base Media file format version */
1899 uint8_t forbid_tref
; /* If set to 1, track reference is forbidden. */
1900 uint8_t undefined_64_ver
; /* If set to 1, 64-bit version fields, e.g. duration, are undefined. */
1901 uint8_t allow_moof_base
; /* If set to 1, default-base-is-moof is available for muxing. */
1902 uint8_t media_segment
; /* If set to 1, this file is a media segment. */
1905 /* fake-file stream */
1911 } fake_file_stream_t
;
1914 struct lsmash_root_tag
1916 ISOM_FULLBOX_COMMON
; /* The 'file' field contains the address of the current active file. */
1917 lsmash_entry_list_t file_list
; /* the list of all files the ROOT contains */
1925 * Be careful about the use of the following defined BOX identifiers.
1926 * Values of array XXXX_BOX_TYPE_YYYY.user.id may be invalid/disappeared value.
1927 * For some systems, e.g.,
1929 * memcpy( id, ISOM_BOX_TYPE_MOOV.user.id, 12 * sizeof(uint8_t) );
1930 * brings about undefined behaviour.
1931 * If you want to access values of array XXXX_BOX_TYPE_YYYY.user.id, you shall do like
1933 * lsmash_box_type_t type = ISOM_BOX_TYPE_MOOV;
1934 * memcpy( id, type.user.id, 12 * sizeof(uint8_t) );
1936 #define ISOM_BOX_TYPE_ID32 lsmash_form_iso_box_type( LSMASH_4CC( 'I', 'D', '3', '2' ) )
1937 #define ISOM_BOX_TYPE_ALBM lsmash_form_iso_box_type( LSMASH_4CC( 'a', 'l', 'b', 'm' ) )
1938 #define ISOM_BOX_TYPE_AUTH lsmash_form_iso_box_type( LSMASH_4CC( 'a', 'u', 't', 'h' ) )
1939 #define ISOM_BOX_TYPE_BPCC lsmash_form_iso_box_type( LSMASH_4CC( 'b', 'p', 'c', 'c' ) )
1940 #define ISOM_BOX_TYPE_BUFF lsmash_form_iso_box_type( LSMASH_4CC( 'b', 'u', 'f', 'f' ) )
1941 #define ISOM_BOX_TYPE_BXML lsmash_form_iso_box_type( LSMASH_4CC( 'b', 'x', 'm', 'l' ) )
1942 #define ISOM_BOX_TYPE_CCID lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'c', 'i', 'd' ) )
1943 #define ISOM_BOX_TYPE_CDEF lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'd', 'e', 'f' ) )
1944 #define ISOM_BOX_TYPE_CLSF lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'l', 's', 'f' ) )
1945 #define ISOM_BOX_TYPE_CMAP lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'm', 'a', 'p' ) )
1946 #define ISOM_BOX_TYPE_CO64 lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'o', '6', '4' ) )
1947 #define ISOM_BOX_TYPE_COLR lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'o', 'l', 'r' ) )
1948 #define ISOM_BOX_TYPE_CPRT lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'p', 'r', 't' ) )
1949 #define ISOM_BOX_TYPE_CSLG lsmash_form_iso_box_type( LSMASH_4CC( 'c', 's', 'l', 'g' ) )
1950 #define ISOM_BOX_TYPE_CTTS lsmash_form_iso_box_type( LSMASH_4CC( 'c', 't', 't', 's' ) )
1951 #define ISOM_BOX_TYPE_CVRU lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'v', 'r', 'u' ) )
1952 #define ISOM_BOX_TYPE_DCFD lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'c', 'f', 'D' ) )
1953 #define ISOM_BOX_TYPE_DINF lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'i', 'n', 'f' ) )
1954 #define ISOM_BOX_TYPE_DREF lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'r', 'e', 'f' ) )
1955 #define ISOM_BOX_TYPE_DSCP lsmash_form_iso_box_type( LSMASH_4CC( 'd', 's', 'c', 'p' ) )
1956 #define ISOM_BOX_TYPE_DSGD lsmash_form_iso_box_type( LSMASH_4CC( 'd', 's', 'g', 'd' ) )
1957 #define ISOM_BOX_TYPE_DSTG lsmash_form_iso_box_type( LSMASH_4CC( 'd', 's', 't', 'g' ) )
1958 #define ISOM_BOX_TYPE_EDTS lsmash_form_iso_box_type( LSMASH_4CC( 'e', 'd', 't', 's' ) )
1959 #define ISOM_BOX_TYPE_ELST lsmash_form_iso_box_type( LSMASH_4CC( 'e', 'l', 's', 't' ) )
1960 #define ISOM_BOX_TYPE_FECI lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'e', 'c', 'i' ) )
1961 #define ISOM_BOX_TYPE_FECR lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'e', 'c', 'r' ) )
1962 #define ISOM_BOX_TYPE_FIIN lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'i', 'i', 'n' ) )
1963 #define ISOM_BOX_TYPE_FIRE lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'i', 'r', 'e' ) )
1964 #define ISOM_BOX_TYPE_FPAR lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'p', 'a', 'r' ) )
1965 #define ISOM_BOX_TYPE_FREE lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'r', 'e', 'e' ) )
1966 #define ISOM_BOX_TYPE_FRMA lsmash_form_iso_box_type( LSMASH_4CC( 'f', 'r', 'm', 'a' ) )
1967 #define ISOM_BOX_TYPE_FTYP lsmash_form_iso_box_type( LSMASH_4CC( 'f', 't', 'y', 'p' ) )
1968 #define ISOM_BOX_TYPE_GITN lsmash_form_iso_box_type( LSMASH_4CC( 'g', 'i', 't', 'n' ) )
1969 #define ISOM_BOX_TYPE_GNRE lsmash_form_iso_box_type( LSMASH_4CC( 'g', 'n', 'r', 'e' ) )
1970 #define ISOM_BOX_TYPE_GRPI lsmash_form_iso_box_type( LSMASH_4CC( 'g', 'r', 'p', 'i' ) )
1971 #define ISOM_BOX_TYPE_HDLR lsmash_form_iso_box_type( LSMASH_4CC( 'h', 'd', 'l', 'r' ) )
1972 #define ISOM_BOX_TYPE_HMHD lsmash_form_iso_box_type( LSMASH_4CC( 'h', 'm', 'h', 'd' ) )
1973 #define ISOM_BOX_TYPE_ICNU lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'c', 'n', 'u' ) )
1974 #define ISOM_BOX_TYPE_IDAT lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'd', 'a', 't' ) )
1975 #define ISOM_BOX_TYPE_IHDR lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'h', 'd', 'r' ) )
1976 #define ISOM_BOX_TYPE_IINF lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'i', 'n', 'f' ) )
1977 #define ISOM_BOX_TYPE_ILOC lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'l', 'o', 'c' ) )
1978 #define ISOM_BOX_TYPE_IMIF lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'm', 'i', 'f' ) )
1979 #define ISOM_BOX_TYPE_INFU lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'n', 'f', 'u' ) )
1980 #define ISOM_BOX_TYPE_IODS lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'o', 'd', 's' ) )
1981 #define ISOM_BOX_TYPE_IPHD lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'p', 'h', 'd' ) )
1982 #define ISOM_BOX_TYPE_IPMC lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'p', 'm', 'c' ) )
1983 #define ISOM_BOX_TYPE_IPRO lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'p', 'r', 'o' ) )
1984 #define ISOM_BOX_TYPE_IREF lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'r', 'e', 'f' ) )
1985 #define ISOM_BOX_TYPE_JP lsmash_form_iso_box_type( LSMASH_4CC( 'j', 'p', ' ', ' ' ) )
1986 #define ISOM_BOX_TYPE_JP2C lsmash_form_iso_box_type( LSMASH_4CC( 'j', 'p', '2', 'c' ) )
1987 #define ISOM_BOX_TYPE_JP2H lsmash_form_iso_box_type( LSMASH_4CC( 'j', 'p', '2', 'h' ) )
1988 #define ISOM_BOX_TYPE_JP2I lsmash_form_iso_box_type( LSMASH_4CC( 'j', 'p', '2', 'i' ) )
1989 #define ISOM_BOX_TYPE_KYWD lsmash_form_iso_box_type( LSMASH_4CC( 'k', 'y', 'w', 'd' ) )
1990 #define ISOM_BOX_TYPE_LOCI lsmash_form_iso_box_type( LSMASH_4CC( 'l', 'o', 'c', 'i' ) )
1991 #define ISOM_BOX_TYPE_LRCU lsmash_form_iso_box_type( LSMASH_4CC( 'l', 'r', 'c', 'u' ) )
1992 #define ISOM_BOX_TYPE_MDAT lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'd', 'a', 't' ) )
1993 #define ISOM_BOX_TYPE_MDHD lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'd', 'h', 'd' ) )
1994 #define ISOM_BOX_TYPE_MDIA lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'd', 'i', 'a' ) )
1995 #define ISOM_BOX_TYPE_MDRI lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'd', 'r', 'i' ) )
1996 #define ISOM_BOX_TYPE_MECO lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'e', 'c', 'o' ) )
1997 #define ISOM_BOX_TYPE_MEHD lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'e', 'h', 'd' ) )
1998 #define ISOM_BOX_TYPE_M7HD lsmash_form_iso_box_type( LSMASH_4CC( 'm', '7', 'h', 'd' ) )
1999 #define ISOM_BOX_TYPE_MERE lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'e', 'r', 'e' ) )
2000 #define ISOM_BOX_TYPE_META lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'e', 't', 'a' ) )
2001 #define ISOM_BOX_TYPE_MFHD lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'f', 'h', 'd' ) )
2002 #define ISOM_BOX_TYPE_MFRA lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'f', 'r', 'a' ) )
2003 #define ISOM_BOX_TYPE_MFRO lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'f', 'r', 'o' ) )
2004 #define ISOM_BOX_TYPE_MINF lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'i', 'n', 'f' ) )
2005 #define ISOM_BOX_TYPE_MJHD lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'j', 'h', 'd' ) )
2006 #define ISOM_BOX_TYPE_MOOF lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'o', 'o', 'f' ) )
2007 #define ISOM_BOX_TYPE_MOOV lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'o', 'o', 'v' ) )
2008 #define ISOM_BOX_TYPE_MVCG lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'v', 'c', 'g' ) )
2009 #define ISOM_BOX_TYPE_MVCI lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'v', 'c', 'i' ) )
2010 #define ISOM_BOX_TYPE_MVEX lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'v', 'e', 'x' ) )
2011 #define ISOM_BOX_TYPE_MVHD lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'v', 'h', 'd' ) )
2012 #define ISOM_BOX_TYPE_MVRA lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'v', 'r', 'a' ) )
2013 #define ISOM_BOX_TYPE_NMHD lsmash_form_iso_box_type( LSMASH_4CC( 'n', 'm', 'h', 'd' ) )
2014 #define ISOM_BOX_TYPE_OCHD lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'c', 'h', 'd' ) )
2015 #define ISOM_BOX_TYPE_ODAF lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 'a', 'f' ) )
2016 #define ISOM_BOX_TYPE_ODDA lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 'd', 'a' ) )
2017 #define ISOM_BOX_TYPE_ODHD lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 'h', 'd' ) )
2018 #define ISOM_BOX_TYPE_ODHE lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 'h', 'e' ) )
2019 #define ISOM_BOX_TYPE_ODRB lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 'r', 'b' ) )
2020 #define ISOM_BOX_TYPE_ODRM lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 'r', 'm' ) )
2021 #define ISOM_BOX_TYPE_ODTT lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'd', 't', 't' ) )
2022 #define ISOM_BOX_TYPE_OHDR lsmash_form_iso_box_type( LSMASH_4CC( 'o', 'h', 'd', 'r' ) )
2023 #define ISOM_BOX_TYPE_PADB lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'a', 'd', 'b' ) )
2024 #define ISOM_BOX_TYPE_PAEN lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'a', 'e', 'n' ) )
2025 #define ISOM_BOX_TYPE_PCLR lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'c', 'l', 'r' ) )
2026 #define ISOM_BOX_TYPE_PDIN lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'd', 'i', 'n' ) )
2027 #define ISOM_BOX_TYPE_PERF lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'e', 'r', 'f' ) )
2028 #define ISOM_BOX_TYPE_PITM lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'i', 't', 'm' ) )
2029 #define ISOM_BOX_TYPE_RES lsmash_form_iso_box_type( LSMASH_4CC( 'r', 'e', 's', ' ' ) )
2030 #define ISOM_BOX_TYPE_RESC lsmash_form_iso_box_type( LSMASH_4CC( 'r', 'e', 's', 'c' ) )
2031 #define ISOM_BOX_TYPE_RESD lsmash_form_iso_box_type( LSMASH_4CC( 'r', 'e', 's', 'd' ) )
2032 #define ISOM_BOX_TYPE_RTNG lsmash_form_iso_box_type( LSMASH_4CC( 'r', 't', 'n', 'g' ) )
2033 #define ISOM_BOX_TYPE_SBGP lsmash_form_iso_box_type( LSMASH_4CC( 's', 'b', 'g', 'p' ) )
2034 #define ISOM_BOX_TYPE_SCHI lsmash_form_iso_box_type( LSMASH_4CC( 's', 'c', 'h', 'i' ) )
2035 #define ISOM_BOX_TYPE_SCHM lsmash_form_iso_box_type( LSMASH_4CC( 's', 'c', 'h', 'm' ) )
2036 #define ISOM_BOX_TYPE_SDEP lsmash_form_iso_box_type( LSMASH_4CC( 's', 'd', 'e', 'p' ) )
2037 #define ISOM_BOX_TYPE_SDHD lsmash_form_iso_box_type( LSMASH_4CC( 's', 'd', 'h', 'd' ) )
2038 #define ISOM_BOX_TYPE_SDTP lsmash_form_iso_box_type( LSMASH_4CC( 's', 'd', 't', 'p' ) )
2039 #define ISOM_BOX_TYPE_SDVP lsmash_form_iso_box_type( LSMASH_4CC( 's', 'd', 'v', 'p' ) )
2040 #define ISOM_BOX_TYPE_SEGR lsmash_form_iso_box_type( LSMASH_4CC( 's', 'e', 'g', 'r' ) )
2041 #define ISOM_BOX_TYPE_SGPD lsmash_form_iso_box_type( LSMASH_4CC( 's', 'g', 'p', 'd' ) )
2042 #define ISOM_BOX_TYPE_SIDX lsmash_form_iso_box_type( LSMASH_4CC( 's', 'i', 'd', 'x' ) )
2043 #define ISOM_BOX_TYPE_SINF lsmash_form_iso_box_type( LSMASH_4CC( 's', 'i', 'n', 'f' ) )
2044 #define ISOM_BOX_TYPE_SKIP lsmash_form_iso_box_type( LSMASH_4CC( 's', 'k', 'i', 'p' ) )
2045 #define ISOM_BOX_TYPE_SMHD lsmash_form_iso_box_type( LSMASH_4CC( 's', 'm', 'h', 'd' ) )
2046 #define ISOM_BOX_TYPE_SRMB lsmash_form_iso_box_type( LSMASH_4CC( 's', 'r', 'm', 'b' ) )
2047 #define ISOM_BOX_TYPE_SRMC lsmash_form_iso_box_type( LSMASH_4CC( 's', 'r', 'm', 'c' ) )
2048 #define ISOM_BOX_TYPE_SRPP lsmash_form_iso_box_type( LSMASH_4CC( 's', 'r', 'p', 'p' ) )
2049 #define ISOM_BOX_TYPE_STBL lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 'b', 'l' ) )
2050 #define ISOM_BOX_TYPE_STCO lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 'c', 'o' ) )
2051 #define ISOM_BOX_TYPE_STDP lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 'd', 'p' ) )
2052 #define ISOM_BOX_TYPE_STSC lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 's', 'c' ) )
2053 #define ISOM_BOX_TYPE_STSD lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 's', 'd' ) )
2054 #define ISOM_BOX_TYPE_STSH lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 's', 'h' ) )
2055 #define ISOM_BOX_TYPE_STSS lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 's', 's' ) )
2056 #define ISOM_BOX_TYPE_STSZ lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 's', 'z' ) )
2057 #define ISOM_BOX_TYPE_STTS lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 't', 's' ) )
2058 #define ISOM_BOX_TYPE_STYP lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 'y', 'p' ) )
2059 #define ISOM_BOX_TYPE_STZ2 lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 'z', '2' ) )
2060 #define ISOM_BOX_TYPE_SUBS lsmash_form_iso_box_type( LSMASH_4CC( 's', 'u', 'b', 's' ) )
2061 #define ISOM_BOX_TYPE_SWTC lsmash_form_iso_box_type( LSMASH_4CC( 's', 'w', 't', 'c' ) )
2062 #define ISOM_BOX_TYPE_TFHD lsmash_form_iso_box_type( LSMASH_4CC( 't', 'f', 'h', 'd' ) )
2063 #define ISOM_BOX_TYPE_TFDT lsmash_form_iso_box_type( LSMASH_4CC( 't', 'f', 'd', 't' ) )
2064 #define ISOM_BOX_TYPE_TFRA lsmash_form_iso_box_type( LSMASH_4CC( 't', 'f', 'r', 'a' ) )
2065 #define ISOM_BOX_TYPE_TIBR lsmash_form_iso_box_type( LSMASH_4CC( 't', 'i', 'b', 'r' ) )
2066 #define ISOM_BOX_TYPE_TIRI lsmash_form_iso_box_type( LSMASH_4CC( 't', 'i', 'r', 'i' ) )
2067 #define ISOM_BOX_TYPE_TITL lsmash_form_iso_box_type( LSMASH_4CC( 't', 'i', 't', 'l' ) )
2068 #define ISOM_BOX_TYPE_TKHD lsmash_form_iso_box_type( LSMASH_4CC( 't', 'k', 'h', 'd' ) )
2069 #define ISOM_BOX_TYPE_TRAF lsmash_form_iso_box_type( LSMASH_4CC( 't', 'r', 'a', 'f' ) )
2070 #define ISOM_BOX_TYPE_TRAK lsmash_form_iso_box_type( LSMASH_4CC( 't', 'r', 'a', 'k' ) )
2071 #define ISOM_BOX_TYPE_TREF lsmash_form_iso_box_type( LSMASH_4CC( 't', 'r', 'e', 'f' ) )
2072 #define ISOM_BOX_TYPE_TREX lsmash_form_iso_box_type( LSMASH_4CC( 't', 'r', 'e', 'x' ) )
2073 #define ISOM_BOX_TYPE_TRGR lsmash_form_iso_box_type( LSMASH_4CC( 't', 'r', 'g', 'r' ) )
2074 #define ISOM_BOX_TYPE_TRUN lsmash_form_iso_box_type( LSMASH_4CC( 't', 'r', 'u', 'n' ) )
2075 #define ISOM_BOX_TYPE_TSEL lsmash_form_iso_box_type( LSMASH_4CC( 't', 's', 'e', 'l' ) )
2076 #define ISOM_BOX_TYPE_UDTA lsmash_form_iso_box_type( LSMASH_4CC( 'u', 'd', 't', 'a' ) )
2077 #define ISOM_BOX_TYPE_UINF lsmash_form_iso_box_type( LSMASH_4CC( 'u', 'i', 'n', 'f' ) )
2078 #define ISOM_BOX_TYPE_ULST lsmash_form_iso_box_type( LSMASH_4CC( 'u', 'l', 's', 't' ) )
2079 #define ISOM_BOX_TYPE_URL lsmash_form_iso_box_type( LSMASH_4CC( 'u', 'r', 'l', ' ' ) )
2080 #define ISOM_BOX_TYPE_URN lsmash_form_iso_box_type( LSMASH_4CC( 'u', 'r', 'n', ' ' ) )
2081 #define ISOM_BOX_TYPE_UUID lsmash_form_iso_box_type( LSMASH_4CC( 'u', 'u', 'i', 'd' ) )
2082 #define ISOM_BOX_TYPE_VMHD lsmash_form_iso_box_type( LSMASH_4CC( 'v', 'm', 'h', 'd' ) )
2083 #define ISOM_BOX_TYPE_VWDI lsmash_form_iso_box_type( LSMASH_4CC( 'v', 'w', 'd', 'i' ) )
2084 #define ISOM_BOX_TYPE_XML lsmash_form_iso_box_type( LSMASH_4CC( 'x', 'm', 'l', ' ' ) )
2085 #define ISOM_BOX_TYPE_YRRC lsmash_form_iso_box_type( LSMASH_4CC( 'y', 'r', 'r', 'c' ) )
2087 #define ISOM_BOX_TYPE_BTRT lsmash_form_iso_box_type( LSMASH_4CC( 'b', 't', 'r', 't' ) )
2088 #define ISOM_BOX_TYPE_CLAP lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'l', 'a', 'p' ) )
2089 #define ISOM_BOX_TYPE_PASP lsmash_form_iso_box_type( LSMASH_4CC( 'p', 'a', 's', 'p' ) )
2090 #define ISOM_BOX_TYPE_SRAT lsmash_form_iso_box_type( LSMASH_4CC( 's', 'r', 'a', 't' ) )
2091 #define ISOM_BOX_TYPE_STSL lsmash_form_iso_box_type( LSMASH_4CC( 's', 't', 's', 'l' ) )
2093 #define ISOM_BOX_TYPE_FTAB lsmash_form_iso_box_type( LSMASH_4CC( 'f', 't', 'a', 'b' ) )
2095 /* iTunes Metadata */
2096 #define ISOM_BOX_TYPE_DATA lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'a', 't', 'a' ) )
2097 #define ISOM_BOX_TYPE_ILST lsmash_form_iso_box_type( LSMASH_4CC( 'i', 'l', 's', 't' ) )
2098 #define ISOM_BOX_TYPE_MEAN lsmash_form_iso_box_type( LSMASH_4CC( 'm', 'e', 'a', 'n' ) )
2099 #define ISOM_BOX_TYPE_NAME lsmash_form_iso_box_type( LSMASH_4CC( 'n', 'a', 'm', 'e' ) )
2101 /* Tyrant extension */
2102 #define ISOM_BOX_TYPE_CHPL lsmash_form_iso_box_type( LSMASH_4CC( 'c', 'h', 'p', 'l' ) )
2104 /* Decoder Specific Info */
2105 #define ISOM_BOX_TYPE_ALAC lsmash_form_iso_box_type( LSMASH_4CC( 'a', 'l', 'a', 'c' ) )
2106 #define ISOM_BOX_TYPE_AVCC lsmash_form_iso_box_type( LSMASH_4CC( 'a', 'v', 'c', 'C' ) )
2107 #define ISOM_BOX_TYPE_DAC3 lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'a', 'c', '3' ) )
2108 #define ISOM_BOX_TYPE_DAMR lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'a', 'm', 'r' ) )
2109 #define ISOM_BOX_TYPE_DDTS lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'd', 't', 's' ) )
2110 #define ISOM_BOX_TYPE_DEC3 lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'e', 'c', '3' ) )
2111 #define ISOM_BOX_TYPE_DVC1 lsmash_form_iso_box_type( LSMASH_4CC( 'd', 'v', 'c', '1' ) )
2112 #define ISOM_BOX_TYPE_ESDS lsmash_form_iso_box_type( LSMASH_4CC( 'e', 's', 'd', 's' ) )
2113 #define ISOM_BOX_TYPE_HVCC lsmash_form_iso_box_type( LSMASH_4CC( 'h', 'v', 'c', 'C' ) )
2115 #define QT_BOX_TYPE_ALLF lsmash_form_qtff_box_type( LSMASH_4CC( 'A', 'l', 'l', 'F' ) )
2116 #define QT_BOX_TYPE_CLEF lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 'l', 'e', 'f' ) )
2117 #define QT_BOX_TYPE_CLIP lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 'l', 'i', 'p' ) )
2118 #define QT_BOX_TYPE_CRGN lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 'r', 'g', 'n' ) )
2119 #define QT_BOX_TYPE_CTAB lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 't', 'a', 'b' ) )
2120 #define QT_BOX_TYPE_ENOF lsmash_form_qtff_box_type( LSMASH_4CC( 'e', 'n', 'o', 'f' ) )
2121 #define QT_BOX_TYPE_GMHD lsmash_form_qtff_box_type( LSMASH_4CC( 'g', 'm', 'h', 'd' ) )
2122 #define QT_BOX_TYPE_GMIN lsmash_form_qtff_box_type( LSMASH_4CC( 'g', 'm', 'i', 'n' ) )
2123 #define QT_BOX_TYPE_ILST lsmash_form_qtff_box_type( LSMASH_4CC( 'i', 'l', 's', 't' ) )
2124 #define QT_BOX_TYPE_IMAP lsmash_form_qtff_box_type( LSMASH_4CC( 'i', 'm', 'a', 'p' ) )
2125 #define QT_BOX_TYPE_KEYS lsmash_form_qtff_box_type( LSMASH_4CC( 'k', 'e', 'y', 's' ) )
2126 #define QT_BOX_TYPE_KMAT lsmash_form_qtff_box_type( LSMASH_4CC( 'k', 'm', 'a', 't' ) )
2127 #define QT_BOX_TYPE_LOAD lsmash_form_qtff_box_type( LSMASH_4CC( 'l', 'o', 'a', 'd' ) )
2128 #define QT_BOX_TYPE_LOOP lsmash_form_qtff_box_type( LSMASH_4CC( 'L', 'O', 'O', 'P' ) )
2129 #define QT_BOX_TYPE_MATT lsmash_form_qtff_box_type( LSMASH_4CC( 'm', 'a', 't', 't' ) )
2130 #define QT_BOX_TYPE_META lsmash_form_qtff_box_type( LSMASH_4CC( 'm', 'e', 't', 'a' ) )
2131 #define QT_BOX_TYPE_PNOT lsmash_form_qtff_box_type( LSMASH_4CC( 'p', 'n', 'o', 't' ) )
2132 #define QT_BOX_TYPE_PROF lsmash_form_qtff_box_type( LSMASH_4CC( 'p', 'r', 'o', 'f' ) )
2133 #define QT_BOX_TYPE_SELO lsmash_form_qtff_box_type( LSMASH_4CC( 'S', 'e', 'l', 'O' ) )
2134 #define QT_BOX_TYPE_STPS lsmash_form_qtff_box_type( LSMASH_4CC( 's', 't', 'p', 's' ) )
2135 #define QT_BOX_TYPE_TAPT lsmash_form_qtff_box_type( LSMASH_4CC( 't', 'a', 'p', 't' ) )
2136 #define QT_BOX_TYPE_TEXT lsmash_form_qtff_box_type( LSMASH_4CC( 't', 'e', 'x', 't' ) )
2137 #define QT_BOX_TYPE_WLOC lsmash_form_qtff_box_type( LSMASH_4CC( 'W', 'L', 'O', 'C' ) )
2139 #define QT_BOX_TYPE_CHAN lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 'h', 'a', 'n' ) )
2140 #define QT_BOX_TYPE_COLR lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 'o', 'l', 'r' ) )
2141 #define QT_BOX_TYPE_CSPC lsmash_form_qtff_box_type( LSMASH_4CC( 'c', 's', 'p', 'c' ) )
2142 #define QT_BOX_TYPE_ENDA lsmash_form_qtff_box_type( LSMASH_4CC( 'e', 'n', 'd', 'a' ) )
2143 #define QT_BOX_TYPE_FIEL lsmash_form_qtff_box_type( LSMASH_4CC( 'f', 'i', 'e', 'l' ) )
2144 #define QT_BOX_TYPE_FRMA lsmash_form_qtff_box_type( LSMASH_4CC( 'f', 'r', 'm', 'a' ) )
2145 #define QT_BOX_TYPE_GAMA lsmash_form_qtff_box_type( LSMASH_4CC( 'g', 'a', 'm', 'a' ) )
2146 #define QT_BOX_TYPE_SGBT lsmash_form_qtff_box_type( LSMASH_4CC( 's', 'g', 'b', 't' ) )
2147 #define QT_BOX_TYPE_WAVE lsmash_form_qtff_box_type( LSMASH_4CC( 'w', 'a', 'v', 'e' ) )
2148 #define QT_BOX_TYPE_TERMINATOR lsmash_form_qtff_box_type( 0x00000000 )
2150 /* Decoder Specific Info */
2151 #define QT_BOX_TYPE_ALAC lsmash_form_qtff_box_type( LSMASH_4CC( 'a', 'l', 'a', 'c' ) )
2152 #define QT_BOX_TYPE_ESDS lsmash_form_qtff_box_type( LSMASH_4CC( 'e', 's', 'd', 's' ) )
2153 #define QT_BOX_TYPE_GLBL lsmash_form_qtff_box_type( LSMASH_4CC( 'g', 'l', 'b', 'l' ) )
2154 #define QT_BOX_TYPE_MP4A lsmash_form_qtff_box_type( LSMASH_4CC( 'm', 'p', '4', 'a' ) )
2156 /* Pre-defined precedence */
2157 #define LSMASH_BOX_PRECEDENCE_ISOM_FTYP (LSMASH_BOX_PRECEDENCE_H - 0 * LSMASH_BOX_PRECEDENCE_S)
2158 #define LSMASH_BOX_PRECEDENCE_ISOM_STYP (LSMASH_BOX_PRECEDENCE_H - 0 * LSMASH_BOX_PRECEDENCE_S)
2159 #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 */
2160 #define LSMASH_BOX_PRECEDENCE_ISOM_MOOV (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2161 #define LSMASH_BOX_PRECEDENCE_ISOM_MVHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2162 #define LSMASH_BOX_PRECEDENCE_ISOM_IODS (LSMASH_BOX_PRECEDENCE_HM - 2 * LSMASH_BOX_PRECEDENCE_S)
2163 #define LSMASH_BOX_PRECEDENCE_ISOM_TRAK (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2164 #define LSMASH_BOX_PRECEDENCE_ISOM_TKHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2165 #define LSMASH_BOX_PRECEDENCE_QTFF_TAPT (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2166 #define LSMASH_BOX_PRECEDENCE_QTFF_CLEF (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2167 #define LSMASH_BOX_PRECEDENCE_QTFF_PROF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2168 #define LSMASH_BOX_PRECEDENCE_QTFF_ENOF (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2169 #define LSMASH_BOX_PRECEDENCE_ISOM_EDTS (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2170 #define LSMASH_BOX_PRECEDENCE_ISOM_ELST (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2171 #define LSMASH_BOX_PRECEDENCE_ISOM_TREF (LSMASH_BOX_PRECEDENCE_N - 3 * LSMASH_BOX_PRECEDENCE_S)
2172 #define LSMASH_BOX_PRECEDENCE_ISOM_TREF_TYPE (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2173 #define LSMASH_BOX_PRECEDENCE_ISOM_MDIA (LSMASH_BOX_PRECEDENCE_N - 4 * LSMASH_BOX_PRECEDENCE_S)
2174 #define LSMASH_BOX_PRECEDENCE_ISOM_MDHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2175 #define LSMASH_BOX_PRECEDENCE_ISOM_HDLR (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2176 #define LSMASH_BOX_PRECEDENCE_ISOM_MINF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2177 #define LSMASH_BOX_PRECEDENCE_ISOM_VMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2178 #define LSMASH_BOX_PRECEDENCE_ISOM_SMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2179 #define LSMASH_BOX_PRECEDENCE_ISOM_HMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2180 #define LSMASH_BOX_PRECEDENCE_ISOM_NMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2181 #define LSMASH_BOX_PRECEDENCE_QTFF_GMHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2182 #define LSMASH_BOX_PRECEDENCE_QTFF_GMIN (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2183 #define LSMASH_BOX_PRECEDENCE_QTFF_TEXT (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2184 #define LSMASH_BOX_PRECEDENCE_ISOM_DINF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2185 #define LSMASH_BOX_PRECEDENCE_ISOM_DREF (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2186 #define LSMASH_BOX_PRECEDENCE_ISOM_URL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2187 #define LSMASH_BOX_PRECEDENCE_ISOM_STBL (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2188 #define LSMASH_BOX_PRECEDENCE_ISOM_STSD (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2189 #define LSMASH_BOX_PRECEDENCE_QTFF_GLBL (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2190 #define LSMASH_BOX_PRECEDENCE_ISOM_ESDS (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2191 #define LSMASH_BOX_PRECEDENCE_QTFF_ESDS (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S) /* preceded by 'frma' and 'mp4a' */
2192 #define LSMASH_BOX_PRECEDENCE_ISOM_BTRT (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S)
2193 #define LSMASH_BOX_PRECEDENCE_ISOM_COLR (LSMASH_BOX_PRECEDENCE_LP + 2 * LSMASH_BOX_PRECEDENCE_S)
2194 #define LSMASH_BOX_PRECEDENCE_QTFF_COLR (LSMASH_BOX_PRECEDENCE_LP + 2 * LSMASH_BOX_PRECEDENCE_S)
2195 #define LSMASH_BOX_PRECEDENCE_QTFF_GAMA (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2196 #define LSMASH_BOX_PRECEDENCE_QTFF_FIEL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2197 #define LSMASH_BOX_PRECEDENCE_QTFF_CSPC (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2198 #define LSMASH_BOX_PRECEDENCE_QTFF_SGBT (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S) /* 'v216' specific */
2199 #define LSMASH_BOX_PRECEDENCE_ISOM_CLAP (LSMASH_BOX_PRECEDENCE_LP + 1 * LSMASH_BOX_PRECEDENCE_S)
2200 #define LSMASH_BOX_PRECEDENCE_ISOM_PASP (LSMASH_BOX_PRECEDENCE_LP - 0 * LSMASH_BOX_PRECEDENCE_S)
2201 #define LSMASH_BOX_PRECEDENCE_ISOM_STSL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2202 #define LSMASH_BOX_PRECEDENCE_ISOM_CHAN (LSMASH_BOX_PRECEDENCE_LP - 0 * LSMASH_BOX_PRECEDENCE_S)
2203 #define LSMASH_BOX_PRECEDENCE_QTFF_CHAN (LSMASH_BOX_PRECEDENCE_LP - 0 * LSMASH_BOX_PRECEDENCE_S)
2204 #define LSMASH_BOX_PRECEDENCE_QTFF_WAVE (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2205 #define LSMASH_BOX_PRECEDENCE_QTFF_FRMA (LSMASH_BOX_PRECEDENCE_HM + 1 * LSMASH_BOX_PRECEDENCE_S) /* precede any as much as possible */
2206 #define LSMASH_BOX_PRECEDENCE_QTFF_ENDA (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2207 #define LSMASH_BOX_PRECEDENCE_QTFF_MP4A (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2208 #define LSMASH_BOX_PRECEDENCE_QTFF_TERMINATOR (LSMASH_BOX_PRECEDENCE_L - 0 * LSMASH_BOX_PRECEDENCE_S)
2209 #define LSMASH_BOX_PRECEDENCE_ISOM_SRAT (LSMASH_BOX_PRECEDENCE_LP - 1 * LSMASH_BOX_PRECEDENCE_S) /* place at the end for maximum compatibility */
2210 #define LSMASH_BOX_PRECEDENCE_ISOM_FTAB (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2211 #define LSMASH_BOX_PRECEDENCE_ISOM_STTS (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2212 #define LSMASH_BOX_PRECEDENCE_ISOM_CTTS (LSMASH_BOX_PRECEDENCE_N - 4 * LSMASH_BOX_PRECEDENCE_S)
2213 #define LSMASH_BOX_PRECEDENCE_ISOM_CSLG (LSMASH_BOX_PRECEDENCE_N - 6 * LSMASH_BOX_PRECEDENCE_S)
2214 #define LSMASH_BOX_PRECEDENCE_ISOM_STSS (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2215 #define LSMASH_BOX_PRECEDENCE_QTFF_STPS (LSMASH_BOX_PRECEDENCE_N - 10 * LSMASH_BOX_PRECEDENCE_S)
2216 #define LSMASH_BOX_PRECEDENCE_ISOM_SDTP (LSMASH_BOX_PRECEDENCE_N - 12 * LSMASH_BOX_PRECEDENCE_S)
2217 #define LSMASH_BOX_PRECEDENCE_ISOM_STSC (LSMASH_BOX_PRECEDENCE_N - 14 * LSMASH_BOX_PRECEDENCE_S)
2218 #define LSMASH_BOX_PRECEDENCE_ISOM_STSZ (LSMASH_BOX_PRECEDENCE_N - 16 * LSMASH_BOX_PRECEDENCE_S)
2219 #define LSMASH_BOX_PRECEDENCE_ISOM_STCO (LSMASH_BOX_PRECEDENCE_N - 18 * LSMASH_BOX_PRECEDENCE_S)
2220 #define LSMASH_BOX_PRECEDENCE_ISOM_CO64 (LSMASH_BOX_PRECEDENCE_N - 18 * LSMASH_BOX_PRECEDENCE_S)
2221 #define LSMASH_BOX_PRECEDENCE_ISOM_SGPD (LSMASH_BOX_PRECEDENCE_N - 20 * LSMASH_BOX_PRECEDENCE_S)
2222 #define LSMASH_BOX_PRECEDENCE_ISOM_SBGP (LSMASH_BOX_PRECEDENCE_N - 22 * LSMASH_BOX_PRECEDENCE_S)
2223 #define LSMASH_BOX_PRECEDENCE_ISOM_UDTA (LSMASH_BOX_PRECEDENCE_N - 5 * LSMASH_BOX_PRECEDENCE_S)
2224 #define LSMASH_BOX_PRECEDENCE_ISOM_MEAN (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2225 #define LSMASH_BOX_PRECEDENCE_ISOM_NAME (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2226 #define LSMASH_BOX_PRECEDENCE_ISOM_DATA (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2227 #define LSMASH_BOX_PRECEDENCE_QTFF_KEYS (LSMASH_BOX_PRECEDENCE_N - 1 * LSMASH_BOX_PRECEDENCE_S)
2228 #define LSMASH_BOX_PRECEDENCE_ISOM_ILST (LSMASH_BOX_PRECEDENCE_N - 2 * LSMASH_BOX_PRECEDENCE_S)
2229 #define LSMASH_BOX_PRECEDENCE_ISOM_METAITEM (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2230 #define LSMASH_BOX_PRECEDENCE_ISOM_CHPL (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2231 #define LSMASH_BOX_PRECEDENCE_ISOM_META (LSMASH_BOX_PRECEDENCE_N - 7 * LSMASH_BOX_PRECEDENCE_S)
2232 #define LSMASH_BOX_PRECEDENCE_QTFF_WLOC (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2233 #define LSMASH_BOX_PRECEDENCE_QTFF_LOOP (LSMASH_BOX_PRECEDENCE_N - 9 * LSMASH_BOX_PRECEDENCE_S)
2234 #define LSMASH_BOX_PRECEDENCE_QTFF_SELO (LSMASH_BOX_PRECEDENCE_N - 10 * LSMASH_BOX_PRECEDENCE_S)
2235 #define LSMASH_BOX_PRECEDENCE_QTFF_ALLF (LSMASH_BOX_PRECEDENCE_N - 11 * LSMASH_BOX_PRECEDENCE_S)
2236 #define LSMASH_BOX_PRECEDENCE_ISOM_CPRT (LSMASH_BOX_PRECEDENCE_N - 12 * LSMASH_BOX_PRECEDENCE_S)
2237 #define LSMASH_BOX_PRECEDENCE_QTFF_CTAB (LSMASH_BOX_PRECEDENCE_N - 6 * LSMASH_BOX_PRECEDENCE_S)
2238 #define LSMASH_BOX_PRECEDENCE_ISOM_MVEX (LSMASH_BOX_PRECEDENCE_N - 8 * LSMASH_BOX_PRECEDENCE_S)
2239 #define LSMASH_BOX_PRECEDENCE_ISOM_MEHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2240 #define LSMASH_BOX_PRECEDENCE_ISOM_TREX (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2241 #define LSMASH_BOX_PRECEDENCE_ISOM_MOOF (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2242 #define LSMASH_BOX_PRECEDENCE_ISOM_MFHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2243 #define LSMASH_BOX_PRECEDENCE_ISOM_TRAF (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2244 #define LSMASH_BOX_PRECEDENCE_ISOM_TFHD (LSMASH_BOX_PRECEDENCE_HM - 0 * LSMASH_BOX_PRECEDENCE_S)
2245 #define LSMASH_BOX_PRECEDENCE_ISOM_TFDT (LSMASH_BOX_PRECEDENCE_HM - 1 * LSMASH_BOX_PRECEDENCE_S) /* shall be positioned after 'tfhd' and before 'trun' */
2246 #define LSMASH_BOX_PRECEDENCE_ISOM_TRUN (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2247 #define LSMASH_BOX_PRECEDENCE_ISOM_MFRA (LSMASH_BOX_PRECEDENCE_L - 0 * LSMASH_BOX_PRECEDENCE_S)
2248 #define LSMASH_BOX_PRECEDENCE_ISOM_TFRA (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2249 #define LSMASH_BOX_PRECEDENCE_ISOM_MFRO (LSMASH_BOX_PRECEDENCE_L - 0 * LSMASH_BOX_PRECEDENCE_S)
2250 #define LSMASH_BOX_PRECEDENCE_ISOM_MDAT (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2251 #define LSMASH_BOX_PRECEDENCE_ISOM_FREE (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2252 #define LSMASH_BOX_PRECEDENCE_ISOM_SKIP (LSMASH_BOX_PRECEDENCE_N - 0 * LSMASH_BOX_PRECEDENCE_S)
2254 /* Track reference types */
2257 ISOM_TREF_TYPE_AVCP
= LSMASH_4CC( 'a', 'v', 'c', 'p' ), /* AVC parameter set stream link */
2258 ISOM_TREF_TYPE_CDSC
= LSMASH_4CC( 'c', 'd', 's', 'c' ), /* This track describes the referenced track. */
2259 ISOM_TREF_TYPE_DPND
= LSMASH_4CC( 'd', 'p', 'n', 'd' ), /* This track has an MPEG-4 dependency on the referenced track. */
2260 ISOM_TREF_TYPE_HIND
= LSMASH_4CC( 'h', 'i', 'n', 'd' ), /* Hint dependency */
2261 ISOM_TREF_TYPE_HINT
= LSMASH_4CC( 'h', 'i', 'n', 't' ), /* Links hint track to original media track */
2262 ISOM_TREF_TYPE_IPIR
= LSMASH_4CC( 'i', 'p', 'i', 'r' ), /* This track contains IPI declarations for the referenced track. */
2263 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. */
2264 ISOM_TREF_TYPE_SBAS
= LSMASH_4CC( 's', 'b', 'a', 's' ), /* Scalable base */
2265 ISOM_TREF_TYPE_SCAL
= LSMASH_4CC( 's', 'c', 'a', 'l' ), /* Scalable extraction */
2266 ISOM_TREF_TYPE_SWFR
= LSMASH_4CC( 's', 'w', 'f', 'r' ), /* AVC Switch from */
2267 ISOM_TREF_TYPE_SWTO
= LSMASH_4CC( 's', 'w', 't', 'o' ), /* AVC Switch to */
2268 ISOM_TREF_TYPE_SYNC
= LSMASH_4CC( 's', 'y', 'n', 'c' ), /* This track uses the referenced track as its synchronization source. */
2269 ISOM_TREF_TYPE_VDEP
= LSMASH_4CC( 'v', 'd', 'e', 'p' ), /* Auxiliary video depth */
2270 ISOM_TREF_TYPE_VPLX
= LSMASH_4CC( 'v', 'p', 'l', 'x' ), /* Auxiliary video parallax */
2272 QT_TREF_TYPE_CHAP
= LSMASH_4CC( 'c', 'h', 'a', 'p' ), /* Chapter or scene list. Usually references a text track. */
2273 QT_TREF_TYPE_SCPT
= LSMASH_4CC( 's', 'c', 'p', 't' ), /* Transcript. Usually references a text track. */
2274 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. */
2275 QT_TREF_TYPE_TMCD
= LSMASH_4CC( 't', 'm', 'c', 'd' ), /* Time code. Usually references a time code track. */
2276 } isom_track_reference_type
;
2279 enum isom_handler_type
2281 QT_HANDLER_TYPE_DATA
= LSMASH_4CC( 'd', 'h', 'l', 'r' ),
2282 QT_HANDLER_TYPE_MEDIA
= LSMASH_4CC( 'm', 'h', 'l', 'r' ),
2287 ISOM_META_HANDLER_TYPE_ITUNES_METADATA
= LSMASH_4CC( 'm', 'd', 'i', 'r' ),
2290 /* Data reference types */
2291 enum isom_data_reference_type
2293 ISOM_REFERENCE_HANDLER_TYPE_URL
= LSMASH_4CC( 'u', 'r', 'l', ' ' ),
2294 ISOM_REFERENCE_HANDLER_TYPE_URN
= LSMASH_4CC( 'u', 'r', 'n', ' ' ),
2296 QT_REFERENCE_HANDLER_TYPE_ALIAS
= LSMASH_4CC( 'a', 'l', 'i', 's' ),
2297 QT_REFERENCE_HANDLER_TYPE_RESOURCE
= LSMASH_4CC( 'r', 's', 'r', 'c' ),
2298 QT_REFERENCE_HANDLER_TYPE_URL
= LSMASH_4CC( 'u', 'r', 'l', ' ' ),
2308 static const isom_language_t isom_languages
[] =
2310 { 0, ISOM_LANGUAGE_CODE_ENGLISH
},
2311 { 1, ISOM_LANGUAGE_CODE_FRENCH
},
2312 { 2, ISOM_LANGUAGE_CODE_GERMAN
},
2313 { 3, ISOM_LANGUAGE_CODE_ITALIAN
},
2314 { 4, ISOM_LANGUAGE_CODE_DUTCH_M
},
2315 { 5, ISOM_LANGUAGE_CODE_SWEDISH
},
2316 { 6, ISOM_LANGUAGE_CODE_SPANISH
},
2317 { 7, ISOM_LANGUAGE_CODE_DANISH
},
2318 { 8, ISOM_LANGUAGE_CODE_PORTUGUESE
},
2319 { 9, ISOM_LANGUAGE_CODE_NORWEGIAN
},
2320 { 10, ISOM_LANGUAGE_CODE_HEBREW
},
2321 { 11, ISOM_LANGUAGE_CODE_JAPANESE
},
2322 { 12, ISOM_LANGUAGE_CODE_ARABIC
},
2323 { 13, ISOM_LANGUAGE_CODE_FINNISH
},
2324 { 14, ISOM_LANGUAGE_CODE_GREEK
},
2325 { 15, ISOM_LANGUAGE_CODE_ICELANDIC
},
2326 { 16, ISOM_LANGUAGE_CODE_MALTESE
},
2327 { 17, ISOM_LANGUAGE_CODE_TURKISH
},
2328 { 18, ISOM_LANGUAGE_CODE_CROATIAN
},
2329 { 19, ISOM_LANGUAGE_CODE_CHINESE
},
2330 { 20, ISOM_LANGUAGE_CODE_URDU
},
2331 { 21, ISOM_LANGUAGE_CODE_HINDI
},
2332 { 22, ISOM_LANGUAGE_CODE_THAI
},
2333 { 23, ISOM_LANGUAGE_CODE_KOREAN
},
2334 { 24, ISOM_LANGUAGE_CODE_LITHUANIAN
},
2335 { 25, ISOM_LANGUAGE_CODE_POLISH
},
2336 { 26, ISOM_LANGUAGE_CODE_HUNGARIAN
},
2337 { 27, ISOM_LANGUAGE_CODE_ESTONIAN
},
2338 { 28, ISOM_LANGUAGE_CODE_LATVIAN
},
2339 { 29, ISOM_LANGUAGE_CODE_SAMI
},
2340 { 30, ISOM_LANGUAGE_CODE_FAROESE
},
2341 { 32, ISOM_LANGUAGE_CODE_RUSSIAN
},
2342 { 33, ISOM_LANGUAGE_CODE_CHINESE
},
2343 { 34, ISOM_LANGUAGE_CODE_DUTCH
},
2344 { 35, ISOM_LANGUAGE_CODE_IRISH
},
2345 { 36, ISOM_LANGUAGE_CODE_ALBANIAN
},
2346 { 37, ISOM_LANGUAGE_CODE_ROMANIAN
},
2347 { 38, ISOM_LANGUAGE_CODE_CZECH
},
2348 { 39, ISOM_LANGUAGE_CODE_SLOVAK
},
2349 { 40, ISOM_LANGUAGE_CODE_SLOVENIA
},
2350 { 41, ISOM_LANGUAGE_CODE_YIDDISH
},
2351 { 42, ISOM_LANGUAGE_CODE_SERBIAN
},
2352 { 43, ISOM_LANGUAGE_CODE_MACEDONIAN
},
2353 { 44, ISOM_LANGUAGE_CODE_BULGARIAN
},
2354 { 45, ISOM_LANGUAGE_CODE_UKRAINIAN
},
2355 { 46, ISOM_LANGUAGE_CODE_BELARUSIAN
},
2356 { 47, ISOM_LANGUAGE_CODE_UZBEK
},
2357 { 48, ISOM_LANGUAGE_CODE_KAZAKH
},
2358 { 49, ISOM_LANGUAGE_CODE_AZERBAIJANI
},
2359 { 51, ISOM_LANGUAGE_CODE_ARMENIAN
},
2360 { 52, ISOM_LANGUAGE_CODE_GEORGIAN
},
2361 { 53, ISOM_LANGUAGE_CODE_MOLDAVIAN
},
2362 { 54, ISOM_LANGUAGE_CODE_KIRGHIZ
},
2363 { 55, ISOM_LANGUAGE_CODE_TAJIK
},
2364 { 56, ISOM_LANGUAGE_CODE_TURKMEN
},
2365 { 57, ISOM_LANGUAGE_CODE_MONGOLIAN
},
2366 { 59, ISOM_LANGUAGE_CODE_PASHTO
},
2367 { 60, ISOM_LANGUAGE_CODE_KURDISH
},
2368 { 61, ISOM_LANGUAGE_CODE_KASHMIRI
},
2369 { 62, ISOM_LANGUAGE_CODE_SINDHI
},
2370 { 63, ISOM_LANGUAGE_CODE_TIBETAN
},
2371 { 64, ISOM_LANGUAGE_CODE_NEPALI
},
2372 { 65, ISOM_LANGUAGE_CODE_SANSKRIT
},
2373 { 66, ISOM_LANGUAGE_CODE_MARATHI
},
2374 { 67, ISOM_LANGUAGE_CODE_BENGALI
},
2375 { 68, ISOM_LANGUAGE_CODE_ASSAMESE
},
2376 { 69, ISOM_LANGUAGE_CODE_GUJARATI
},
2377 { 70, ISOM_LANGUAGE_CODE_PUNJABI
},
2378 { 71, ISOM_LANGUAGE_CODE_ORIYA
},
2379 { 72, ISOM_LANGUAGE_CODE_MALAYALAM
},
2380 { 73, ISOM_LANGUAGE_CODE_KANNADA
},
2381 { 74, ISOM_LANGUAGE_CODE_TAMIL
},
2382 { 75, ISOM_LANGUAGE_CODE_TELUGU
},
2383 { 76, ISOM_LANGUAGE_CODE_SINHALESE
},
2384 { 77, ISOM_LANGUAGE_CODE_BURMESE
},
2385 { 78, ISOM_LANGUAGE_CODE_KHMER
},
2386 { 79, ISOM_LANGUAGE_CODE_LAO
},
2387 { 80, ISOM_LANGUAGE_CODE_VIETNAMESE
},
2388 { 81, ISOM_LANGUAGE_CODE_INDONESIAN
},
2389 { 82, ISOM_LANGUAGE_CODE_TAGALOG
},
2390 { 83, ISOM_LANGUAGE_CODE_MALAY_ROMAN
},
2391 { 84, ISOM_LANGUAGE_CODE_MAYAY_ARABIC
},
2392 { 85, ISOM_LANGUAGE_CODE_AMHARIC
},
2393 { 87, ISOM_LANGUAGE_CODE_OROMO
},
2394 { 88, ISOM_LANGUAGE_CODE_SOMALI
},
2395 { 89, ISOM_LANGUAGE_CODE_SWAHILI
},
2396 { 90, ISOM_LANGUAGE_CODE_KINYARWANDA
},
2397 { 91, ISOM_LANGUAGE_CODE_RUNDI
},
2398 { 92, ISOM_LANGUAGE_CODE_CHEWA
},
2399 { 93, ISOM_LANGUAGE_CODE_MALAGASY
},
2400 { 94, ISOM_LANGUAGE_CODE_ESPERANTO
},
2401 { 128, ISOM_LANGUAGE_CODE_WELSH
},
2402 { 129, ISOM_LANGUAGE_CODE_BASQUE
},
2403 { 130, ISOM_LANGUAGE_CODE_CATALAN
},
2404 { 131, ISOM_LANGUAGE_CODE_LATIN
},
2405 { 132, ISOM_LANGUAGE_CODE_QUECHUA
},
2406 { 133, ISOM_LANGUAGE_CODE_GUARANI
},
2407 { 134, ISOM_LANGUAGE_CODE_AYMARA
},
2408 { 135, ISOM_LANGUAGE_CODE_TATAR
},
2409 { 136, ISOM_LANGUAGE_CODE_UIGHUR
},
2410 { 137, ISOM_LANGUAGE_CODE_DZONGKHA
},
2411 { 138, ISOM_LANGUAGE_CODE_JAVANESE
},
2415 /* Color parameters */
2416 enum isom_color_patameter_type
2418 ISOM_COLOR_PARAMETER_TYPE_NCLX
= LSMASH_4CC( 'n', 'c', 'l', 'x' ), /* on-screen colours */
2419 ISOM_COLOR_PARAMETER_TYPE_RICC
= LSMASH_4CC( 'r', 'I', 'C', 'C' ), /* restricted ICC profile */
2420 ISOM_COLOR_PARAMETER_TYPE_PROF
= LSMASH_4CC( 'p', 'r', 'o', 'f' ), /* unrestricted ICC profile */
2422 QT_COLOR_PARAMETER_TYPE_NCLC
= LSMASH_4CC( 'n', 'c', 'l', 'c' ), /* NonConstant Luminance Coding */
2423 QT_COLOR_PARAMETER_TYPE_PROF
= LSMASH_4CC( 'p', 'r', 'o', 'f' ), /* ICC profile */
2426 /* Sample grouping types */
2429 ISOM_GROUP_TYPE_3GAG
= LSMASH_4CC( '3', 'g', 'a', 'g' ), /* Text track3GPP PSS Annex G video buffer parameters */
2430 ISOM_GROUP_TYPE_ALST
= LSMASH_4CC( 'a', 'l', 's', 't' ), /* Alternative startup sequence */
2431 ISOM_GROUP_TYPE_AVCB
= LSMASH_4CC( 'a', 'v', 'c', 'b' ), /* AVC HRD parameters */
2432 ISOM_GROUP_TYPE_AVLL
= LSMASH_4CC( 'a', 'v', 'l', 'l' ), /* AVC Layer */
2433 ISOM_GROUP_TYPE_AVSS
= LSMASH_4CC( 'a', 'v', 's', 's' ), /* AVC Sub Sequence */
2434 ISOM_GROUP_TYPE_DTRT
= LSMASH_4CC( 'd', 't', 'r', 't' ), /* Decode re-timing */
2435 ISOM_GROUP_TYPE_MVIF
= LSMASH_4CC( 'm', 'v', 'i', 'f' ), /* MVC Scalability Information */
2436 ISOM_GROUP_TYPE_PROL
= LSMASH_4CC( 'p', 'r', 'o', 'l' ), /* Pre-roll */
2437 ISOM_GROUP_TYPE_RAP
= LSMASH_4CC( 'r', 'a', 'p', ' ' ), /* Random Access Point */
2438 ISOM_GROUP_TYPE_RASH
= LSMASH_4CC( 'r', 'a', 's', 'h' ), /* Rate Share */
2439 ISOM_GROUP_TYPE_ROLL
= LSMASH_4CC( 'r', 'o', 'l', 'l' ), /* Pre-roll/Post-roll */
2440 ISOM_GROUP_TYPE_SCIF
= LSMASH_4CC( 's', 'c', 'i', 'f' ), /* SVC Scalability Information */
2441 ISOM_GROUP_TYPE_SCNM
= LSMASH_4CC( 's', 'c', 'n', 'm' ), /* AVC/SVC/MVC map groups */
2442 ISOM_GROUP_TYPE_VIPR
= LSMASH_4CC( 'v', 'i', 'p', 'r' ), /* View priority */
2443 } isom_grouping_type
;
2445 /* wrapper to avoid boring cast */
2446 #define isom_init_box_common( box, parent, box_type, precedence, destructor ) \
2447 isom_init_box_common_orig( box, parent, box_type, precedence, (isom_extension_destructor_t)(destructor) )
2449 void isom_init_box_common_orig
2453 lsmash_box_type_t box_type
,
2454 uint64_t precedence
,
2455 isom_extension_destructor_t destructor
2458 int isom_is_fullbox( void *box
);
2459 int isom_is_lpcm_audio( void *box
);
2460 int isom_is_qt_audio( lsmash_codec_type_t type
);
2461 int isom_is_uncompressed_ycbcr( lsmash_codec_type_t type
);
2462 int isom_is_waveform_audio( lsmash_box_type_t type
);
2464 size_t isom_skip_box_common( uint8_t **p_data
);
2466 void isom_bs_put_basebox_common( lsmash_bs_t
*bs
, isom_box_t
*box
);
2467 void isom_bs_put_fullbox_common( lsmash_bs_t
*bs
, isom_box_t
*box
);
2468 void isom_bs_put_box_common( lsmash_bs_t
*bs
, void *box
);
2470 #define isom_is_printable_char( c ) ((c) >= 32 && (c) < 128)
2471 #define isom_is_printable_4cc( fourcc ) \
2472 (isom_is_printable_char( ((fourcc) >> 24) & 0xff ) \
2473 && isom_is_printable_char( ((fourcc) >> 16) & 0xff ) \
2474 && isom_is_printable_char( ((fourcc) >> 8) & 0xff ) \
2475 && isom_is_printable_char( (fourcc) & 0xff ))
2477 #define isom_4cc2str( fourcc ) (const char [5]){ (fourcc) >> 24, (fourcc) >> 16, (fourcc) >> 8, (fourcc), 0 }
2479 int isom_check_initializer_present( lsmash_root_t
*root
);
2481 isom_trak_t
*isom_get_trak( lsmash_file_t
*file
, uint32_t track_ID
);
2482 isom_trex_t
*isom_get_trex( isom_mvex_t
*mvex
, uint32_t track_ID
);
2483 isom_traf_t
*isom_get_traf( isom_moof_t
*moof
, uint32_t track_ID
);
2484 isom_tfra_t
*isom_get_tfra( isom_mfra_t
*mfra
, uint32_t track_ID
);
2485 isom_sgpd_t
*isom_get_sample_group_description( isom_stbl_t
*stbl
, uint32_t grouping_type
);
2486 isom_sbgp_t
*isom_get_sample_to_group( isom_stbl_t
*stbl
, uint32_t grouping_type
);
2487 isom_sgpd_t
*isom_get_roll_recovery_sample_group_description( lsmash_entry_list_t
*list
);
2488 isom_sbgp_t
*isom_get_roll_recovery_sample_to_group( lsmash_entry_list_t
*list
);
2489 isom_sgpd_t
*isom_get_fragment_sample_group_description( isom_traf_t
*traf
, uint32_t grouping_type
);
2490 isom_sbgp_t
*isom_get_fragment_sample_to_group( isom_traf_t
*traf
, uint32_t grouping_type
);
2492 isom_dcr_ps_entry_t
*isom_create_ps_entry( uint8_t *ps
, uint32_t ps_size
);
2493 void isom_remove_dcr_ps( isom_dcr_ps_entry_t
*ps
);
2495 int isom_setup_handler_reference( isom_hdlr_t
*hdlr
, uint32_t media_type
);
2496 int isom_setup_iods( isom_moov_t
*moov
);
2498 uint32_t isom_get_sample_count( isom_trak_t
*trak
);
2499 isom_sample_pool_t
*isom_create_sample_pool( uint64_t size
);
2500 int isom_update_sample_tables( isom_trak_t
*trak
, lsmash_sample_t
*sample
, uint32_t *samples_per_packet
);
2501 int isom_pool_sample( isom_sample_pool_t
*pool
, lsmash_sample_t
*sample
, uint32_t samples_per_packet
);
2503 int isom_add_sample_grouping( isom_box_t
*parent
, isom_grouping_type grouping_type
);
2504 int isom_group_random_access( isom_box_t
*parent
, lsmash_sample_t
*sample
);
2505 int isom_group_roll_recovery( isom_box_t
*parent
, lsmash_sample_t
*sample
);
2507 int isom_update_tkhd_duration( isom_trak_t
*trak
);
2508 int isom_update_bitrate_description( isom_mdia_t
*mdia
);
2509 int isom_complement_data_reference( isom_minf_t
*minf
);
2510 int isom_check_large_offset_requirement( isom_moov_t
*moov
, uint64_t meta_size
);
2511 void isom_add_preceding_box_size( isom_moov_t
*moov
, uint64_t preceding_size
);
2512 int isom_establish_movie( lsmash_file_t
*file
);
2513 int isom_rap_grouping_established( isom_rap_group_t
*group
, int num_leading_samples_known
, isom_sgpd_t
*sgpd
, int is_fragment
);
2514 int isom_all_recovery_completed( isom_sbgp_t
*sbgp
, lsmash_entry_list_t
*pool
);
2516 lsmash_file_t
*isom_add_file( lsmash_root_t
*root
);
2517 isom_ftyp_t
*isom_add_ftyp( lsmash_file_t
*file
);
2518 isom_moov_t
*isom_add_moov( lsmash_file_t
*file
);
2519 isom_mvhd_t
*isom_add_mvhd( isom_moov_t
*moov
);
2520 isom_iods_t
*isom_add_iods( isom_moov_t
*moov
);
2521 isom_ctab_t
*isom_add_ctab( void *parent_box
);
2522 isom_trak_t
*isom_add_trak( isom_moov_t
*moov
);
2523 isom_tkhd_t
*isom_add_tkhd( isom_trak_t
*trak
);
2524 isom_tapt_t
*isom_add_tapt( isom_trak_t
*trak
);
2525 isom_clef_t
*isom_add_clef( isom_tapt_t
*tapt
);
2526 isom_prof_t
*isom_add_prof( isom_tapt_t
*tapt
);
2527 isom_enof_t
*isom_add_enof( isom_tapt_t
*tapt
);
2528 isom_edts_t
*isom_add_edts( isom_trak_t
*trak
);
2529 isom_elst_t
*isom_add_elst( isom_edts_t
*edts
);
2530 isom_tref_t
*isom_add_tref( isom_trak_t
*trak
);
2531 isom_tref_type_t
*isom_add_track_reference_type( isom_tref_t
*tref
, isom_track_reference_type type
);
2532 isom_mdia_t
*isom_add_mdia( isom_trak_t
*trak
);
2533 isom_mdhd_t
*isom_add_mdhd( isom_mdia_t
*mdia
);
2534 isom_hdlr_t
*isom_add_hdlr( void *parent_box
);
2535 isom_minf_t
*isom_add_minf( isom_mdia_t
*mdia
);
2536 isom_vmhd_t
*isom_add_vmhd( isom_minf_t
*minf
);
2537 isom_smhd_t
*isom_add_smhd( isom_minf_t
*minf
);
2538 isom_hmhd_t
*isom_add_hmhd( isom_minf_t
*minf
);
2539 isom_nmhd_t
*isom_add_nmhd( isom_minf_t
*minf
);
2540 isom_gmhd_t
*isom_add_gmhd( isom_minf_t
*minf
);
2541 isom_gmin_t
*isom_add_gmin( isom_gmhd_t
*gmhd
);
2542 isom_text_t
*isom_add_text( isom_gmhd_t
*gmhd
);
2543 isom_dinf_t
*isom_add_dinf( void *parent_box
);
2544 isom_dref_t
*isom_add_dref( isom_dinf_t
*dinf
);
2545 isom_dref_entry_t
*isom_add_dref_entry( isom_dref_t
*dref
);
2546 isom_stbl_t
*isom_add_stbl( isom_minf_t
*minf
);
2547 isom_stsd_t
*isom_add_stsd( isom_stbl_t
*stbl
);
2548 isom_visual_entry_t
*isom_add_visual_description( isom_stsd_t
*stsd
, lsmash_codec_type_t sample_type
);
2549 isom_audio_entry_t
*isom_add_audio_description( isom_stsd_t
*stsd
, lsmash_codec_type_t sample_type
);
2550 isom_qt_text_entry_t
*isom_add_qt_text_description( isom_stsd_t
*stsd
);
2551 isom_tx3g_entry_t
*isom_add_tx3g_description( isom_stsd_t
*stsd
);
2552 isom_esds_t
*isom_add_esds( void *parent_box
);
2553 isom_glbl_t
*isom_add_glbl( void *parent_box
);
2554 isom_clap_t
*isom_add_clap( isom_visual_entry_t
*visual
);
2555 isom_pasp_t
*isom_add_pasp( isom_visual_entry_t
*visual
);
2556 isom_colr_t
*isom_add_colr( isom_visual_entry_t
*visual
);
2557 isom_gama_t
*isom_add_gama( isom_visual_entry_t
*visual
);
2558 isom_fiel_t
*isom_add_fiel( isom_visual_entry_t
*visual
);
2559 isom_cspc_t
*isom_add_cspc( isom_visual_entry_t
*visual
);
2560 isom_sgbt_t
*isom_add_sgbt( isom_visual_entry_t
*visual
);
2561 isom_stsl_t
*isom_add_stsl( isom_visual_entry_t
*visual
);
2562 isom_btrt_t
*isom_add_btrt( isom_visual_entry_t
*visual
);
2563 isom_wave_t
*isom_add_wave( isom_audio_entry_t
*audio
);
2564 isom_frma_t
*isom_add_frma( isom_wave_t
*wave
);
2565 isom_enda_t
*isom_add_enda( isom_wave_t
*wave
);
2566 isom_mp4a_t
*isom_add_mp4a( isom_wave_t
*wave
);
2567 isom_terminator_t
*isom_add_terminator( isom_wave_t
*wave
);
2568 isom_chan_t
*isom_add_chan( isom_audio_entry_t
*audio
);
2569 isom_srat_t
*isom_add_srat( isom_audio_entry_t
*audio
);
2570 isom_ftab_t
*isom_add_ftab( isom_tx3g_entry_t
*tx3g
);
2571 isom_stts_t
*isom_add_stts( isom_stbl_t
*stbl
);
2572 isom_ctts_t
*isom_add_ctts( isom_stbl_t
*stbl
);
2573 isom_cslg_t
*isom_add_cslg( isom_stbl_t
*stbl
);
2574 isom_stsc_t
*isom_add_stsc( isom_stbl_t
*stbl
);
2575 isom_stsz_t
*isom_add_stsz( isom_stbl_t
*stbl
);
2576 isom_stss_t
*isom_add_stss( isom_stbl_t
*stbl
);
2577 isom_stps_t
*isom_add_stps( isom_stbl_t
*stbl
);
2578 isom_sdtp_t
*isom_add_sdtp( isom_box_t
*parent
);
2579 isom_sgpd_t
*isom_add_sgpd( void *parent_box
);
2580 isom_sbgp_t
*isom_add_sbgp( void *parent_box
);
2581 isom_stco_t
*isom_add_stco( isom_stbl_t
*stbl
);
2582 isom_stco_t
*isom_add_co64( isom_stbl_t
*stbl
);
2583 isom_udta_t
*isom_add_udta( void *parent_box
);
2584 isom_cprt_t
*isom_add_cprt( isom_udta_t
*udta
);
2585 isom_WLOC_t
*isom_add_WLOC( isom_udta_t
*udta
);
2586 isom_LOOP_t
*isom_add_LOOP( isom_udta_t
*udta
);
2587 isom_SelO_t
*isom_add_SelO( isom_udta_t
*udta
);
2588 isom_AllF_t
*isom_add_AllF( isom_udta_t
*udta
);
2589 isom_chpl_t
*isom_add_chpl( isom_udta_t
*udta
);
2590 isom_meta_t
*isom_add_meta( void *parent_box
);
2591 isom_keys_t
*isom_add_keys( isom_meta_t
*meta
);
2592 isom_ilst_t
*isom_add_ilst( isom_meta_t
*meta
);
2593 isom_metaitem_t
*isom_add_metaitem( isom_ilst_t
*ilst
, lsmash_itunes_metadata_item item
);
2594 isom_mean_t
*isom_add_mean( isom_metaitem_t
*metaitem
);
2595 isom_name_t
*isom_add_name( isom_metaitem_t
*metaitem
);
2596 isom_data_t
*isom_add_data( isom_metaitem_t
*metaitem
);
2597 isom_mvex_t
*isom_add_mvex( isom_moov_t
*moov
);
2598 isom_mehd_t
*isom_add_mehd( isom_mvex_t
*mvex
);
2599 isom_trex_t
*isom_add_trex( isom_mvex_t
*mvex
);
2600 isom_moof_t
*isom_add_moof( lsmash_file_t
*file
);
2601 isom_mfhd_t
*isom_add_mfhd( isom_moof_t
*moof
);
2602 isom_traf_t
*isom_add_traf( isom_moof_t
*moof
);
2603 isom_tfhd_t
*isom_add_tfhd( isom_traf_t
*traf
);
2604 isom_tfdt_t
*isom_add_tfdt( isom_traf_t
*traf
);
2605 isom_trun_t
*isom_add_trun( isom_traf_t
*traf
);
2606 isom_mfra_t
*isom_add_mfra( lsmash_file_t
*file
);
2607 isom_tfra_t
*isom_add_tfra( isom_mfra_t
*mfra
);
2608 isom_mfro_t
*isom_add_mfro( isom_mfra_t
*mfra
);
2609 isom_mdat_t
*isom_add_mdat( lsmash_file_t
*file
);
2610 isom_free_t
*isom_add_free( void *parent_box
);
2611 isom_styp_t
*isom_add_styp( lsmash_file_t
*file
);
2612 isom_sidx_t
*isom_add_sidx( lsmash_file_t
*file
);
2614 void isom_remove_sample_description( isom_sample_entry_t
*sample
);
2615 void isom_remove_unknown_box( isom_unknown_box_t
*unknown_box
);
2616 void isom_remove_sample_pool( isom_sample_pool_t
*pool
);
2618 uint64_t isom_update_box_size( void *box
);
2620 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
);
2621 void isom_remove_all_extension_boxes( lsmash_entry_list_t
*extensions
);
2622 isom_box_t
*isom_get_extension_box( lsmash_entry_list_t
*extensions
, lsmash_box_type_t box_type
);
2623 void *isom_get_extension_box_format( lsmash_entry_list_t
*extensions
, lsmash_box_type_t box_type
);
2624 void isom_remove_box_by_itself( void *opaque_box
);