print: Avoid Variable Length Arrays.
[L-SMASH.git] / lsmash.h
blob96c5fcaecbbd1a0aa8d61fa3d71ab482773d83ab
1 /*****************************************************************************
2 * lsmash.h:
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. */
23 #ifndef LSMASH_H
24 #define LSMASH_H
26 #include <stddef.h>
27 #include <stdint.h>
29 #define PRIVATE /* If this declaration is placed at a variable, any user shall NOT use it. */
31 #define LSMASH_4CC( a, b, c, d ) (((a)<<24) | ((b)<<16) | ((c)<<8) | (d))
33 /****************************************************************************
34 * Version
35 ****************************************************************************/
36 #define LSMASH_VERSION_MAJOR 2
37 #define LSMASH_VERSION_MINOR 4
38 #define LSMASH_VERSION_MICRO 27
40 #define LSMASH_VERSION_INT( a, b, c ) (((a) << 16) | ((b) << 8) | (c))
42 #define LIBLSMASH_VERSION_INT LSMASH_VERSION_INT( LSMASH_VERSION_MAJOR, \
43 LSMASH_VERSION_MINOR, \
44 LSMASH_VERSION_MICRO )
46 /****************************************************************************
47 * Error Values
48 ****************************************************************************/
49 enum
51 LSMASH_ERR_NAMELESS = -1, /* An error but not assigned to any following errors */
52 LSMASH_ERR_MEMORY_ALLOC = -2, /* There is not enough room in the heap. */
53 LSMASH_ERR_INVALID_DATA = -3, /* Invalid data was found. */
54 LSMASH_ERR_FUNCTION_PARAM = -4, /* An error in the parameter list of the function */
55 LSMASH_ERR_PATCH_WELCOME = -5, /* Not implemented yet, so patches welcome. */
56 LSMASH_ERR_UNKNOWN = -6, /* Unknown error occured. */
59 /****************************************************************************
60 * ROOT
61 * The top-level opaque handler for whole file handling.
62 ****************************************************************************/
63 typedef struct lsmash_root_tag lsmash_root_t;
65 /* Allocate a ROOT.
66 * The allocated ROOT can be deallocate by lsmash_destroy_root().
68 * Return the address of an allocated ROOT if successful.
69 * Return NULL otherwise. */
70 lsmash_root_t *lsmash_create_root( void );
72 /* Deallocate a given ROOT. */
73 void lsmash_destroy_root
75 lsmash_root_t *root /* the address of a ROOT you want to deallocate */
78 /****************************************************************************
79 * File Layer
80 ****************************************************************************/
81 typedef struct lsmash_file_tag lsmash_file_t;
83 typedef enum
85 LSMASH_FILE_MODE_WRITE = 1, /* output/muxing */
86 LSMASH_FILE_MODE_READ = 1<<1, /* input/demuxing */
87 LSMASH_FILE_MODE_FRAGMENTED = 1<<2, /* movie fragments */
88 LSMASH_FILE_MODE_DUMP = 1<<3,
89 LSMASH_FILE_MODE_BOX = 1<<4, /* box structure */
90 LSMASH_FILE_MODE_INITIALIZATION = 1<<5, /* movie sample table */
91 LSMASH_FILE_MODE_MEDIA = 1<<6, /* media data */
92 LSMASH_FILE_MODE_INDEX = 1<<7,
93 LSMASH_FILE_MODE_SEGMENT = 1<<8, /* segment */
94 LSMASH_FILE_MODE_WRITE_FRAGMENTED = LSMASH_FILE_MODE_WRITE | LSMASH_FILE_MODE_FRAGMENTED, /* deprecated */
95 } lsmash_file_mode;
97 typedef enum
99 ISOM_BRAND_TYPE_3G2A = LSMASH_4CC( '3', 'g', '2', 'a' ), /* 3GPP2 */
100 ISOM_BRAND_TYPE_3GE6 = LSMASH_4CC( '3', 'g', 'e', '6' ), /* 3GPP Release 6 Extended Presentation Profile */
101 ISOM_BRAND_TYPE_3GE9 = LSMASH_4CC( '3', 'g', 'e', '9' ), /* 3GPP Release 9 Extended Presentation Profile */
102 ISOM_BRAND_TYPE_3GF9 = LSMASH_4CC( '3', 'g', 'f', '9' ), /* 3GPP Release 9 File-delivery Server Profile */
103 ISOM_BRAND_TYPE_3GG6 = LSMASH_4CC( '3', 'g', 'g', '6' ), /* 3GPP Release 6 General Profile */
104 ISOM_BRAND_TYPE_3GG9 = LSMASH_4CC( '3', 'g', 'g', '9' ), /* 3GPP Release 9 General Profile */
105 ISOM_BRAND_TYPE_3GH9 = LSMASH_4CC( '3', 'g', 'h', '9' ), /* 3GPP Release 9 Adaptive Streaming Profile */
106 ISOM_BRAND_TYPE_3GM9 = LSMASH_4CC( '3', 'g', 'm', '9' ), /* 3GPP Release 9 Media Segment Profile */
107 ISOM_BRAND_TYPE_3GP4 = LSMASH_4CC( '3', 'g', 'p', '4' ), /* 3GPP Release 4 */
108 ISOM_BRAND_TYPE_3GP5 = LSMASH_4CC( '3', 'g', 'p', '5' ), /* 3GPP Release 5 */
109 ISOM_BRAND_TYPE_3GP6 = LSMASH_4CC( '3', 'g', 'p', '6' ), /* 3GPP Release 6 Basic Profile */
110 ISOM_BRAND_TYPE_3GP7 = LSMASH_4CC( '3', 'g', 'p', '7' ), /* 3GPP Release 7 */
111 ISOM_BRAND_TYPE_3GP8 = LSMASH_4CC( '3', 'g', 'p', '8' ), /* 3GPP Release 8 */
112 ISOM_BRAND_TYPE_3GP9 = LSMASH_4CC( '3', 'g', 'p', '9' ), /* 3GPP Release 9 Basic Profile */
113 ISOM_BRAND_TYPE_3GR6 = LSMASH_4CC( '3', 'g', 'r', '6' ), /* 3GPP Release 6 Progressive Download Profile */
114 ISOM_BRAND_TYPE_3GR9 = LSMASH_4CC( '3', 'g', 'r', '9' ), /* 3GPP Release 9 Progressive Download Profile */
115 ISOM_BRAND_TYPE_3GS6 = LSMASH_4CC( '3', 'g', 's', '6' ), /* 3GPP Release 6 Streaming Server Profile */
116 ISOM_BRAND_TYPE_3GS9 = LSMASH_4CC( '3', 'g', 's', '9' ), /* 3GPP Release 9 Streaming Server Profile */
117 ISOM_BRAND_TYPE_3GT9 = LSMASH_4CC( '3', 'g', 't', '9' ), /* 3GPP Release 9 Media Stream Recording Profile */
118 ISOM_BRAND_TYPE_ARRI = LSMASH_4CC( 'A', 'R', 'R', 'I' ), /* ARRI Digital Camera */
119 ISOM_BRAND_TYPE_CAEP = LSMASH_4CC( 'C', 'A', 'E', 'P' ), /* Canon Digital Camera */
120 ISOM_BRAND_TYPE_CDES = LSMASH_4CC( 'C', 'D', 'e', 's' ), /* Convergent Designs */
121 ISOM_BRAND_TYPE_LCAG = LSMASH_4CC( 'L', 'C', 'A', 'G' ), /* Leica digital camera */
122 ISOM_BRAND_TYPE_M4A = LSMASH_4CC( 'M', '4', 'A', ' ' ), /* iTunes MPEG-4 audio protected or not */
123 ISOM_BRAND_TYPE_M4B = LSMASH_4CC( 'M', '4', 'B', ' ' ), /* iTunes AudioBook protected or not */
124 ISOM_BRAND_TYPE_M4P = LSMASH_4CC( 'M', '4', 'P', ' ' ), /* MPEG-4 protected audio */
125 ISOM_BRAND_TYPE_M4V = LSMASH_4CC( 'M', '4', 'V', ' ' ), /* MPEG-4 protected audio+video */
126 ISOM_BRAND_TYPE_MFSM = LSMASH_4CC( 'M', 'F', 'S', 'M' ), /* Media File for Samsung video Metadata */
127 ISOM_BRAND_TYPE_MPPI = LSMASH_4CC( 'M', 'P', 'P', 'I' ), /* Photo Player Multimedia Application Format */
128 ISOM_BRAND_TYPE_ROSS = LSMASH_4CC( 'R', 'O', 'S', 'S' ), /* Ross Video */
129 ISOM_BRAND_TYPE_AVC1 = LSMASH_4CC( 'a', 'v', 'c', '1' ), /* Advanced Video Coding extensions */
130 ISOM_BRAND_TYPE_BBXM = LSMASH_4CC( 'b', 'b', 'x', 'm' ), /* Blinkbox Master File */
131 ISOM_BRAND_TYPE_CAQV = LSMASH_4CC( 'c', 'a', 'q', 'v' ), /* Casio Digital Camera */
132 ISOM_BRAND_TYPE_CCFF = LSMASH_4CC( 'c', 'c', 'f', 'f' ), /* Common container file format */
133 ISOM_BRAND_TYPE_DA0A = LSMASH_4CC( 'd', 'a', '0', 'a' ), /* DMB AF */
134 ISOM_BRAND_TYPE_DA0B = LSMASH_4CC( 'd', 'a', '0', 'b' ), /* DMB AF */
135 ISOM_BRAND_TYPE_DA1A = LSMASH_4CC( 'd', 'a', '1', 'a' ), /* DMB AF */
136 ISOM_BRAND_TYPE_DA1B = LSMASH_4CC( 'd', 'a', '1', 'b' ), /* DMB AF */
137 ISOM_BRAND_TYPE_DA2A = LSMASH_4CC( 'd', 'a', '2', 'a' ), /* DMB AF */
138 ISOM_BRAND_TYPE_DA2B = LSMASH_4CC( 'd', 'a', '2', 'b' ), /* DMB AF */
139 ISOM_BRAND_TYPE_DA3A = LSMASH_4CC( 'd', 'a', '3', 'a' ), /* DMB AF */
140 ISOM_BRAND_TYPE_DA3B = LSMASH_4CC( 'd', 'a', '3', 'b' ), /* DMB AF */
141 ISOM_BRAND_TYPE_DASH = LSMASH_4CC( 'd', 'a', 's', 'h' ), /* Indexed self-initializing Media Segment */
142 ISOM_BRAND_TYPE_DBY1 = LSMASH_4CC( 'd', 'b', 'y', '1' ), /* MP4 files with Dolby content */
143 ISOM_BRAND_TYPE_DMB1 = LSMASH_4CC( 'd', 'm', 'b', '1' ), /* DMB AF */
144 ISOM_BRAND_TYPE_DSMS = LSMASH_4CC( 'd', 's', 'm', 's' ), /* Self-initializing Media Segment */
145 ISOM_BRAND_TYPE_DV1A = LSMASH_4CC( 'd', 'v', '1', 'a' ), /* DMB AF */
146 ISOM_BRAND_TYPE_DV1B = LSMASH_4CC( 'd', 'v', '1', 'b' ), /* DMB AF */
147 ISOM_BRAND_TYPE_DV2A = LSMASH_4CC( 'd', 'v', '2', 'a' ), /* DMB AF */
148 ISOM_BRAND_TYPE_DV2B = LSMASH_4CC( 'd', 'v', '2', 'b' ), /* DMB AF */
149 ISOM_BRAND_TYPE_DV3A = LSMASH_4CC( 'd', 'v', '3', 'a' ), /* DMB AF */
150 ISOM_BRAND_TYPE_DV3B = LSMASH_4CC( 'd', 'v', '3', 'b' ), /* DMB AF */
151 ISOM_BRAND_TYPE_DVR1 = LSMASH_4CC( 'd', 'v', 'r', '1' ), /* DVB RTP */
152 ISOM_BRAND_TYPE_DVT1 = LSMASH_4CC( 'd', 'v', 't', '1' ), /* DVB Transport Stream */
153 ISOM_BRAND_TYPE_IFRM = LSMASH_4CC( 'i', 'f', 'r', 'm' ), /* Apple iFrame */
154 ISOM_BRAND_TYPE_ISC2 = LSMASH_4CC( 'i', 's', 'c', '2' ), /* Files encrypted according to ISMACryp 2.0 */
155 ISOM_BRAND_TYPE_ISO2 = LSMASH_4CC( 'i', 's', 'o', '2' ), /* ISO Base Media file format version 2 */
156 ISOM_BRAND_TYPE_ISO3 = LSMASH_4CC( 'i', 's', 'o', '3' ), /* ISO Base Media file format version 3 */
157 ISOM_BRAND_TYPE_ISO4 = LSMASH_4CC( 'i', 's', 'o', '4' ), /* ISO Base Media file format version 4 */
158 ISOM_BRAND_TYPE_ISO5 = LSMASH_4CC( 'i', 's', 'o', '5' ), /* ISO Base Media file format version 5 */
159 ISOM_BRAND_TYPE_ISO6 = LSMASH_4CC( 'i', 's', 'o', '6' ), /* ISO Base Media file format version 6 */
160 ISOM_BRAND_TYPE_ISO7 = LSMASH_4CC( 'i', 's', 'o', '7' ), /* ISO Base Media file format version 7 */
161 ISOM_BRAND_TYPE_ISOM = LSMASH_4CC( 'i', 's', 'o', 'm' ), /* ISO Base Media file format version 1 */
162 ISOM_BRAND_TYPE_JPSI = LSMASH_4CC( 'j', 'p', 's', 'i' ), /* The JPSearch data interchange format */
163 ISOM_BRAND_TYPE_LMSG = LSMASH_4CC( 'l', 'm', 's', 'g' ), /* last Media Segment indicator */
164 ISOM_BRAND_TYPE_MJ2S = LSMASH_4CC( 'm', 'j', '2', 's' ), /* Motion JPEG 2000 simple profile */
165 ISOM_BRAND_TYPE_MJP2 = LSMASH_4CC( 'm', 'j', 'p', '2' ), /* Motion JPEG 2000, general profile */
166 ISOM_BRAND_TYPE_MP21 = LSMASH_4CC( 'm', 'p', '2', '1' ), /* MPEG-21 */
167 ISOM_BRAND_TYPE_MP41 = LSMASH_4CC( 'm', 'p', '4', '1' ), /* MP4 version 1 */
168 ISOM_BRAND_TYPE_MP42 = LSMASH_4CC( 'm', 'p', '4', '2' ), /* MP4 version 2 */
169 ISOM_BRAND_TYPE_MP71 = LSMASH_4CC( 'm', 'p', '7', '1' ), /* MPEG-7 file-level metadata */
170 ISOM_BRAND_TYPE_MSDH = LSMASH_4CC( 'm', 's', 'd', 'h' ), /* Media Segment */
171 ISOM_BRAND_TYPE_MSIX = LSMASH_4CC( 'm', 's', 'i', 'x' ), /* Indexed Media Segment */
172 ISOM_BRAND_TYPE_NIKO = LSMASH_4CC( 'n', 'i', 'k', 'o' ), /* Nikon Digital Camera */
173 ISOM_BRAND_TYPE_ODCF = LSMASH_4CC( 'o', 'd', 'c', 'f' ), /* OMA DCF */
174 ISOM_BRAND_TYPE_OPF2 = LSMASH_4CC( 'o', 'p', 'f', '2' ), /* OMA PDCF */
175 ISOM_BRAND_TYPE_OPX2 = LSMASH_4CC( 'o', 'p', 'x', '2' ), /* OMA Adapted PDCF */
176 ISOM_BRAND_TYPE_PANA = LSMASH_4CC( 'p', 'a', 'n', 'a' ), /* Panasonic Digital Camera */
177 ISOM_BRAND_TYPE_PIFF = LSMASH_4CC( 'p', 'i', 'f', 'f' ), /* Protected Interoperable File Format */
178 ISOM_BRAND_TYPE_PNVI = LSMASH_4CC( 'p', 'n', 'v', 'i' ), /* Panasonic Video Intercom */
179 ISOM_BRAND_TYPE_QT = LSMASH_4CC( 'q', 't', ' ', ' ' ), /* QuickTime file format */
180 ISOM_BRAND_TYPE_RISX = LSMASH_4CC( 'r', 'i', 's', 'x' ), /* Representation Index Segment */
181 ISOM_BRAND_TYPE_SDV = LSMASH_4CC( 's', 'd', 'v', ' ' ), /* SD Video */
182 ISOM_BRAND_TYPE_SIMS = LSMASH_4CC( 's', 'i', 'm', 's' ), /* Sub-Indexed Media Segment */
183 ISOM_BRAND_TYPE_SISX = LSMASH_4CC( 's', 'i', 's', 'x' ), /* Single Index Segment */
184 ISOM_BRAND_TYPE_SSSS = LSMASH_4CC( 's', 's', 's', 's' ), /* Subsegment Index Segment */
185 } lsmash_brand_type;
187 typedef struct
189 lsmash_file_mode mode; /* file modes */
190 /** custom I/O stuff **/
191 void *opaque; /* custom I/O opaque handler used for the following callback functions */
192 /* Attempt to read up to 'size' bytes from the file referenced by 'opaque' into the buffer starting at 'buf'.
194 * Return the number of bytes read if successful.
195 * Return 0 if no more read.
196 * Return a negative value otherwise. */
197 int (*read)
199 void *opaque,
200 uint8_t *buf,
201 int size
203 /* Write up to 'size' bytes to the file referenced by 'opaque' from the buffer starting at 'buf'.
205 * Return the number of bytes written if successful.
206 * Return a negative value otherwise. */
207 int (*write)
209 void *opaque,
210 uint8_t *buf,
211 int size
213 /* Change the location of the read/write pointer of 'opaque'.
214 * The offset of the pointer is determined according to the directive 'whence' as follows:
215 * If 'whence' is set to SEEK_SET, the offset is set to 'offset' bytes.
216 * If 'whence' is set to SEEK_CUR, the offset is set to its current location plus 'offset' bytes.
217 * If 'whence' is set to SEEK_END, the offset is set to the size of the file plus 'offset' bytes.
219 * Return the resulting offset of the location in bytes from the beginning of the file if successful.
220 * Return a negative value otherwise. */
221 int64_t (*seek)
223 void *opaque,
224 int64_t offset,
225 int whence
227 /** file types or segment types **/
228 lsmash_brand_type major_brand; /* the best used brand */
229 lsmash_brand_type *brands; /* the list of compatible brands */
230 uint32_t brand_count; /* the number of compatible brands used in the file */
231 uint32_t minor_version; /* minor version of the best used brand
232 * minor_version is informative only i.e. not specifying requirements but merely providing information.
233 * It must not be used to determine the conformance of a file to a standard. */
234 /** muxing only **/
235 double max_chunk_duration; /* max duration per chunk in seconds. 0.5 is default value. */
236 double max_async_tolerance; /* max tolerance, in seconds, for amount of interleaving asynchronization between tracks.
237 * 2.0 is default value. At least twice of max_chunk_duration is used. */
238 uint64_t max_chunk_size; /* max size per chunk in bytes. 4*1024*1024 (4MiB) is default value. */
239 /** demuxing only **/
240 uint64_t max_read_size; /* max size of reading from the file at a time. 4*1024*1024 (4MiB) is default value. */
241 } lsmash_file_parameters_t;
243 typedef int (*lsmash_adhoc_remux_callback)( void *param, uint64_t done, uint64_t total );
244 typedef struct
246 uint64_t buffer_size;
247 lsmash_adhoc_remux_callback func;
248 void *param;
249 } lsmash_adhoc_remux_t;
251 /* Open a file where the path is given.
252 * And if successful, set up the parameters by 'open_mode'.
253 * Here, the 'open_mode' parameter is either 0 or 1 as follows:
254 * 0: Create a file for output/muxing operations.
255 * If a file with the same name already exists, its contents are discarded and the file is treated as a new file.
256 * If user specifies "-" for 'filename', operations are done on stdout.
257 * The file types or segment types are set up as specified in 'param'.
258 * 1: Open a file for input/demuxing operations. The file must exist.
259 * If user specifies "-" for 'filename', operations are done on stdin.
261 * This function sets up file modes minimally.
262 * User can add additional modes and/or remove modes already set later.
263 * The other parameters except for the custom I/O stuff are set to a default.
264 * User shall not touch the custom I/O stuff for the opened file if using this function.
266 * The opened file can be closed by lsmash_close_file().
268 * Note:
269 * 'filename' must be encoded by UTF-8 if 'open_mode' is equal to 0.
270 * On Windows, lsmash_convert_ansi_to_utf8() may help you.
272 * Return 0 if successful.
273 * Return a negative value otherwise. */
274 int lsmash_open_file
276 const char *filename,
277 int open_mode,
278 lsmash_file_parameters_t *param
281 /* Close a file opened by lsmash_open_file().
283 * Return 0 if successful.
284 * Return a negative value otherwise. */
285 int lsmash_close_file
287 lsmash_file_parameters_t *param
290 /* Associate a file with a ROOT and allocate the handle of that file.
291 * The all allocated handles can be deallocated by lsmash_destroy_root().
292 * If the ROOT has no associated file yet, the first associated file is activated.
294 * Return the address of the allocated handle of the added file if successful.
295 * Return NULL otherwise. */
296 lsmash_file_t *lsmash_set_file
298 lsmash_root_t *root,
299 lsmash_file_parameters_t *param
302 /* Read whole boxes in a given file.
303 * You can also get file modes and file types or segment types by this function.
305 * Return the file size (if seekable) or 0 if successful.
306 * Return a negative value otherwise. */
307 int64_t lsmash_read_file
309 lsmash_file_t *file,
310 lsmash_file_parameters_t *param
313 /* Deallocate all boxes within the current active file in a given ROOT. */
314 void lsmash_discard_boxes
316 lsmash_root_t *root /* the address of a ROOT you want to deallocate all boxes within the active file in it */
319 /* Activate a file associated with a ROOT.
321 * Return 0 if successful.
322 * Return a negative value otherwise. */
323 int lsmash_activate_file
325 lsmash_root_t *root,
326 lsmash_file_t *file
329 /* Switch from the current segment file to the following media segment file.
330 * After switching, the followed segment file can be closed unless that file is an initialization segment.
332 * The first followed segment file must be also an initialization segment.
333 * The second or later segment files must not be an initialization segment.
334 * For media segment files flagging LSMASH_FILE_MODE_INDEX, 'remux' must be set.
336 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function.
338 * Return 0 if successful.
339 * Return a negative value otherwise. */
340 int lsmash_switch_media_segment
342 lsmash_root_t *root,
343 lsmash_file_t *successor,
344 lsmash_adhoc_remux_t *remux
347 /****************************************************************************
348 * Basic Types
349 ****************************************************************************/
350 /* rational types */
351 typedef struct
353 uint32_t n; /* numerator */
354 uint32_t d; /* denominator */
355 } lsmash_rational_u32_t;
357 typedef struct
359 int32_t n; /* numerator */
360 uint32_t d; /* denominator */
361 } lsmash_rational_s32_t;
363 typedef enum
365 LSMASH_BOOLEAN_FALSE = 0,
366 LSMASH_BOOLEAN_TRUE = 1
367 } lsmash_boolean_t;
369 /****************************************************************************
370 * Allocation
371 ****************************************************************************/
372 /* Allocate a memory block.
373 * The allocated memory block can be deallocate by lsmash_free().
375 * Return the address to the beginning of a memory block if successful.
376 * Return NULL otherwise. */
377 void *lsmash_malloc
379 size_t size /* size of a memory block, in bytes */
382 /* Allocate a memory block.
383 * The allocated memory block shall be initialized to all bits 0.
384 * The allocated memory block can be deallocate by lsmash_free().
386 * Return the address to the beginning of a memory block if successful.
387 * Return NULL otherwise. */
388 void *lsmash_malloc_zero
390 size_t size /* size of a memory block, in bytes */
393 /* Reallocate a memory block.
394 * The reallocated memory block can be deallocate by lsmash_free().
395 * If this function succeed, the given memory block is deallocated and the address is invalid.
396 * If this function fails, the address to the given memory block is still valid and the memory block is unchanged.
398 * Return the address to the beginning of a memory block if successful.
399 * Return NULL otherwise. */
400 void *lsmash_realloc
402 void *ptr, /* an address to a memory block previously allocated with
403 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup()
404 * Alternatively, NULL makes this function to allocate a new memory block. */
405 size_t size /* size of a memory block, in bytes */
408 /* Allocate a memory block and copy all bits from a given memory block.
409 * The allocated memory block can be deallocate by lsmash_free().
411 * Return the address to the beginning of an allocated memory block if successful.
412 * Return NULL otherwise. */
413 void *lsmash_memdup
415 const void *ptr, /* an address to the source of data to be copied */
416 size_t size /* number of bytes to copy */
419 /* Deallocate a given memory block.
420 * If the given address to a memory block is NULL, this function does nothing. */
421 void lsmash_free
423 void *ptr /* an address to a memory block previously allocated with
424 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup() */
427 /* Deallocate a given memory block.
428 * If the given address to a memory block is NULL, this function does nothing.
429 * Set NULL to the pointer to the memory block after deallocating.
431 * As an example of usage.
432 * Let's say you allocate a memory block and set the address to the beginning of it to the pointer 'ptr'.
433 * You can deallocate the memory block and set NULL to 'ptr' by lsmash_freep( &ptr ).
435 void lsmash_freep
437 void *ptrptr /* the address to a pointer to a memory block previously allocated with
438 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup() */
441 /****************************************************************************
442 * Box
443 ****************************************************************************/
444 typedef struct lsmash_box_tag lsmash_box_t;
445 typedef uint32_t lsmash_compact_box_type_t;
447 /* An UUID structure for extended box type */
448 typedef struct
450 uint32_t fourcc; /* four characters codes that identify extended box type partially
451 * If the box is not a UUID box, this field shall be the same as the box type.
452 * Note: characters in this field aren't always printable. */
453 uint8_t id[12]; /* If the box is not a UUID box, this field shall be set to 12-byte ISO reserved value
454 * { 0x00, 0x11, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 }
455 * and shall not be written into the stream together with above-defined four characters codes.
456 * As an exception, we could set the value
457 * { 0x0F, 0x11, 0x4D, 0xA5, 0xBF, 0x4E, 0xF2, 0xC4, 0x8C, 0x6A, 0xA1, 0x1E }
458 * to indicate the box is derived from QuickTime file format. */
459 } lsmash_extended_box_type_t;
461 typedef struct
463 lsmash_compact_box_type_t fourcc; /* four characters codes that identify box type
464 * Note: characters in this field aren't always printable. */
465 lsmash_extended_box_type_t user; /* Universal Unique IDentifier, i.e. UUID */
466 /* If 'fourcc' doesn't equal 'uuid', ignore this field. */
467 } lsmash_box_type_t;
469 typedef struct
471 lsmash_box_type_t type; /* box type */
472 uint32_t number; /* the number of box in ascending order excluding boxes unspecified by 'type' within
473 * the same level of the box nested structure. */
474 } lsmash_box_path_t;
476 #define LSMASH_BOX_TYPE_INITIALIZER { 0x00000000, { 0x00000000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }
477 #define LSMASH_BOX_TYPE_UNSPECIFIED static_lsmash_box_type_unspecified
478 static const lsmash_box_type_t static_lsmash_box_type_unspecified = LSMASH_BOX_TYPE_INITIALIZER;
480 /* Return extended box type that consists of combination of given FourCC and 12-byte ID. */
481 lsmash_extended_box_type_t lsmash_form_extended_box_type
483 uint32_t fourcc,
484 const uint8_t id[12]
487 /* Return box type that consists of combination of given compact and extended box type. */
488 lsmash_box_type_t lsmash_form_box_type
490 lsmash_compact_box_type_t type,
491 lsmash_extended_box_type_t user
494 #define LSMASH_ISO_BOX_TYPE_INITIALIZER( x ) { x, { x, { 0x00, 0x11, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 } } }
495 #define LSMASH_QTFF_BOX_TYPE_INITIALIZER( x ) { x, { x, { 0x0F, 0x11, 0x4D, 0xA5, 0xBF, 0x4E, 0xF2, 0xC4, 0x8C, 0x6A, 0xA1, 0x1E } } }
496 lsmash_box_type_t lsmash_form_iso_box_type( lsmash_compact_box_type_t type );
497 lsmash_box_type_t lsmash_form_qtff_box_type( lsmash_compact_box_type_t type );
499 /* precedence of the box position
500 * Box with higher value will precede physically other boxes with lower one.
501 * The lower 32-bits are intended to determine order of boxes with the same box type. */
502 #define LSMASH_BOX_PRECEDENCE_L 0x0000000000800000ULL /* Lowest */
503 #define LSMASH_BOX_PRECEDENCE_LP 0x000FFFFF00000000ULL /* Lowest+ */
504 #define LSMASH_BOX_PRECEDENCE_N 0x0080000000000000ULL /* Normal */
505 #define LSMASH_BOX_PRECEDENCE_HM 0xFFEEEEEE00000000ULL /* Highest- */
506 #define LSMASH_BOX_PRECEDENCE_H 0xFFFFFFFF00800000ULL /* Highest */
507 #define LSMASH_BOX_PRECEDENCE_S 0x0000010000000000ULL /* Step */
509 /* Check if the type of two boxes is identical or not.
511 * Return 1 if the both box types are identical.
512 * Return 0 otherwise. */
513 int lsmash_check_box_type_identical
515 lsmash_box_type_t a,
516 lsmash_box_type_t b
519 /* Check if the type of a given box is already specified or not.
521 * Return 1 if the box type is specified.
522 * Return 0 otherwise, i.e. LSMASH_BOX_TYPE_UNSPECIFIED. */
523 int lsmash_check_box_type_specified
525 const lsmash_box_type_t *box_type
528 /* Allocate a box.
529 * The allocated box can be deallocated by lsmash_destroy_box().
531 * Return the address of an allocated box if successful.
532 * Return NULL otherwise. */
533 lsmash_box_t *lsmash_create_box
535 lsmash_box_type_t type,
536 uint8_t *data,
537 uint32_t size,
538 uint64_t precedence
541 /* Get a box under a given 'parent' box.
542 * The path of a box must be terminated by LSMASH_BOX_TYPE_UNSPECIFIED.
544 * Return the address of the box specified by 'box_path'.
545 * Return NULL otherwise. */
546 lsmash_box_t *lsmash_get_box
548 lsmash_box_t *parent,
549 const lsmash_box_path_t box_path[]
552 /* Add a box into 'parent' box as a child box.
554 * Return 0 if successful.
555 * Return a negative value otherwise. */
556 int lsmash_add_box
558 lsmash_box_t *parent,
559 lsmash_box_t *box
562 /* Add a box into 'parent' box as a child box.
563 * If the adding child box is known and its children (if any) are known, expand them into known
564 * struct formats for the internal references within the L-SMASH library.
565 * If this function succeed, the adding child box is deallocated and the address is invalid.
566 * Instead of that, this function replaces the invalid address with the valid one of the new
567 * allocated memory block representing the added and expanded child box.
569 * Return 0 if successful.
570 * Return a negative value otherwise. */
571 int lsmash_add_box_ex
573 lsmash_box_t *parent,
574 lsmash_box_t **box
577 /* Deallocate a given box and its children. */
578 void lsmash_destroy_box
580 lsmash_box_t *box
583 /* Deallocate all children of a given box. */
584 void lsmash_destroy_children
586 lsmash_box_t *box
589 /* Get the precedence of a given box.
591 * Return 0 if successful.
592 * Return a negative value otherwise. */
593 int lsmash_get_box_precedence
595 lsmash_box_t *box,
596 uint64_t *precedence
599 /* This function allows you to handle a ROOT as if it is a box.
600 * Of course, you can deallocate the ROOT by lsmash_destroy_box().
602 * Return the address of a given ROOT as a box. */
603 lsmash_box_t *lsmash_root_as_box
605 lsmash_root_t *root
608 /* This function allows you to handle the handle of a file as if it is a box.
609 * Of course, you can deallocate the handle of the file by lsmash_destroy_box().
611 * Return the address of the handle of a given file as a box. */
612 lsmash_box_t *lsmash_file_as_box
614 lsmash_file_t *file
617 /* Write a top level box and its children already added to a file.
618 * WARNING:
619 * You should not use this function as long as media data is incompletely written.
620 * That is before starting to write a media data or after finishing of writing that.
622 * Return 0 if successful.
623 * Return a negative value otherwise. */
624 int lsmash_write_top_level_box
626 lsmash_box_t *box
629 /* Export the data of a given box and its children as the binary string.
630 * The returned address is of the beginning of an allocated memory block.
631 * You can deallocate the memory block by lsmash_free().
633 * Note that some boxes cannot be exported since L-SMASH might skip the cache for them.
634 * Media Data Box is an unexportable example.
636 * Return the address to the beginning of the binary string if successful.
637 * Return NULL otherwise. */
638 uint8_t *lsmash_export_box
640 lsmash_box_t *box,
641 uint32_t *size
644 /****************************************************************************
645 * CODEC identifiers
646 ****************************************************************************/
647 typedef lsmash_box_type_t lsmash_codec_type_t;
649 #define LSMASH_CODEC_TYPE_INITIALIZER LSMASH_BOX_TYPE_INITIALIZER
650 #define LSMASH_CODEC_TYPE_UNSPECIFIED LSMASH_BOX_TYPE_UNSPECIFIED
652 #define DEFINE_ISOM_CODEC_TYPE( BOX_TYPE_NAME, BOX_TYPE_FOURCC ) \
653 static const lsmash_codec_type_t BOX_TYPE_NAME = LSMASH_ISO_BOX_TYPE_INITIALIZER( BOX_TYPE_FOURCC )
654 #define DEFINE_QTFF_CODEC_TYPE( BOX_TYPE_NAME, BOX_TYPE_FOURCC ) \
655 static const lsmash_codec_type_t BOX_TYPE_NAME = LSMASH_QTFF_BOX_TYPE_INITIALIZER( BOX_TYPE_FOURCC )
657 /* Audio CODEC identifiers */
658 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AC_3_AUDIO, LSMASH_4CC( 'a', 'c', '-', '3' ) ); /* AC-3 audio */
659 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ALAC_AUDIO, LSMASH_4CC( 'a', 'l', 'a', 'c' ) ); /* Apple lossless audio codec */
660 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DRA1_AUDIO, LSMASH_4CC( 'd', 'r', 'a', '1' ) ); /* DRA Audio */
661 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSC_AUDIO, LSMASH_4CC( 'd', 't', 's', 'c' ) ); /* DTS Coherent Acoustics audio */
662 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSH_AUDIO, LSMASH_4CC( 'd', 't', 's', 'h' ) ); /* DTS-HD High Resolution Audio */
663 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSL_AUDIO, LSMASH_4CC( 'd', 't', 's', 'l' ) ); /* DTS-HD Master Audio */
664 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSE_AUDIO, LSMASH_4CC( 'd', 't', 's', 'e' ) ); /* DTS Express low bit rate audio, also known as DTS LBR */
665 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_EC_3_AUDIO, LSMASH_4CC( 'e', 'c', '-', '3' ) ); /* Enhanced AC-3 audio */
666 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCA_AUDIO, LSMASH_4CC( 'e', 'n', 'c', 'a' ) ); /* Encrypted/Protected audio */
667 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_G719_AUDIO, LSMASH_4CC( 'g', '7', '1', '9' ) ); /* ITU-T Recommendation G.719 (2008) ); */
668 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_G726_AUDIO, LSMASH_4CC( 'g', '7', '2', '6' ) ); /* ITU-T Recommendation G.726 (1990) ); */
669 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_M4AE_AUDIO, LSMASH_4CC( 'm', '4', 'a', 'e' ) ); /* MPEG-4 Audio Enhancement */
670 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MLPA_AUDIO, LSMASH_4CC( 'm', 'l', 'p', 'a' ) ); /* MLP Audio */
671 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MP4A_AUDIO, LSMASH_4CC( 'm', 'p', '4', 'a' ) ); /* MPEG-4 Audio */
672 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RAW_AUDIO, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Uncompressed audio */
673 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SAMR_AUDIO, LSMASH_4CC( 's', 'a', 'm', 'r' ) ); /* Narrowband AMR voice */
674 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SAWB_AUDIO, LSMASH_4CC( 's', 'a', 'w', 'b' ) ); /* Wideband AMR voice */
675 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SAWP_AUDIO, LSMASH_4CC( 's', 'a', 'w', 'p' ) ); /* Extended AMR-WB (AMR-WB+) ); */
676 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SEVC_AUDIO, LSMASH_4CC( 's', 'e', 'v', 'c' ) ); /* EVRC Voice */
677 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SQCP_AUDIO, LSMASH_4CC( 's', 'q', 'c', 'p' ) ); /* 13K Voice */
678 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SSMV_AUDIO, LSMASH_4CC( 's', 's', 'm', 'v' ) ); /* SMV Voice */
679 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_TWOS_AUDIO, LSMASH_4CC( 't', 'w', 'o', 's' ) ); /* Uncompressed 16-bit audio */
680 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_WMA_AUDIO, LSMASH_4CC( 'w', 'm', 'a', ' ' ) ); /* Windows Media Audio V2 or V3 (not registered at MP4RA) */
682 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_23NI_AUDIO, LSMASH_4CC( '2', '3', 'n', 'i' ) ); /* 32-bit little endian integer uncompressed */
683 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MAC3_AUDIO, LSMASH_4CC( 'M', 'A', 'C', '3' ) ); /* MACE 3:1 */
684 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MAC6_AUDIO, LSMASH_4CC( 'M', 'A', 'C', '6' ) ); /* MACE 6:1 */
685 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_NONE_AUDIO, LSMASH_4CC( 'N', 'O', 'N', 'E' ) ); /* either 'raw ' or 'twos' */
686 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_QDM2_AUDIO, LSMASH_4CC( 'Q', 'D', 'M', '2' ) ); /* Qdesign music 2 */
687 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_QDMC_AUDIO, LSMASH_4CC( 'Q', 'D', 'M', 'C' ) ); /* Qdesign music 1 */
688 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_QCLP_AUDIO, LSMASH_4CC( 'Q', 'c', 'l', 'p' ) ); /* Qualcomm PureVoice */
689 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AC_3_AUDIO, LSMASH_4CC( 'a', 'c', '-', '3' ) ); /* Digital Audio Compression Standard (AC-3, Enhanced AC-3) */
690 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AGSM_AUDIO, LSMASH_4CC( 'a', 'g', 's', 'm' ) ); /* GSM */
691 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ALAC_AUDIO, LSMASH_4CC( 'a', 'l', 'a', 'c' ) ); /* Apple lossless audio codec */
692 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ALAW_AUDIO, LSMASH_4CC( 'a', 'l', 'a', 'w' ) ); /* a-Law 2:1 */
693 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CDX2_AUDIO, LSMASH_4CC( 'c', 'd', 'x', '2' ) ); /* CD/XA 2:1 */
694 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CDX4_AUDIO, LSMASH_4CC( 'c', 'd', 'x', '4' ) ); /* CD/XA 4:1 */
695 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVCA_AUDIO, LSMASH_4CC( 'd', 'v', 'c', 'a' ) ); /* DV Audio */
696 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVI_AUDIO, LSMASH_4CC( 'd', 'v', 'i', ' ' ) ); /* DVI (as used in RTP, 4:1 compression) */
697 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FL32_AUDIO, LSMASH_4CC( 'f', 'l', '3', '2' ) ); /* 32-bit float */
698 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FL64_AUDIO, LSMASH_4CC( 'f', 'l', '6', '4' ) ); /* 64-bit float */
699 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_IMA4_AUDIO, LSMASH_4CC( 'i', 'm', 'a', '4' ) ); /* IMA (International Multimedia Assocation, defunct, 4:1) */
700 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_IN24_AUDIO, LSMASH_4CC( 'i', 'n', '2', '4' ) ); /* 24-bit integer uncompressed */
701 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_IN32_AUDIO, LSMASH_4CC( 'i', 'n', '3', '2' ) ); /* 32-bit integer uncompressed */
702 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_LPCM_AUDIO, LSMASH_4CC( 'l', 'p', 'c', 'm' ) ); /* Uncompressed audio (various integer and float formats) */
703 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MP4A_AUDIO, LSMASH_4CC( 'm', 'p', '4', 'a' ) ); /* MPEG-4 Audio */
704 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RAW_AUDIO, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* 8-bit offset-binary uncompressed */
705 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SOWT_AUDIO, LSMASH_4CC( 's', 'o', 'w', 't' ) ); /* 16-bit little endian uncompressed */
706 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TWOS_AUDIO, LSMASH_4CC( 't', 'w', 'o', 's' ) ); /* 8-bit or 16-bit big endian uncompressed */
707 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULAW_AUDIO, LSMASH_4CC( 'u', 'l', 'a', 'w' ) ); /* uLaw 2:1 */
708 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_VDVA_AUDIO, LSMASH_4CC( 'v', 'd', 'v', 'a' ) ); /* DV audio (variable duration per video frame) */
709 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FULLMP3_AUDIO, LSMASH_4CC( '.', 'm', 'p', '3' ) ); /* MPEG-1 layer 3, CBR & VBR (QT4.1 and later) */
710 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MP3_AUDIO, 0x6D730055 ); /* MPEG-1 layer 3, CBR only (pre-QT4.1) */
711 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ADPCM2_AUDIO, 0x6D730002 ); /* Microsoft ADPCM - ACM code 2 */
712 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ADPCM17_AUDIO, 0x6D730011 ); /* DVI/Intel IMA ADPCM - ACM code 17 */
713 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_GSM49_AUDIO, 0x6D730031 ); /* Microsoft GSM 6.10 - ACM code 49 */
714 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_NOT_SPECIFIED, 0x00000000 ); /* either 'raw ' or 'twos' */
716 /* Video CODEC identifiers */
717 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC1_VIDEO, LSMASH_4CC( 'a', 'v', 'c', '1' ) ); /* Advanced Video Coding
718 * Any sample must not contain any paramerter set and filler data. */
719 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC2_VIDEO, LSMASH_4CC( 'a', 'v', 'c', '2' ) ); /* Advanced Video Coding
720 * Any sample must not contain any paramerter set and filler data.
721 * May only be used when Extractors or Aggregators are required to be supported. */
722 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC3_VIDEO, LSMASH_4CC( 'a', 'v', 'c', '3' ) ); /* Advanced Video Coding
723 * It is allowed that sample contains parameter sets and filler data. */
724 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC4_VIDEO, LSMASH_4CC( 'a', 'v', 'c', '4' ) ); /* Advanced Video Coding
725 * It is allowed that sample contains parameter sets and filler data.
726 * May only be used when Extractors or Aggregators are required to be supported. */
727 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVCP_VIDEO, LSMASH_4CC( 'a', 'v', 'c', 'p' ) ); /* Advanced Video Coding Parameters */
728 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DRAC_VIDEO, LSMASH_4CC( 'd', 'r', 'a', 'c' ) ); /* Dirac Video Coder */
729 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCV_VIDEO, LSMASH_4CC( 'e', 'n', 'c', 'v' ) ); /* Encrypted/protected video */
730 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_HVC1_VIDEO, LSMASH_4CC( 'h', 'v', 'c', '1' ) ); /* High Efficiency Video Coding
731 * The default and mandatory value of array_completeness is 1 for arrays of
732 * all types of parameter sets, and 0 for all other arrays.
733 * This means any sample must not contain any paramerter set and filler data. */
734 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_HEV1_VIDEO, LSMASH_4CC( 'h', 'e', 'v', '1' ) ); /* High Efficiency Video Coding
735 * The default value of array_completeness is 0 for all arrays.
736 * It is allowed that sample contains parameter sets and filler data. */
737 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MJP2_VIDEO, LSMASH_4CC( 'm', 'j', 'p', '2' ) ); /* Motion JPEG 2000 */
738 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MP4V_VIDEO, LSMASH_4CC( 'm', 'p', '4', 'v' ) ); /* MPEG-4 Visual */
739 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MVC1_VIDEO, LSMASH_4CC( 'm', 'v', 'c', '1' ) ); /* Multiview coding */
740 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MVC2_VIDEO, LSMASH_4CC( 'm', 'v', 'c', '2' ) ); /* Multiview coding */
741 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_S263_VIDEO, LSMASH_4CC( 's', '2', '6', '3' ) ); /* ITU H.263 video (3GPP format) */
742 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SVC1_VIDEO, LSMASH_4CC( 's', 'v', 'c', '1' ) ); /* Scalable Video Coding */
743 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_VC_1_VIDEO, LSMASH_4CC( 'v', 'c', '-', '1' ) ); /* SMPTE VC-1 */
745 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_2VUY_VIDEO, LSMASH_4CC( '2', 'v', 'u', 'y' ) ); /* Uncompressed Y'CbCr, 8-bit-per-component 4:2:2
746 * |Cb(8)|Y'0(8)|Cr(8)|Y'1(8)| */
747 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CFHD_VIDEO, LSMASH_4CC( 'C', 'F', 'H', 'D' ) ); /* CineForm High-Definition (HD) wavelet codec */
748 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DV10_VIDEO, LSMASH_4CC( 'D', 'V', '1', '0' ) ); /* Digital Voodoo 10 bit Uncompressed 4:2:2 codec */
749 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVOO_VIDEO, LSMASH_4CC( 'D', 'V', 'O', 'O' ) ); /* Digital Voodoo 8 bit Uncompressed 4:2:2 codec */
750 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVOR_VIDEO, LSMASH_4CC( 'D', 'V', 'O', 'R' ) ); /* Digital Voodoo intermediate raw */
751 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVTV_VIDEO, LSMASH_4CC( 'D', 'V', 'T', 'V' ) ); /* Digital Voodoo intermediate 2vuy */
752 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVVT_VIDEO, LSMASH_4CC( 'D', 'V', 'V', 'T' ) ); /* Digital Voodoo intermediate v210 */
753 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_HD10_VIDEO, LSMASH_4CC( 'H', 'D', '1', '0' ) ); /* Digital Voodoo 10 bit Uncompressed 4:2:2 HD codec */
754 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_M105_VIDEO, LSMASH_4CC( 'M', '1', '0', '5' ) ); /* Internal format of video data supported by Matrox hardware; pixel organization is proprietary*/
755 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_PNTG_VIDEO, LSMASH_4CC( 'P', 'N', 'T', 'G' ) ); /* Apple MacPaint image format */
756 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SVQ1_VIDEO, LSMASH_4CC( 'S', 'V', 'Q', '1' ) ); /* Sorenson Video 1 video */
757 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SVQ3_VIDEO, LSMASH_4CC( 'S', 'V', 'Q', '3' ) ); /* Sorenson Video 3 video */
758 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR0_VIDEO, LSMASH_4CC( 'S', 'h', 'r', '0' ) ); /* Generic SheerVideo codec */
759 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR1_VIDEO, LSMASH_4CC( 'S', 'h', 'r', '1' ) ); /* SheerVideo RGB[A] 8b - at 8 bits/channel */
760 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR2_VIDEO, LSMASH_4CC( 'S', 'h', 'r', '2' ) ); /* SheerVideo Y'CbCr[A] 8bv 4:4:4[:4] - at 8 bits/channel, in ITU-R BT.601-4 video range */
761 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR3_VIDEO, LSMASH_4CC( 'S', 'h', 'r', '3' ) ); /* SheerVideo Y'CbCr 8bv 4:2:2 - 2:1 chroma subsampling, at 8 bits/channel, in ITU-R BT.601-4 video range */
762 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR4_VIDEO, LSMASH_4CC( 'S', 'h', 'r', '4' ) ); /* SheerVideo Y'CbCr 8bw 4:2:2 - 2:1 chroma subsampling, at 8 bits/channel, with full-range luma and wide-range two's-complement chroma */
763 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_WRLE_VIDEO, LSMASH_4CC( 'W', 'R', 'L', 'E' ) ); /* Windows BMP image format */
764 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCH_VIDEO, LSMASH_4CC( 'a', 'p', 'c', 'h' ) ); /* Apple ProRes 422 High Quality */
765 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCN_VIDEO, LSMASH_4CC( 'a', 'p', 'c', 'n' ) ); /* Apple ProRes 422 Standard Definition */
766 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCS_VIDEO, LSMASH_4CC( 'a', 'p', 'c', 's' ) ); /* Apple ProRes 422 LT */
767 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCO_VIDEO, LSMASH_4CC( 'a', 'p', 'c', 'o' ) ); /* Apple ProRes 422 Proxy */
768 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AP4H_VIDEO, LSMASH_4CC( 'a', 'p', '4', 'h' ) ); /* Apple ProRes 4444 */
769 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CIVD_VIDEO, LSMASH_4CC( 'c', 'i', 'v', 'd' ) ); /* Cinepak Video */
770 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DRAC_VIDEO, LSMASH_4CC( 'd', 'r', 'a', 'c' ) ); /* Dirac Video Coder */
771 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVC_VIDEO, LSMASH_4CC( 'd', 'v', 'c', ' ' ) ); /* DV NTSC format */
772 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVCP_VIDEO, LSMASH_4CC( 'd', 'v', 'c', 'p' ) ); /* DV PAL format */
773 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVPP_VIDEO, LSMASH_4CC( 'd', 'v', 'p', 'p' ) ); /* Panasonic DVCPro PAL format */
774 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DV5N_VIDEO, LSMASH_4CC( 'd', 'v', '5', 'n' ) ); /* Panasonic DVCPro-50 NTSC format */
775 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DV5P_VIDEO, LSMASH_4CC( 'd', 'v', '5', 'p' ) ); /* Panasonic DVCPro-50 PAL format */
776 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH2_VIDEO, LSMASH_4CC( 'd', 'v', 'h', '2' ) ); /* Panasonic DVCPro-HD 1080p25 format */
777 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH3_VIDEO, LSMASH_4CC( 'd', 'v', 'h', '3' ) ); /* Panasonic DVCPro-HD 1080p30 format */
778 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH5_VIDEO, LSMASH_4CC( 'd', 'v', 'h', '5' ) ); /* Panasonic DVCPro-HD 1080i50 format */
779 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH6_VIDEO, LSMASH_4CC( 'd', 'v', 'h', '6' ) ); /* Panasonic DVCPro-HD 1080i60 format */
780 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVHP_VIDEO, LSMASH_4CC( 'd', 'v', 'h', 'p' ) ); /* Panasonic DVCPro-HD 720p60 format */
781 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVHQ_VIDEO, LSMASH_4CC( 'd', 'v', 'h', 'q' ) ); /* Panasonic DVCPro-HD 720p50 format */
782 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FLIC_VIDEO, LSMASH_4CC( 'f', 'l', 'i', 'c' ) ); /* Autodesk FLIC animation format */
783 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_GIF_VIDEO, LSMASH_4CC( 'g', 'i', 'f', ' ' ) ); /* GIF image format */
784 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_H261_VIDEO, LSMASH_4CC( 'h', '2', '6', '1' ) ); /* ITU H.261 video */
785 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_H263_VIDEO, LSMASH_4CC( 'h', '2', '6', '3' ) ); /* ITU H.263 video */
786 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_JPEG_VIDEO, LSMASH_4CC( 'j', 'p', 'e', 'g' ) ); /* JPEG image format */
787 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MJPA_VIDEO, LSMASH_4CC( 'm', 'j', 'p', 'a' ) ); /* Motion-JPEG (format A) */
788 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MJPB_VIDEO, LSMASH_4CC( 'm', 'j', 'p', 'b' ) ); /* Motion-JPEG (format B) */
789 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_PNG_VIDEO, LSMASH_4CC( 'p', 'n', 'g', ' ' ) ); /* W3C Portable Network Graphics (PNG) */
790 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RAW_VIDEO, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Uncompressed RGB */
791 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RLE_VIDEO, LSMASH_4CC( 'r', 'l', 'e', ' ' ) ); /* Apple animation codec */
792 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RPZA_VIDEO, LSMASH_4CC( 'r', 'p', 'z', 'a' ) ); /* Apple simple video 'road pizza' compression */
793 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TGA_VIDEO, LSMASH_4CC( 't', 'g', 'a', ' ' ) ); /* Truvision Targa video format */
794 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TIFF_VIDEO, LSMASH_4CC( 't', 'i', 'f', 'f' ) ); /* Tagged Image File Format (Adobe) */
795 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULRA_VIDEO, LSMASH_4CC( 'U', 'L', 'R', 'A' ) ); /* Ut Video RGBA 4:4:4:4 8bit full-range */
796 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULRG_VIDEO, LSMASH_4CC( 'U', 'L', 'R', 'G' ) ); /* Ut Video RGB 4:4:4 8bit full-range */
797 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULY0_VIDEO, LSMASH_4CC( 'U', 'L', 'Y', '0' ) ); /* Ut Video YCbCr (BT.601) 4:2:0 8bit limited */
798 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULY2_VIDEO, LSMASH_4CC( 'U', 'L', 'Y', '2' ) ); /* Ut Video YCbCr (BT.601) 4:2:2 8bit limited */
799 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULH0_VIDEO, LSMASH_4CC( 'U', 'L', 'H', '0' ) ); /* Ut Video YCbCr (BT.709) 4:2:0 8bit limited */
800 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULH2_VIDEO, LSMASH_4CC( 'U', 'L', 'H', '2' ) ); /* Ut Video YCbCr (BT.709) 4:2:2 8bit limited */
801 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_V210_VIDEO, LSMASH_4CC( 'v', '2', '1', '0' ) ); /* Uncompressed Y'CbCr, 10-bit-per-component 4:2:2
802 * |Cb0(10)|Y'0(10)|Cr0(10)|XX(2)|
803 * |Y'1(10)|Cb1(10)|Y'2(10)|XX(2)|
804 * |Cr1(10)|Y'3(10)|Cb2(10)|XX(2)|
805 * |Y'4(10)|Cr2(10)|Y'5(10)|XX(2)| (X is a zero bit) */
806 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_V216_VIDEO, LSMASH_4CC( 'v', '2', '1', '6' ) ); /* Uncompressed Y'CbCr, 10, 12, 14, or 16-bit-per-component 4:2:2
807 * |Cb(16 LE)|Y'0(16 LE)|Cr(16 LE)|Y'1(16 LE)| */
808 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_V308_VIDEO, LSMASH_4CC( 'v', '3', '0', '8' ) ); /* Uncompressed Y'CbCr, 8-bit-per-component 4:4:4
809 * |Cr(8)|Y'(8)|Cb(8)| */
810 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_V408_VIDEO, LSMASH_4CC( 'v', '4', '0', '8' ) ); /* Uncompressed Y'CbCrA, 8-bit-per-component 4:4:4:4
811 * |Cb(8)|Y'(8)|Cr(8)|A(8)| */
812 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_V410_VIDEO, LSMASH_4CC( 'v', '4', '1', '0' ) ); /* Uncompressed Y'CbCr, 10-bit-per-component 4:4:4
813 * |XX(2)|Cb(10)|Y'(10)|Cr(10)| (X is a zero bit) */
814 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_YUV2_VIDEO, LSMASH_4CC( 'y', 'u', 'v', '2' ) ); /* Uncompressed Y'CbCr, 8-bit-per-component 4:2:2
815 * |Y'0(8)|Cb(8)|Y'1(8)|Cr(8)| */
817 /* Text CODEC identifiers */
818 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCT_TEXT, LSMASH_4CC( 'e', 'n', 'c', 't' ) ); /* Encrypted Text */
819 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_STPP_TEXT, LSMASH_4CC( 's', 't', 'p', 'p' ) ); /* Sub-titles (Timed Text) */
820 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_TX3G_TEXT, LSMASH_4CC( 't', 'x', '3', 'g' ) ); /* 3GPP Timed Text stream */
822 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TEXT_TEXT, LSMASH_4CC( 't', 'e', 'x', 't' ) ); /* QuickTime Text Media */
824 /* Hint CODEC identifiers */
825 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_FDP_HINT, LSMASH_4CC( 'f', 'd', 'p', ' ' ) ); /* File delivery hints */
826 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_M2TS_HINT, LSMASH_4CC( 'm', '2', 't', 's' ) ); /* MPEG-2 transport stream for DMB */
827 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_PM2T_HINT, LSMASH_4CC( 'p', 'm', '2', 't' ) ); /* Protected MPEG-2 Transport */
828 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_PRTP_HINT, LSMASH_4CC( 'p', 'r', 't', 'p' ) ); /* Protected RTP Reception */
829 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RM2T_HINT, LSMASH_4CC( 'r', 'm', '2', 't' ) ); /* MPEG-2 Transport Reception */
830 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RRTP_HINT, LSMASH_4CC( 'r', 'r', 't', 'p' ) ); /* RTP reception */
831 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RSRP_HINT, LSMASH_4CC( 'r', 's', 'r', 'p' ) ); /* SRTP Reception */
832 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RTP_HINT, LSMASH_4CC( 'r', 't', 'p', ' ' ) ); /* RTP Hints */
833 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SM2T_HINT, LSMASH_4CC( 's', 'm', '2', 't' ) ); /* MPEG-2 Transport Server */
834 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SRTP_HINT, LSMASH_4CC( 's', 'r', 't', 'p' ) ); /* SRTP Hints */
836 /* Metadata CODEC identifiers */
837 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_IXSE_META, LSMASH_4CC( 'i', 'x', 's', 'e' ) ); /* DVB Track Level Index Track */
838 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_METT_META, LSMASH_4CC( 'm', 'e', 't', 't' ) ); /* Text timed metadata */
839 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_METX_META, LSMASH_4CC( 'm', 'e', 't', 'x' ) ); /* XML timed metadata */
840 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MLIX_META, LSMASH_4CC( 'm', 'l', 'i', 'x' ) ); /* DVB Movie level index track */
841 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_OKSD_META, LSMASH_4CC( 'o', 'k', 's', 'd' ) ); /* OMA Keys */
842 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SVCM_META, LSMASH_4CC( 's', 'v', 'c', 'M' ) ); /* SVC metadata */
843 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_TEXT_META, LSMASH_4CC( 't', 'e', 'x', 't' ) ); /* Textual meta-data with MIME type */
844 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_URIM_META, LSMASH_4CC( 'u', 'r', 'i', 'm' ) ); /* URI identified timed metadata */
845 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_XML_META, LSMASH_4CC( 'x', 'm', 'l', ' ' ) ); /* XML-formatted meta-data */
847 /* Other CODEC identifiers */
848 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCS_SYSTEM, LSMASH_4CC( 'e', 'n', 'c', 's' ) ); /* Encrypted Systems stream */
849 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MP4S_SYSTEM, LSMASH_4CC( 'm', 'p', '4', 's' ) ); /* MPEG-4 Systems */
851 DEFINE_QTFF_CODEC_TYPE( LSMASH_CODEC_TYPE_RAW, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Either video or audio */
853 /* Check if the identifier of two CODECs is identical or not.
855 * Return 1 if the both CODEC identifiers are identical.
856 * Return 0 otherwise. */
857 int lsmash_check_codec_type_identical( lsmash_codec_type_t a, lsmash_codec_type_t b );
859 /****************************************************************************
860 * Summary of Stream Configuration
861 * This is L-SMASH's original structure.
862 ****************************************************************************/
863 typedef enum
865 LSMASH_SUMMARY_TYPE_UNKNOWN = 0,
866 LSMASH_SUMMARY_TYPE_VIDEO,
867 LSMASH_SUMMARY_TYPE_AUDIO,
868 } lsmash_summary_type;
870 typedef enum
872 LSMASH_CODEC_SPECIFIC_DATA_TYPE_UNSPECIFIED = -1, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED */
874 LSMASH_CODEC_SPECIFIC_DATA_TYPE_UNKNOWN = 0, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */
876 LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG,
878 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264,
879 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_HEVC,
880 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_VC_1,
881 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_AC_3,
882 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_EC_3,
883 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_DTS,
884 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_ALAC,
886 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_SAMPLE_SCALE,
887 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264_BITRATE,
889 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_COMMON, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
890 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_COMMON, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
891 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_FORMAT_SPECIFIC_FLAGS, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
892 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_DECOMPRESSION_PARAMETERS, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */
894 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_FIELD_INFO,
895 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_PIXEL_FORMAT,
896 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_SIGNIFICANT_BITS,
897 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_GAMMA_LEVEL,
898 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_CHANNEL_LAYOUT,
900 LSMASH_CODEC_SPECIFIC_DATA_TYPE_CODEC_GLOBAL_HEADER,
901 } lsmash_codec_specific_data_type;
903 typedef enum
905 LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED = -1,
906 LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED = 0,
907 LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED = 1
908 } lsmash_codec_specific_format;
910 typedef union
912 void *always_null; /* LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED */
913 void *structured; /* LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
914 uint8_t *unstructured; /* LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */
915 } lsmash_codec_specific_data_t;
917 typedef void (*lsmash_codec_specific_destructor_t)( void * );
918 typedef struct
920 lsmash_codec_specific_data_type type;
921 lsmash_codec_specific_format format;
922 lsmash_codec_specific_data_t data;
923 uint32_t size;
924 lsmash_codec_specific_destructor_t destruct;
925 } lsmash_codec_specific_t;
927 typedef struct lsmash_codec_specific_list_tag lsmash_codec_specific_list_t;
929 typedef enum
931 LSMASH_CODEC_SUPPORT_FLAG_NONE = 0,
932 LSMASH_CODEC_SUPPORT_FLAG_MUX = 1 << 0, /* It's expected that L-SMASH can mux CODEC stream properly.
933 * If not flagged, L-SMASH may recognize and/or handle CODEC specific info incorrectly when muxing. */
934 LSMASH_CODEC_SUPPORT_FLAG_DEMUX = 1 << 1, /* It's expected that L-SMASH can demux CODEC stream properly.
935 * If not flagged, L-SMASH may recognize and/or handle CODEC specific info incorrectly when demuxing. */
936 LSMASH_CODEC_SUPPORT_FLAG_REMUX = LSMASH_CODEC_SUPPORT_FLAG_MUX | LSMASH_CODEC_SUPPORT_FLAG_DEMUX,
937 } lsmash_codec_support_flag;
939 #define LSMASH_BASE_SUMMARY \
940 lsmash_summary_type summary_type; \
941 lsmash_codec_type_t sample_type; \
942 lsmash_codec_specific_list_t *opaque; \
943 uint32_t max_au_length; /* buffer length for 1 access unit, \
944 * typically max size of 1 audio/video frame */ \
945 uint32_t data_ref_index; /* the index of a data reference */
947 typedef struct
949 LSMASH_BASE_SUMMARY
950 } lsmash_summary_t;
952 /* Allocate a summary by 'summary_type'.
953 * The allocated summary can be deallocated by lsmash_cleanup_summary().
955 * Return the address of an allocated summary if successful.
956 * Return NULL otherwise. */
957 lsmash_summary_t *lsmash_create_summary
959 lsmash_summary_type summary_type /* a type of summary you want */
962 /* Deallocate a given summary. */
963 void lsmash_cleanup_summary
965 lsmash_summary_t *summary /* the address of a summary you want to deallocate */
968 /* Allocate and append a new sample description to a track by 'summary'.
970 * Return the index of an allocated and appended sample description if successful.
971 * Return 0 otherwise. */
972 int lsmash_add_sample_entry
974 lsmash_root_t *root, /* the address of the ROOT containing a track to which you want to append a new sample description */
975 uint32_t track_ID, /* the track_ID of a track to which you want to append a new sample description */
976 void *summary /* the summary of a sample description you want to append */
979 /* Count the number of summaries in a track.
981 * Return the number of summaries in a track if no error.
982 * Return 0 otherwise. */
983 uint32_t lsmash_count_summary
985 lsmash_root_t *root, /* the address of the ROOT containing a track in which you want to count the number of summaries */
986 uint32_t track_ID /* the track_ID of a track in which you want to count the number of summaries */
989 /* Get the summary of a sample description you want in a track.
990 * The summary returned by this function is allocated internally, and can be deallocate by lsmash_cleanup_summary().
992 * Return the address of an allocated summary you want if successful.
993 * Return NULL otherwise. */
994 lsmash_summary_t *lsmash_get_summary
996 lsmash_root_t *root, /* the address of the ROOT containing a track which contains a sample description you want */
997 uint32_t track_ID, /* the track_ID of a track containing a sample description you want */
998 uint32_t description_number /* the index of a sample description you want */
1001 /* Allocate and initialize a CODEC specific configuration by 'type' and 'format'.
1002 * The allocated CODEC specific configuration can be deallocated by lsmash_destroy_codec_specific_data().
1004 * Return the address of an allocated and initialized CODEC specific configuration if successful.
1005 * Return NULL otherwise. */
1006 lsmash_codec_specific_t *lsmash_create_codec_specific_data
1008 lsmash_codec_specific_data_type type,
1009 lsmash_codec_specific_format format
1012 /* Deallocate a CODEC specific configuration. */
1013 void lsmash_destroy_codec_specific_data
1015 lsmash_codec_specific_t *specific /* the address of a CODEC specific configuration you want to deallocate */
1018 /* Allocate a CODEC specific configuration which is a copy of 'specific', and append it to 'summary'.
1020 * Return 0 if successful.
1021 * Return a negative value otherwise. */
1022 int lsmash_add_codec_specific_data
1024 lsmash_summary_t *summary,
1025 lsmash_codec_specific_t *specific
1028 /* Count the number of CODEC specific configuration in a summary.
1030 * Return the number of CODEC specific configuration in a summary if successful.
1031 * Return 0 otherwise. */
1032 uint32_t lsmash_count_codec_specific_data
1034 lsmash_summary_t *summary /* the address of a summary in which you want to count the number of CODEC specific configuration */
1037 /* Get a CODEC specific configuration you want in a summary.
1039 * Return the address of a CODEC specific configuration if successful.
1040 * Return NULL otherwise. */
1041 lsmash_codec_specific_t *lsmash_get_codec_specific_data
1043 lsmash_summary_t *summary,
1044 uint32_t extension_number
1047 /* Convert a data format of CODEC specific configuration into another.
1048 * User can specify the same data format for the destination.
1049 * If so, a returned CODEC specific configuration is a copy of the source.
1051 * Return an allocated CODEC specific configuration by specified 'format' from 'specific' if successful.
1052 * Return NULL otherwise. */
1053 lsmash_codec_specific_t *lsmash_convert_codec_specific_format
1055 lsmash_codec_specific_t *specific, /* the address of a CODEC specific configuration as the source */
1056 lsmash_codec_specific_format format /* a data format of the destination */
1059 /* Compare two summaries.
1061 * Return 0 if the two summaries are identical.
1062 * Return 1 if the two summaries are different.
1063 * Return a negative value if there is any error. */
1064 int lsmash_compare_summary
1066 lsmash_summary_t *a,
1067 lsmash_summary_t *b
1070 /* Check status of CODEC support.
1072 * Return support flags of a given CODEC. */
1073 lsmash_codec_support_flag lsmash_check_codec_support
1075 lsmash_codec_type_t codec_type
1078 /****************************************************************************
1079 * Audio Description Layer
1080 ****************************************************************************/
1081 /* Audio Object Types */
1082 typedef enum
1084 MP4A_AUDIO_OBJECT_TYPE_NULL = 0,
1085 MP4A_AUDIO_OBJECT_TYPE_AAC_MAIN = 1, /* ISO/IEC 14496-3 subpart 4 */
1086 MP4A_AUDIO_OBJECT_TYPE_AAC_LC = 2, /* ISO/IEC 14496-3 subpart 4 */
1087 MP4A_AUDIO_OBJECT_TYPE_AAC_SSR = 3, /* ISO/IEC 14496-3 subpart 4 */
1088 MP4A_AUDIO_OBJECT_TYPE_AAC_LTP = 4, /* ISO/IEC 14496-3 subpart 4 */
1089 MP4A_AUDIO_OBJECT_TYPE_SBR = 5, /* ISO/IEC 14496-3 subpart 4 */
1090 MP4A_AUDIO_OBJECT_TYPE_AAC_scalable = 6, /* ISO/IEC 14496-3 subpart 4 */
1091 MP4A_AUDIO_OBJECT_TYPE_TwinVQ = 7, /* ISO/IEC 14496-3 subpart 4 */
1092 MP4A_AUDIO_OBJECT_TYPE_CELP = 8, /* ISO/IEC 14496-3 subpart 3 */
1093 MP4A_AUDIO_OBJECT_TYPE_HVXC = 9, /* ISO/IEC 14496-3 subpart 2 */
1094 MP4A_AUDIO_OBJECT_TYPE_TTSI = 12, /* ISO/IEC 14496-3 subpart 6 */
1095 MP4A_AUDIO_OBJECT_TYPE_Main_synthetic = 13, /* ISO/IEC 14496-3 subpart 5 */
1096 MP4A_AUDIO_OBJECT_TYPE_Wavetable_synthesis = 14, /* ISO/IEC 14496-3 subpart 5 */
1097 MP4A_AUDIO_OBJECT_TYPE_General_MIDI = 15, /* ISO/IEC 14496-3 subpart 5 */
1098 MP4A_AUDIO_OBJECT_TYPE_Algorithmic_Synthesis_Audio_FX = 16, /* ISO/IEC 14496-3 subpart 5 */
1099 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LC = 17, /* ISO/IEC 14496-3 subpart 4 */
1100 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LTP = 19, /* ISO/IEC 14496-3 subpart 4 */
1101 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_scalable = 20, /* ISO/IEC 14496-3 subpart 4 */
1102 MP4A_AUDIO_OBJECT_TYPE_ER_Twin_VQ = 21, /* ISO/IEC 14496-3 subpart 4 */
1103 MP4A_AUDIO_OBJECT_TYPE_ER_BSAC = 22, /* ISO/IEC 14496-3 subpart 4 */
1104 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LD = 23, /* ISO/IEC 14496-3 subpart 4 */
1105 MP4A_AUDIO_OBJECT_TYPE_ER_CELP = 24, /* ISO/IEC 14496-3 subpart 3 */
1106 MP4A_AUDIO_OBJECT_TYPE_ER_HVXC = 25, /* ISO/IEC 14496-3 subpart 2 */
1107 MP4A_AUDIO_OBJECT_TYPE_ER_HILN = 26, /* ISO/IEC 14496-3 subpart 7 */
1108 MP4A_AUDIO_OBJECT_TYPE_ER_Parametric = 27, /* ISO/IEC 14496-3 subpart 2 and 7 */
1109 MP4A_AUDIO_OBJECT_TYPE_SSC = 28, /* ISO/IEC 14496-3 subpart 8 */
1110 MP4A_AUDIO_OBJECT_TYPE_PS = 29, /* ISO/IEC 14496-3 subpart 8 */
1111 MP4A_AUDIO_OBJECT_TYPE_MPEG_Surround = 30, /* ISO/IEC 23003-1 */
1112 MP4A_AUDIO_OBJECT_TYPE_ESCAPE = 31,
1113 MP4A_AUDIO_OBJECT_TYPE_Layer_1 = 32, /* ISO/IEC 14496-3 subpart 9 */
1114 MP4A_AUDIO_OBJECT_TYPE_Layer_2 = 33, /* ISO/IEC 14496-3 subpart 9 */
1115 MP4A_AUDIO_OBJECT_TYPE_Layer_3 = 34, /* ISO/IEC 14496-3 subpart 9 */
1116 MP4A_AUDIO_OBJECT_TYPE_DST = 35, /* ISO/IEC 14496-3 subpart 10 */
1117 MP4A_AUDIO_OBJECT_TYPE_ALS = 36, /* ISO/IEC 14496-3 subpart 11 */
1118 MP4A_AUDIO_OBJECT_TYPE_SLS = 37, /* ISO/IEC 14496-3 subpart 12 */
1119 MP4A_AUDIO_OBJECT_TYPE_SLS_non_core = 38, /* ISO/IEC 14496-3 subpart 12 */
1120 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_ELD = 39, /* ISO/IEC 14496-3 subpart 4 */
1121 MP4A_AUDIO_OBJECT_TYPE_SMR_Simple = 40, /* ISO/IEC 14496-23 */
1122 MP4A_AUDIO_OBJECT_TYPE_SMR_Main = 41, /* ISO/IEC 14496-23 */
1123 MP4A_AUDIO_OBJECT_TYPE_SAOC = 43, /* ISO/IEC 23003-2 */
1124 } lsmash_mp4a_AudioObjectType;
1126 /* See ISO/IEC 14496-3 Signaling of SBR, SBR Signaling and Corresponding Decoder Behavior */
1127 typedef enum
1129 MP4A_AAC_SBR_NOT_SPECIFIED = 0x0, /* not mention to SBR presence. Implicit signaling. */
1130 MP4A_AAC_SBR_NONE, /* explicitly signals SBR does not present. Useless in general. */
1131 MP4A_AAC_SBR_BACKWARD_COMPATIBLE, /* explicitly signals SBR present. Recommended method to signal SBR. */
1132 MP4A_AAC_SBR_HIERARCHICAL /* SBR exists. SBR dedicated method. */
1133 } lsmash_mp4a_aac_sbr_mode;
1135 typedef struct
1137 LSMASH_BASE_SUMMARY
1138 lsmash_mp4a_AudioObjectType aot; /* detailed codec type
1139 * If neither ISOM_CODEC_TYPE_MP4A_AUDIO nor QT_CODEC_TYPE_MP4A_AUDIO, just ignored. */
1140 uint32_t frequency; /* the audio sampling rate (in Hz) at the default output playback
1141 * For some audio, this field is used as a nominal value.
1142 * For HE-AAC v1/SBR stream, this is base AAC's one.
1143 * For ISOM_CODEC_TYPE_AC_3_AUDIO and ISOM_CODEC_TYPE_EC_3_AUDIO, this shall be
1144 * equal to the sampling rate (in Hz) of the stream and the media timescale. */
1145 uint32_t channels; /* the number of audio channels at the default output playback
1146 * Even if the stream is HE-AAC v2/SBR+PS, this is base AAC's one. */
1147 uint32_t sample_size; /* For uncompressed audio,
1148 * the number of bits in each uncompressed sample for a single channel.
1149 * For some compressed audio, such as audio that uses MDCT,
1150 * N/A (not applicable), and may be set to 16. */
1151 uint32_t samples_in_frame; /* the number of decoded PCM samples in an audio frame at 'frequency'
1152 * Even if the stream is HE-AAC/aacPlus/SBR(+PS), this is base AAC's one, so 1024. */
1153 lsmash_mp4a_aac_sbr_mode sbr_mode; /* SBR treatment
1154 * Currently we always set this as mp4a_AAC_SBR_NOT_SPECIFIED (Implicit signaling).
1155 * User can set this for treatment in other way. */
1156 uint32_t bytes_per_frame; /* the number of bytes per audio frame
1157 * If variable, shall be set to 0. */
1158 } lsmash_audio_summary_t;
1160 /* Facilitate to make exdata (typically DecoderSpecificInfo or AudioSpecificConfig). */
1161 int lsmash_setup_AudioSpecificConfig
1163 lsmash_audio_summary_t* summary
1166 /****************************************************************************
1167 * Video Description Layer
1168 ****************************************************************************/
1169 /* Clean Aperture */
1170 typedef struct
1172 lsmash_rational_u32_t width;
1173 lsmash_rational_u32_t height;
1174 lsmash_rational_s32_t horizontal_offset;
1175 lsmash_rational_s32_t vertical_offset;
1176 } lsmash_clap_t;
1178 typedef struct
1180 lsmash_rational_u32_t top;
1181 lsmash_rational_u32_t left;
1182 lsmash_rational_u32_t bottom;
1183 lsmash_rational_u32_t right;
1184 } lsmash_crop_t;
1186 /* Video depth */
1187 typedef enum
1189 ISOM_DEPTH_TEMPLATE = 0x0018,
1191 /* H.264/AVC */
1192 AVC_DEPTH_COLOR_WITH_NO_ALPHA = 0x0018, /* color with no alpha */
1193 AVC_DEPTH_GRAYSCALE_WITH_NO_ALPHA = 0x0028, /* grayscale with no alpha */
1194 AVC_DEPTH_WITH_ALPHA = 0x0020, /* gray or color with alpha */
1196 /* QuickTime Video
1197 * (1-32) or (33-40 grayscale) */
1198 QT_VIDEO_DEPTH_COLOR_1 = 0x0001,
1199 QT_VIDEO_DEPTH_COLOR_2 = 0x0002,
1200 QT_VIDEO_DEPTH_COLOR_4 = 0x0004,
1201 QT_VIDEO_DEPTH_COLOR_8 = 0x0008,
1202 QT_VIDEO_DEPTH_COLOR_16 = 0x0010,
1203 QT_VIDEO_DEPTH_COLOR_24 = 0x0018,
1204 QT_VIDEO_DEPTH_COLOR_32 = 0x0020,
1205 QT_VIDEO_DEPTH_GRAYSCALE_1 = 0x0021,
1206 QT_VIDEO_DEPTH_GRAYSCALE_2 = 0x0022,
1207 QT_VIDEO_DEPTH_GRAYSCALE_4 = 0x0024,
1208 QT_VIDEO_DEPTH_GRAYSCALE_8 = 0x0028,
1210 /* QuickTime Uncompressed RGB */
1211 QT_VIDEO_DEPTH_555RGB = 0x0010,
1212 QT_VIDEO_DEPTH_24RGB = 0x0018,
1213 QT_VIDEO_DEPTH_32ARGB = 0x0020,
1214 } lsmash_video_depth;
1216 /* Index for the chromaticity coordinates of the color primaries */
1217 enum
1219 /* for ISO Base Media file format */
1220 ISOM_PRIMARIES_INDEX_ITU_R709_5 = 1, /* ITU-R BT.709-2/5, ITU-R BT.1361,
1221 * SMPTE 274M-1995, SMPTE 296M-1997,
1222 * IEC 61966-2-1 (sRGB or sYCC), IEC 61966-2-4 (xvYCC),
1223 * SMPTE RP 177M-1993 Annex B
1224 * green x = 0.300 y = 0.600
1225 * blue x = 0.150 y = 0.060
1226 * red x = 0.640 y = 0.330
1227 * white x = 0.3127 y = 0.3290 (CIE III. D65) */
1228 ISOM_PRIMARIES_INDEX_UNSPECIFIED = 2, /* Unspecified */
1229 ISOM_PRIMARIES_INDEX_ITU_R470M = 4, /* ITU-R BT.470-6 System M
1230 * green x = 0.21 y = 0.71
1231 * blue x = 0.14 y = 0.08
1232 * red x = 0.67 y = 0.33
1233 * white x = 0.310 y = 0.316 */
1234 ISOM_PRIMARIES_INDEX_ITU_R470BG = 5, /* EBU Tech. 3213 (1981), ITU-R BT.470-6 System B, G,
1235 * ITU-R BT.601-6 625, ITU-R BT.1358 625,
1236 * ITU-R BT.1700 625 PAL and 625 SECAM
1237 * green x = 0.29 y = 0.60
1238 * blue x = 0.15 y = 0.06
1239 * red x = 0.64 y = 0.33
1240 * white x = 0.3127 y = 0.3290 (CIE III. D65) */
1241 ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 = 6, /* SMPTE C Primaries from SMPTE RP 145-1993, SMPTE 170M-2004,
1242 * ITU-R BT.601-6 525, ITU-R BT.1358 525,
1243 * ITU-R BT.1700 NTSC, SMPTE 170M-2004
1244 * green x = 0.310 y = 0.595
1245 * blue x = 0.155 y = 0.070
1246 * red x = 0.630 y = 0.340
1247 * white x = 0.3127 y = 0.3290 (CIE III. D65) */
1248 ISOM_PRIMARIES_INDEX_SMPTE_240M_1999 = 7, /* SMPTE 240M-1999
1249 * functionally the same as the value ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 */
1251 /* for QuickTime file format */
1252 QT_PRIMARIES_INDEX_ITU_R709_2 = 1, /* the same as the value ISOM_PRIMARIES_INDEX_ITU_R709_5 */
1253 QT_PRIMARIES_INDEX_UNSPECIFIED = 2, /* Unspecified */
1254 QT_PRIMARIES_INDEX_EBU_3213 = 5, /* the same as the value ISOM_PRIMARIES_INDEX_ITU_R470BG */
1255 QT_PRIMARIES_INDEX_SMPTE_C = 6, /* the same as the value ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 */
1258 /* Index for the opto-electronic transfer characteristic of the image color components */
1259 enum
1261 /* for ISO Base Media file format */
1262 ISOM_TRANSFER_INDEX_ITU_R709_5 = 1, /* ITU-R BT.709-2/5, ITU-R BT.1361
1263 * SMPTE 274M-1995, SMPTE 296M-1997,
1264 * SMPTE 293M-1996, SMPTE 170M-1994
1265 * vV = 1.099 * vLc^0.45 - 0.099 for 1 >= vLc >= 0.018
1266 * vV = 4.500 * vLc for 0.018 > vLc >= 0 */
1267 ISOM_TRANSFER_INDEX_UNSPECIFIED = 2, /* Unspecified */
1268 ISOM_TRANSFER_INDEX_ITU_R470M = 4, /* ITU-R BT.470-6 System M, ITU-R BT.1700 625 PAL and 625 SECAM
1269 * Assumed display gamma 2.2 */
1270 ISOM_TRANSFER_INDEX_ITU_R470BG = 5, /* ITU-R BT.470-6 System B, G
1271 * Assumed display gamma 2.8 */
1272 ISOM_TRANSFER_INDEX_SMPTE_170M_2004 = 6, /* ITU-R BT.601-6 525 or 625, ITU-R BT.1358 525 or 625,
1273 * ITU-R BT.1700 NTSC, SMPTE 170M-2004
1274 * functionally the same as the value ISOM_TRANSFER_INDEX_ITU_R709_5
1275 * vV = 1.099 * vLc^0.45 - 0.099 for 1 >= vLc >= 0.018
1276 * vV = 4.500 * vLc for 0.018 > vLc >= 0 */
1277 ISOM_TRANSFER_INDEX_SMPTE_240M_1999 = 7, /* SMPTE 240M-1995/1999, interim color implementation of SMPTE 274M-1995
1278 * vV = 1.1115 * vLc^0.45 - 0.1115 for 1 >= vLc >= 0.0228
1279 * vV = 4.0 * vLc for 0.0228 > vLc >= 0 */
1280 ISOM_TRANSFER_INDEX_LINEAR = 8, /* Linear transfer characteristics */
1281 ISOM_TRANSFER_INDEX_XVYCC = 11, /* IEC 61966-2-4 (xvYCC)
1282 * vV = 1.099 * vLc^0.45 - 0.099 for vLc >= 0.018
1283 * vV = 4.500 * vLc for 0.018 > vLc > -0.018
1284 * vV = -1.099 * (-vLc)^0.45 + 0.099 for -0.018 >= vLc */
1285 ISOM_TRANSFER_INDEX_ITU_R1361 = 12, /* ITU-R BT.1361
1286 * vV = 1.099 * vLc^0.45 - 0.099 for 1.33 > vLc >= 0.018
1287 * vV = 4.500 * vLc for 0.018 > vLc >= -0.0045
1288 * vV = -(1.099 * (-4 * vLc)^0.45 + 0.099) / 4 for -0.0045 > vLc >= -0.25 */
1289 ISOM_TRANSFER_INDEX_SRGB = 13, /* IEC 61966-2-1 (sRGB or sYCC)
1290 * vV = 1.055 * vLc^(1/2.4) - 0.055 for 1 > vLc >= 0.0031308
1291 * vV = 12.92 * vLc for 0.0031308 > vLc >= 0 */
1293 /* for QuickTime file format */
1294 QT_TRANSFER_INDEX_ITU_R709_2 = 1, /* the same as the value ISOM_TRANSFER_INDEX_ITU_R709_5 */
1295 QT_TRANSFER_INDEX_UNSPECIFIED = 2, /* Unspecified */
1296 QT_TRANSFER_INDEX_SMPTE_240M_1995 = 7, /* the same as the value ISOM_TRANSFER_INDEX_SMPTE_240M_1999 */
1299 /* Index for the matrix coefficients associated with derivation of luma and chroma signals from the green, blue, and red primaries */
1300 enum
1302 /* for ISO Base Media file format */
1303 ISOM_MATRIX_INDEX_NO_MATRIX = 0, /* No matrix transformation
1304 * IEC 61966-2-1 (sRGB) */
1305 ISOM_MATRIX_INDEX_ITU_R_709_5 = 1, /* ITU-R BT.709-2/5, ITU-R BT.1361,
1306 * SMPTE 274M-1995, SMPTE 296M-1997
1307 * IEC 61966-2-1 (sYCC), IEC 61966-2-4 xvYCC_709,
1308 * SMPTE RP 177M-1993 Annex B
1309 * vKr = 0.2126; vKb = 0.0722 */
1310 ISOM_MATRIX_INDEX_UNSPECIFIED = 2, /* Unspecified */
1311 ISOM_MATRIX_INDEX_USFCCT_47_CFR = 4, /* United States Federal Communications Commission Title 47 Code of Federal Regulations
1312 * vKr = 0.30; vKb = 0.11 */
1313 ISOM_MATRIX_INDEX_ITU_R470BG = 5, /* ITU-R BT.470-6 System B, G,
1314 * ITU-R BT.601-4/6 625, ITU-R BT.1358 625,
1315 * ITU-R BT.1700 625 PAL and 625 SECAM, IEC 61966-2-4 xvYCC601
1316 * vKr = 0.299; vKb = 0.114 */
1317 ISOM_MATRIX_INDEX_SMPTE_170M_2004 = 6, /* ITU-R BT.601-4/6 525, ITU-R BT.1358 525,
1318 * ITU-R BT.1700 NTSC,
1319 * SMPTE 170M-1994, SMPTE 293M-1996
1320 * functionally the same as the value ISOM_MATRIX_INDEX_ITU_R470BG
1321 * vKr = 0.299; vKb = 0.114 */
1322 ISOM_MATRIX_INDEX_SMPTE_240M_1999 = 7, /* SMPTE 240M-1995, interim color implementation of SMPTE 274M-1995
1323 * vKr = 0.212; vKb = 0.087 */
1324 ISOM_MATRIX_INDEX_YCGCO = 8, /* YCoCg */
1326 /* for QuickTime file format */
1327 QT_MATRIX_INDEX_ITU_R_709_2 = 1, /* the same as the value ISOM_MATRIX_INDEX_ITU_R_709_5 */
1328 QT_MATRIX_INDEX_UNSPECIFIED = 2, /* Unspecified */
1329 QT_MATRIX_INDEX_ITU_R_601_4 = 6, /* the same as the value ISOM_MATRIX_INDEX_SMPTE_170M_2004 */
1330 QT_MATRIX_INDEX_SMPTE_240M_1995 = 7 /* the same as the value ISOM_MATRIX_INDEX_SMPTE_240M_1999 */
1333 typedef struct
1335 LSMASH_BASE_SUMMARY
1336 // lsmash_mp4v_VideoObjectType vot; /* Detailed codec type. If not mp4v, just ignored. */
1337 uint32_t timescale; /* media timescale
1338 * User can't set this parameter manually. */
1339 uint32_t timebase; /* increment unit of timestamp
1340 * User can't set this parameter manually. */
1341 uint8_t vfr; /* whether a stream is assumed as variable frame rate
1342 * User can't set this parameter manually. */
1343 uint8_t sample_per_field; /* whether a stream may have a sample per field
1344 * User can't set this parameter manually. */
1345 uint32_t width; /* pixel counts of width samples have */
1346 uint32_t height; /* pixel counts of height samples have */
1347 char compressorname[33]; /* a 32-byte Pascal string containing the name of the compressor that created the image */
1348 lsmash_video_depth depth; /* data size of a pixel */
1349 lsmash_clap_t clap; /* clean aperture */
1350 uint32_t par_h; /* horizontal factor of pixel aspect ratio */
1351 uint32_t par_v; /* vertical factor of pixel aspect ratio */
1352 struct
1354 /* To omit to write these field, set zero value to all them. */
1355 uint16_t primaries_index; /* the chromaticity coordinates of the color primaries */
1356 uint16_t transfer_index; /* the opto-electronic transfer characteristic of the image color components */
1357 uint16_t matrix_index; /* the matrix coefficients associated with derivation of luma and chroma signals from the green, blue, and red primaries */
1358 uint8_t full_range;
1359 } color;
1360 } lsmash_video_summary_t;
1362 int lsmash_convert_crop_into_clap
1364 lsmash_crop_t crop,
1365 uint32_t width,
1366 uint32_t height,
1367 lsmash_clap_t *clap
1370 int lsmash_convert_clap_into_crop
1372 lsmash_clap_t clap,
1373 uint32_t width,
1374 uint32_t height,
1375 lsmash_crop_t *crop
1378 /****************************************************************************
1379 * Media Sample
1380 ****************************************************************************/
1381 typedef enum
1383 /* allow_ealier */
1384 QT_SAMPLE_EARLIER_PTS_ALLOWED = 1,
1385 /* leading */
1386 ISOM_SAMPLE_LEADING_UNKNOWN = 0,
1387 ISOM_SAMPLE_IS_UNDECODABLE_LEADING = 1,
1388 ISOM_SAMPLE_IS_NOT_LEADING = 2,
1389 ISOM_SAMPLE_IS_DECODABLE_LEADING = 3,
1390 /* independent */
1391 ISOM_SAMPLE_INDEPENDENCY_UNKNOWN = 0,
1392 ISOM_SAMPLE_IS_NOT_INDEPENDENT = 1,
1393 ISOM_SAMPLE_IS_INDEPENDENT = 2,
1394 /* disposable */
1395 ISOM_SAMPLE_DISPOSABLE_UNKNOWN = 0,
1396 ISOM_SAMPLE_IS_NOT_DISPOSABLE = 1,
1397 ISOM_SAMPLE_IS_DISPOSABLE = 2,
1398 /* redundant */
1399 ISOM_SAMPLE_REDUNDANCY_UNKNOWN = 0,
1400 ISOM_SAMPLE_HAS_REDUNDANCY = 1,
1401 ISOM_SAMPLE_HAS_NO_REDUNDANCY = 2,
1402 } lsmash_sample_dependency;
1404 typedef enum
1406 /* flags for ISO Base Media file format */
1407 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_NONE = 0,
1408 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_SYNC = 1 << 0, /* a sync sample */
1409 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP = 1 << 2, /* the first sample of a closed or an open GOP */
1410 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED = 1 << 3, /* a sample in a closed GOP
1411 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP. */
1412 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN = 1 << 4, /* a sample in an open GOP
1413 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP. */
1414 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR = 1 << 5, /* a sample on gradual decoder refresh or random access recovery */
1415 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_START = 1 << 6, /* a sample that is the starting point of gradual decoder refresh or random access recovery
1416 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR. */
1417 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_END = 1 << 7, /* a sample that is the ending point of gradual decoder refresh or random access recovery
1418 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR. */
1420 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP /* the first sample of a closed GOP */
1421 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1422 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED,
1423 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP /* the first sample of an open GOP */
1424 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1425 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN,
1426 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_POST_ROLL_START /* the post-roll starting point of random access recovery */
1427 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR
1428 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_START,
1429 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_PRE_ROLL_END /* the pre-roll ending point of random access recovery */
1430 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR
1431 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_END,
1433 /* flags for QuickTime file format */
1434 QT_SAMPLE_RANDOM_ACCESS_FLAG_NONE = 0, /* alias of ISOM_SAMPLE_RANDOM_ACCESS_FLAG_NONE */
1435 QT_SAMPLE_RANDOM_ACCESS_FLAG_SYNC = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_SYNC,
1436 QT_SAMPLE_RANDOM_ACCESS_FLAG_PARTIAL_SYNC = 1 << 1, /* partial sync sample
1437 * Partial sync sample is a sample
1438 * such that this sample and samples following in decoding order can be correctly decoded
1439 * using the first sample of the previous GOP and samples following in decoding order,
1440 * in addition, this sample and non-leading samples following in decoding order can be correctly decoded from this. */
1441 QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP,
1442 QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED,
1443 QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN,
1445 QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP /* the first sample of a closed GOP */
1446 = QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1447 | QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED,
1448 QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP /* the first sample of an open GOP */
1449 = QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1450 | QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN,
1451 } lsmash_random_access_flag;
1453 #define LSMASH_FLAGS_SATISFIED( x, y ) (((x) & (y)) == (y))
1454 #define LSMASH_IS_CLOSED_RAP( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP )
1455 #define LSMASH_IS_OPEN_RAP( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP )
1456 #define LSMASH_IS_POST_ROLL_START( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_POST_ROLL_START )
1457 #define LSMASH_IS_PRE_ROLL_END( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_PRE_ROLL_END )
1459 typedef struct
1461 uint32_t identifier; /* the identifier of sample
1462 * If this identifier equals a certain identifier of random access recovery point,
1463 * then this sample is the random access recovery point of the earliest unestablished post-roll group. */
1464 uint32_t complete; /* the identifier of future random access recovery point, which is necessary for the recovery from its starting point to be completed
1465 * For muxing, this value is used only if (ra_flags & ISOM_SAMPLE_RANDOM_ACCESS_TYPE_POST_ROLL_START) is true.
1466 * The following is an example of use for gradual decoder refresh of H.264/AVC.
1467 * For each sample, set 'frame_num' to the 'identifier'.
1468 * For samples with recovery point SEI message, add ISOM_SAMPLE_RANDOM_ACCESS_TYPE_POST_ROLL_START to ra_flags
1469 * and set '(frame_num + recovery_frame_cnt) % MaxFrameNum' to the 'complete'.
1470 * The above-mentioned values are set appropriately, then L-SMASH will establish appropriate post-roll grouping. */
1471 } lsmash_post_roll_t;
1473 typedef struct
1475 uint32_t distance; /* the distance from the previous random access point or pre-roll starting point
1476 * of the random access recovery point to this sample.
1477 * For muxing, this value is used only if ra_flags is not set to ISOM_SAMPLE_RANDOM_ACCESS_TYPE_NONE
1478 * and LSMASH_IS_POST_ROLL_START( ra_flags ) is false.
1479 * Some derived specifications forbid using pre-roll settings and use post-roll settings instead (e.g. AVC uses only post-roll).
1480 * The following is an example of pre-roll distance for representing audio decoder delay derived from composition.
1481 * Typical AAC encoding uses a transform over consecutive sets of 2048 audio samples,
1482 * applied every 1024 audio samples (MDCTs are overlapped).
1483 * For correct audio to be decoded, both transforms for any period of 1024 audio samples are needed.
1484 * For this AAC stream, therefore, 'distance' of each sample shall be set to 1 (one AAC access unit).
1485 * Note: the number of priming audio sample i.e. encoder delay shall be represented by 'start_time' in an edit. */
1486 } lsmash_pre_roll_t;
1488 typedef struct
1490 lsmash_random_access_flag ra_flags; /* random access flags */
1491 lsmash_post_roll_t post_roll;
1492 lsmash_pre_roll_t pre_roll;
1493 uint8_t allow_earlier; /* only for QuickTime file format */
1494 uint8_t leading;
1495 uint8_t independent;
1496 uint8_t disposable;
1497 uint8_t redundant;
1498 uint8_t reserved[3]; /* non-output
1499 * broken link
1500 * ??? */
1501 } lsmash_sample_property_t;
1503 typedef struct
1505 uint32_t length; /* size of sample data
1506 * Note: this is NOT always an allocated size. */
1507 uint8_t *data; /* sample data */
1508 uint64_t dts; /* Decoding TimeStamp in units of media timescale */
1509 uint64_t cts; /* Composition TimeStamp in units of media timescale */
1510 uint64_t pos; /* absolute file offset of sample data (read-only) */
1511 uint32_t index; /* index of sample description */
1512 lsmash_sample_property_t prop;
1513 } lsmash_sample_t;
1515 typedef struct
1517 uint64_t dts; /* Decoding TimeStamp in units of media timescale */
1518 uint64_t cts; /* Composition TimeStamp in units of media timescale */
1519 } lsmash_media_ts_t;
1521 typedef struct
1523 uint32_t sample_count;
1524 lsmash_media_ts_t *timestamp;
1525 } lsmash_media_ts_list_t;
1527 /* Allocate a sample and then allocate data of the allocated sample by 'size'.
1528 * If 'size' is set to 0, data of the allocated sample won't be allocated and will be set to NULL instead.
1529 * The allocated sample can be deallocated by lsmash_delete_sample().
1531 * Return the address of an allocated sample if successful.
1532 * Return NULL otherwise. */
1533 lsmash_sample_t *lsmash_create_sample
1535 uint32_t size /* size of sample data you request */
1538 /* Allocate data of a given allocated sample by 'size'.
1539 * If the sample data is already allocated, reallocate it by 'size'.
1541 * Return 0 if successful.
1542 * Return a negative value otherwise. */
1543 int lsmash_sample_alloc
1545 lsmash_sample_t *sample, /* the address of a sample you want to allocate its sample data */
1546 uint32_t size /* size of sample data you request */
1549 /* Deallocate a given sample. */
1550 void lsmash_delete_sample
1552 lsmash_sample_t *sample /* the address of a sample you want to deallocate */
1555 /* Append a sample to a track.
1556 * Note:
1557 * The appended sample will be deleted by lsmash_delete_sample() internally.
1558 * Users shall not deallocate the sample by lsmash_delete_sample() if successful to append the sample.
1560 * Return 0 if successful.
1561 * Return a negative value otherwise. */
1562 int lsmash_append_sample
1564 lsmash_root_t *root,
1565 uint32_t track_ID,
1566 lsmash_sample_t *sample
1569 /****************************************************************************
1570 * Media Layer
1571 ****************************************************************************/
1572 /* Media handler types */
1573 typedef enum
1575 ISOM_MEDIA_HANDLER_TYPE_3GPP_SCENE_DESCRIPTION = LSMASH_4CC( '3', 'g', 's', 'd' ),
1576 ISOM_MEDIA_HANDLER_TYPE_ID3_VERSION2_METADATA = LSMASH_4CC( 'I', 'D', '3', '2' ),
1577 ISOM_MEDIA_HANDLER_TYPE_AUXILIARY_VIDEO_TRACK = LSMASH_4CC( 'a', 'u', 'x', 'v' ),
1578 ISOM_MEDIA_HANDLER_TYPE_CPCM_AUXILIARY_METADATA = LSMASH_4CC( 'c', 'p', 'a', 'd' ),
1579 ISOM_MEDIA_HANDLER_TYPE_CLOCK_REFERENCE_STREAM = LSMASH_4CC( 'c', 'r', 's', 'm' ),
1580 ISOM_MEDIA_HANDLER_TYPE_DVB_MANDATORY_BASIC_DESCRIPTION = LSMASH_4CC( 'd', 'm', 'b', 'd' ),
1581 ISOM_MEDIA_HANDLER_TYPE_TV_ANYTIME = LSMASH_4CC( 'd', 't', 'v', 'a' ),
1582 ISOM_MEDIA_HANDLER_TYPE_BROADBAND_CONTENT_GUIDE = LSMASH_4CC( 'd', 't', 'v', 'a' ),
1583 ISOM_MEDIA_HANDLER_TYPE_FONT_DATA_STREAM = LSMASH_4CC( 'f', 'd', 's', 'm' ),
1584 ISOM_MEDIA_HANDLER_TYPE_GENERAL_MPEG4_SYSTEM_STREAM = LSMASH_4CC( 'g', 'e', 's', 'm' ),
1585 ISOM_MEDIA_HANDLER_TYPE_HINT_TRACK = LSMASH_4CC( 'h', 'i', 'n', 't' ),
1586 ISOM_MEDIA_HANDLER_TYPE_IPDC_ELECTRONIC_SERVICE_GUIDE = LSMASH_4CC( 'i', 'p', 'd', 'c' ),
1587 ISOM_MEDIA_HANDLER_TYPE_IPMP_STREAM = LSMASH_4CC( 'i', 'p', 's', 'm' ),
1588 ISOM_MEDIA_HANDLER_TYPE_MPEG7_STREAM = LSMASH_4CC( 'm', '7', 's', 'm' ),
1589 ISOM_MEDIA_HANDLER_TYPE_TIMED_METADATA_TRACK = LSMASH_4CC( 'm', 'e', 't', 'a' ),
1590 ISOM_MEDIA_HANDLER_TYPE_MPEGJ_STREAM = LSMASH_4CC( 'm', 'j', 's', 'm' ),
1591 ISOM_MEDIA_HANDLER_TYPE_MPEG21_DIGITAL_ITEM = LSMASH_4CC( 'm', 'p', '2', '1' ),
1592 ISOM_MEDIA_HANDLER_TYPE_OBJECT_CONTENT_INFO_STREAM = LSMASH_4CC( 'o', 'c', 's', 'm' ),
1593 ISOM_MEDIA_HANDLER_TYPE_OBJECT_DESCRIPTOR_STREAM = LSMASH_4CC( 'o', 'd', 's', 'm' ),
1594 ISOM_MEDIA_HANDLER_TYPE_SCENE_DESCRIPTION_STREAM = LSMASH_4CC( 's', 'd', 's', 'm' ),
1595 ISOM_MEDIA_HANDLER_TYPE_KEY_MANAGEMENT_MESSAGES = LSMASH_4CC( 's', 'k', 'm', 'm' ),
1596 ISOM_MEDIA_HANDLER_TYPE_AUDIO_TRACK = LSMASH_4CC( 's', 'o', 'u', 'n' ),
1597 ISOM_MEDIA_HANDLER_TYPE_TEXT_TRACK = LSMASH_4CC( 't', 'e', 'x', 't' ),
1598 ISOM_MEDIA_HANDLER_TYPE_PROPRIETARY_DESCRIPTIVE_METADATA = LSMASH_4CC( 'u', 'r', 'i', ' ' ),
1599 ISOM_MEDIA_HANDLER_TYPE_VIDEO_TRACK = LSMASH_4CC( 'v', 'i', 'd', 'e' ),
1600 } lsmash_media_type;
1602 /* ISO language codes */
1603 typedef enum
1605 #define LSMASH_PACK_ISO_LANGUAGE( a, b, c ) ((((a-0x60)&0x1f)<<10) | (((b-0x60)&0x1f)<<5) | ((c-0x60)&0x1f))
1606 ISOM_LANGUAGE_CODE_ENGLISH = LSMASH_PACK_ISO_LANGUAGE( 'e', 'n', 'g' ),
1607 ISOM_LANGUAGE_CODE_FRENCH = LSMASH_PACK_ISO_LANGUAGE( 'f', 'r', 'a' ),
1608 ISOM_LANGUAGE_CODE_GERMAN = LSMASH_PACK_ISO_LANGUAGE( 'd', 'e', 'u' ),
1609 ISOM_LANGUAGE_CODE_ITALIAN = LSMASH_PACK_ISO_LANGUAGE( 'i', 't', 'a' ),
1610 ISOM_LANGUAGE_CODE_DUTCH_M = LSMASH_PACK_ISO_LANGUAGE( 'd', 'u', 'm' ),
1611 ISOM_LANGUAGE_CODE_SWEDISH = LSMASH_PACK_ISO_LANGUAGE( 's', 'w', 'e' ),
1612 ISOM_LANGUAGE_CODE_SPANISH = LSMASH_PACK_ISO_LANGUAGE( 's', 'p', 'a' ),
1613 ISOM_LANGUAGE_CODE_DANISH = LSMASH_PACK_ISO_LANGUAGE( 'd', 'a', 'n' ),
1614 ISOM_LANGUAGE_CODE_PORTUGUESE = LSMASH_PACK_ISO_LANGUAGE( 'p', 'o', 'r' ),
1615 ISOM_LANGUAGE_CODE_NORWEGIAN = LSMASH_PACK_ISO_LANGUAGE( 'n', 'o', 'r' ),
1616 ISOM_LANGUAGE_CODE_HEBREW = LSMASH_PACK_ISO_LANGUAGE( 'h', 'e', 'b' ),
1617 ISOM_LANGUAGE_CODE_JAPANESE = LSMASH_PACK_ISO_LANGUAGE( 'j', 'p', 'n' ),
1618 ISOM_LANGUAGE_CODE_ARABIC = LSMASH_PACK_ISO_LANGUAGE( 'a', 'r', 'a' ),
1619 ISOM_LANGUAGE_CODE_FINNISH = LSMASH_PACK_ISO_LANGUAGE( 'f', 'i', 'n' ),
1620 ISOM_LANGUAGE_CODE_GREEK = LSMASH_PACK_ISO_LANGUAGE( 'e', 'l', 'l' ),
1621 ISOM_LANGUAGE_CODE_ICELANDIC = LSMASH_PACK_ISO_LANGUAGE( 'i', 's', 'l' ),
1622 ISOM_LANGUAGE_CODE_MALTESE = LSMASH_PACK_ISO_LANGUAGE( 'm', 'l', 't' ),
1623 ISOM_LANGUAGE_CODE_TURKISH = LSMASH_PACK_ISO_LANGUAGE( 't', 'u', 'r' ),
1624 ISOM_LANGUAGE_CODE_CROATIAN = LSMASH_PACK_ISO_LANGUAGE( 'h', 'r', 'v' ),
1625 ISOM_LANGUAGE_CODE_CHINESE = LSMASH_PACK_ISO_LANGUAGE( 'z', 'h', 'o' ),
1626 ISOM_LANGUAGE_CODE_URDU = LSMASH_PACK_ISO_LANGUAGE( 'u', 'r', 'd' ),
1627 ISOM_LANGUAGE_CODE_HINDI = LSMASH_PACK_ISO_LANGUAGE( 'h', 'i', 'n' ),
1628 ISOM_LANGUAGE_CODE_THAI = LSMASH_PACK_ISO_LANGUAGE( 't', 'h', 'a' ),
1629 ISOM_LANGUAGE_CODE_KOREAN = LSMASH_PACK_ISO_LANGUAGE( 'k', 'o', 'r' ),
1630 ISOM_LANGUAGE_CODE_LITHUANIAN = LSMASH_PACK_ISO_LANGUAGE( 'l', 'i', 't' ),
1631 ISOM_LANGUAGE_CODE_POLISH = LSMASH_PACK_ISO_LANGUAGE( 'p', 'o', 'l' ),
1632 ISOM_LANGUAGE_CODE_HUNGARIAN = LSMASH_PACK_ISO_LANGUAGE( 'h', 'u', 'n' ),
1633 ISOM_LANGUAGE_CODE_ESTONIAN = LSMASH_PACK_ISO_LANGUAGE( 'e', 's', 't' ),
1634 ISOM_LANGUAGE_CODE_LATVIAN = LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 'v' ),
1635 ISOM_LANGUAGE_CODE_SAMI = LSMASH_PACK_ISO_LANGUAGE( 's', 'm', 'i' ),
1636 ISOM_LANGUAGE_CODE_FAROESE = LSMASH_PACK_ISO_LANGUAGE( 'f', 'a', 'o' ),
1637 ISOM_LANGUAGE_CODE_RUSSIAN = LSMASH_PACK_ISO_LANGUAGE( 'r', 'u', 's' ),
1638 ISOM_LANGUAGE_CODE_DUTCH = LSMASH_PACK_ISO_LANGUAGE( 'n', 'l', 'd' ),
1639 ISOM_LANGUAGE_CODE_IRISH = LSMASH_PACK_ISO_LANGUAGE( 'g', 'l', 'e' ),
1640 ISOM_LANGUAGE_CODE_ALBANIAN = LSMASH_PACK_ISO_LANGUAGE( 's', 'q', 'i' ),
1641 ISOM_LANGUAGE_CODE_ROMANIAN = LSMASH_PACK_ISO_LANGUAGE( 'r', 'o', 'n' ),
1642 ISOM_LANGUAGE_CODE_CZECH = LSMASH_PACK_ISO_LANGUAGE( 'c', 'e', 's' ),
1643 ISOM_LANGUAGE_CODE_SLOVAK = LSMASH_PACK_ISO_LANGUAGE( 's', 'l', 'k' ),
1644 ISOM_LANGUAGE_CODE_SLOVENIA = LSMASH_PACK_ISO_LANGUAGE( 's', 'l', 'v' ),
1645 ISOM_LANGUAGE_CODE_YIDDISH = LSMASH_PACK_ISO_LANGUAGE( 'y', 'i', 'd' ),
1646 ISOM_LANGUAGE_CODE_SERBIAN = LSMASH_PACK_ISO_LANGUAGE( 's', 'r', 'p' ),
1647 ISOM_LANGUAGE_CODE_MACEDONIAN = LSMASH_PACK_ISO_LANGUAGE( 'm', 'k', 'd' ),
1648 ISOM_LANGUAGE_CODE_BULGARIAN = LSMASH_PACK_ISO_LANGUAGE( 'b', 'u', 'l' ),
1649 ISOM_LANGUAGE_CODE_UKRAINIAN = LSMASH_PACK_ISO_LANGUAGE( 'u', 'k', 'r' ),
1650 ISOM_LANGUAGE_CODE_BELARUSIAN = LSMASH_PACK_ISO_LANGUAGE( 'b', 'e', 'l' ),
1651 ISOM_LANGUAGE_CODE_UZBEK = LSMASH_PACK_ISO_LANGUAGE( 'u', 'z', 'b' ),
1652 ISOM_LANGUAGE_CODE_KAZAKH = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 'z' ),
1653 ISOM_LANGUAGE_CODE_AZERBAIJANI = LSMASH_PACK_ISO_LANGUAGE( 'a', 'z', 'e' ),
1654 ISOM_LANGUAGE_CODE_ARMENIAN = LSMASH_PACK_ISO_LANGUAGE( 'h', 'y', 'e' ),
1655 ISOM_LANGUAGE_CODE_GEORGIAN = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 't' ),
1656 ISOM_LANGUAGE_CODE_MOLDAVIAN = LSMASH_PACK_ISO_LANGUAGE( 'r', 'o', 'n' ),
1657 ISOM_LANGUAGE_CODE_KIRGHIZ = LSMASH_PACK_ISO_LANGUAGE( 'k', 'i', 'r' ),
1658 ISOM_LANGUAGE_CODE_TAJIK = LSMASH_PACK_ISO_LANGUAGE( 't', 'g', 'k' ),
1659 ISOM_LANGUAGE_CODE_TURKMEN = LSMASH_PACK_ISO_LANGUAGE( 't', 'u', 'k' ),
1660 ISOM_LANGUAGE_CODE_MONGOLIAN = LSMASH_PACK_ISO_LANGUAGE( 'm', 'o', 'n' ),
1661 ISOM_LANGUAGE_CODE_PASHTO = LSMASH_PACK_ISO_LANGUAGE( 'p', 'u', 's' ),
1662 ISOM_LANGUAGE_CODE_KURDISH = LSMASH_PACK_ISO_LANGUAGE( 'k', 'u', 'r' ),
1663 ISOM_LANGUAGE_CODE_KASHMIRI = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 's' ),
1664 ISOM_LANGUAGE_CODE_SINDHI = LSMASH_PACK_ISO_LANGUAGE( 's', 'n', 'd' ),
1665 ISOM_LANGUAGE_CODE_TIBETAN = LSMASH_PACK_ISO_LANGUAGE( 'b', 'o', 'd' ),
1666 ISOM_LANGUAGE_CODE_NEPALI = LSMASH_PACK_ISO_LANGUAGE( 'n', 'e', 'p' ),
1667 ISOM_LANGUAGE_CODE_SANSKRIT = LSMASH_PACK_ISO_LANGUAGE( 's', 'a', 'n' ),
1668 ISOM_LANGUAGE_CODE_MARATHI = LSMASH_PACK_ISO_LANGUAGE( 'm', 'a', 'r' ),
1669 ISOM_LANGUAGE_CODE_BENGALI = LSMASH_PACK_ISO_LANGUAGE( 'b', 'e', 'n' ),
1670 ISOM_LANGUAGE_CODE_ASSAMESE = LSMASH_PACK_ISO_LANGUAGE( 'a', 's', 'm' ),
1671 ISOM_LANGUAGE_CODE_GUJARATI = LSMASH_PACK_ISO_LANGUAGE( 'g', 'u', 'j' ),
1672 ISOM_LANGUAGE_CODE_PUNJABI = LSMASH_PACK_ISO_LANGUAGE( 'p', 'a', 'n' ),
1673 ISOM_LANGUAGE_CODE_ORIYA = LSMASH_PACK_ISO_LANGUAGE( 'o', 'r', 'i' ),
1674 ISOM_LANGUAGE_CODE_MALAYALAM = LSMASH_PACK_ISO_LANGUAGE( 'm', 'a', 'l' ),
1675 ISOM_LANGUAGE_CODE_KANNADA = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 'n' ),
1676 ISOM_LANGUAGE_CODE_TAMIL = LSMASH_PACK_ISO_LANGUAGE( 't', 'a', 'm' ),
1677 ISOM_LANGUAGE_CODE_TELUGU = LSMASH_PACK_ISO_LANGUAGE( 't', 'e', 'l' ),
1678 ISOM_LANGUAGE_CODE_SINHALESE = LSMASH_PACK_ISO_LANGUAGE( 's', 'i', 'n' ),
1679 ISOM_LANGUAGE_CODE_BURMESE = LSMASH_PACK_ISO_LANGUAGE( 'm', 'y', 'a' ),
1680 ISOM_LANGUAGE_CODE_KHMER = LSMASH_PACK_ISO_LANGUAGE( 'k', 'h', 'm' ),
1681 ISOM_LANGUAGE_CODE_LAO = LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 'o' ),
1682 ISOM_LANGUAGE_CODE_VIETNAMESE = LSMASH_PACK_ISO_LANGUAGE( 'v', 'i', 'e' ),
1683 ISOM_LANGUAGE_CODE_INDONESIAN = LSMASH_PACK_ISO_LANGUAGE( 'i', 'n', 'd' ),
1684 ISOM_LANGUAGE_CODE_TAGALOG = LSMASH_PACK_ISO_LANGUAGE( 't', 'g', 'l' ),
1685 ISOM_LANGUAGE_CODE_MALAY_ROMAN = LSMASH_PACK_ISO_LANGUAGE( 'm', 's', 'a' ),
1686 ISOM_LANGUAGE_CODE_MAYAY_ARABIC = LSMASH_PACK_ISO_LANGUAGE( 'm', 's', 'a' ),
1687 ISOM_LANGUAGE_CODE_AMHARIC = LSMASH_PACK_ISO_LANGUAGE( 'a', 'm', 'h' ),
1688 ISOM_LANGUAGE_CODE_OROMO = LSMASH_PACK_ISO_LANGUAGE( 'o', 'r', 'm' ),
1689 ISOM_LANGUAGE_CODE_SOMALI = LSMASH_PACK_ISO_LANGUAGE( 's', 'o', 'm' ),
1690 ISOM_LANGUAGE_CODE_SWAHILI = LSMASH_PACK_ISO_LANGUAGE( 's', 'w', 'a' ),
1691 ISOM_LANGUAGE_CODE_KINYARWANDA = LSMASH_PACK_ISO_LANGUAGE( 'k', 'i', 'n' ),
1692 ISOM_LANGUAGE_CODE_RUNDI = LSMASH_PACK_ISO_LANGUAGE( 'r', 'u', 'n' ),
1693 ISOM_LANGUAGE_CODE_CHEWA = LSMASH_PACK_ISO_LANGUAGE( 'n', 'y', 'a' ),
1694 ISOM_LANGUAGE_CODE_MALAGASY = LSMASH_PACK_ISO_LANGUAGE( 'm', 'l', 'g' ),
1695 ISOM_LANGUAGE_CODE_ESPERANTO = LSMASH_PACK_ISO_LANGUAGE( 'e', 'p', 'o' ),
1696 ISOM_LANGUAGE_CODE_WELSH = LSMASH_PACK_ISO_LANGUAGE( 'c', 'y', 'm' ),
1697 ISOM_LANGUAGE_CODE_BASQUE = LSMASH_PACK_ISO_LANGUAGE( 'e', 'u', 's' ),
1698 ISOM_LANGUAGE_CODE_CATALAN = LSMASH_PACK_ISO_LANGUAGE( 'c', 'a', 't' ),
1699 ISOM_LANGUAGE_CODE_LATIN = LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 't' ),
1700 ISOM_LANGUAGE_CODE_QUECHUA = LSMASH_PACK_ISO_LANGUAGE( 'q', 'u', 'e' ),
1701 ISOM_LANGUAGE_CODE_GUARANI = LSMASH_PACK_ISO_LANGUAGE( 'g', 'r', 'n' ),
1702 ISOM_LANGUAGE_CODE_AYMARA = LSMASH_PACK_ISO_LANGUAGE( 'a', 'y', 'm' ),
1703 ISOM_LANGUAGE_CODE_TATAR = LSMASH_PACK_ISO_LANGUAGE( 'c', 'r', 'h' ),
1704 ISOM_LANGUAGE_CODE_UIGHUR = LSMASH_PACK_ISO_LANGUAGE( 'u', 'i', 'g' ),
1705 ISOM_LANGUAGE_CODE_DZONGKHA = LSMASH_PACK_ISO_LANGUAGE( 'd', 'z', 'o' ),
1706 ISOM_LANGUAGE_CODE_JAVANESE = LSMASH_PACK_ISO_LANGUAGE( 'j', 'a', 'v' ),
1707 ISOM_LANGUAGE_CODE_UNDEFINED = LSMASH_PACK_ISO_LANGUAGE( 'u', 'n', 'd' ),
1708 } lsmash_iso_language_code;
1710 typedef struct
1712 lsmash_media_type handler_type; /* the nature of the media
1713 * You can't change handler_type through this parameter manually. */
1714 uint32_t timescale; /* media timescale: timescale for this media */
1715 uint64_t duration; /* the duration of this media, expressed in the media timescale
1716 * You can't set this parameter manually. */
1717 uint8_t roll_grouping; /* roll recovery grouping present
1718 * Require 'avc1' brand, or ISO Base Media File Format version 2 or later. */
1719 uint8_t rap_grouping; /* random access point grouping present
1720 * Require ISO Base Media File Format version 6 or later. */
1721 /* Use either type of language code. */
1722 uint16_t MAC_language; /* Macintosh language code for this media */
1723 uint16_t ISO_language; /* ISO 639-2/T language code for this media */
1724 /* human-readable name for the track type (for debugging and inspection purposes) */
1725 char *media_handler_name;
1726 char *data_handler_name;
1727 /* Any user shouldn't use the following parameters. */
1728 PRIVATE char media_handler_name_shadow[256];
1729 PRIVATE char data_handler_name_shadow[256];
1730 } lsmash_media_parameters_t;
1732 typedef struct
1734 uint32_t index; /* the index of a data reference */
1735 char *location; /* URL; location of referenced media file */
1736 /* Probably, additional string fields such as thing to indicate URN will be added in the future. */
1737 } lsmash_data_reference_t;
1739 /* Set all the given media parameters to default. */
1740 void lsmash_initialize_media_parameters
1742 lsmash_media_parameters_t *param /* the address of the media parameters to which you want to set default value */
1745 /* Set media parameters to a track.
1747 * Return 0 if successful.
1748 * Return a negative value otherwise. */
1749 int lsmash_set_media_parameters
1751 lsmash_root_t *root, /* the address of a ROOT containing a track to which you want to set the media parameters */
1752 uint32_t track_ID, /* the track_ID of a track to which you want to set the media parameters */
1753 lsmash_media_parameters_t *param /* the address of the media parameters you want to set to a track. */
1756 /* Set the duration of the last sample to a track.
1758 * Return 0 if successful.
1759 * Return a negative value otherwise. */
1760 int lsmash_set_last_sample_delta
1762 lsmash_root_t *root,
1763 uint32_t track_ID,
1764 uint32_t sample_delta
1767 /* Flush samples in the internal pool in a track.
1768 * Users shall call this function for each track before calling lsmash_finish_movie() or lsmash_create_fragment_movie().
1770 * Return 0 if successful.
1771 * Return a negative value otherwise. */
1772 int lsmash_flush_pooled_samples
1774 lsmash_root_t *root,
1775 uint32_t track_ID,
1776 uint32_t last_sample_delta
1779 /* Update the modification time of a media to the most recent.
1780 * If the creation time of that media is larger than the modification time,
1781 * then override the creation one with the modification one.
1783 * Return 0 if successful.
1784 * Return a negative value otherwise. */
1785 int lsmash_update_media_modification_time
1787 lsmash_root_t *root,
1788 uint32_t track_ID
1791 /* Get the media parameters in a track.
1793 * Return 0 if successful.
1794 * Return a negative value otherwise. */
1795 int lsmash_get_media_parameters
1797 lsmash_root_t *root,
1798 uint32_t track_ID,
1799 lsmash_media_parameters_t *param
1802 /* Get the duration of a media.
1804 * Return the duration of a media if successful.
1805 * Return 0 otherwise. */
1806 uint64_t lsmash_get_media_duration
1808 lsmash_root_t *root,
1809 uint32_t track_ID
1812 /* Get the timescale of a media.
1814 * Return the timescale of a media if successful.
1815 * Return 0 otherwise. */
1816 uint32_t lsmash_get_media_timescale
1818 lsmash_root_t *root,
1819 uint32_t track_ID
1822 /* Get the duration of the last sample in a track.
1824 * Return the duration of the last sample in a track if successful.
1825 * Return 0 otherwise. */
1826 uint32_t lsmash_get_last_sample_delta
1828 lsmash_root_t *root,
1829 uint32_t track_ID
1832 /* Get the composition time offset of the first sample in a track.
1834 * Return the composition time offset of the first sample in a track if successful.
1835 * Return 0 otherwise. */
1836 uint32_t lsmash_get_start_time_offset
1838 lsmash_root_t *root,
1839 uint32_t track_ID
1842 /* Get the shift of composition timeline to decode timeline in a track.
1844 * Return the shift of composition timeline to decode timeline in a track. if successful.
1845 * Return 0 otherwise. */
1846 uint32_t lsmash_get_composition_to_decode_shift
1848 lsmash_root_t *root,
1849 uint32_t track_ID
1852 /* Pack a string of ISO 639-2/T language code into 16-bit data.
1854 * Return a packed 16-bit ISO 639-2/T language if successful.
1855 * Return 0 otherwise. */
1856 uint16_t lsmash_pack_iso_language
1858 char *iso_language /* a string of ISO 639-2/T language code */
1861 /* Count the number of data references in a track.
1863 * Return the number of data references in a track if no error.
1864 * Return 0 otherwise. */
1865 uint32_t lsmash_count_data_reference
1867 lsmash_root_t *root,
1868 uint32_t track_ID
1871 /* Get the location of a data reference in a track by specifying the index in 'data_ref'.
1872 * The string fields in 'data_ref' may be allocated if referencing external media data.
1873 * If referencing self-contained media data, the all string fields are set to NULL.
1874 * You can deallocate the allocated fields by lsmash_free().
1875 * Also you can deallocate all of the allocated fields by lsmash_cleanup_data_reference() at a time.
1877 * Return 0 if successful.
1878 * Return a negative value otherwise. */
1879 int lsmash_get_data_reference
1881 lsmash_root_t *root,
1882 uint32_t track_ID,
1883 lsmash_data_reference_t *data_ref
1886 /* Deallocate all of allocated fields in a given data reference at a time.
1887 * The deallocated fields are set to NULL. */
1888 void lsmash_cleanup_data_reference
1890 lsmash_data_reference_t *data_ref
1893 /* Create a data reference in a track and specify its location on playback for writing.
1894 * If no settings for data references in a track, the location of the first data reference is specified to
1895 * the location of the same file implicitly.
1896 * Note that referenced files shall be used as a media, i.e. LSMASH_FILE_MODE_MEDIA shall be set to the 'mode'
1897 * in the lsmash_file_parameters_t before calling lsmash_set_file().
1899 * As restrictions of the libary,
1900 * WARNING1: The box structured media files cannot be used as a reference data yet.
1901 * WARNING2: The external media files cannot be used as a reference data for movie fragments yet.
1903 * Return 0 if successful.
1904 * Return a negative value otherwise. */
1905 int lsmash_create_data_reference
1907 lsmash_root_t *root,
1908 uint32_t track_ID,
1909 lsmash_data_reference_t *data_ref,
1910 lsmash_file_t *file
1913 /* Assign a data reference in a track to a read file.
1915 * Return 0 if successful.
1916 * Return a negative value otherwise. */
1917 int lsmash_assign_data_reference
1919 lsmash_root_t *root,
1920 uint32_t track_ID,
1921 uint32_t data_ref_index,
1922 lsmash_file_t *file
1925 /****************************************************************************
1926 * Track Layer
1927 ****************************************************************************/
1928 /* Track mode */
1929 typedef enum
1931 /* In MP4 and/or ISO base media file format, if in a presentation all tracks have neither track_in_movie nor track_in_preview set,
1932 * then all tracks shall be treated as if both flags were set on all tracks. */
1933 ISOM_TRACK_ENABLED = 0x000001, /* Track_enabled: Indicates that the track is enabled.
1934 * A disabled track is treated as if it were not present. */
1935 ISOM_TRACK_IN_MOVIE = 0x000002, /* Track_in_movie: Indicates that the track is used in the presentation. */
1936 ISOM_TRACK_IN_PREVIEW = 0x000004, /* Track_in_preview: Indicates that the track is used when previewing the presentation. */
1938 QT_TRACK_IN_POSTER = 0x000008, /* Track_in_poster: Indicates that the track is used in the movie's poster. (only defined in QuickTime file format) */
1939 } lsmash_track_mode;
1941 typedef struct
1943 lsmash_track_mode mode;
1944 uint32_t track_ID; /* an integer that uniquely identifies the track
1945 * Don't set to value already used except for zero value.
1946 * Zero value don't override established track_ID. */
1947 uint64_t duration; /* the duration of this track expressed in the movie timescale units
1948 * If there is any edit, your setting is ignored. */
1949 int16_t alternate_group; /* an integer that specifies a group or collection of tracks
1950 * If this field is not 0, it should be the same for tracks that contain alternate data for one another
1951 * and different for tracks belonging to different such groups.
1952 * Only one track within an alternate group should be played or streamed at any one time.
1953 * Note: alternate_group is ignored when a file is read as an MPEG-4. */
1954 /* The following parameters are ignored when a file is read as an MPEG-4 or 3GPP file format. */
1955 int16_t video_layer; /* the front-to-back ordering of video tracks; tracks with lower numbers are closer to the viewer. */
1956 int16_t audio_volume; /* fixed point 8.8 number. 0x0100 is full volume. */
1957 int32_t matrix[9]; /* transformation matrix for the video
1958 * Each value represents, in order, a, b, u, c, d, v, x, y and w.
1959 * All the values in a matrix are stored as 16.16 fixed-point values,
1960 * except for u, v and w, which are stored as 2.30 fixed-point values.
1961 * Not all derived specifications use matrices.
1962 * If a matrix is used, the point (p, q) is transformed into (p', q') using the matrix as follows:
1963 * | a b u |
1964 * (p, q, 1) * | c d v | = z * (p', q', 1)
1965 * | x y w |
1966 * p' = (a * p + c * q + x) / z; q' = (b * p + d * q + y) / z; z = u * p + v * q + w
1967 * Note: transformation matrix is applied after scaling to display size up to display_width and display_height. */
1968 /* visual presentation region size */
1969 uint32_t display_width; /* visual presentation region size of horizontal direction as fixed point 16.16 number. */
1970 uint32_t display_height; /* visual presentation region size of vertical direction as fixed point 16.16 number. */
1971 /* */
1972 uint8_t aperture_modes; /* track aperture modes present
1973 * This feature is only available under QuickTime file format.
1974 * Automatically disabled if multiple sample description is present or scaling method is specified. */
1975 } lsmash_track_parameters_t;
1977 /* Explicit Timeline Map (Edit)
1978 * There are two types of timeline; one is the media timeline, the other is the presentation timeline (or the movie timeline).
1979 * An edit maps the presentation timeline to the media timeline.
1980 * Therefore, an edit can select any portion within the media and specify its playback speed.
1981 * The media within the track is played through the presentation timeline, so you can construct any complex presentation from a media by edits.
1982 * In the absence of any edit, there is an implicit one-to-one mapping of these timelines, and the presentation of a track starts at the beginning of the presentation.
1983 * Note: any edit doesn't restrict decoding and composition. So, if a sample in an edit need to decode from a sample in outside of that edit,
1984 * the decoder shall start to decode from there but player shall not display any sample in outside of that edit. */
1985 #define ISOM_EDIT_MODE_NORMAL (1<<16)
1986 #define ISOM_EDIT_MODE_DWELL 0
1987 #define ISOM_EDIT_MODE_EMPTY -1
1988 #define ISOM_EDIT_DURATION_UNKNOWN32 0xffffffff
1989 #define ISOM_EDIT_DURATION_UNKNOWN64 0xffffffffffffffff
1990 #define ISOM_EDIT_DURATION_IMPLICIT 0
1992 typedef struct
1994 uint64_t duration; /* the duration of this edit expressed in the movie timescale units
1995 * An edit can refer to the media within fragmented tracks.
1996 * The duration can be unknown at the time of creation of the initial movie due to various limiting factors that include
1997 * real-time generation of content, such as live streaming. In such a case it is recommended that the duration is set to
1998 * either ISOM_EDIT_DURATION_UNKNOWN32 (the maximum 32-bit unsigned integer), ISOM_EDIT_DURATION_UNKNOWN64 (the maximum
1999 * 64-bit unsigned integer) or ISOM_EDIT_DURATION_IMPLICIT.
2000 * If you have no interest in the duration of this edit but want to set the offset from media composition time to movie
2001 * presentation time, ISOM_EDIT_DURATION_IMPLICIT is useful for the provision of the offset for the movie and subsequent
2002 * movie fragments. The duration is expected to be constructed by demuxer. */
2003 int64_t start_time; /* the starting composition time within the media of this edit
2004 * If set to ISOM_EDIT_MODE_EMPTY (-1), it construct an empty edit, which doesn't select any portion within the media. */
2005 int32_t rate; /* the relative rate at which to play the media corresponding to this edit, expressed as 16.16 fixed-point number
2006 * If set to ISOM_EDIT_MODE_NORMAL (0x00010000), there is no rate change for timeline mapping.
2007 * If set to ISOM_EDIT_MODE_DWELL (0), the media at start_time is presented for the duration. */
2008 } lsmash_edit_t;
2010 /* Create a track in a movie.
2011 * Users can destroy the created track by lsmash_delete_track().
2012 * When a track is created, its track_ID is assigned automatically so that any duplication of track_ID may be avoided.
2014 * Return the current track_ID of a track created by this function if successful.
2015 * Return 0 otherwise. */
2016 uint32_t lsmash_create_track
2018 lsmash_root_t *root,
2019 lsmash_media_type media_type
2022 /* Destroy the track of a given track_ID in a movie. */
2023 void lsmash_delete_track
2025 lsmash_root_t *root,
2026 uint32_t track_ID
2029 /* Set all the given track parameters to default. */
2030 void lsmash_initialize_track_parameters
2032 lsmash_track_parameters_t *param
2035 /* Set track parameters to a track.
2037 * Return 0 if successful.
2038 * Return a negative value otherwise. */
2039 int lsmash_set_track_parameters
2041 lsmash_root_t *root,
2042 uint32_t track_ID,
2043 lsmash_track_parameters_t *param
2046 /* Update the duration of a track with a new duration of its last sample.
2048 * Return 0 if successful.
2049 * Return a negative value otherwise. */
2050 int lsmash_update_track_duration
2052 lsmash_root_t *root,
2053 uint32_t track_ID,
2054 uint32_t last_sample_delta
2057 /* Update the modification time of a track to the most recent.
2058 * If the creation time of that track is larger than the modification time,
2059 * then override the creation one with the modification one.
2061 * Return 0 if successful.
2062 * Return a negative value otherwise. */
2063 int lsmash_update_track_modification_time
2065 lsmash_root_t *root,
2066 uint32_t track_ID
2069 /* Get a track_ID by a track number.
2070 * A track number is given in created order in a movie.
2071 * If a track is removed, the track number of tracks with higher track number than one of just removed track will be decremented.
2073 * Return a track_ID if successful.
2074 * Return 0 otherwise. */
2075 uint32_t lsmash_get_track_ID
2077 lsmash_root_t *root,
2078 uint32_t track_number
2081 /* Get the track parameters in a track.
2083 * Return 0 if successful.
2084 * Return a negative value otherwise. */
2085 int lsmash_get_track_parameters
2087 lsmash_root_t *root,
2088 uint32_t track_ID,
2089 lsmash_track_parameters_t *param
2092 /* Get the duration of a track.
2094 * Return the duration of a track if successful.
2095 * Return 0 otherwise. */
2096 uint64_t lsmash_get_track_duration
2098 lsmash_root_t *root,
2099 uint32_t track_ID
2102 /* Create an explicit timeline map (edit) and append it into a track.
2103 * Users can destroy ALL created edits in a track by lsmash_delete_explicit_timeline_map().
2105 * Return 0 if successful.
2106 * Return a negative value otherwise. */
2107 int lsmash_create_explicit_timeline_map
2109 lsmash_root_t *root,
2110 uint32_t track_ID,
2111 lsmash_edit_t edit
2114 /* Destroy ALL created edits in a track.
2116 * Return 0 if successful.
2117 * Return a negative value otherwise. */
2118 int lsmash_delete_explicit_timeline_map
2120 lsmash_root_t *root,
2121 uint32_t track_ID
2124 /* Count the number of edits in a track.
2126 * Return the number of edits in a track if successful.
2127 * Return 0 otherwise. */
2128 uint32_t lsmash_count_explicit_timeline_map
2130 lsmash_root_t *root,
2131 uint32_t track_ID
2134 /* Get an edit in a track by an edit number.
2135 * An edit number is given in created order in a track.
2136 * If an edit is removed, the edit number of edits with higher edit number than one of just removed edit will be decremented.
2138 * Return 0 if successful.
2139 * Return a negative value otherwise. */
2140 int lsmash_get_explicit_timeline_map
2142 lsmash_root_t *root,
2143 uint32_t track_ID,
2144 uint32_t edit_number,
2145 lsmash_edit_t *edit
2148 /* Modify an edit in a track by an edit number.
2149 * An edit number is given in created order in a track.
2150 * If an edit is removed, the edit number of edits with higher edit number than one of just removed edit will be decremented.
2152 * Return 0 if successful.
2153 * Return a negative value otherwise. */
2154 int lsmash_modify_explicit_timeline_map
2156 lsmash_root_t *root,
2157 uint32_t track_ID,
2158 uint32_t edit_number,
2159 lsmash_edit_t edit
2162 /****************************************************************************
2163 * Movie Layer
2164 ****************************************************************************/
2165 typedef struct
2167 uint32_t timescale; /* movie timescale: timescale for the entire presentation */
2168 uint64_t duration; /* the duration, expressed in movie timescale, of the longest track
2169 * You can't set this parameter manually. */
2170 uint32_t number_of_tracks; /* the number of tracks in the movie
2171 * You can't set this parameter manually. */
2172 /* The following parameters are recognized only when a file is read as an Apple MPEG-4 or QuickTime file format. */
2173 int32_t playback_rate; /* fixed point 16.16 number. 0x00010000 is normal forward playback and default value. */
2174 int32_t playback_volume; /* fixed point 8.8 number. 0x0100 is full volume and default value. */
2175 int32_t preview_time; /* the time value in the movie at which the preview begins */
2176 int32_t preview_duration; /* the duration of the movie preview in movie timescale units */
2177 int32_t poster_time; /* the time value of the time of the movie poster */
2178 } lsmash_movie_parameters_t;
2180 /* Set all the given movie parameters to default. */
2181 void lsmash_initialize_movie_parameters
2183 lsmash_movie_parameters_t *param
2186 /* Set movie parameters to a movie.
2188 * Return 0 if successful.
2189 * Return a negative value otherwise. */
2190 int lsmash_set_movie_parameters
2192 lsmash_root_t *root,
2193 lsmash_movie_parameters_t *param
2196 /* Finalize a movie.
2197 * If the movie is not fragmented and 'remux' is set to non-NULL,
2198 * move overall necessary data to access and decode samples into the very front of the file at the end.
2199 * This is useful for progressive downloading.
2200 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function.
2202 * Return 0 if successful.
2203 * Return a negative value otherwise. */
2204 int lsmash_finish_movie
2206 lsmash_root_t *root,
2207 lsmash_adhoc_remux_t *remux
2210 /* Update the modification time of a movie to the most recent.
2211 * If the creation time of that movie is larger than the modification time,
2212 * then override the creation one with the modification one.
2214 * Return 0 if successful.
2215 * Return a negative value otherwise. */
2216 int lsmash_update_movie_modification_time
2218 lsmash_root_t *root
2221 /* Get the movie parameters in a movie.
2223 * Return 0 if successful.
2224 * Return a negative value otherwise. */
2225 int lsmash_get_movie_parameters
2227 lsmash_root_t *root,
2228 lsmash_movie_parameters_t *param
2231 /* Get the timescale of a movie.
2233 * Return the timescale of a movie if successful.
2234 * Return 0 otherwise. */
2235 uint32_t lsmash_get_movie_timescale
2237 lsmash_root_t *root
2240 /****************************************************************************
2241 * Chapter list
2242 ****************************************************************************/
2243 /* Create a track as a chapter list referenced by another track.
2245 * Return 0 if successful.
2246 * Return a negative value otherwise. */
2247 int lsmash_create_reference_chapter_track
2249 lsmash_root_t *root,
2250 uint32_t track_ID,
2251 char *file_name
2254 /* Create and set a chapter list as a user data to a movie.
2255 * The created chapter list in a movie can be destroyed by lsmash_delete_tyrant_chapter().
2257 * Return 0 if successful.
2258 * Return a negative value otherwise. */
2259 int lsmash_set_tyrant_chapter
2261 lsmash_root_t *root,
2262 char *file_name,
2263 int add_bom
2266 /* Destroy a chapter list as a user data in a movie. */
2267 void lsmash_delete_tyrant_chapter
2269 lsmash_root_t *root
2272 /* Count chapters in the chapter list (moov.udta.chpl). */
2273 uint32_t lsmash_count_tyrant_chapter
2275 lsmash_root_t *root
2278 /* Retrieve a chapter entry from the chapter list (moov.udta.chpl).
2279 * Returned pointer is owned by the ROOT structure, so user shall not
2280 * modify or free it.
2282 * Return chapter title string if successful, otherwise NULL.
2284 char *lsmash_get_tyrant_chapter
2286 lsmash_root_t *root,
2287 uint32_t index, /* index of chapter ( >= 1) */
2288 double *timestamp /* timestamp of the chapter entry (in seconds) */
2291 /****************************************************************************
2292 * Fragments
2293 ****************************************************************************/
2294 /* Flush the current movie fragment and create a new movie fragment.
2295 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function.
2297 * Return 0 if successful.
2298 * Return a negative value otherwise. */
2299 int lsmash_create_fragment_movie
2301 lsmash_root_t *root
2304 /* Create an empty duration track in the current movie fragment.
2305 * Don't specify track_ID any track fragment in the current movie fragment has.
2307 * Return 0 if successful.
2308 * Return a negative value otherwise. */
2309 int lsmash_create_fragment_empty_duration
2311 lsmash_root_t *root,
2312 uint32_t track_ID,
2313 uint32_t duration
2316 #ifdef LSMASH_DEMUXER_ENABLED
2317 /****************************************************************************
2318 * Dump / Print
2319 ****************************************************************************/
2320 /* Dump and print box structure of ROOT into the destination.
2322 * Return 0 if successful.
2323 * Return a negative value otherwise. */
2324 int lsmash_print_movie
2326 lsmash_root_t *root, /* the address of ROOT you want to dump and print */
2327 const char *filename /* the path of a file as the destination */
2330 /* Print a chapter list written as a user data on stdout.
2331 * This function might output BOM on Windows.
2333 * Return 0 if successful.
2334 * Return a negative value otherwise. */
2335 int lsmash_print_chapter_list
2337 lsmash_root_t *root
2340 /****************************************************************************
2341 * Timeline
2342 ****************************************************************************/
2343 /* Copy all edits from the source track to the destination track.
2345 * Return 0 if successful.
2346 * Return a negative value otherwise. */
2347 int lsmash_copy_timeline_map
2349 lsmash_root_t *dst,
2350 uint32_t dst_track_ID,
2351 lsmash_root_t *src,
2352 uint32_t src_track_ID
2355 /* Construct the timeline for a track.
2356 * The constructed timeline can be destructed by lsmash_destruct_timeline().
2358 * Return 0 if successful.
2359 * Return a negative value otherwise. */
2360 int lsmash_construct_timeline
2362 lsmash_root_t *root,
2363 uint32_t track_ID
2366 /* Destruct the timeline for a given track. */
2367 void lsmash_destruct_timeline
2369 lsmash_root_t *root,
2370 uint32_t track_ID
2373 /* Get the duration of the last sample from the media timeline for a track.
2375 * Return 0 if successful.
2376 * Return a negative value otherwise. */
2377 int lsmash_get_last_sample_delta_from_media_timeline
2379 lsmash_root_t *root,
2380 uint32_t track_ID,
2381 uint32_t *last_sample_delta /* the address of a variable to which the duration of the last sample will be set */
2384 /* Get the duration of a sample from the media timeline for a track.
2386 * Return 0 if successful.
2387 * Return a negative value otherwise. */
2388 int lsmash_get_sample_delta_from_media_timeline
2390 lsmash_root_t *root,
2391 uint32_t track_ID,
2392 uint32_t sample_number,
2393 uint32_t *sample_delta /* the address of a variable to which the duration of a sample will be set */
2396 /* Get the decoding timestamp of a sample from the media timeline for a track.
2398 * Return 0 if successful.
2399 * Return a negative value otherwise. */
2400 int lsmash_get_dts_from_media_timeline
2402 lsmash_root_t *root,
2403 uint32_t track_ID,
2404 uint32_t sample_number,
2405 uint64_t *dts /* the address of a variable to which a decoding timestamp will be set */
2408 /* Get the composition timestamp of a sample from the media timeline for a track.
2410 * Return 0 if successful.
2411 * Return a negative value otherwise. */
2412 int lsmash_get_cts_from_media_timeline
2414 lsmash_root_t *root,
2415 uint32_t track_ID,
2416 uint32_t sample_number,
2417 uint64_t *cts /* the address of a variable to which a composition timestamp will be set */
2420 /* Get the shift of composition timeline to decode timeline from the media timeline for a track.
2422 * Return 0 if successful.
2423 * Return a negative value otherwise. */
2424 int lsmash_get_composition_to_decode_shift_from_media_timeline
2426 lsmash_root_t *root,
2427 uint32_t track_ID,
2428 uint32_t *ctd_shift /* the address of a variable to which the shift of composition timeline to decode timeline will be set */
2431 /* Get the sample number which is the closest random accessible point to the sample
2432 * corresponding to a given sample number from the media timeline for a track.
2433 * This function tries to find the closest random accessible point from the past at the first.
2434 * If not found, try to find it from the future.
2435 * Note:
2436 * the closest random accessible point doesn't always guarantee that
2437 * the sample corresponding to a given number can be decodable correctly by decoding from there.
2439 * Return 0 if successful.
2440 * Return a negative value otherwise. */
2441 int lsmash_get_closest_random_accessible_point_from_media_timeline
2443 lsmash_root_t *root,
2444 uint32_t track_ID,
2445 uint32_t sample_number,
2446 uint32_t *rap_number /* the address of a variable to which the sample number of the closest random accessible point will be set */
2449 /* Get the detailed information of the closest random accessible point to the sample
2450 * corresponding to a given sample number from the media timeline for a track.
2451 * Note:
2452 * the closest random accessible point doesn't always guarantee that
2453 * the sample corresponding to a given number can be decodable correctly by decoding from there.
2455 * Return 0 if successful.
2456 * Return a negative value otherwise. */
2457 int lsmash_get_closest_random_accessible_point_detail_from_media_timeline
2459 lsmash_root_t *root,
2460 uint32_t track_ID,
2461 uint32_t sample_number,
2462 uint32_t *rap_number, /* the address of a variable to which the sample number of the closest random accessible point will be set */
2463 lsmash_random_access_flag *ra_flags, /* the address of a variable to which the flags of the closest random accessible point will be set */
2464 uint32_t *leading, /* the address of a variable to which the number of leading samples will be set */
2465 uint32_t *distance /* the address of a variable to which a distance from the closest random accessible point to a point which guarantees
2466 * that the sample corresponding to a given number can be decodable correctly by decoding from there will be set */
2469 /* Get the number of samples in the media timeline for a track.
2471 * Return the number of samples in a track if successful.
2472 * Return 0 otherwise. */
2473 uint32_t lsmash_get_sample_count_in_media_timeline
2475 lsmash_root_t *root,
2476 uint32_t track_ID
2479 /* Get the maximum size of sample in the media timeline for a track.
2481 * Return the maximum size of the samples in a track if successful.
2482 * Return 0 otherwise. */
2483 uint32_t lsmash_get_max_sample_size_in_media_timeline
2485 lsmash_root_t *root,
2486 uint32_t track_ID
2489 /* Get the duration of the media from the media timeline for a track.
2491 * Return the duration of the media in a track if successful.
2492 * Return 0 otherwise. */
2493 uint64_t lsmash_get_media_duration_from_media_timeline
2495 lsmash_root_t *root,
2496 uint32_t track_ID
2499 /* Allocate and get the sample corresponding to a given sample number from the media timeline for a track.
2500 * The allocated sample can be deallocated by lsmash_delete_sample().
2502 * Return the address of an allocated and gotten sample if successful.
2503 * Return NULL otherwise. */
2504 lsmash_sample_t *lsmash_get_sample_from_media_timeline
2506 lsmash_root_t *root,
2507 uint32_t track_ID,
2508 uint32_t sample_number
2511 /* Get the information of the sample correspondint to a given sample number from the media timeline for a track.
2512 * The information includes the size, timestamps and properties of the sample.
2514 * Return 0 if successful.
2515 * Return a negative value otherwise. */
2516 int lsmash_get_sample_info_from_media_timeline
2518 lsmash_root_t *root,
2519 uint32_t track_ID,
2520 uint32_t sample_number,
2521 lsmash_sample_t *sample
2524 /* Get the properties of the sample correspondint to a given sample number from the media timeline for a track.
2526 * Return 0 if successful.
2527 * Return a negative value otherwise. */
2528 int lsmash_get_sample_property_from_media_timeline
2530 lsmash_root_t *root,
2531 uint32_t track_ID,
2532 uint32_t sample_number,
2533 lsmash_sample_property_t *prop
2536 /* Check if the sample corresponding to a given sample number exists in the media timeline for a track.
2538 * Return 1 if the sample exists.
2539 * Return 0 otherwise. */
2540 int lsmash_check_sample_existence_in_media_timeline
2542 lsmash_root_t *root,
2543 uint32_t track_ID,
2544 uint32_t sample_number
2547 /* Set or change the decoding and composition timestamps in the media timeline for a track.
2548 * This function doesn't support for any LPCM track currently.
2550 * Return 0 if successful.
2551 * Return a negative value othewise. */
2552 int lsmash_set_media_timestamps
2554 lsmash_root_t *root,
2555 uint32_t track_ID,
2556 lsmash_media_ts_list_t *ts_list
2559 /* Allocate and get the decoding and composition timestamps from the media timeline for a track.
2560 * The allocated decoding and composition timestamps can be deallocated by lsmash_delete_media_timestamps().
2562 * Return 0 if successful.
2563 * Return a negative value othewise. */
2564 int lsmash_get_media_timestamps
2566 lsmash_root_t *root,
2567 uint32_t track_ID,
2568 lsmash_media_ts_list_t *ts_list
2571 /* Deallocate the decoding and composition timestamps in a given media timestamp list. */
2572 void lsmash_delete_media_timestamps
2574 lsmash_media_ts_list_t *ts_list
2577 /* Get the maximum composition delay derived from composition reordering.
2579 * Return 0 if successful.
2580 * Return a negative value otherwise. */
2581 int lsmash_get_max_sample_delay
2583 lsmash_media_ts_list_t *ts_list,
2584 uint32_t *max_sample_delay
2587 /* Sort decoding and composition timestamps in decoding order. */
2588 void lsmash_sort_timestamps_decoding_order
2590 lsmash_media_ts_list_t *ts_list
2593 /* Sort decoding and composition timestamps in composition order. */
2594 void lsmash_sort_timestamps_composition_order
2596 lsmash_media_ts_list_t *ts_list
2598 #endif
2600 /****************************************************************************
2601 * Tools for creating CODEC Specific Information Extensions (Magic Cookies)
2602 ****************************************************************************/
2603 /* MPEG-4 Systems Specific Information
2604 * Mandatory :
2605 * ISOM_CODEC_TYPE_MP4A_AUDIO
2606 * QT_CODEC_TYPE_MP4A_AUDIO
2607 * ISOM_CODEC_TYPE_MP4V_AUDIO
2608 * ISOM_CODEC_TYPE_MP4S_AUDIO */
2609 /* objectTypeIndication */
2610 typedef enum
2612 MP4SYS_OBJECT_TYPE_Forbidden = 0x00, /* Forbidden */
2613 MP4SYS_OBJECT_TYPE_Systems_ISO_14496_1 = 0x01, /* Systems ISO/IEC 14496-1
2614 * For all 14496-1 streams unless specifically indicated to the contrary.
2615 * Scene Description scenes, which are identified with StreamType=0x03, using
2616 * this object type value shall use the BIFSConfig. */
2617 MP4SYS_OBJECT_TYPE_Systems_ISO_14496_1_BIFSv2 = 0x02, /* Systems ISO/IEC 14496-1
2618 * This object type shall be used, with StreamType=0x03, for Scene
2619 * Description streams that use the BIFSv2Config.
2620 * Its use with other StreamTypes is reserved. */
2621 MP4SYS_OBJECT_TYPE_Interaction_Stream = 0x03, /* Interaction Stream */
2622 MP4SYS_OBJECT_TYPE_Extended_BIFS = 0x04, /* Extended BIFS
2623 * Used, with StreamType=0x03, for Scene Description streams that use the BIFSConfigEx;
2624 * its use with other StreamTypes is reserved.
2625 * (Was previously reserved for MUCommandStream but not used for that purpose.) */
2626 MP4SYS_OBJECT_TYPE_AFX_Stream = 0x05, /* AFX Stream
2627 * Used, with StreamType=0x03, for Scene Description streams that use the AFXConfig;
2628 * its use with other StreamTypes is reserved. */
2629 MP4SYS_OBJECT_TYPE_Font_Data_Stream = 0x06, /* Font Data Stream */
2630 MP4SYS_OBJECT_TYPE_Synthetised_Texture = 0x07, /* Synthetised Texture */
2631 MP4SYS_OBJECT_TYPE_Text_Stream = 0x08, /* Text Stream */
2632 MP4SYS_OBJECT_TYPE_Visual_ISO_14496_2 = 0x20, /* Visual ISO/IEC 14496-2
2633 * The actual object types are within the DecoderSpecificInfo and defined in 14496-2. */
2634 MP4SYS_OBJECT_TYPE_Visual_H264_ISO_14496_10 = 0x21, /* Visual ITU-T Recommendation H.264 | ISO/IEC 14496-10
2635 * The actual object types are within the DecoderSpecificInfo and defined in H.264 | 14496-10. */
2636 MP4SYS_OBJECT_TYPE_Parameter_Sets_H_264_ISO_14496_10 = 0x22, /* Parameter Sets for ITU-T Recommendation H.264 | ISO/IEC 14496-10
2637 * The actual object types are within the DecoderSpecificInfo and defined in H.264 | 14496-10. */
2638 MP4SYS_OBJECT_TYPE_Audio_ISO_14496_3 = 0x40, /* Audio ISO/IEC 14496-3 (MPEG-4 Audio)
2639 * The actual object types are defined in 14496-3 and are in the DecoderSpecificInfo as specified in 14496-3. */
2640 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Simple_Profile = 0x60, /* Visual ISO/IEC 13818-2 Simple Profile (MPEG-2 Video) */
2641 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Main_Profile = 0x61, /* Visual ISO/IEC 13818-2 Main Profile */
2642 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_SNR_Profile = 0x62, /* Visual ISO/IEC 13818-2 SNR Profile */
2643 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Spatial_Profile = 0x63, /* Visual ISO/IEC 13818-2 Spatial Profile */
2644 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_High_Profile = 0x64, /* Visual ISO/IEC 13818-2 High Profile */
2645 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_422_Profile = 0x65, /* Visual ISO/IEC 13818-2 422 Profile */
2646 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_Main_Profile = 0x66, /* Audio ISO/IEC 13818-7 Main Profile (MPEG-2 Audio)(AAC) */
2647 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_LC_Profile = 0x67, /* Audio ISO/IEC 13818-7 LowComplexity Profile */
2648 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_SSR_Profile = 0x68, /* Audio ISO/IEC 13818-7 Scaleable Sampling Rate Profile
2649 * For streams kinda 13818-7 the decoder specific information consists of the ADIF header if present
2650 * (or none if not present) and an access unit is a "raw_data_block()" as defined in 13818-7. */
2651 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_3 = 0x69, /* Audio ISO/IEC 13818-3 (MPEG-2 BC-Audio)(redefined MPEG-1 Audio in MPEG-2)
2652 * For streams kinda 13818-3 the decoder specific information is empty since all necessary data is in the bitstream frames itself.
2653 * The access units in this case are the "frame()" bitstream element as is defined in 11172-3. */
2654 MP4SYS_OBJECT_TYPE_Visual_ISO_11172_2 = 0x6A, /* Visual ISO/IEC 11172-2 (MPEG-1 Video) */
2655 MP4SYS_OBJECT_TYPE_Audio_ISO_11172_3 = 0x6B, /* Audio ISO/IEC 11172-3 (MPEG-1 Audio) */
2656 MP4SYS_OBJECT_TYPE_Visual_ISO_10918_1 = 0x6C, /* Visual ISO/IEC 10918-1 (JPEG) */
2657 MP4SYS_OBJECT_TYPE_PNG = 0x6D, /* Portable Network Graphics */
2658 MP4SYS_OBJECT_TYPE_Visual_ISO_15444_1_JPEG2000 = 0x6E, /* Visual ISO/IEC 15444-1 (JPEG 2000) */
2660 /* FIXME: rename these symbols to be explaining, rather than based on four cc */
2661 MP4SYS_OBJECT_TYPE_EVRC_AUDIO = 0xA0, /* EVRC Voice */
2662 MP4SYS_OBJECT_TYPE_SSMV_AUDIO = 0xA1, /* SMV Voice */
2663 MP4SYS_OBJECT_TYPE_3GPP2_CMF = 0xA2, /* 3GPP2 Compact Multimedia Format (CMF) */
2664 MP4SYS_OBJECT_TYPE_VC_1_VIDEO = 0xA3, /* SMPTE VC-1 Video */
2665 MP4SYS_OBJECT_TYPE_DRAC_VIDEO = 0xA4, /* Dirac Video Coder */
2666 MP4SYS_OBJECT_TYPE_AC_3_AUDIO = 0xA5, /* AC-3 Audio */
2667 MP4SYS_OBJECT_TYPE_EC_3_AUDIO = 0xA6, /* Enhanced AC-3 audio */
2668 MP4SYS_OBJECT_TYPE_DRA1_AUDIO = 0xA7, /* DRA Audio */
2669 MP4SYS_OBJECT_TYPE_G719_AUDIO = 0xA8, /* ITU G.719 Audio */
2670 MP4SYS_OBJECT_TYPE_DTSC_AUDIO = 0xA9, /* DTS Coherent Acoustics audio */
2671 MP4SYS_OBJECT_TYPE_DTSH_AUDIO = 0xAA, /* DTS-HD High Resolution Audio */
2672 MP4SYS_OBJECT_TYPE_DTSL_AUDIO = 0xAB, /* DTS-HD Master Audio */
2673 MP4SYS_OBJECT_TYPE_DTSE_AUDIO = 0xAC, /* DTS Express low bit rate audio, also known as DTS LBR */
2674 MP4SYS_OBJECT_TYPE_SQCP_AUDIO = 0xE1, /* 13K Voice */
2676 MP4SYS_OBJECT_TYPE_NONE = 0xFF, /* no object type specified
2677 * Streams with this value with a StreamType indicating a systems stream (values 1,2,3,6,7,8,9)
2678 * shall be treated as if the ObjectTypeIndication had been set to 0x01. */
2679 } lsmash_mp4sys_object_type_indication;
2681 /* streamType */
2682 typedef enum
2684 MP4SYS_STREAM_TYPE_Forbidden = 0x00, /* Forbidden */
2685 MP4SYS_STREAM_TYPE_ObjectDescriptorStream = 0x01, /* ObjectDescriptorStream */
2686 MP4SYS_STREAM_TYPE_ClockReferenceStream = 0x02, /* ClockReferenceStream */
2687 MP4SYS_STREAM_TYPE_SceneDescriptionStream = 0x03, /* SceneDescriptionStream */
2688 MP4SYS_STREAM_TYPE_VisualStream = 0x04, /* VisualStream */
2689 MP4SYS_STREAM_TYPE_AudioStream = 0x05, /* AudioStream */
2690 MP4SYS_STREAM_TYPE_MPEG7Stream = 0x06, /* MPEG7Stream */
2691 MP4SYS_STREAM_TYPE_IPMPStream = 0x07, /* IPMPStream */
2692 MP4SYS_STREAM_TYPE_ObjectContentInfoStream = 0x08, /* ObjectContentInfoStream */
2693 MP4SYS_STREAM_TYPE_MPEGJStream = 0x09, /* MPEGJStream */
2694 MP4SYS_STREAM_TYPE_InteractionStream = 0x0A, /* Interaction Stream */
2695 MP4SYS_STREAM_TYPE_IPMPToolStream = 0x0B, /* IPMPToolStream */
2696 MP4SYS_STREAM_TYPE_FontDataStream = 0x0C, /* FontDataStream */
2697 MP4SYS_STREAM_TYPE_StreamingText = 0x0D, /* StreamingText */
2698 } lsmash_mp4sys_stream_type;
2700 /* MPEG-4 Systems Decoder Specific Information
2701 * an opaque container with information for a specific media decoder
2702 * The existence and semantics of decoder specific information depends on the values of streamType and objectTypeIndication. */
2703 typedef struct lsmash_mp4sys_decoder_specific_info_tag lsmash_mp4sys_decoder_specific_info_t;
2705 /* Note: bufferSizeDB, maxBitrate and avgBitrate are calculated internally when calling lsmash_finish_movie().
2706 * You need not to set up them manually when muxing streams by L-SMASH. */
2707 typedef struct
2709 lsmash_mp4sys_object_type_indication objectTypeIndication;
2710 lsmash_mp4sys_stream_type streamType;
2711 uint32_t bufferSizeDB; /* the size of the decoding buffer for this elementary stream in byte */
2712 uint32_t maxBitrate; /* the maximum bitrate in bits per second of the elementary stream in
2713 * any time window of one second duration */
2714 uint32_t avgBitrate; /* the average bitrate in bits per second of the elementary stream
2715 * Set to 0 if the stream is encoded as variable bitrate. */
2716 lsmash_mp4sys_decoder_specific_info_t *dsi; /* zero or one decoder specific information */
2717 } lsmash_mp4sys_decoder_parameters_t;
2719 int lsmash_set_mp4sys_decoder_specific_info
2721 lsmash_mp4sys_decoder_parameters_t *param,
2722 uint8_t *payload,
2723 uint32_t payload_length
2726 void lsmash_destroy_mp4sys_decoder_specific_info
2728 lsmash_mp4sys_decoder_parameters_t *param
2731 uint8_t *lsmash_create_mp4sys_decoder_config
2733 lsmash_mp4sys_decoder_parameters_t *param,
2734 uint32_t *data_length
2737 /* Return MP4SYS_OBJECT_TYPE_Forbidden if objectTypeIndication is not found or there is an error to find it. */
2738 lsmash_mp4sys_object_type_indication lsmash_mp4sys_get_object_type_indication
2740 lsmash_summary_t *summary
2743 /* Return -1 if any error.
2744 * Even if the decoder specific information is not found, it is not an error since no decoder specific information is allowed for some stream formats. */
2745 int lsmash_get_mp4sys_decoder_specific_info
2747 lsmash_mp4sys_decoder_parameters_t *param,
2748 uint8_t **payload,
2749 uint32_t *payload_length
2752 /* AC-3 Specific Information
2753 * Mandatory :
2754 * ISOM_CODEC_TYPE_AC_3_AUDIO
2756 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization.
2757 * Each AC-3 sample is self-contained.
2758 * Users shall set the actual sample rate to 'frequency', which is a member of lsmash_audio_summary_t. */
2759 typedef struct
2761 uint8_t fscod; /* the same value as the fscod field in the AC-3 bitstream */
2762 uint8_t bsid; /* the same value as the bsid field in the AC-3 bitstream */
2763 uint8_t bsmod; /* the same value as the bsmod field in the AC-3 bitstream */
2764 uint8_t acmod; /* the same value as the acmod field in the AC-3 bitstream */
2765 uint8_t lfeon; /* the same value as the lfeon field in the AC-3 bitstream */
2766 uint8_t frmsizecod; /* the same value as the frmsizecod field in the AC-3 bitstream */
2767 } lsmash_ac3_specific_parameters_t;
2769 int lsmash_setup_ac3_specific_parameters_from_syncframe
2771 lsmash_ac3_specific_parameters_t *param,
2772 uint8_t *data,
2773 uint32_t data_length
2776 uint8_t *lsmash_create_ac3_specific_info
2778 lsmash_ac3_specific_parameters_t *param,
2779 uint32_t *data_length
2782 /* Enhanced AC-3 Specific Information
2783 * Mandatory :
2784 * ISOM_CODEC_TYPE_EC_3_AUDIO
2786 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization.
2787 * Each Enhanced AC-3 sample is self-contained.
2788 * Note that this cannot document reduced sample rates (24000, 22050 or 16000 Hz).
2789 * Therefore, users shall set the actual sample rate to 'frequency', which is a member of lsmash_audio_summary_t. */
2790 typedef struct
2792 uint8_t fscod; /* the same value as the fscod field in the independent substream */
2793 uint8_t bsid; /* the same value as the bsid field in the independent substream */
2794 uint8_t bsmod; /* the same value as the bsmod field in the independent substream
2795 * If the bsmod field is not present in the independent substream, this field shall be set to 0. */
2796 uint8_t acmod; /* the same value as the acmod field in the independent substream */
2797 uint8_t lfeon; /* the same value as the lfeon field in the independent substream */
2798 uint8_t num_dep_sub; /* the number of dependent substreams that are associated with the independent substream */
2799 uint16_t chan_loc; /* channel locations of dependent substreams associated with the independent substream
2800 * This information is extracted from the chanmap field of each dependent substream. */
2801 } lsmash_eac3_substream_info_t;
2803 typedef struct
2805 uint16_t data_rate; /* the data rate of the Enhanced AC-3 bitstream in kbit/s
2806 * If the Enhanced AC-3 stream is variable bitrate, then this value indicates the maximum data rate of the stream. */
2807 uint8_t num_ind_sub; /* the number of independent substreams that are present in the Enhanced AC-3 bitstream
2808 * The value of this field is one less than the number of independent substreams present
2809 * and shall be in the range of 0 to 7, inclusive. */
2810 lsmash_eac3_substream_info_t independent_info[8];
2811 } lsmash_eac3_specific_parameters_t;
2813 int lsmash_setup_eac3_specific_parameters_from_frame
2815 lsmash_eac3_specific_parameters_t *param,
2816 uint8_t *data,
2817 uint32_t data_length
2820 uint16_t lsmash_eac3_get_chan_loc_from_chanmap
2822 uint16_t chanmap
2825 uint8_t *lsmash_create_eac3_specific_info
2827 lsmash_eac3_specific_parameters_t *param,
2828 uint32_t *data_length
2831 /* DTS Audio Specific Information
2832 * Mandatory :
2833 * ISOM_CODEC_TYPE_DTSC_AUDIO
2834 * ISOM_CODEC_TYPE_DTSH_AUDIO
2835 * ISOM_CODEC_TYPE_DTSL_AUDIO
2836 * ISOM_CODEC_TYPE_DTSE_AUDIO
2838 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization.
2839 * Each DTS Audio sample is self-contained. */
2840 typedef enum
2842 DTS_CORE_SUBSTREAM_CORE_FLAG = 0x00000001,
2843 DTS_CORE_SUBSTREAM_XXCH_FLAG = 0x00000002,
2844 DTS_CORE_SUBSTREAM_X96_FLAG = 0x00000004,
2845 DTS_CORE_SUBSTREAM_XCH_FLAG = 0x00000008,
2846 DTS_EXT_SUBSTREAM_CORE_FLAG = 0x00000010,
2847 DTS_EXT_SUBSTREAM_XBR_FLAG = 0x00000020,
2848 DTS_EXT_SUBSTREAM_XXCH_FLAG = 0x00000040,
2849 DTS_EXT_SUBSTREAM_X96_FLAG = 0x00000080,
2850 DTS_EXT_SUBSTREAM_LBR_FLAG = 0x00000100,
2851 DTS_EXT_SUBSTREAM_XLL_FLAG = 0x00000200,
2852 } lsmash_dts_construction_flag;
2854 typedef struct lsmash_dts_reserved_box_tag lsmash_dts_reserved_box_t;
2856 typedef struct
2858 uint32_t DTSSamplingFrequency; /* the maximum sampling frequency stored in the compressed audio stream
2859 * 'frequency', which is a member of lsmash_audio_summary_t, shall be set according to DTSSamplingFrequency of either:
2860 * 48000 for original sampling frequencies of 24000Hz, 48000Hz, 96000Hz or 192000Hz;
2861 * 44100 for original sampling frequencies of 22050Hz, 44100Hz, 88200Hz or 176400Hz;
2862 * 32000 for original sampling frequencies of 16000Hz, 32000Hz, 64000Hz or 128000Hz. */
2863 uint32_t maxBitrate; /* the peak bit rate, in bits per second, of the audio elementary stream for the duration of the track,
2864 * including the core substream (if present) and all extension substreams.
2865 * If the stream is a constant bit rate, this parameter shall have the same value as avgBitrate.
2866 * If the maximum bit rate is unknown, this parameter shall be set to 0. */
2867 uint32_t avgBitrate; /* the average bit rate, in bits per second, of the audio elementary stream for the duration of the track,
2868 * including the core substream and any extension substream that may be present. */
2869 uint8_t pcmSampleDepth; /* the bit depth of the rendered audio
2870 * The value is 16 or 24 bits. */
2871 uint8_t FrameDuration; /* the number of audio samples decoded in a complete audio access unit at DTSSamplingFrequency
2872 * 0: 512, 1: 1024, 2: 2048, 3: 4096 */
2873 uint8_t StreamConstruction; /* complete information on the existence and of location of extensions in any synchronized frame */
2874 uint8_t CoreLFEPresent; /* the presence of an LFE channel in the core
2875 * 0: none
2876 * 1: LFE exists */
2877 uint8_t CoreLayout; /* the channel layout of the core within the core substream
2878 * If no core substream exists, this parameter shall be ignored and ChannelLayout or
2879 * RepresentationType shall be used to determine channel configuration. */
2880 uint16_t CoreSize; /* The size of a core substream AU in bytes.
2881 * If no core substream exists, CoreSize = 0. */
2882 uint8_t StereoDownmix; /* the presence of an embedded stereo downmix in the stream
2883 * 0: none
2884 * 1: embedded downmix present */
2885 uint8_t RepresentationType; /* This indicates special properties of the audio presentation.
2886 * 0: Audio asset designated for mixing with another audio asset
2887 * 2: Lt/Rt Encoded for matrix surround decoding
2888 * 3: Audio processed for headphone playback
2889 * otherwise: Reserved
2890 * If ChannelLayout != 0, this value shall be ignored. */
2891 uint16_t ChannelLayout; /* complete information on channels coded in the audio stream including core and extensions */
2892 uint8_t MultiAssetFlag; /* This flag shall set if the stream contains more than one asset.
2893 * 0: single asset
2894 * 1: multiple asset
2895 * When multiple assets exist, the remaining parameters only reflect the coding parameters of the first asset. */
2896 uint8_t LBRDurationMod; /* This flag indicates a special case of the LBR coding bandwidth, resulting in 1/3 or 2/3 band limiting.
2897 * If set to 1, LBR frame duration is 50 % larger than indicated in FrameDuration */
2898 lsmash_dts_reserved_box_t *box;
2899 } lsmash_dts_specific_parameters_t;
2901 int lsmash_setup_dts_specific_parameters_from_frame
2903 lsmash_dts_specific_parameters_t *param,
2904 uint8_t *data,
2905 uint32_t data_length
2908 uint8_t lsmash_dts_get_stream_construction
2910 lsmash_dts_construction_flag flags
2913 lsmash_dts_construction_flag lsmash_dts_get_construction_flags
2915 uint8_t stream_construction
2918 lsmash_codec_type_t lsmash_dts_get_codingname
2920 lsmash_dts_specific_parameters_t *param
2923 uint8_t *lsmash_create_dts_specific_info
2925 lsmash_dts_specific_parameters_t *param,
2926 uint32_t *data_length
2929 int lsmash_append_dts_reserved_box
2931 lsmash_dts_specific_parameters_t *param,
2932 uint8_t *box_data,
2933 uint32_t box_size
2936 void lsmash_remove_dts_reserved_box
2938 lsmash_dts_specific_parameters_t *param
2941 /* Apple Lossless Audio Specific Information
2942 * Mandatory :
2943 * ISOM_CODEC_TYPE_ALAC_AUDIO
2944 * QT_CODEC_TYPE_ALAC_AUDIO */
2945 typedef struct
2947 uint32_t frameLength; /* the frames per packet when no explicit frames per packet setting is present in the packet header
2948 * The encoder frames per packet can be explicitly set but for maximum compatibility,
2949 * the default encoder setting of 4096 should be used. */
2950 uint8_t bitDepth; /* the bit depth of the source PCM data (maximum value = 32) */
2951 uint8_t numChannels; /* the channel count (1 = mono, 2 = stereo, etc...)
2952 * When channel layout info is not provided in the Channel Layout extension,
2953 * a channel count > 2 describes a set of discreet channels with no specific ordering. */
2954 uint32_t maxFrameBytes; /* the maximum size of an Apple Lossless packet within the encoded stream
2955 * Value of 0 indicates unknown. */
2956 uint32_t avgBitrate; /* the average bit rate in bits per second of the Apple Lossless stream
2957 * Value of 0 indicates unknown. */
2958 uint32_t sampleRate; /* sample rate of the encoded stream */
2959 } lsmash_alac_specific_parameters_t;
2961 uint8_t *lsmash_create_alac_specific_info
2963 lsmash_alac_specific_parameters_t *param,
2964 uint32_t *data_length
2967 /* MPEG-4 Bitrate Information.
2968 * Optional :
2969 * ISOM_CODEC_TYPE_AVC1_VIDEO
2970 * ISOM_CODEC_TYPE_AVC2_VIDEO
2971 * ISOM_CODEC_TYPE_AVC3_VIDEO
2972 * ISOM_CODEC_TYPE_AVC4_VIDEO
2973 * ISOM_CODEC_TYPE_HVC1_VIDEO
2974 * ISOM_CODEC_TYPE_HEV1_VIDEO
2976 * Though you need not to set these fields manually since lsmash_finish_movie() calls the function
2977 * that calculates these values internally, these fields are optional.
2978 * Therefore, if you want to add this info, append this as an extension via LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264_BITRATE at least. */
2979 typedef struct
2981 uint32_t bufferSizeDB; /* the size of the decoding buffer for the elementary stream in bytes */
2982 uint32_t maxBitrate; /* the maximum rate in bits/second over any window of one second */
2983 uint32_t avgBitrate; /* the average rate in bits/second over the entire presentation */
2984 } lsmash_h264_bitrate_t;
2986 /* Appendability of NAL unit into Decoder Configuration Record */
2987 typedef enum
2989 DCR_NALU_APPEND_NEW_SAMPLE_ENTRY_REQUIRED = -3, /* A new sample description entry is needed because e.g. visual presentation size changes. */
2990 DCR_NALU_APPEND_NEW_DCR_REQUIRED = -2, /* A new Decoder Configuration Record is needed. */
2991 DCR_NALU_APPEND_ERROR = -1, /* something of errors */
2992 DCR_NALU_APPEND_DUPLICATED = 0, /* The same NAL unit is in the Decoder Configuration Record. */
2993 DCR_NALU_APPEND_POSSIBLE = 1, /* It is possible to append the NAL unit into the Decoder Configuration Record. */
2994 } lsmash_dcr_nalu_appendable;
2996 /* H.264/AVC Specific Information
2997 * Mandatory :
2998 * ISOM_CODEC_TYPE_AVC1_VIDEO
2999 * ISOM_CODEC_TYPE_AVC2_VIDEO
3000 * ISOM_CODEC_TYPE_AVC3_VIDEO
3001 * ISOM_CODEC_TYPE_AVC4_VIDEO
3003 * All members in lsmash_h264_specific_parameters_t except for lengthSizeMinusOne shall be automatically set up
3004 * when appending SPS NAL units by calling lsmash_append_h264_parameter_set(). */
3005 typedef enum
3007 H264_PARAMETER_SET_TYPE_SPS = 0, /* SPS (Sequence Parameter Set) */
3008 H264_PARAMETER_SET_TYPE_PPS = 1, /* PPS (Picture Parameter Set) */
3009 H264_PARAMETER_SET_TYPE_SPSEXT = 2, /* SPS Ext (Sequence Parameter Set Extension) */
3010 /* The number of the NAL unit types defined for AVC Decoder Configuration Record */
3011 H264_PARAMETER_SET_TYPE_NUM
3012 } lsmash_h264_parameter_set_type;
3014 typedef struct lsmash_h264_parameter_sets_tag lsmash_h264_parameter_sets_t;
3016 typedef struct
3018 uint8_t AVCProfileIndication; /* profile_idc in sequence parameter sets
3019 * This field must indicate a profile to which the stream associated with
3020 * this configuration record conforms.
3021 * Note: there is no profile to which the entire stream conforms, then
3022 * the entire stream must be split into two or more sub-streams with
3023 * separate configuration records in which these rules can be met. */
3024 uint8_t profile_compatibility; /* constraint_set_flags in sequence parameter sets
3025 * The each bit may only be set if all the included parameter sets set that flag. */
3026 uint8_t AVCLevelIndication; /* level_idc in sequence parameter sets
3027 * This field must indicate a level of capability equal to or greater than
3028 * the highest level indicated in the included parameter sets. */
3029 uint8_t lengthSizeMinusOne; /* the length in bytes of the NALUnitLength field prior to NAL unit
3030 * The value of this field shall be one of 0, 1, or 3
3031 * corresponding to a length encoded with 1, 2, or 4 bytes, respectively.
3032 * NALUnitLength indicates the size of a NAL unit measured in bytes,
3033 * and includes the size of both the one byte NAL header and the EBSP payload
3034 * but does not include the length field itself. */
3035 /* chroma format and bit depth information
3036 * These fields must be identical in all the parameter sets. */
3037 uint8_t chroma_format; /* chroma_format_idc in sequence parameter sets */
3038 uint8_t bit_depth_luma_minus8; /* bit_depth_luma_minus8 in sequence parameter sets */
3039 uint8_t bit_depth_chroma_minus8; /* bit_depth_chroma_minus8 in sequence parameter sets */
3040 /* a set of arrays to carry initialization NAL units
3041 * The NAL unit types are restricted to indicate SPS, PPS and SPS Ext NAL units only. */
3042 lsmash_h264_parameter_sets_t *parameter_sets;
3043 } lsmash_h264_specific_parameters_t;
3045 int lsmash_setup_h264_specific_parameters_from_access_unit
3047 lsmash_h264_specific_parameters_t *param,
3048 uint8_t *data,
3049 uint32_t data_length
3052 void lsmash_destroy_h264_parameter_sets
3054 lsmash_h264_specific_parameters_t *param
3057 lsmash_dcr_nalu_appendable lsmash_check_h264_parameter_set_appendable
3059 lsmash_h264_specific_parameters_t *param,
3060 lsmash_h264_parameter_set_type ps_type,
3061 void *ps_data,
3062 uint32_t ps_length
3065 int lsmash_append_h264_parameter_set
3067 lsmash_h264_specific_parameters_t *param,
3068 lsmash_h264_parameter_set_type ps_type,
3069 void *ps_data,
3070 uint32_t ps_length
3073 uint8_t *lsmash_create_h264_specific_info
3075 lsmash_h264_specific_parameters_t *param,
3076 uint32_t *data_length
3079 /* H.265/HEVC Specific Information
3080 * Mandatory :
3081 * ISOM_CODEC_TYPE_HVC1_VIDEO
3082 * ISOM_CODEC_TYPE_HEV1_VIDEO
3084 * All members in lsmash_hevc_specific_parameters_t except for avgFrameRate and lengthSizeMinusOne shall be
3085 * automatically set up when appending VPS and SPS NAL units by calling lsmash_append_hevc_dcr_nalu().
3086 * It is recommended that you should append VPS, SPS and PPS in this order so that a parameter set can reference
3087 * another parameter set. */
3088 typedef enum
3090 /* Parameter sets
3091 * When the CODEC identifier ISOM_CODEC_TYPE_HVC1_VIDEO is used, at least one parameter set for each array
3092 * of parameter set shall be in the configuration record. */
3093 HEVC_DCR_NALU_TYPE_VPS = 0, /* VPS (Video Parameter Set) */
3094 HEVC_DCR_NALU_TYPE_SPS = 1, /* SPS (Sequence Parameter Set) */
3095 HEVC_DCR_NALU_TYPE_PPS = 2, /* PPS (Picture Parameter Set) */
3096 /* SEI (Supplemental Enhancement Information)
3097 * Only the 'declarative' SEI messages that provide information about the stream as
3098 * a whole are allowed because SEIs themselves basically have no identifier and
3099 * no one can reference dynamically in a configuration record. */
3100 HEVC_DCR_NALU_TYPE_PREFIX_SEI = 3, /* Prefix SEI */
3101 HEVC_DCR_NALU_TYPE_SUFFIX_SEI = 4, /* Suffix SEI */
3102 /* The number of the NAL unit types defined for HEVC Decoder Configuration Record */
3103 HEVC_DCR_NALU_TYPE_NUM
3104 } lsmash_hevc_dcr_nalu_type;
3106 typedef struct lsmash_hevc_parameter_arrays_tag lsmash_hevc_parameter_arrays_t;
3108 typedef struct
3110 /* general profile, tier and level from VPS and/or SPS */
3111 uint8_t general_profile_space; /* general_profile_space
3112 * The value in all the parameter sets must be identical. */
3113 uint8_t general_tier_flag; /* general_tier_flag
3114 * The value must indicate a tier equal to or greater than the highest
3115 * tier indicated in all the parameter sets. */
3116 uint8_t general_profile_idc; /* general_profile_idc
3117 * The value must indicate a profile to which the stream associated with
3118 * this configuration record conforms.
3119 * Note: there is no profile to which the entire stream conforms, then
3120 * the entire stream must be split into two or more sub-streams with
3121 * separate configuration records in which these rules can be met. */
3122 uint32_t general_profile_compatibility_flags; /* general_profile_compatibility_flag[j] for j from 0 to 31
3123 * The each bit may only be set if all the parameter sets set that bit. */
3124 uint64_t general_constraint_indicator_flags; /* the 6 bytes starting with the byte containing the general_progressive_source_flag
3125 * The each bit may only be set if all the parameter sets set that bit. */
3126 uint8_t general_level_idc; /* general_level_idc
3127 * The value must indicate a level of capability equal to or greater
3128 * than the highest level indicated for the highest tier in all the
3129 * parameter sets. */
3130 /* */
3131 uint16_t min_spatial_segmentation_idc; /* min_spatial_segmentation_idc in VUI (Video Usability Information)
3132 * The value must indicate a level of spatial segmentation equal to
3133 * or less than the lowest level of spatial segmentation indicated in
3134 * all the parameter sets. */
3135 uint8_t parallelismType; /* parallelismType indicates the type of parallelism that is used to meet the
3136 * restrictions imposed by min_spatial_segmentation_idc when the value of
3137 * min_spatial_segmentation_idc is greater than 0.
3138 * For the stream to which this configuration record applies,
3139 * 0: mixed types of parallel decoding or parallelism type is unknown
3140 * 1: slice based parallel decoding
3141 * 2: tile based parallel decoding
3142 * 3: entropy coding synchronization based parallel decoding
3143 * (WPP: Wavefront Parallel Processing) */
3144 /* chroma format and bit depth information
3145 * These fields must be identical in all the parameter sets. */
3146 uint8_t chromaFormat; /* chroma_format_idc in sequence parameter sets */
3147 uint8_t bitDepthLumaMinus8; /* bit_depth_luma_minus8 in sequence parameter sets */
3148 uint8_t bitDepthChromaMinus8; /* bit_depth_chroma_minus8 in sequence parameter sets */
3149 /* miscellaneous */
3150 uint16_t avgFrameRate; /* the average frame rate in units of frames/(256 seconds)
3151 * Value 0 indicates an unspecified average frame rate. */
3152 uint8_t constantFrameRate; /* 0: the stream may or may not be of constant frame rate.
3153 * 1: that the stream to which this configuration record applies is of
3154 * constant frame rate
3155 * 2: the representation of each temporal layer in the stream is of
3156 * constant frame rate. */
3157 uint8_t numTemporalLayers; /* 0: it is unknown whether the stream is temporally scalable.
3158 * 1: the stream is not temporally scalable.
3159 * otherwise: the stream to which this configuration record applies is
3160 * temporally scalable and the contained number of temporal layers
3161 * (also referred to as temporal sublayer or sub-layer) is equal
3162 * is equal to numTemporalLayers. */
3163 uint8_t temporalIdNested; /* 0: at least one of the SPSs that are activated when the stream to which
3164 * this configuration record applies is decoded has sps_temporal_id_nesting_flag
3165 * equal to 0.
3166 * 1: all SPSs that are activated when the stream to which this configuration
3167 * record applies is decoded have sps_temporal_id_nesting_flag equal to 1
3168 * and temporal sub-layer up-switching to any higher temporal layer can be
3169 * performed at any sample.
3170 * Any step-wise temporal sub-layer access picture shall not be present in
3171 * the sequences to which this configuration record applies. */
3172 uint8_t lengthSizeMinusOne; /* the length in bytes of the NALUnitLength field prior to NAL unit
3173 * The value of this field shall be one of 0, 1, or 3
3174 * corresponding to a length encoded with 1, 2, or 4 bytes, respectively.
3175 * NALUnitLength indicates the size of a NAL unit measured in bytes,
3176 * and includes the size of both the one byte NAL header and the EBSP payload
3177 * but does not include the length field itself. */
3178 /* a set of arrays to carry initialization NAL units
3179 * The NAL unit types are restricted to indicate VPS, SPS, PPS, and SEI NAL units only. */
3180 lsmash_hevc_parameter_arrays_t *parameter_arrays;
3181 } lsmash_hevc_specific_parameters_t;
3183 int lsmash_setup_hevc_specific_parameters_from_access_unit
3185 lsmash_hevc_specific_parameters_t *param,
3186 uint8_t *data,
3187 uint32_t data_length
3190 void lsmash_destroy_hevc_parameter_arrays
3192 lsmash_hevc_specific_parameters_t *param
3195 lsmash_dcr_nalu_appendable lsmash_check_hevc_dcr_nalu_appendable
3197 lsmash_hevc_specific_parameters_t *param,
3198 lsmash_hevc_dcr_nalu_type ps_type,
3199 void *ps_data,
3200 uint32_t ps_length
3203 int lsmash_append_hevc_dcr_nalu
3205 lsmash_hevc_specific_parameters_t *param,
3206 lsmash_hevc_dcr_nalu_type ps_type,
3207 void *ps_data,
3208 uint32_t ps_length
3211 int lsmash_set_hevc_array_completeness
3213 lsmash_hevc_specific_parameters_t *param,
3214 lsmash_hevc_dcr_nalu_type ps_type,
3215 int array_completeness
3218 int lsmash_get_hevc_array_completeness
3220 lsmash_hevc_specific_parameters_t *param,
3221 lsmash_hevc_dcr_nalu_type ps_type,
3222 int *array_completeness
3225 uint8_t *lsmash_create_hevc_specific_info
3227 lsmash_hevc_specific_parameters_t *param,
3228 uint32_t *data_length
3231 /* VC-1 Specific Information
3232 * Mandatory :
3233 * ISOM_CODEC_TYPE_VC_1_VIDEO
3235 * We support only advanced profile at present. */
3236 typedef struct lsmash_vc1_header_tag lsmash_vc1_header_t;
3238 typedef struct
3240 /* Note: multiple_sequence, multiple_entry, slice_present and bframe_present shall be decided through overall VC-1 bitstream. */
3241 uint8_t profile; /* the encoding profile used in the VC-1 bitstream
3242 * 0: simple profile (not supported)
3243 * 4: main profile (not supported)
3244 * 12: advanced profile
3245 * Currently, only 12 for advanced profile is available. */
3246 uint8_t level; /* the highest encoding level used in the VC-1 bitstream */
3247 uint8_t cbr; /* 0: non-constant bitrate model
3248 * 1: constant bitrate model */
3249 uint8_t interlaced; /* 0: interlaced coding of frames is not used.
3250 * 1: frames may use interlaced coding. */
3251 uint8_t multiple_sequence; /* 0: the track contains no sequence headers (stored only in VC-1 specific info structure),
3252 * or
3253 * all sequence headers in the track are identical to the sequence header that is specified in the seqhdr field.
3254 * In this case, random access points are samples that contain an entry-point header.
3255 * 1: the track may contain Sequence headers that are different from the sequence header specified in the seqhdr field.
3256 * In this case, random access points are samples that contain both a sequence Header and an entry-point header. */
3257 uint8_t multiple_entry; /* 0: all entry-point headers in the track are identical to the entry-point header that is specified in the ephdr field.
3258 * 1: the track may contain entry-point headers that are different from the entry-point header specified in the ephdr field. */
3259 uint8_t slice_present; /* 0: frames are not coded as multiple slices.
3260 * 1: frames may be coded as multiple slices. */
3261 uint8_t bframe_present; /* 0: neither B-frames nor BI-frames are present in the track.
3262 * 1: B-frames or BI-frames may be present in the track. */
3263 uint32_t framerate; /* the rounded frame rate (frames per second) of the track
3264 * Should be set to 0xffffffff if the frame rate is not known, unspecified, or non-constant. */
3265 lsmash_vc1_header_t *seqhdr; /* a sequence header EBDU (mandatory) */
3266 lsmash_vc1_header_t *ephdr; /* an entry-point header EBDU (mandatory) */
3267 } lsmash_vc1_specific_parameters_t;
3269 int lsmash_setup_vc1_specific_parameters_from_access_unit
3271 lsmash_vc1_specific_parameters_t *param,
3272 uint8_t *data,
3273 uint32_t data_length
3276 void lsmash_destroy_vc1_headers
3278 lsmash_vc1_specific_parameters_t *param
3281 int lsmash_put_vc1_header
3283 lsmash_vc1_specific_parameters_t *param,
3284 void *hdr_data,
3285 uint32_t hdr_length
3288 uint8_t *lsmash_create_vc1_specific_info
3290 lsmash_vc1_specific_parameters_t *param,
3291 uint32_t *data_length
3294 /* Sample scaling
3295 * Without this extension, video samples are scaled into the visual presentation region to fill it. */
3296 typedef enum
3298 ISOM_SCALE_METHOD_FILL = 1,
3299 ISOM_SCALE_METHOD_HIDDEN = 2,
3300 ISOM_SCALE_METHOD_MEET = 3,
3301 ISOM_SCALE_METHOD_SLICE_X = 4,
3302 ISOM_SCALE_METHOD_SLICE_Y = 5,
3303 } lsmash_scale_method;
3305 typedef struct
3307 uint8_t constraint_flag; /* Upper 7-bits are reserved.
3308 * If this flag is set, all samples described by this sample entry shall be scaled
3309 * according to the method specified by the field 'scale_method'. */
3310 lsmash_scale_method scale_method; /* The semantics of the values for scale_method are as specified for the 'fit' attribute of regions in SMIL 1.0. */
3311 int16_t display_center_x;
3312 int16_t display_center_y;
3313 } lsmash_isom_sample_scale_t;
3315 /* QuickTime Video CODEC tools */
3316 typedef enum
3318 QT_COMPRESSION_QUALITY_LOSSLESS = 0x00000400, /* only valid for spatial compression */
3319 QT_COMPRESSION_QUALITY_MAX = 0x000003FF,
3320 QT_COMPRESSION_QUALITY_MIN = 0x00000000,
3321 QT_COMPRESSION_QUALITY_LOW = 0x00000100,
3322 QT_COMPRESSION_QUALITY_NORMAL = 0x00000200,
3323 QT_COMPRESSION_QUALITY_HIGH = 0x00000300
3324 } lsmash_qt_compression_quality;
3326 typedef struct
3328 uint32_t seed; /* Must be set to 0. */
3329 uint16_t flags; /* Must be set to 0x8000. */
3330 uint16_t size; /* the number of colors in the following color array
3331 * This is a zero-relative value;
3332 * setting this field to 0 means that there is one color in the array. */
3333 /* Color array
3334 * An array of colors. Each color is made of four unsigned 16-bit integers.
3335 * We support up to 256 elements. */
3336 struct
3338 uint16_t unused; /* Must be set to 0. */
3339 /* true color */
3340 uint16_t r; /* magnitude of red component */
3341 uint16_t g; /* magnitude of green component */
3342 uint16_t b; /* magnitude of blue component */
3343 } array[256];
3344 } lsmash_qt_color_table_t;
3346 typedef struct
3348 int16_t revision_level; /* version of the CODEC */
3349 int32_t vendor; /* whose CODEC */
3350 lsmash_qt_compression_quality temporalQuality; /* the temporal quality factor (0-1023) */
3351 lsmash_qt_compression_quality spatialQuality; /* the spatial quality factor (0-1024) */
3352 uint32_t horizontal_resolution; /* a 16.16 fixed-point number containing the horizontal resolution of the image in pixels per inch. */
3353 uint32_t vertical_resolution; /* a 16.16 fixed-point number containing the vertical resolution of the image in pixels per inch. */
3354 uint32_t dataSize; /* if known, the size of data for this descriptor */
3355 uint16_t frame_count; /* frame per sample */
3356 int16_t color_table_ID; /* color table ID
3357 * If this field is set to -1, the default color table should be used for the specified depth
3358 * If the color table ID is set to 0, a color table is contained within the sample description itself.
3359 * The color table immediately follows the color table ID field. */
3360 lsmash_qt_color_table_t color_table; /* a list of preferred colors for displaying the movie on devices that support only 256 colors */
3361 } lsmash_qt_video_common_t;
3363 typedef struct
3365 uint32_t level; /* A fixed-point 16.16 number indicating the gamma level at which the image was captured. */
3366 } lsmash_qt_gamma_t;
3368 typedef enum
3370 QT_FIELEDS_SCAN_PROGRESSIVE = 1, /* progressive scan */
3371 QT_FIELEDS_SCAN_INTERLACED = 2, /* 2:1 interlaced */
3372 } lsmash_qt_number_of_fields;
3374 /* field ordering for interlaced material */
3375 typedef enum
3377 QT_FIELD_ORDERINGS_UNKNOWN = 0,
3378 QT_FIELD_ORDERINGS_TEMPORAL_TOP_FIRST = 1,
3379 QT_FIELD_ORDERINGS_TEMPORAL_BOTTOM_FIRST = 6,
3380 QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_EARLY = 9,
3381 QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_LATE = 14
3382 } lsmash_qt_field_orderings;
3384 typedef struct
3386 lsmash_qt_number_of_fields fields;
3387 lsmash_qt_field_orderings detail;
3388 } lsmash_qt_field_info_t;
3390 /* the native pixel format */
3391 typedef enum
3393 QT_PIXEL_FORMAT_TYPE_1_MONOCHROME = 0x00000001, /* 1 bit indexed */
3394 QT_PIXEL_FORMAT_TYPE_2_INDEXED = 0x00000002, /* 2 bit indexed */
3395 QT_PIXEL_FORMAT_TYPE_4_INDEXED = 0x00000004, /* 4 bit indexed */
3396 QT_PIXEL_FORMAT_TYPE_8_INDEXED = 0x00000008, /* 8 bit indexed */
3397 QT_PIXEL_FORMAT_TYPE_1_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000021, /* 1 bit indexed gray, white is zero */
3398 QT_PIXEL_FORMAT_TYPE_2_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000022, /* 2 bit indexed gray, white is zero */
3399 QT_PIXEL_FORMAT_TYPE_4_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000024, /* 4 bit indexed gray, white is zero */
3400 QT_PIXEL_FORMAT_TYPE_8_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000028, /* 8 bit indexed gray, white is zero */
3401 QT_PIXEL_FORMAT_TYPE_16BE555 = 0x00000010, /* 16 bit BE RGB 555 */
3402 QT_PIXEL_FORMAT_TYPE_16LE555 = LSMASH_4CC( 'L', '5', '5', '5' ), /* 16 bit LE RGB 555 */
3403 QT_PIXEL_FORMAT_TYPE_16LE5551 = LSMASH_4CC( '5', '5', '5', '1' ), /* 16 bit LE RGB 5551 */
3404 QT_PIXEL_FORMAT_TYPE_16BE565 = LSMASH_4CC( 'B', '5', '6', '5' ), /* 16 bit BE RGB 565 */
3405 QT_PIXEL_FORMAT_TYPE_16LE565 = LSMASH_4CC( 'L', '5', '6', '5' ), /* 16 bit LE RGB 565 */
3406 QT_PIXEL_FORMAT_TYPE_24RGB = 0x00000018, /* 24 bit RGB */
3407 QT_PIXEL_FORMAT_TYPE_24BGR = LSMASH_4CC( '2', '4', 'B', 'G' ), /* 24 bit BGR */
3408 QT_PIXEL_FORMAT_TYPE_32ARGB = 0x00000020, /* 32 bit ARGB */
3409 QT_PIXEL_FORMAT_TYPE_32BGRA = LSMASH_4CC( 'B', 'G', 'R', 'A' ), /* 32 bit BGRA */
3410 QT_PIXEL_FORMAT_TYPE_32ABGR = LSMASH_4CC( 'A', 'B', 'G', 'R' ), /* 32 bit ABGR */
3411 QT_PIXEL_FORMAT_TYPE_32RGBA = LSMASH_4CC( 'R', 'G', 'B', 'A' ), /* 32 bit RGBA */
3412 QT_PIXEL_FORMAT_TYPE_64ARGB = LSMASH_4CC( 'b', '6', '4', 'a' ), /* 64 bit ARGB, 16-bit big-endian samples */
3413 QT_PIXEL_FORMAT_TYPE_48RGB = LSMASH_4CC( 'b', '4', '8', 'r' ), /* 48 bit RGB, 16-bit big-endian samples */
3414 QT_PIXEL_FORMAT_TYPE_32_ALPHA_GRAY = LSMASH_4CC( 'b', '3', '2', 'a' ), /* 32 bit AlphaGray, 16-bit big-endian samples, black is zero */
3415 QT_PIXEL_FORMAT_TYPE_16_GRAY = LSMASH_4CC( 'b', '1', '6', 'g' ), /* 16 bit Grayscale, 16-bit big-endian samples, black is zero */
3416 QT_PIXEL_FORMAT_TYPE_30RGB = LSMASH_4CC( 'R', '1', '0', 'k' ), /* 30 bit RGB, 10-bit big-endian samples, 2 unused padding bits (at least significant end) */
3417 QT_PIXEL_FORMAT_TYPE_422YpCbCr8 = LSMASH_4CC( '2', 'v', 'u', 'y' ), /* Component Y'CbCr 8-bit 4:2:2, ordered Cb Y'0 Cr Y'1 */
3418 QT_PIXEL_FORMAT_TYPE_4444YpCbCrA8 = LSMASH_4CC( 'v', '4', '0', '8' ), /* Component Y'CbCrA 8-bit 4:4:4:4, ordered Cb Y' Cr A */
3419 QT_PIXEL_FORMAT_TYPE_4444YpCbCrA8R = LSMASH_4CC( 'r', '4', '0', '8' ), /* Component Y'CbCrA 8-bit 4:4:4:4, rendering format. full range alpha, zero biased YUV, ordered A Y' Cb Cr */
3420 QT_PIXEL_FORMAT_TYPE_4444AYpCbCr8 = LSMASH_4CC( 'y', '4', '0', '8' ), /* Component Y'CbCrA 8-bit 4:4:4:4, ordered A Y' Cb Cr, full range alpha, video range Y'CbCr */
3421 QT_PIXEL_FORMAT_TYPE_4444AYpCbCr16 = LSMASH_4CC( 'y', '4', '1', '6' ), /* Component Y'CbCrA 16-bit 4:4:4:4, ordered A Y' Cb Cr, full range alpha, video range Y'CbCr, 16-bit little-endian samples */
3422 QT_PIXEL_FORMAT_TYPE_444YpCbCr8 = LSMASH_4CC( 'v', '3', '0', '8' ), /* Component Y'CbCr 8-bit 4:4:4 */
3423 QT_PIXEL_FORMAT_TYPE_422YpCbCr16 = LSMASH_4CC( 'v', '2', '1', '6' ), /* Component Y'CbCr 10,12,14,16-bit 4:2:2 */
3424 QT_PIXEL_FORMAT_TYPE_422YpCbCr10 = LSMASH_4CC( 'v', '2', '1', '0' ), /* Component Y'CbCr 10-bit 4:2:2 */
3425 QT_PIXEL_FORMAT_TYPE_444YpCbCr10 = LSMASH_4CC( 'v', '4', '1', '0' ), /* Component Y'CbCr 10-bit 4:4:4 */
3426 QT_PIXEL_FORMAT_TYPE_420YpCbCr8_PLANAR = LSMASH_4CC( 'y', '4', '2', '0' ), /* Planar Component Y'CbCr 8-bit 4:2:0 */
3427 QT_PIXEL_FORMAT_TYPE_420YpCbCr8_PLANAR_FULL_RANGE = LSMASH_4CC( 'f', '4', '2', '0' ), /* Planar Component Y'CbCr 8-bit 4:2:0, full range */
3428 QT_PIXEL_FORMAT_TYPE_422YpCbCr_4A_8_BIPLANAR = LSMASH_4CC( 'a', '2', 'v', 'y' ), /* First plane: Video-range Component Y'CbCr 8-bit 4:2:2, ordered Cb Y'0 Cr Y'1; second plane: alpha 8-bit 0-255 */
3429 QT_PIXEL_FORMAT_TYPE_420YpCbCr8_BIPLANAR_VIDEO_RANGE = LSMASH_4CC( '4', '2', '0', 'v' ), /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, video-range (luma=[16,235] chroma=[16,240]) */
3430 QT_PIXEL_FORMAT_TYPE_420YpCbCr8_BIPLANAR_FULL_RANGE = LSMASH_4CC( '4', '2', '0', 'f' ), /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]) */
3431 QT_PIXEL_FORMAT_TYPE_422YpCbCr8_YUVS = LSMASH_4CC( 'y', 'u', 'v', 's' ), /* Component Y'CbCr 8-bit 4:2:2, ordered Y'0 Cb Y'1 Cr */
3432 QT_PIXEL_FORMAT_TYPE_422YpCbCr8_FULL_RANGE = LSMASH_4CC( 'y', 'u', 'v', 'f' ), /* Component Y'CbCr 8-bit 4:2:2, full range, ordered Y'0 Cb Y'1 Cr */
3434 /* Developer specific FourCCs (from dispatch 20) */
3435 QT_PIXEL_FORMAT_TYPE_SOFTVOUT_SOFTCODEC = LSMASH_4CC( 's', 'o', 'f', 't' ), /* Intermediary pixel format used by SoftVout and SoftCodec */
3436 QT_PIXEL_FORMAT_TYPE_VIEW_GRAPHICS = LSMASH_4CC( 'v', 'w', 'g', 'r' ), /* Intermediary pixel format used by View Graphics */
3437 QT_PIXEL_FORMAT_TYPE_SGI = LSMASH_4CC( 'S', 'G', 'V', 'C' ), /* Intermediary pixel format used by SGI */
3438 } lsmash_qt_pixel_format;
3440 typedef struct
3442 lsmash_qt_pixel_format pixel_format; /* the native pixel format of an image */
3443 } lsmash_qt_pixel_format_t;
3445 /* Significant Bits Extension
3446 * mandatory extension for 'v216' (Uncompressed Y'CbCr, 10, 12, 14, or 16-bit-per-component 4:2:2) */
3447 typedef struct
3449 uint8_t significantBits; /* the number of significant bits per component */
3450 } lsmash_qt_significant_bits_t;
3452 /* QuickTime Audio CODEC tools */
3453 typedef enum
3455 QT_AUDIO_COMPRESSION_ID_NOT_COMPRESSED = 0,
3456 QT_AUDIO_COMPRESSION_ID_FIXED_COMPRESSION = -1,
3457 QT_AUDIO_COMPRESSION_ID_VARIABLE_COMPRESSION = -2,
3458 QT_AUDIO_COMPRESSION_ID_TWO_TO_ONE = 1,
3459 QT_AUDIO_COMPRESSION_ID_EIGHT_TO_THREE = 2,
3460 QT_AUDIO_COMPRESSION_ID_THREE_TO_ONE = 3,
3461 QT_AUDIO_COMPRESSION_ID_SIX_TO_ONE = 4,
3462 QT_AUDIO_COMPRESSION_ID_SIX_TO_ONE_PACKET_SIZE = 8,
3463 QT_AUDIO_COMPRESSION_ID_THREE_TO_ONE_PACKET_SIZE = 16,
3464 } lsmash_qt_audio_compression_id;
3466 typedef struct
3468 int16_t revision_level; /* version of the CODEC */
3469 int32_t vendor; /* whose CODEC */
3470 lsmash_qt_audio_compression_id compression_ID;
3471 } lsmash_qt_audio_common_t;
3473 /* Audio Channel Layout
3474 * This CODEC specific extension is for
3475 * QuickTime Audio inside QuickTime file format
3476 * and
3477 * Apple Lossless Audio inside ISO Base Media file format.
3478 * When audio stream has 3 or more number of channels, this extension shall be present. */
3479 typedef enum
3481 QT_CHANNEL_LABEL_UNKNOWN = (signed)0xffffffff, /* unknown or unspecified other use */
3482 QT_CHANNEL_LABEL_UNUSED = 0, /* channel is present, but has no intended use or destination */
3483 QT_CHANNEL_LABEL_USE_COORDINATES = 100, /* channel is described by the coordinates fields. */
3485 QT_CHANNEL_LABEL_LEFT = 1,
3486 QT_CHANNEL_LABEL_RIGHT = 2,
3487 QT_CHANNEL_LABEL_CENTER = 3,
3488 QT_CHANNEL_LABEL_LFE_SCREEN = 4,
3489 QT_CHANNEL_LABEL_LEFT_SURROUND = 5, /* WAVE: "Back Left" */
3490 QT_CHANNEL_LABEL_RIGHT_SUROUND = 6, /* WAVE: "Back Right" */
3491 QT_CHANNEL_LABEL_LEFT_CENTER = 7,
3492 QT_CHANNEL_LABEL_RIGHT_CENTER = 8,
3493 QT_CHANNEL_LABEL_CENTER_SURROUND = 9, /* WAVE: "Back Center" or plain "Rear Surround" */
3494 QT_CHANNEL_LABEL_LEFT_SURROUND_DIRECT = 10, /* WAVE: "Side Left" */
3495 QT_CHANNEL_LABEL_RIGHT_SURROUND_DIRECT = 11, /* WAVE: "Side Right" */
3496 QT_CHANNEL_LABEL_TOP_CENTER_SURROUND = 12,
3497 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_LEFT = 13, /* WAVE: "Top Front Left" */
3498 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_CENTER = 14, /* WAVE: "Top Front Center" */
3499 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_RIGHT = 15, /* WAVE: "Top Front Right" */
3501 QT_CHANNEL_LABEL_TOP_BACK_LEFT = 16,
3502 QT_CHANNEL_LABEL_TOP_BACK_CENTER = 17,
3503 QT_CHANNEL_LABEL_TOP_BACK_RIGHT = 18,
3505 QT_CHANNEL_LABEL_REAR_SURROUND_LEFT = 33,
3506 QT_CHANNEL_LABEL_REAR_SURROUND_RIGHT = 34,
3507 QT_CHANNEL_LABEL_LEFT_WIDE = 35,
3508 QT_CHANNEL_LABEL_RIGHT_WIDE = 36,
3509 QT_CHANNEL_LABEL_LFE2 = 37,
3510 QT_CHANNEL_LABEL_LEFT_TOTAL = 38, /* matrix encoded 4 channels */
3511 QT_CHANNEL_LABEL_RIGHT_TOTAL = 39, /* matrix encoded 4 channels */
3512 QT_CHANNEL_LABEL_HEARING_IMPAIRED = 40,
3513 QT_CHANNEL_LABEL_NARRATION = 41,
3514 QT_CHANNEL_LABEL_MONO = 42,
3515 QT_CHANNEL_LABEL_DIALOG_CENTRIC_MIX = 43,
3517 QT_CHANNEL_LABEL_CENTER_SURROUND_DIRECT = 44, /* back center, non diffuse */
3519 QT_CHANNEL_LABEL_HAPTIC = 45,
3521 /* first order ambisonic channels */
3522 QT_CHANNEL_LABEL_AMBISONIC_W = 200,
3523 QT_CHANNEL_LABEL_AMBISONIC_X = 201,
3524 QT_CHANNEL_LABEL_AMBISONIC_Y = 202,
3525 QT_CHANNEL_LABEL_AMBISONIC_Z = 203,
3527 /* Mid/Side Recording */
3528 QT_CHANNEL_LABEL_MS_MID = 204,
3529 QT_CHANNEL_LABEL_MS_SIDE = 205,
3531 /* X-Y Recording */
3532 QT_CHANNEL_LABEL_XY_X = 206,
3533 QT_CHANNEL_LABEL_XY_Y = 207,
3535 /* other */
3536 QT_CHANNEL_LABEL_HEADPHONES_LEFT = 301,
3537 QT_CHANNEL_LABEL_HEADPHONES_RIGHT = 302,
3538 QT_CHANNEL_LABEL_CLICK_TRACK = 304,
3539 QT_CHANNEL_LABEL_FOREIGN_LANGUAGE = 305,
3541 /* generic discrete channel */
3542 QT_CHANNEL_LABEL_DISCRETE = 400,
3544 /* numbered discrete channel */
3545 QT_CHANNEL_LABEL_DISCRETE_0 = (1<<16),
3546 QT_CHANNEL_LABEL_DISCRETE_1 = (1<<16) | 1,
3547 QT_CHANNEL_LABEL_DISCRETE_2 = (1<<16) | 2,
3548 QT_CHANNEL_LABEL_DISCRETE_3 = (1<<16) | 3,
3549 QT_CHANNEL_LABEL_DISCRETE_4 = (1<<16) | 4,
3550 QT_CHANNEL_LABEL_DISCRETE_5 = (1<<16) | 5,
3551 QT_CHANNEL_LABEL_DISCRETE_6 = (1<<16) | 6,
3552 QT_CHANNEL_LABEL_DISCRETE_7 = (1<<16) | 7,
3553 QT_CHANNEL_LABEL_DISCRETE_8 = (1<<16) | 8,
3554 QT_CHANNEL_LABEL_DISCRETE_9 = (1<<16) | 9,
3555 QT_CHANNEL_LABEL_DISCRETE_10 = (1<<16) | 10,
3556 QT_CHANNEL_LABEL_DISCRETE_11 = (1<<16) | 11,
3557 QT_CHANNEL_LABEL_DISCRETE_12 = (1<<16) | 12,
3558 QT_CHANNEL_LABEL_DISCRETE_13 = (1<<16) | 13,
3559 QT_CHANNEL_LABEL_DISCRETE_14 = (1<<16) | 14,
3560 QT_CHANNEL_LABEL_DISCRETE_15 = (1<<16) | 15,
3561 QT_CHANNEL_LABEL_DISCRETE_65535 = (1<<16) | 65535,
3562 } lsmash_channel_label;
3564 typedef enum
3566 QT_CHANNEL_BIT_LEFT = 1,
3567 QT_CHANNEL_BIT_RIGHT = 1<<1,
3568 QT_CHANNEL_BIT_CENTER = 1<<2,
3569 QT_CHANNEL_BIT_LFE_SCREEN = 1<<3,
3570 QT_CHANNEL_BIT_LEFT_SURROUND = 1<<4, /* WAVE: "Back Left" */
3571 QT_CHANNEL_BIT_RIGHT_SURROUND = 1<<5, /* WAVE: "Back Right" */
3572 QT_CHANNEL_BIT_LEFT_CENTER = 1<<6,
3573 QT_CHANNEL_BIT_RIGHT_CENTER = 1<<7,
3574 QT_CHANNEL_BIT_CENTER_SURROUND = 1<<8, /* WAVE: "Back Center" */
3575 QT_CHANNEL_BIT_LEFT_SURROUND_DIRECT = 1<<9, /* WAVE: "Side Left" */
3576 QT_CHANNEL_BIT_RIGHT_SURROUND_DIRECT = 1<<10, /* WAVE: "Side Right" */
3577 QT_CHANNEL_BIT_TOP_CENTER_SURROUND = 1<<11,
3578 QT_CHANNEL_BIT_VERTICAL_HEIGHT_LEFT = 1<<12, /* WAVE: "Top Front Left" */
3579 QT_CHANNEL_BIT_VERTICAL_HEIGHT_CENTER = 1<<13, /* WAVE: "Top Front Center" */
3580 QT_CHANNEL_BIT_VERTICAL_HEIGHT_RIGHT = 1<<14, /* WAVE: "Top Front Right" */
3581 QT_CHANNEL_BIT_TOP_BACK_LEFT = 1<<15,
3582 QT_CHANNEL_BIT_TOP_BACK_CENTER = 1<<16,
3583 QT_CHANNEL_BIT_TOP_BACK_RIGHT = 1<<17,
3584 QT_CHANNEL_BIT_FULL = 0x3ffff,
3585 } lsmash_channel_bitmap;
3587 typedef enum
3589 QT_CHANNEL_FLAGS_ALL_OFF = 0,
3590 QT_CHANNEL_FLAGS_RECTANGULAR_COORDINATES = 1,
3591 QT_CHANNEL_FLAGS_SPHERICAL_COORDINATES = 1<<1,
3592 QT_CHANNEL_FLAGS_METERS = 1<<2,
3593 } lsmash_channel_flags;
3595 typedef enum
3597 /* indices for accessing the coordinates array in Channel Descriptions */
3598 /* for rectangulare coordinates */
3599 QT_CHANNEL_COORDINATES_LEFT_RIGHT = 0, /* Negative is left and positive is right. */
3600 QT_CHANNEL_COORDINATES_BACK_FRONT = 1, /* Negative is back and positive is front. */
3601 QT_CHANNEL_COORDINATES_DOWN_UP = 2, /* Negative is below ground level, 0 is ground level, and positive is above ground level. */
3602 /* for spherical coordinates */
3603 QT_CHANNEL_COORDINATES_AZIMUTH = 0, /* 0 is front center, positive is right, negative is left. This is measured in degrees. */
3604 QT_CHANNEL_COORDINATES_ELEVATION = 1, /* +90 is zenith, 0 is horizontal, -90 is nadir. This is measured in degrees. */
3605 QT_CHANNEL_COORDINATES_DISTANCE = 2, /* The units are described by flags. */
3606 } lsmash_channel_coordinates_index;
3608 typedef enum
3610 /* channel abbreviations:
3611 * L - left
3612 * R - right
3613 * C - center
3614 * Ls - left surround
3615 * Rs - right surround
3616 * Cs - center surround
3617 * Rls - rear left surround
3618 * Rrs - rear right surround
3619 * Lw - left wide
3620 * Rw - right wide
3621 * Lsd - left surround direct
3622 * Rsd - right surround direct
3623 * Lc - left center
3624 * Rc - right center
3625 * Ts - top surround
3626 * Vhl - vertical height left
3627 * Vhc - vertical height center
3628 * Vhr - vertical height right
3629 * Lt - left matrix total. for matrix encoded stereo.
3630 * Rt - right matrix total. for matrix encoded stereo. */
3632 /* General layouts */
3633 QT_CHANNEL_LAYOUT_USE_CHANNEL_DESCRIPTIONS = 0, /* use the array of Channel Descriptions to define the mapping. */
3634 QT_CHANNEL_LAYOUT_USE_CHANNEL_BITMAP = 1<<16, /* use the bitmap to define the mapping. */
3636 QT_CHANNEL_LAYOUT_MONO = (100<<16) | 1, /* a standard mono stream */
3637 QT_CHANNEL_LAYOUT_STEREO = (101<<16) | 2, /* a standard stereo stream (L R) - implied playback */
3638 QT_CHANNEL_LAYOUT_STEREO_HEADPHONES = (102<<16) | 2, /* a standard stereo stream (L R) - implied headphone playback */
3639 QT_CHANNEL_LAYOUT_MATRIX_STEREO = (103<<16) | 2, /* a matrix encoded stereo stream (Lt, Rt) */
3640 QT_CHANNEL_LAYOUT_MID_SIDE = (104<<16) | 2, /* mid/side recording */
3641 QT_CHANNEL_LAYOUT_XY = (105<<16) | 2, /* coincident mic pair (often 2 figure 8's) */
3642 QT_CHANNEL_LAYOUT_BINAURAL = (106<<16) | 2, /* binaural stereo (left, right) */
3643 QT_CHANNEL_LAYOUT_AMBISONIC_B_FORMAT = (107<<16) | 4, /* W, X, Y, Z */
3645 QT_CHANNEL_LAYOUT_QUADRAPHONIC = (108<<16) | 4, /* front left, front right, back left, back right */
3647 QT_CHANNEL_LAYOUT_PENTAGONAL = (109<<16) | 5, /* left, right, rear left, rear right, center */
3649 QT_CHANNEL_LAYOUT_HEXAGONAL = (110<<16) | 6, /* left, right, rear left, rear right, center, rear */
3651 QT_CHANNEL_LAYOUT_OCTAGONAL = (111<<16) | 8, /* front left, front right, rear left, rear right,
3652 * front center, rear center, side left, side right */
3654 QT_CHANNEL_LAYOUT_CUBE = (112<<16) | 8, /* left, right, rear left, rear right,
3655 * top left, top right, top rear left, top rear right */
3657 /* MPEG defined layouts */
3658 QT_CHANNEL_LAYOUT_MPEG_1_0 = QT_CHANNEL_LAYOUT_MONO, /* C */
3659 QT_CHANNEL_LAYOUT_MPEG_2_0 = QT_CHANNEL_LAYOUT_STEREO, /* L R */
3660 QT_CHANNEL_LAYOUT_MPEG_3_0_A = (113<<16) | 3, /* L R C */
3661 QT_CHANNEL_LAYOUT_MPEG_3_0_B = (114<<16) | 3, /* C L R */
3662 QT_CHANNEL_LAYOUT_MPEG_4_0_A = (115<<16) | 4, /* L R C Cs */
3663 QT_CHANNEL_LAYOUT_MPEG_4_0_B = (116<<16) | 4, /* C L R Cs */
3664 QT_CHANNEL_LAYOUT_MPEG_5_0_A = (117<<16) | 5, /* L R C Ls Rs */
3665 QT_CHANNEL_LAYOUT_MPEG_5_0_B = (118<<16) | 5, /* L R Ls Rs C */
3666 QT_CHANNEL_LAYOUT_MPEG_5_0_C = (119<<16) | 5, /* L C R Ls Rs */
3667 QT_CHANNEL_LAYOUT_MPEG_5_0_D = (120<<16) | 5, /* C L R Ls Rs */
3668 QT_CHANNEL_LAYOUT_MPEG_5_1_A = (121<<16) | 6, /* L R C LFE Ls Rs */
3669 QT_CHANNEL_LAYOUT_MPEG_5_1_B = (122<<16) | 6, /* L R Ls Rs C LFE */
3670 QT_CHANNEL_LAYOUT_MPEG_5_1_C = (123<<16) | 6, /* L C R Ls Rs LFE */
3671 QT_CHANNEL_LAYOUT_MPEG_5_1_D = (124<<16) | 6, /* C L R Ls Rs LFE */
3672 QT_CHANNEL_LAYOUT_MPEG_6_1_A = (125<<16) | 7, /* L R C LFE Ls Rs Cs */
3673 QT_CHANNEL_LAYOUT_MPEG_7_1_A = (126<<16) | 8, /* L R C LFE Ls Rs Lc Rc */
3674 QT_CHANNEL_LAYOUT_MPEG_7_1_B = (127<<16) | 8, /* C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC Table 3.1) */
3675 QT_CHANNEL_LAYOUT_MPEG_7_1_C = (128<<16) | 8, /* L R C LFE Ls Rs Rls Rrs */
3676 QT_CHANNEL_LAYOUT_EMAGIC_DEFAULT_7_1 = (129<<16) | 8, /* L R Ls Rs C LFE Lc Rc */
3677 QT_CHANNEL_LAYOUT_SMPTE_DTV = (130<<16) | 8, /* L R C LFE Ls Rs Lt Rt */
3679 /* ITU defined layouts */
3680 QT_CHANNEL_LAYOUT_ITU_1_0 = QT_CHANNEL_LAYOUT_MONO, /* C */
3681 QT_CHANNEL_LAYOUT_ITU_2_0 = QT_CHANNEL_LAYOUT_STEREO, /* L R */
3683 QT_CHANNEL_LAYOUT_ITU_2_1 = (131<<16) | 3, /* L R Cs */
3684 QT_CHANNEL_LAYOUT_ITU_2_2 = (132<<16) | 4, /* L R Ls Rs */
3685 QT_CHANNEL_LAYOUT_ITU_3_0 = QT_CHANNEL_LAYOUT_MPEG_3_0_A, /* L R C */
3686 QT_CHANNEL_LAYOUT_ITU_3_1 = QT_CHANNEL_LAYOUT_MPEG_4_0_A, /* L R C Cs */
3688 QT_CHANNEL_LAYOUT_ITU_3_2 = QT_CHANNEL_LAYOUT_MPEG_5_0_A, /* L R C Ls Rs */
3689 QT_CHANNEL_LAYOUT_ITU_3_2_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_A, /* L R C LFE Ls Rs */
3690 QT_CHANNEL_LAYOUT_ITU_3_4_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_C, /* L R C LFE Ls Rs Rls Rrs */
3692 /* DVD defined layouts */
3693 QT_CHANNEL_LAYOUT_DVD_0 = QT_CHANNEL_LAYOUT_MONO, /* C (mono) */
3694 QT_CHANNEL_LAYOUT_DVD_1 = QT_CHANNEL_LAYOUT_STEREO, /* L R */
3695 QT_CHANNEL_LAYOUT_DVD_2 = QT_CHANNEL_LAYOUT_ITU_2_1, /* L R Cs */
3696 QT_CHANNEL_LAYOUT_DVD_3 = QT_CHANNEL_LAYOUT_ITU_2_2, /* L R Ls Rs */
3697 QT_CHANNEL_LAYOUT_DVD_4 = (133<<16) | 3, /* L R LFE */
3698 QT_CHANNEL_LAYOUT_DVD_5 = (134<<16) | 4, /* L R LFE Cs */
3699 QT_CHANNEL_LAYOUT_DVD_6 = (135<<16) | 5, /* L R LFE Ls Rs */
3700 QT_CHANNEL_LAYOUT_DVD_7 = QT_CHANNEL_LAYOUT_MPEG_3_0_A, /* L R C */
3701 QT_CHANNEL_LAYOUT_DVD_8 = QT_CHANNEL_LAYOUT_MPEG_4_0_A, /* L R C Cs */
3702 QT_CHANNEL_LAYOUT_DVD_9 = QT_CHANNEL_LAYOUT_MPEG_5_0_A, /* L R C Ls Rs */
3703 QT_CHANNEL_LAYOUT_DVD_10 = (136<<16) | 4, /* L R C LFE */
3704 QT_CHANNEL_LAYOUT_DVD_11 = (137<<16) | 5, /* L R C LFE Cs */
3705 QT_CHANNEL_LAYOUT_DVD_12 = QT_CHANNEL_LAYOUT_MPEG_5_1_A, /* L R C LFE Ls Rs */
3706 /* 13 through 17 are duplicates of 8 through 12. */
3707 QT_CHANNEL_LAYOUT_DVD_13 = QT_CHANNEL_LAYOUT_DVD_8, /* L R C Cs */
3708 QT_CHANNEL_LAYOUT_DVD_14 = QT_CHANNEL_LAYOUT_DVD_9, /* L R C Ls Rs */
3709 QT_CHANNEL_LAYOUT_DVD_15 = QT_CHANNEL_LAYOUT_DVD_10, /* L R C LFE */
3710 QT_CHANNEL_LAYOUT_DVD_16 = QT_CHANNEL_LAYOUT_DVD_11, /* L R C LFE Cs */
3711 QT_CHANNEL_LAYOUT_DVD_17 = QT_CHANNEL_LAYOUT_DVD_12, /* L R C LFE Ls Rs */
3712 QT_CHANNEL_LAYOUT_DVD_18 = (138<<16) | 5, /* L R Ls Rs LFE */
3713 QT_CHANNEL_LAYOUT_DVD_19 = QT_CHANNEL_LAYOUT_MPEG_5_0_B, /* L R Ls Rs C */
3714 QT_CHANNEL_LAYOUT_DVD_20 = QT_CHANNEL_LAYOUT_MPEG_5_1_B, /* L R Ls Rs C LFE */
3716 /* These are the symmetrical layouts. */
3717 QT_CHANNEL_LAYOUT_AUDIO_UNIT_4 = QT_CHANNEL_LAYOUT_QUADRAPHONIC,
3718 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5 = QT_CHANNEL_LAYOUT_PENTAGONAL,
3719 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6 = QT_CHANNEL_LAYOUT_HEXAGONAL,
3720 QT_CHANNEL_LAYOUT_AUDIO_UNIT_8 = QT_CHANNEL_LAYOUT_OCTAGONAL,
3721 /* These are the surround-based layouts. */
3722 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5_0 = QT_CHANNEL_LAYOUT_MPEG_5_0_B, /* L R Ls Rs C */
3723 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6_0 = (139<<16) | 6, /* L R Ls Rs C Cs */
3724 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_0 = (140<<16) | 7, /* L R Ls Rs C Rls Rrs */
3725 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_0_FRONT = (148<<16) | 7, /* L R Ls Rs C Lc Rc */
3726 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_A, /* L R C LFE Ls Rs */
3727 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6_1 = QT_CHANNEL_LAYOUT_MPEG_6_1_A, /* L R C LFE Ls Rs Cs */
3728 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_C, /* L R C LFE Ls Rs Rls Rrs */
3729 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_1_FRONT = QT_CHANNEL_LAYOUT_MPEG_7_1_A, /* L R C LFE Ls Rs Lc Rc */
3731 QT_CHANNEL_LAYOUT_AAC_3_0 = QT_CHANNEL_LAYOUT_MPEG_3_0_B, /* C L R */
3732 QT_CHANNEL_LAYOUT_AAC_QUADRAPHONIC = QT_CHANNEL_LAYOUT_QUADRAPHONIC, /* L R Ls Rs */
3733 QT_CHANNEL_LAYOUT_AAC_4_0 = QT_CHANNEL_LAYOUT_MPEG_4_0_B, /* C L R Cs */
3734 QT_CHANNEL_LAYOUT_AAC_5_0 = QT_CHANNEL_LAYOUT_MPEG_5_0_D, /* C L R Ls Rs */
3735 QT_CHANNEL_LAYOUT_AAC_5_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_D, /* C L R Ls Rs LFE */
3736 QT_CHANNEL_LAYOUT_AAC_6_0 = (141<<16) | 6, /* C L R Ls Rs Cs */
3737 QT_CHANNEL_LAYOUT_AAC_6_1 = (142<<16) | 7, /* C L R Ls Rs Cs LFE */
3738 QT_CHANNEL_LAYOUT_AAC_7_0 = (143<<16) | 7, /* C L R Ls Rs Rls Rrs */
3739 QT_CHANNEL_LAYOUT_AAC_7_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_B, /* C Lc Rc L R Ls Rs LFE */
3740 QT_CHANNEL_LAYOUT_AAC_OCTAGONAL = (144<<16) | 8, /* C L R Ls Rs Rls Rrs Cs */
3742 QT_CHANNEL_LAYOUT_TMH_10_2_STD = (145<<16) | 16, /* L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2 */
3743 QT_CHANNEL_LAYOUT_TMH_10_2_FULL = (146<<16) | 21, /* TMH_10_2_std plus: Lc Rc HI VI Haptic */
3745 QT_CHANNEL_LAYOUT_AC3_1_0_1 = (149<<16) | 2, /* C LFE */
3746 QT_CHANNEL_LAYOUT_AC3_3_0 = (150<<16) | 3, /* L C R */
3747 QT_CHANNEL_LAYOUT_AC3_3_1 = (151<<16) | 4, /* L C R Cs */
3748 QT_CHANNEL_LAYOUT_AC3_3_0_1 = (152<<16) | 4, /* L C R LFE */
3749 QT_CHANNEL_LAYOUT_AC3_2_1_1 = (153<<16) | 4, /* L R Cs LFE */
3750 QT_CHANNEL_LAYOUT_AC3_3_1_1 = (154<<16) | 5, /* L C R Cs LFE */
3752 QT_CHANNEL_LAYOUT_EAC_6_0_A = (155<<16) | 6, /* L C R Ls Rs Cs */
3753 QT_CHANNEL_LAYOUT_EAC_7_0_A = (156<<16) | 7, /* L C R Ls Rs Rls Rrs */
3755 QT_CHANNEL_LAYOUT_EAC3_6_1_A = (157<<16) | 7, /* L C R Ls Rs LFE Cs */
3756 QT_CHANNEL_LAYOUT_EAC3_6_1_B = (158<<16) | 7, /* L C R Ls Rs LFE Ts */
3757 QT_CHANNEL_LAYOUT_EAC3_6_1_C = (159<<16) | 7, /* L C R Ls Rs LFE Vhc */
3758 QT_CHANNEL_LAYOUT_EAC3_7_1_A = (160<<16) | 8, /* L C R Ls Rs LFE Rls Rrs */
3759 QT_CHANNEL_LAYOUT_EAC3_7_1_B = (161<<16) | 8, /* L C R Ls Rs LFE Lc Rc */
3760 QT_CHANNEL_LAYOUT_EAC3_7_1_C = (162<<16) | 8, /* L C R Ls Rs LFE Lsd Rsd */
3761 QT_CHANNEL_LAYOUT_EAC3_7_1_D = (163<<16) | 8, /* L C R Ls Rs LFE Lw Rw */
3762 QT_CHANNEL_LAYOUT_EAC3_7_1_E = (164<<16) | 8, /* L C R Ls Rs LFE Vhl Vhr */
3764 QT_CHANNEL_LAYOUT_EAC3_7_1_F = (165<<16) | 8, /* L C R Ls Rs LFE Cs Ts */
3765 QT_CHANNEL_LAYOUT_EAC3_7_1_G = (166<<16) | 8, /* L C R Ls Rs LFE Cs Vhc */
3766 QT_CHANNEL_LAYOUT_EAC3_7_1_H = (167<<16) | 8, /* L C R Ls Rs LFE Ts Vhc */
3768 QT_CHANNEL_LAYOUT_DTS_3_1 = (168<<16) | 4, /* C L R LFE */
3769 QT_CHANNEL_LAYOUT_DTS_4_1 = (169<<16) | 5, /* C L R Cs LFE */
3770 QT_CHANNEL_LAYOUT_DTS_6_0_A = (170<<16) | 6, /* Lc Rc L R Ls Rs */
3771 QT_CHANNEL_LAYOUT_DTS_6_0_B = (171<<16) | 6, /* C L R Rls Rrs Ts */
3772 QT_CHANNEL_LAYOUT_DTS_6_0_C = (172<<16) | 6, /* C Cs L R Rls Rrs */
3773 QT_CHANNEL_LAYOUT_DTS_6_1_A = (173<<16) | 7, /* Lc Rc L R Ls Rs LFE */
3774 QT_CHANNEL_LAYOUT_DTS_6_1_B = (174<<16) | 7, /* C L R Rls Rrs Ts LFE */
3775 QT_CHANNEL_LAYOUT_DTS_6_1_C = (175<<16) | 7, /* C Cs L R Rls Rrs LFE */
3776 QT_CHANNEL_LAYOUT_DTS_7_0 = (176<<16) | 7, /* Lc C Rc L R Ls Rs */
3777 QT_CHANNEL_LAYOUT_DTS_7_1 = (177<<16) | 8, /* Lc C Rc L R Ls Rs LFE */
3778 QT_CHANNEL_LAYOUT_DTS_8_0_A = (178<<16) | 8, /* Lc Rc L R Ls Rs Rls Rrs */
3779 QT_CHANNEL_LAYOUT_DTS_8_0_B = (179<<16) | 8, /* Lc C Rc L R Ls Cs Rs */
3780 QT_CHANNEL_LAYOUT_DTS_8_1_A = (180<<16) | 9, /* Lc Rc L R Ls Rs Rls Rrs LFE */
3781 QT_CHANNEL_LAYOUT_DTS_8_1_B = (181<<16) | 9, /* Lc C Rc L R Ls Cs Rs LFE */
3782 QT_CHANNEL_LAYOUT_DTS_6_1_D = (182<<16) | 7, /* C L R Ls Rs LFE Cs */
3784 QT_CHANNEL_LAYOUT_ALAC_MONO = QT_CHANNEL_LAYOUT_MONO, /* C */
3785 QT_CHANNEL_LAYOUT_ALAC_STEREO = QT_CHANNEL_LAYOUT_STEREO, /* L R */
3786 QT_CHANNEL_LAYOUT_ALAC_3_0 = QT_CHANNEL_LAYOUT_MPEG_3_0_B, /* C L R */
3787 QT_CHANNEL_LAYOUT_ALAC_4_0 = QT_CHANNEL_LAYOUT_MPEG_4_0_B, /* C L R Cs */
3788 QT_CHANNEL_LAYOUT_ALAC_5_0 = QT_CHANNEL_LAYOUT_MPEG_5_0_D, /* C L R Ls Rs */
3789 QT_CHANNEL_LAYOUT_ALAC_5_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_D, /* C L R Ls Rs LFE */
3790 QT_CHANNEL_LAYOUT_ALAC_6_1 = QT_CHANNEL_LAYOUT_AAC_6_1, /* C L R Ls Rs Cs LFE */
3791 QT_CHANNEL_LAYOUT_ALAC_7_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_B, /* C Lc Rc L R Ls Rs LFE */
3793 QT_CHANNEL_LAYOUT_DISCRETE_IN_ORDER = 147<<16, /* needs to be ORed with the actual number of channels */
3794 QT_CHANNEL_LAYOUT_UNKNOWN = (signed)0xffff0000, /* needs to be ORed with the actual number of channels */
3795 } lsmash_channel_layout_tag;
3797 typedef struct
3799 lsmash_channel_layout_tag channelLayoutTag; /* channel layout */
3800 lsmash_channel_bitmap channelBitmap; /* Only available when layout_tag is set to QT_CHANNEL_LAYOUT_USE_CHANNEL_BITMAP. */
3801 } lsmash_qt_audio_channel_layout_t;
3803 /* QuickTime Audio Format Specific Flags
3804 * Some values are ignored i.e. as if treated as unspecified when you specify certain CODECs.
3805 * For instance, you specify QT_CODEC_TYPE_SOWT_AUDIO, then all these values are ignored.
3806 * These values are basically used for QT_CODEC_TYPE_LPCM_AUDIO.
3807 * The endiannes value can be used for QT_CODEC_TYPE_FL32_AUDIO, QT_CODEC_TYPE_FL64_AUDIO, QT_CODEC_TYPE_IN24_AUDIO and QT_CODEC_TYPE_IN32_AUDIO. */
3808 typedef enum
3810 QT_AUDIO_FORMAT_FLAG_FLOAT = 1, /* Set for floating point, clear for integer. */
3811 QT_AUDIO_FORMAT_FLAG_BIG_ENDIAN = 1<<1, /* Set for big endian, clear for little endian. */
3812 QT_AUDIO_FORMAT_FLAG_SIGNED_INTEGER = 1<<2, /* Set for signed integer, clear for unsigned integer.
3813 * This is only valid if QT_AUDIO_FORMAT_FLAG_FLOAT is clear. */
3814 QT_AUDIO_FORMAT_FLAG_PACKED = 1<<3, /* Set if the sample bits occupy the entire available bits for the channel,
3815 * clear if they are high or low aligned within the channel. */
3816 QT_AUDIO_FORMAT_FLAG_ALIGNED_HIGH = 1<<4, /* Set if the sample bits are placed into the high bits of the channel, clear for low bit placement.
3817 * This is only valid if QT_AUDIO_FORMAT_FLAG_PACKED is clear. */
3818 QT_AUDIO_FORMAT_FLAG_NON_INTERLEAVED = 1<<5, /* Set if the samples for each channel are located contiguously and the channels are layed out end to end,
3819 * clear if the samples for each frame are layed out contiguously and the frames layed out end to end. */
3820 QT_AUDIO_FORMAT_FLAG_NON_MIXABLE = 1<<6, /* Set to indicate when a format is non-mixable.
3821 * Note that this flag is only used when interacting with the HAL's stream format information.
3822 * It is not a valid flag for any other uses. */
3823 QT_AUDIO_FORMAT_FLAG_ALL_CLEAR = 1<<31, /* Set if all the flags would be clear in order to preserve 0 as the wild card value. */
3825 QT_LPCM_FORMAT_FLAG_FLOAT = QT_AUDIO_FORMAT_FLAG_FLOAT,
3826 QT_LPCM_FORMAT_FLAG_BIG_ENDIAN = QT_AUDIO_FORMAT_FLAG_BIG_ENDIAN,
3827 QT_LPCM_FORMAT_FLAG_SIGNED_INTEGER = QT_AUDIO_FORMAT_FLAG_SIGNED_INTEGER,
3828 QT_LPCM_FORMAT_FLAG_PACKED = QT_AUDIO_FORMAT_FLAG_PACKED,
3829 QT_LPCM_FORMAT_FLAG_ALIGNED_HIGH = QT_AUDIO_FORMAT_FLAG_ALIGNED_HIGH,
3830 QT_LPCM_FORMAT_FLAG_NON_INTERLEAVED = QT_AUDIO_FORMAT_FLAG_NON_INTERLEAVED,
3831 QT_LPCM_FORMAT_FLAG_NON_MIXABLE = QT_AUDIO_FORMAT_FLAG_NON_MIXABLE,
3832 QT_LPCM_FORMAT_FLAG_ALL_CLEAR = QT_AUDIO_FORMAT_FLAG_ALL_CLEAR,
3834 /* These flags are set for Apple Lossless data that was sourced from N bit native endian signed integer data. */
3835 QT_ALAC_FORMAT_FLAG_16BIT_SOURCE_DATA = 1,
3836 QT_ALAC_FORMAT_FLAG_20BIT_SOURCE_DATA = 2,
3837 QT_ALAC_FORMAT_FLAG_24BIT_SOURCE_DATA = 3,
3838 QT_ALAC_FORMAT_FLAG_32BIT_SOURCE_DATA = 4,
3839 } lsmash_qt_audio_format_specific_flag;
3841 typedef struct
3843 lsmash_qt_audio_format_specific_flag format_flags;
3844 } lsmash_qt_audio_format_specific_flags_t;
3846 /* Global Header
3847 * Ut Video inside QuickTime file format requires this extension for storing CODEC specific information. */
3848 typedef struct
3850 uint32_t header_size;
3851 uint8_t *header_data;
3852 } lsmash_codec_global_header_t;
3854 /****************************************************************************
3855 * iTunes Metadata
3856 ****************************************************************************/
3857 typedef enum
3859 /* UTF String type */
3860 ITUNES_METADATA_ITEM_ALBUM_NAME = LSMASH_4CC( 0xA9, 'a', 'l', 'b' ), /* Album Name */
3861 ITUNES_METADATA_ITEM_ARTIST = LSMASH_4CC( 0xA9, 'A', 'R', 'T' ), /* Artist */
3862 ITUNES_METADATA_ITEM_USER_COMMENT = LSMASH_4CC( 0xA9, 'c', 'm', 't' ), /* User Comment */
3863 ITUNES_METADATA_ITEM_RELEASE_DATE = LSMASH_4CC( 0xA9, 'd', 'a', 'y' ), /* YYYY-MM-DD format string (may be incomplete, i.e. only year) */
3864 ITUNES_METADATA_ITEM_ENCODED_BY = LSMASH_4CC( 0xA9, 'e', 'n', 'c' ), /* Person or company that encoded the recording */
3865 ITUNES_METADATA_ITEM_USER_GENRE = LSMASH_4CC( 0xA9, 'g', 'e', 'n' ), /* User Genre user-specified string */
3866 ITUNES_METADATA_ITEM_GROUPING = LSMASH_4CC( 0xA9, 'g', 'r', 'p' ), /* Grouping */
3867 ITUNES_METADATA_ITEM_LYRICS = LSMASH_4CC( 0xA9, 'l', 'y', 'r' ), /* Lyrics */
3868 ITUNES_METADATA_ITEM_TITLE = LSMASH_4CC( 0xA9, 'n', 'a', 'm' ), /* Title / Song Name */
3869 ITUNES_METADATA_ITEM_TRACK_SUBTITLE = LSMASH_4CC( 0xA9, 's', 't', '3' ), /* Track Sub-Title */
3870 ITUNES_METADATA_ITEM_ENCODING_TOOL = LSMASH_4CC( 0xA9, 't', 'o', 'o' ), /* Software which encoded the recording */
3871 ITUNES_METADATA_ITEM_COMPOSER = LSMASH_4CC( 0xA9, 'w', 'r', 't' ), /* Composer */
3872 ITUNES_METADATA_ITEM_ALBUM_ARTIST = LSMASH_4CC( 'a', 'A', 'R', 'T' ), /* Artist for the whole album (if different than the individual tracks) */
3873 ITUNES_METADATA_ITEM_PODCAST_CATEGORY = LSMASH_4CC( 'c', 'a', 't', 'g' ), /* Podcast Category */
3874 ITUNES_METADATA_ITEM_COPYRIGHT = LSMASH_4CC( 'c', 'p', 'r', 't' ), /* Copyright */
3875 ITUNES_METADATA_ITEM_DESCRIPTION = LSMASH_4CC( 'd', 'e', 's', 'c' ), /* Description (limited to 255 bytes) */
3876 ITUNES_METADATA_ITEM_GROUPING_DRAFT = LSMASH_4CC( 'g', 'r', 'u', 'p' ), /* Grouping
3877 * Note: This identifier is defined in
3878 * iTunes Metadata Format Specification (Preliminary draft),
3879 * but not used by iTunes actually it seems.
3880 * We recommend you use ITUNES_METADATA_ITEM_GROUPING instead of this. */
3881 ITUNES_METADATA_ITEM_PODCAST_KEYWORD = LSMASH_4CC( 'k', 'e', 'y', 'w' ), /* Podcast Keywords */
3882 ITUNES_METADATA_ITEM_LONG_DESCRIPTION = LSMASH_4CC( 'l', 'd', 'e', 's' ), /* Long Description */
3883 ITUNES_METADATA_ITEM_PURCHASE_DATE = LSMASH_4CC( 'p', 'u', 'r', 'd' ), /* Purchase Date */
3884 ITUNES_METADATA_ITEM_TV_EPISODE_ID = LSMASH_4CC( 't', 'v', 'e', 'n' ), /* TV Episode ID */
3885 ITUNES_METADATA_ITEM_TV_NETWORK = LSMASH_4CC( 't', 'v', 'n', 'n' ), /* TV Network Name */
3886 ITUNES_METADATA_ITEM_TV_SHOW_NAME = LSMASH_4CC( 't', 'v', 's', 'h' ), /* TV Show Name */
3887 ITUNES_METADATA_ITEM_ITUNES_PURCHASE_ACCOUNT_ID = LSMASH_4CC( 'a', 'p', 'I', 'D' ), /* iTunes Account Used for Purchase */
3888 ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM = LSMASH_4CC( 's', 'o', 'a', 'l' ), /* Sort Album */
3889 ITUNES_METADATA_ITEM_ITUNES_SORT_ARTIST = LSMASH_4CC( 's', 'o', 'a', 'r' ), /* Sort Artist */
3890 ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM_ARTIST = LSMASH_4CC( 's', 'o', 'a', 'a' ), /* Sort Album Artist */
3891 ITUNES_METADATA_ITEM_ITUNES_SORT_COMPOSER = LSMASH_4CC( 's', 'o', 'c', 'o' ), /* Sort Composer */
3892 ITUNES_METADATA_ITEM_ITUNES_SORT_NAME = LSMASH_4CC( 's', 'o', 'n', 'm' ), /* Sort Name */
3893 ITUNES_METADATA_ITEM_ITUNES_SORT_SHOW = LSMASH_4CC( 's', 'o', 's', 'n' ), /* Sort Show */
3895 /* Integer type
3896 * (X): X means length of bytes */
3897 ITUNES_METADATA_ITEM_EPISODE_GLOBAL_ID = LSMASH_4CC( 'e', 'g', 'i', 'd' ), /* (1) Episode Global Unique ID */
3898 ITUNES_METADATA_ITEM_PREDEFINED_GENRE = LSMASH_4CC( 'g', 'n', 'r', 'e' ), /* (2) Pre-defined Genre / Enumerated value from ID3 tag set, plus 1 */
3899 ITUNES_METADATA_ITEM_PODCAST_URL = LSMASH_4CC( 'p', 'u', 'r', 'l' ), /* (?) Podcast URL */
3900 ITUNES_METADATA_ITEM_CONTENT_RATING = LSMASH_4CC( 'r', 't', 'n', 'g' ), /* (1) Content Rating / Does song have explicit content? 0: none, 2: clean, 4: explicit */
3901 ITUNES_METADATA_ITEM_MEDIA_TYPE = LSMASH_4CC( 's', 't', 'i', 'k' ), /* (1) Media Type */
3902 ITUNES_METADATA_ITEM_BEATS_PER_MINUTE = LSMASH_4CC( 't', 'm', 'p', 'o' ), /* (2) Beats Per Minute */
3903 ITUNES_METADATA_ITEM_TV_EPISODE = LSMASH_4CC( 't', 'v', 'e', 's' ), /* (4) TV Episode */
3904 ITUNES_METADATA_ITEM_TV_SEASON = LSMASH_4CC( 't', 'v', 's', 'n' ), /* (4) TV Season */
3905 ITUNES_METADATA_ITEM_ITUNES_ACCOUNT_TYPE = LSMASH_4CC( 'a', 'k', 'I', 'D' ), /* (1) iTunes Account Type / 0: iTunes, 1: AOL */
3906 ITUNES_METADATA_ITEM_ITUNES_ARTIST_ID = LSMASH_4CC( 'a', 't', 'I', 'D' ), /* (4) iTunes Artist ID */
3907 ITUNES_METADATA_ITEM_ITUNES_COMPOSER_ID = LSMASH_4CC( 'c', 'm', 'I', 'D' ), /* (4) iTunes Composer ID */
3908 ITUNES_METADATA_ITEM_ITUNES_CATALOG_ID = LSMASH_4CC( 'c', 'n', 'I', 'D' ), /* (4) iTunes Catalog ID */
3909 ITUNES_METADATA_ITEM_ITUNES_TV_GENRE_ID = LSMASH_4CC( 'g', 'e', 'I', 'D' ), /* (4) iTunes TV Genre ID */
3910 ITUNES_METADATA_ITEM_ITUNES_PLAYLIST_ID = LSMASH_4CC( 'p', 'l', 'I', 'D' ), /* (8) iTunes Playlist ID */
3911 ITUNES_METADATA_ITEM_ITUNES_COUNTRY_CODE = LSMASH_4CC( 's', 'f', 'I', 'D' ), /* (4) iTunes Country Code */
3913 /* Boolean type */
3914 ITUNES_METADATA_ITEM_DISC_COMPILATION = LSMASH_4CC( 'c', 'p', 'i', 'l' ), /* Disc Compilation / Is disc part of a compilation? 0: No, 1: Yes */
3915 ITUNES_METADATA_ITEM_HIGH_DEFINITION_VIDEO = LSMASH_4CC( 'h', 'd', 'v', 'd' ), /* High Definition Video / 0: No, 1: Yes */
3916 ITUNES_METADATA_ITEM_PODCAST = LSMASH_4CC( 'p', 'c', 's', 't' ), /* Podcast / 0: No, 1: Yes */
3917 ITUNES_METADATA_ITEM_GAPLESS_PLAYBACK = LSMASH_4CC( 'p', 'g', 'a', 'p' ), /* Gapless Playback / 0: insert gap, 1: no gap */
3919 /* Binary type */
3920 ITUNES_METADATA_ITEM_COVER_ART = LSMASH_4CC( 'c', 'o', 'v', 'r' ), /* One or more cover art images (JPEG/PNG/BMP data) */
3921 ITUNES_METADATA_ITEM_DISC_NUMBER = LSMASH_4CC( 'd', 'i', 's', 'k' ), /* Disc Number */
3922 ITUNES_METADATA_ITEM_TRACK_NUMBER = LSMASH_4CC( 't', 'r', 'k', 'n' ), /* Track Number */
3924 /* Custom type */
3925 ITUNES_METADATA_ITEM_CUSTOM = LSMASH_4CC( '-', '-', '-', '-' ), /* Custom */
3926 } lsmash_itunes_metadata_item;
3928 typedef enum
3930 ITUNES_METADATA_TYPE_NONE = 0,
3931 ITUNES_METADATA_TYPE_STRING = 1,
3932 ITUNES_METADATA_TYPE_INTEGER = 2,
3933 ITUNES_METADATA_TYPE_BOOLEAN = 3,
3934 ITUNES_METADATA_TYPE_BINARY = 4,
3935 } lsmash_itunes_metadata_type;
3937 typedef enum
3939 ITUNES_METADATA_SUBTYPE_IMPLICIT = 0, /* for use with tags for which no type needs to be indicated because only one type is allowed */
3940 ITUNES_METADATA_SUBTYPE_UTF8 = 1, /* without any count or null terminator */
3941 ITUNES_METADATA_SUBTYPE_UTF16 = 2, /* also known as UTF-16BE */
3942 ITUNES_METADATA_SUBTYPE_SJIS = 3, /* deprecated unless it is needed for special Japanese characters */
3943 ITUNES_METADATA_SUBTYPE_HTML = 6, /* the HTML file header specifies which HTML version */
3944 ITUNES_METADATA_SUBTYPE_XML = 7, /* the XML header must identify the DTD or schemas */
3945 ITUNES_METADATA_SUBTYPE_UUID = 8, /* also known as GUID; stored as 16 bytes in binary (valid as an ID) */
3946 ITUNES_METADATA_SUBTYPE_ISRC = 9, /* stored as UTF-8 text (valid as an ID) */
3947 ITUNES_METADATA_SUBTYPE_MI3P = 10, /* stored as UTF-8 text (valid as an ID) */
3948 ITUNES_METADATA_SUBTYPE_GIF = 12, /* (deprecated) a GIF image */
3949 ITUNES_METADATA_SUBTYPE_JPEG = 13, /* in a JFIF wrapper */
3950 ITUNES_METADATA_SUBTYPE_PNG = 14, /* in a PNG wrapper */
3951 ITUNES_METADATA_SUBTYPE_URL = 15, /* absolute, in UTF-8 characters */
3952 ITUNES_METADATA_SUBTYPE_DURATION = 16, /* in milliseconds, a 32-bit integer */
3953 ITUNES_METADATA_SUBTYPE_TIME = 17, /* in UTC, counting seconds since midnight on 1 January, 1904; 32 or 64 bits */
3954 ITUNES_METADATA_SUBTYPE_GENRES = 18, /* a list of values from the enumerated set */
3955 ITUNES_METADATA_SUBTYPE_INTEGER = 21, /* A signed big-endian integer in 1,2,3,4 or 8 bytes */
3956 ITUNES_METADATA_SUBTYPE_RIAAPA = 24, /* RIAA Parental advisory; -1=no, 1=yes, 0=unspecified. 8-bit integer */
3957 ITUNES_METADATA_SUBTYPE_UPC = 25, /* Universal Product Code, in text UTF-8 format (valid as an ID) */
3958 ITUNES_METADATA_SUBTYPE_BMP = 27, /* Windows bitmap format graphics */
3959 } lsmash_itunes_metadata_subtype;
3961 typedef union
3963 char *string; /* for ITUNES_METADATA_TYPE_STRING (UTF-8 string) */
3964 uint64_t integer; /* for ITUNES_METADATA_TYPE_INTEGER */
3965 lsmash_boolean_t boolean; /* for ITUNES_METADATA_TYPE_BOOLEAN */
3966 /* for ITUNES_METADATA_TYPE_BINARY */
3967 struct
3969 lsmash_itunes_metadata_subtype subtype;
3970 uint32_t size;
3971 uint8_t *data;
3972 } binary;
3973 } lsmash_itunes_metadata_value_t;
3975 typedef struct
3977 /* When 'item' is specified as ITUNES_METADATA_ITEM_CUSTOM, 'type' and 'meaning' is mandatory while 'name' is optionally valid.
3978 * Otherwise 'type', 'meaning' and 'name' are just ignored. 'value' is always mandatory. */
3979 lsmash_itunes_metadata_item item;
3980 lsmash_itunes_metadata_type type;
3981 lsmash_itunes_metadata_value_t value;
3982 char *meaning;
3983 char *name;
3984 } lsmash_itunes_metadata_t;
3986 /* Append an iTunes metadata to a movie.
3988 * Return 0 if successful.
3989 * Return a negative value otherwise. */
3990 int lsmash_set_itunes_metadata
3992 lsmash_root_t *root,
3993 lsmash_itunes_metadata_t metadata
3996 /* Count the number of iTunes metadata in a movie.
3998 * Return the number of iTunes metadata in a movie if successful.
3999 * Return 0 otherwise. */
4000 uint32_t lsmash_count_itunes_metadata
4002 lsmash_root_t *root
4005 /* Get an iTunes metadata in a movie.
4006 * String and/or binary fields in 'metadata' are allocated if successful.
4007 * You can deallocate the allocated fields by lsmash_free().
4008 * Also you can deallocate all of the allocated fields by lsmash_cleanup_itunes_metadata() at a time.
4010 * Return 0 if successful.
4011 * Return a negative value otherwise. */
4012 int lsmash_get_itunes_metadata
4014 lsmash_root_t *root,
4015 uint32_t metadata_number,
4016 lsmash_itunes_metadata_t *metadata
4019 /* Deallocate all of allocated fields in a given iTunes metadata at a time.
4020 * The deallocated fields are set to NULL.
4021 * Note: the given iTunes metadata itself is NOT deallocated by this function. */
4022 void lsmash_cleanup_itunes_metadata
4024 lsmash_itunes_metadata_t *metadata
4027 /****************************************************************************
4028 * Others
4029 ****************************************************************************/
4030 /* Set a copyright declaration to a track.
4031 * track_ID == 0 means copyright declaration applies to the entire presentation, not an entire track.
4033 * Return 0 if successful.
4034 * Return a negative value otherwise. */
4035 int lsmash_set_copyright
4037 lsmash_root_t *root,
4038 uint32_t track_ID,
4039 uint16_t ISO_language,
4040 char *notice
4043 int lsmash_create_object_descriptor
4045 lsmash_root_t *root
4048 #ifdef _WIN32
4049 /* Convert string encoded by ACP (ANSI CODE PAGE) to UTF-8.
4051 * Return the size of converted string (bytes) if successful.
4052 * Return 0 otherwise. */
4053 int lsmash_convert_ansi_to_utf8
4055 const char *string_ansi, /* string encoded by ACP */
4056 char *string_utf8, /* buffer for converted string from ACP */
4057 int max_length /* size of 'string_utf8' */
4059 #endif
4061 #undef PRIVATE
4063 #endif