1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2010-2017 L-SMASH project
6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *****************************************************************************/
21 /* This file is available under an ISC license. */
33 #define PRIVATE /* If this declaration is placed at a variable, any user shall NOT use it. */
35 /**************************************************************************************
36 * Handle windows dll imports. The user must define this before including this header.
37 **************************************************************************************/
38 #ifdef LSMASH_API_IMPORTS
39 #define LSMASH_API __declspec(dllimport)
44 #define LSMASH_4CC( a, b, c, d ) (((a)<<24) | ((b)<<16) | ((c)<<8) | (d))
46 /****************************************************************************
48 ****************************************************************************/
49 #define LSMASH_VERSION_MAJOR 2
50 #define LSMASH_VERSION_MINOR 15
51 #define LSMASH_VERSION_MICRO 0
53 #define LSMASH_VERSION_INT( a, b, c ) (((a) << 16) | ((b) << 8) | (c))
55 #define LIBLSMASH_VERSION_INT LSMASH_VERSION_INT( LSMASH_VERSION_MAJOR, \
56 LSMASH_VERSION_MINOR, \
57 LSMASH_VERSION_MICRO )
59 /****************************************************************************
61 ****************************************************************************/
64 LSMASH_ERR_NAMELESS
= -1, /* An error but not assigned to any following errors */
65 LSMASH_ERR_MEMORY_ALLOC
= -2, /* There is not enough room in the heap. */
66 LSMASH_ERR_INVALID_DATA
= -3, /* Invalid data was found. */
67 LSMASH_ERR_FUNCTION_PARAM
= -4, /* An error in the parameter list of the function */
68 LSMASH_ERR_PATCH_WELCOME
= -5, /* Not implemented yet, so patches welcome. */
69 LSMASH_ERR_UNKNOWN
= -6, /* Unknown error occured. */
70 LSMASH_ERR_IO
= -7, /* I/O error occurred. */
73 /****************************************************************************
75 * The top-level opaque handler for whole file handling.
76 ****************************************************************************/
77 typedef struct lsmash_root_tag lsmash_root_t
;
80 * The allocated ROOT can be deallocate by lsmash_destroy_root().
82 * Return the address of an allocated ROOT if successful.
83 * Return NULL otherwise. */
84 lsmash_root_t
*lsmash_create_root
89 /* Deallocate a given ROOT. */
90 void lsmash_destroy_root
92 lsmash_root_t
*root
/* the address of a ROOT you want to deallocate */
95 /****************************************************************************
97 ****************************************************************************/
98 typedef struct lsmash_file_tag lsmash_file_t
;
102 LSMASH_FILE_MODE_WRITE
= 1, /* output/muxing */
103 LSMASH_FILE_MODE_READ
= 1<<1, /* input/demuxing */
104 LSMASH_FILE_MODE_FRAGMENTED
= 1<<2, /* movie fragments */
105 LSMASH_FILE_MODE_DUMP
= 1<<3,
106 LSMASH_FILE_MODE_BOX
= 1<<4, /* box structure */
107 LSMASH_FILE_MODE_INITIALIZATION
= 1<<5, /* movie sample table */
108 LSMASH_FILE_MODE_MEDIA
= 1<<6, /* media data */
109 LSMASH_FILE_MODE_INDEX
= 1<<7,
110 LSMASH_FILE_MODE_SEGMENT
= 1<<8, /* segment */
111 LSMASH_FILE_MODE_WRITE_FRAGMENTED
= LSMASH_FILE_MODE_WRITE
| LSMASH_FILE_MODE_FRAGMENTED
, /* deprecated */
116 ISOM_BRAND_TYPE_3G2A
= LSMASH_4CC( '3', 'g', '2', 'a' ), /* 3GPP2 */
117 ISOM_BRAND_TYPE_3GE6
= LSMASH_4CC( '3', 'g', 'e', '6' ), /* 3GPP Release 6 Extended Presentation Profile */
118 ISOM_BRAND_TYPE_3GE9
= LSMASH_4CC( '3', 'g', 'e', '9' ), /* 3GPP Release 9 Extended Presentation Profile */
119 ISOM_BRAND_TYPE_3GF9
= LSMASH_4CC( '3', 'g', 'f', '9' ), /* 3GPP Release 9 File-delivery Server Profile */
120 ISOM_BRAND_TYPE_3GG6
= LSMASH_4CC( '3', 'g', 'g', '6' ), /* 3GPP Release 6 General Profile */
121 ISOM_BRAND_TYPE_3GG9
= LSMASH_4CC( '3', 'g', 'g', '9' ), /* 3GPP Release 9 General Profile */
122 ISOM_BRAND_TYPE_3GH9
= LSMASH_4CC( '3', 'g', 'h', '9' ), /* 3GPP Release 9 Adaptive Streaming Profile */
123 ISOM_BRAND_TYPE_3GM9
= LSMASH_4CC( '3', 'g', 'm', '9' ), /* 3GPP Release 9 Media Segment Profile */
124 ISOM_BRAND_TYPE_3GP4
= LSMASH_4CC( '3', 'g', 'p', '4' ), /* 3GPP Release 4 */
125 ISOM_BRAND_TYPE_3GP5
= LSMASH_4CC( '3', 'g', 'p', '5' ), /* 3GPP Release 5 */
126 ISOM_BRAND_TYPE_3GP6
= LSMASH_4CC( '3', 'g', 'p', '6' ), /* 3GPP Release 6 Basic Profile */
127 ISOM_BRAND_TYPE_3GP7
= LSMASH_4CC( '3', 'g', 'p', '7' ), /* 3GPP Release 7 */
128 ISOM_BRAND_TYPE_3GP8
= LSMASH_4CC( '3', 'g', 'p', '8' ), /* 3GPP Release 8 */
129 ISOM_BRAND_TYPE_3GP9
= LSMASH_4CC( '3', 'g', 'p', '9' ), /* 3GPP Release 9 Basic Profile */
130 ISOM_BRAND_TYPE_3GR6
= LSMASH_4CC( '3', 'g', 'r', '6' ), /* 3GPP Release 6 Progressive Download Profile */
131 ISOM_BRAND_TYPE_3GR9
= LSMASH_4CC( '3', 'g', 'r', '9' ), /* 3GPP Release 9 Progressive Download Profile */
132 ISOM_BRAND_TYPE_3GS6
= LSMASH_4CC( '3', 'g', 's', '6' ), /* 3GPP Release 6 Streaming Server Profile */
133 ISOM_BRAND_TYPE_3GS9
= LSMASH_4CC( '3', 'g', 's', '9' ), /* 3GPP Release 9 Streaming Server Profile */
134 ISOM_BRAND_TYPE_3GT9
= LSMASH_4CC( '3', 'g', 't', '9' ), /* 3GPP Release 9 Media Stream Recording Profile */
135 ISOM_BRAND_TYPE_ARRI
= LSMASH_4CC( 'A', 'R', 'R', 'I' ), /* ARRI Digital Camera */
136 ISOM_BRAND_TYPE_CAEP
= LSMASH_4CC( 'C', 'A', 'E', 'P' ), /* Canon Digital Camera */
137 ISOM_BRAND_TYPE_CDES
= LSMASH_4CC( 'C', 'D', 'e', 's' ), /* Convergent Designs */
138 ISOM_BRAND_TYPE_LCAG
= LSMASH_4CC( 'L', 'C', 'A', 'G' ), /* Leica digital camera */
139 ISOM_BRAND_TYPE_M4A
= LSMASH_4CC( 'M', '4', 'A', ' ' ), /* iTunes MPEG-4 audio protected or not */
140 ISOM_BRAND_TYPE_M4B
= LSMASH_4CC( 'M', '4', 'B', ' ' ), /* iTunes AudioBook protected or not */
141 ISOM_BRAND_TYPE_M4P
= LSMASH_4CC( 'M', '4', 'P', ' ' ), /* MPEG-4 protected audio */
142 ISOM_BRAND_TYPE_M4V
= LSMASH_4CC( 'M', '4', 'V', ' ' ), /* MPEG-4 protected audio+video */
143 ISOM_BRAND_TYPE_MFSM
= LSMASH_4CC( 'M', 'F', 'S', 'M' ), /* Media File for Samsung video Metadata */
144 ISOM_BRAND_TYPE_MPPI
= LSMASH_4CC( 'M', 'P', 'P', 'I' ), /* Photo Player Multimedia Application Format */
145 ISOM_BRAND_TYPE_ROSS
= LSMASH_4CC( 'R', 'O', 'S', 'S' ), /* Ross Video */
146 ISOM_BRAND_TYPE_AVC1
= LSMASH_4CC( 'a', 'v', 'c', '1' ), /* Advanced Video Coding extensions */
147 ISOM_BRAND_TYPE_BBXM
= LSMASH_4CC( 'b', 'b', 'x', 'm' ), /* Blinkbox Master File */
148 ISOM_BRAND_TYPE_CAQV
= LSMASH_4CC( 'c', 'a', 'q', 'v' ), /* Casio Digital Camera */
149 ISOM_BRAND_TYPE_CCFF
= LSMASH_4CC( 'c', 'c', 'f', 'f' ), /* Common container file format */
150 ISOM_BRAND_TYPE_DA0A
= LSMASH_4CC( 'd', 'a', '0', 'a' ), /* DMB AF */
151 ISOM_BRAND_TYPE_DA0B
= LSMASH_4CC( 'd', 'a', '0', 'b' ), /* DMB AF */
152 ISOM_BRAND_TYPE_DA1A
= LSMASH_4CC( 'd', 'a', '1', 'a' ), /* DMB AF */
153 ISOM_BRAND_TYPE_DA1B
= LSMASH_4CC( 'd', 'a', '1', 'b' ), /* DMB AF */
154 ISOM_BRAND_TYPE_DA2A
= LSMASH_4CC( 'd', 'a', '2', 'a' ), /* DMB AF */
155 ISOM_BRAND_TYPE_DA2B
= LSMASH_4CC( 'd', 'a', '2', 'b' ), /* DMB AF */
156 ISOM_BRAND_TYPE_DA3A
= LSMASH_4CC( 'd', 'a', '3', 'a' ), /* DMB AF */
157 ISOM_BRAND_TYPE_DA3B
= LSMASH_4CC( 'd', 'a', '3', 'b' ), /* DMB AF */
158 ISOM_BRAND_TYPE_DASH
= LSMASH_4CC( 'd', 'a', 's', 'h' ), /* Indexed self-initializing Media Segment */
159 ISOM_BRAND_TYPE_DBY1
= LSMASH_4CC( 'd', 'b', 'y', '1' ), /* MP4 files with Dolby content */
160 ISOM_BRAND_TYPE_DMB1
= LSMASH_4CC( 'd', 'm', 'b', '1' ), /* DMB AF */
161 ISOM_BRAND_TYPE_DSMS
= LSMASH_4CC( 'd', 's', 'm', 's' ), /* Self-initializing Media Segment */
162 ISOM_BRAND_TYPE_DV1A
= LSMASH_4CC( 'd', 'v', '1', 'a' ), /* DMB AF */
163 ISOM_BRAND_TYPE_DV1B
= LSMASH_4CC( 'd', 'v', '1', 'b' ), /* DMB AF */
164 ISOM_BRAND_TYPE_DV2A
= LSMASH_4CC( 'd', 'v', '2', 'a' ), /* DMB AF */
165 ISOM_BRAND_TYPE_DV2B
= LSMASH_4CC( 'd', 'v', '2', 'b' ), /* DMB AF */
166 ISOM_BRAND_TYPE_DV3A
= LSMASH_4CC( 'd', 'v', '3', 'a' ), /* DMB AF */
167 ISOM_BRAND_TYPE_DV3B
= LSMASH_4CC( 'd', 'v', '3', 'b' ), /* DMB AF */
168 ISOM_BRAND_TYPE_DVR1
= LSMASH_4CC( 'd', 'v', 'r', '1' ), /* DVB RTP */
169 ISOM_BRAND_TYPE_DVT1
= LSMASH_4CC( 'd', 'v', 't', '1' ), /* DVB Transport Stream */
170 ISOM_BRAND_TYPE_IFRM
= LSMASH_4CC( 'i', 'f', 'r', 'm' ), /* Apple iFrame */
171 ISOM_BRAND_TYPE_ISC2
= LSMASH_4CC( 'i', 's', 'c', '2' ), /* Files encrypted according to ISMACryp 2.0 */
172 ISOM_BRAND_TYPE_ISO2
= LSMASH_4CC( 'i', 's', 'o', '2' ), /* ISO Base Media file format version 2 */
173 ISOM_BRAND_TYPE_ISO3
= LSMASH_4CC( 'i', 's', 'o', '3' ), /* ISO Base Media file format version 3 */
174 ISOM_BRAND_TYPE_ISO4
= LSMASH_4CC( 'i', 's', 'o', '4' ), /* ISO Base Media file format version 4 */
175 ISOM_BRAND_TYPE_ISO5
= LSMASH_4CC( 'i', 's', 'o', '5' ), /* ISO Base Media file format version 5 */
176 ISOM_BRAND_TYPE_ISO6
= LSMASH_4CC( 'i', 's', 'o', '6' ), /* ISO Base Media file format version 6 */
177 ISOM_BRAND_TYPE_ISO7
= LSMASH_4CC( 'i', 's', 'o', '7' ), /* ISO Base Media file format version 7 */
178 ISOM_BRAND_TYPE_ISOM
= LSMASH_4CC( 'i', 's', 'o', 'm' ), /* ISO Base Media file format version 1 */
179 ISOM_BRAND_TYPE_JPSI
= LSMASH_4CC( 'j', 'p', 's', 'i' ), /* The JPSearch data interchange format */
180 ISOM_BRAND_TYPE_LMSG
= LSMASH_4CC( 'l', 'm', 's', 'g' ), /* last Media Segment indicator */
181 ISOM_BRAND_TYPE_MJ2S
= LSMASH_4CC( 'm', 'j', '2', 's' ), /* Motion JPEG 2000 simple profile */
182 ISOM_BRAND_TYPE_MJP2
= LSMASH_4CC( 'm', 'j', 'p', '2' ), /* Motion JPEG 2000, general profile */
183 ISOM_BRAND_TYPE_MP21
= LSMASH_4CC( 'm', 'p', '2', '1' ), /* MPEG-21 */
184 ISOM_BRAND_TYPE_MP41
= LSMASH_4CC( 'm', 'p', '4', '1' ), /* MP4 version 1 */
185 ISOM_BRAND_TYPE_MP42
= LSMASH_4CC( 'm', 'p', '4', '2' ), /* MP4 version 2 */
186 ISOM_BRAND_TYPE_MP71
= LSMASH_4CC( 'm', 'p', '7', '1' ), /* MPEG-7 file-level metadata */
187 ISOM_BRAND_TYPE_MSDH
= LSMASH_4CC( 'm', 's', 'd', 'h' ), /* Media Segment */
188 ISOM_BRAND_TYPE_MSIX
= LSMASH_4CC( 'm', 's', 'i', 'x' ), /* Indexed Media Segment */
189 ISOM_BRAND_TYPE_NIKO
= LSMASH_4CC( 'n', 'i', 'k', 'o' ), /* Nikon Digital Camera */
190 ISOM_BRAND_TYPE_ODCF
= LSMASH_4CC( 'o', 'd', 'c', 'f' ), /* OMA DCF */
191 ISOM_BRAND_TYPE_OPF2
= LSMASH_4CC( 'o', 'p', 'f', '2' ), /* OMA PDCF */
192 ISOM_BRAND_TYPE_OPX2
= LSMASH_4CC( 'o', 'p', 'x', '2' ), /* OMA Adapted PDCF */
193 ISOM_BRAND_TYPE_PANA
= LSMASH_4CC( 'p', 'a', 'n', 'a' ), /* Panasonic Digital Camera */
194 ISOM_BRAND_TYPE_PIFF
= LSMASH_4CC( 'p', 'i', 'f', 'f' ), /* Protected Interoperable File Format */
195 ISOM_BRAND_TYPE_PNVI
= LSMASH_4CC( 'p', 'n', 'v', 'i' ), /* Panasonic Video Intercom */
196 ISOM_BRAND_TYPE_QT
= LSMASH_4CC( 'q', 't', ' ', ' ' ), /* QuickTime file format */
197 ISOM_BRAND_TYPE_RISX
= LSMASH_4CC( 'r', 'i', 's', 'x' ), /* Representation Index Segment */
198 ISOM_BRAND_TYPE_SDV
= LSMASH_4CC( 's', 'd', 'v', ' ' ), /* SD Video */
199 ISOM_BRAND_TYPE_SIMS
= LSMASH_4CC( 's', 'i', 'm', 's' ), /* Sub-Indexed Media Segment */
200 ISOM_BRAND_TYPE_SISX
= LSMASH_4CC( 's', 'i', 's', 'x' ), /* Single Index Segment */
201 ISOM_BRAND_TYPE_SSSS
= LSMASH_4CC( 's', 's', 's', 's' ), /* Subsegment Index Segment */
206 lsmash_file_mode mode
; /* file modes */
207 /** custom I/O stuff **/
208 void *opaque
; /* custom I/O opaque handler used for the following callback functions */
209 /* Attempt to read up to 'size' bytes from the file referenced by 'opaque' into the buffer starting at 'buf'.
211 * Return the number of bytes read if successful.
212 * Return 0 if no more read.
213 * Return a negative value otherwise. */
220 /* Write up to 'size' bytes to the file referenced by 'opaque' from the buffer starting at 'buf'.
222 * Return the number of bytes written if successful.
223 * Return a negative value otherwise. */
230 /* Change the location of the read/write pointer of 'opaque'.
231 * The offset of the pointer is determined according to the directive 'whence' as follows:
232 * If 'whence' is set to SEEK_SET, the offset is set to 'offset' bytes.
233 * If 'whence' is set to SEEK_CUR, the offset is set to its current location plus 'offset' bytes.
234 * If 'whence' is set to SEEK_END, the offset is set to the size of the file plus 'offset' bytes.
236 * Return the resulting offset of the location in bytes from the beginning of the file if successful.
237 * Return a negative value otherwise. */
244 /** file types or segment types **/
245 lsmash_brand_type major_brand
; /* the best used brand */
246 lsmash_brand_type
*brands
; /* the list of compatible brands */
247 uint32_t brand_count
; /* the number of compatible brands used in the file */
248 uint32_t minor_version
; /* minor version of the best used brand
249 * minor_version is informative only i.e. not specifying requirements but merely providing information.
250 * It must not be used to determine the conformance of a file to a standard. */
252 double max_chunk_duration
; /* max duration per chunk in seconds. 0.5 is default value. */
253 double max_async_tolerance
; /* max tolerance, in seconds, for amount of interleaving asynchronization between tracks.
254 * 2.0 is default value. At least twice of max_chunk_duration is used. */
255 uint64_t max_chunk_size
; /* max size per chunk in bytes. 4*1024*1024 (4MiB) is default value. */
256 /** demuxing only **/
257 uint64_t max_read_size
; /* max size of reading from the file at a time. 4*1024*1024 (4MiB) is default value. */
258 } lsmash_file_parameters_t
;
260 typedef int (*lsmash_adhoc_remux_callback
)( void *param
, uint64_t done
, uint64_t total
);
263 uint64_t buffer_size
;
264 lsmash_adhoc_remux_callback func
;
266 } lsmash_adhoc_remux_t
;
268 /* Open a file where the path is given.
269 * And if successful, set up the parameters by 'open_mode'.
270 * Here, the 'open_mode' parameter is either 0 or 1 as follows:
271 * 0: Create a file for output/muxing operations.
272 * If a file with the same name already exists, its contents are discarded and the file is treated as a new file.
273 * If user specifies "-" for 'filename', operations are done on stdout.
274 * The file types or segment types are set up as specified in 'param'.
275 * 1: Open a file for input/demuxing operations. The file must exist.
276 * If user specifies "-" for 'filename', operations are done on stdin.
278 * This function sets up file modes minimally.
279 * User can add additional modes and/or remove modes already set later.
280 * The other parameters except for the custom I/O stuff are set to a default.
281 * User shall not touch the custom I/O stuff for the opened file if using this function.
283 * The opened file can be closed by lsmash_close_file().
286 * 'filename' must be encoded by UTF-8 if 'open_mode' is equal to 0.
287 * On Windows, lsmash_convert_ansi_to_utf8() may help you.
289 * Return 0 if successful.
290 * Return a negative value otherwise. */
293 const char *filename
,
295 lsmash_file_parameters_t
*param
298 /* Close a file opened by lsmash_open_file().
300 * Return 0 if successful.
301 * Return a negative value otherwise. */
302 int lsmash_close_file
304 lsmash_file_parameters_t
*param
307 /* Associate a file with a ROOT and allocate the handle of that file.
308 * The all allocated handles can be deallocated by lsmash_destroy_root().
309 * If the ROOT has no associated file yet, the first associated file is activated.
311 * Return the address of the allocated handle of the added file if successful.
312 * Return NULL otherwise. */
313 lsmash_file_t
*lsmash_set_file
316 lsmash_file_parameters_t
*param
319 /* Read whole boxes in a given file.
320 * You can also get file modes and file types or segment types by this function.
322 * Return the file size (if seekable) or 0 if successful.
323 * Return a negative value otherwise. */
324 int64_t lsmash_read_file
327 lsmash_file_parameters_t
*param
330 /* Deallocate all boxes within the current active file in a given ROOT. */
331 void lsmash_discard_boxes
333 lsmash_root_t
*root
/* the address of a ROOT you want to deallocate all boxes within the active file in it */
336 /* Activate a file associated with a ROOT.
338 * Return 0 if successful.
339 * Return a negative value otherwise. */
340 int lsmash_activate_file
346 /* Switch from the current segment file to the following media segment file.
347 * After switching, the followed segment file can be closed unless that file is an initialization segment.
349 * The first followed segment file must be also an initialization segment.
350 * The second or later segment files must not be an initialization segment.
351 * For media segment files flagging LSMASH_FILE_MODE_INDEX, 'remux' must be set.
353 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function.
355 * Return 0 if successful.
356 * Return a negative value otherwise. */
357 int lsmash_switch_media_segment
360 lsmash_file_t
*successor
,
361 lsmash_adhoc_remux_t
*remux
364 /****************************************************************************
366 ****************************************************************************/
370 uint32_t n
; /* numerator */
371 uint32_t d
; /* denominator */
372 } lsmash_rational_u32_t
;
376 int32_t n
; /* numerator */
377 uint32_t d
; /* denominator */
378 } lsmash_rational_s32_t
;
382 LSMASH_BOOLEAN_FALSE
= 0,
383 LSMASH_BOOLEAN_TRUE
= 1
386 /****************************************************************************
388 ****************************************************************************/
389 /* Allocate a memory block.
390 * The allocated memory block can be deallocate by lsmash_free().
392 * Return the address to the beginning of a memory block if successful.
393 * Return NULL otherwise. */
396 size_t size
/* size of a memory block, in bytes */
399 /* Allocate a memory block.
400 * The allocated memory block shall be initialized to all bits 0.
401 * The allocated memory block can be deallocate by lsmash_free().
403 * Return the address to the beginning of a memory block if successful.
404 * Return NULL otherwise. */
405 void *lsmash_malloc_zero
407 size_t size
/* size of a memory block, in bytes */
410 /* Reallocate a memory block.
411 * The reallocated memory block can be deallocate by lsmash_free().
412 * If this function succeed, the given memory block is deallocated and the address is invalid.
413 * If this function fails, the address to the given memory block is still valid and the memory block is unchanged.
415 * Return the address to the beginning of a memory block if successful.
416 * Return NULL otherwise. */
419 void *ptr
, /* an address to a memory block previously allocated with
420 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup()
421 * Alternatively, NULL makes this function to allocate a new memory block. */
422 size_t size
/* size of a memory block, in bytes */
425 /* Allocate a memory block and copy all bits from a given memory block.
426 * The allocated memory block can be deallocate by lsmash_free().
428 * Return the address to the beginning of an allocated memory block if successful.
429 * Return NULL otherwise. */
432 const void *ptr
, /* an address to the source of data to be copied */
433 size_t size
/* number of bytes to copy */
436 /* Deallocate a given memory block.
437 * If the given address to a memory block is NULL, this function does nothing. */
440 void *ptr
/* an address to a memory block previously allocated with
441 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup() */
444 /* Deallocate a given memory block.
445 * If the given address to a memory block is NULL, this function does nothing.
446 * Set NULL to the pointer to the memory block after deallocating.
448 * As an example of usage.
449 * Let's say you allocate a memory block and set the address to the beginning of it to the pointer 'ptr'.
450 * You can deallocate the memory block and set NULL to 'ptr' by lsmash_freep( &ptr ).
454 void *ptrptr
/* the address to a pointer to a memory block previously allocated with
455 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup() */
458 /****************************************************************************
460 ****************************************************************************/
461 typedef struct lsmash_box_tag lsmash_box_t
;
462 typedef uint32_t lsmash_compact_box_type_t
;
464 /* An UUID structure for extended box type */
467 uint32_t fourcc
; /* four characters codes that identify extended box type partially
468 * If the box is not a UUID box, this field shall be the same as the box type.
469 * Note: characters in this field aren't always printable. */
470 uint8_t id
[12]; /* If the box is not a UUID box, this field shall be set to 12-byte ISO reserved value
471 * { 0x00, 0x11, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 }
472 * and shall not be written into the stream together with above-defined four characters codes.
473 * As an exception, we could set the value
474 * { 0x0F, 0x11, 0x4D, 0xA5, 0xBF, 0x4E, 0xF2, 0xC4, 0x8C, 0x6A, 0xA1, 0x1E }
475 * to indicate the box is derived from QuickTime file format. */
476 } lsmash_extended_box_type_t
;
480 lsmash_compact_box_type_t fourcc
; /* four characters codes that identify box type
481 * Note: characters in this field aren't always printable. */
482 lsmash_extended_box_type_t user
; /* Universal Unique IDentifier, i.e. UUID */
483 /* If 'fourcc' doesn't equal 'uuid', ignore this field. */
488 lsmash_box_type_t type
; /* box type */
489 uint32_t number
; /* the number of box in ascending order excluding boxes unspecified by 'type' within
490 * the same level of the box nested structure. */
493 #define LSMASH_BOX_TYPE_INITIALIZER { 0x00000000, { 0x00000000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }
494 #define LSMASH_BOX_TYPE_UNSPECIFIED static_lsmash_box_type_unspecified
495 LSMASH_API
extern const lsmash_box_type_t static_lsmash_box_type_unspecified
;
497 /* Return extended box type that consists of combination of given FourCC and 12-byte ID. */
498 lsmash_extended_box_type_t lsmash_form_extended_box_type
504 /* Return box type that consists of combination of given compact and extended box type. */
505 lsmash_box_type_t lsmash_form_box_type
507 lsmash_compact_box_type_t type
,
508 lsmash_extended_box_type_t user
511 #define LSMASH_ISO_BOX_TYPE_INITIALIZER( x ) { x, { x, { 0x00, 0x11, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 } } }
512 #define LSMASH_QTFF_BOX_TYPE_INITIALIZER( x ) { x, { x, { 0x0F, 0x11, 0x4D, 0xA5, 0xBF, 0x4E, 0xF2, 0xC4, 0x8C, 0x6A, 0xA1, 0x1E } } }
513 lsmash_box_type_t lsmash_form_iso_box_type
515 lsmash_compact_box_type_t type
518 lsmash_box_type_t lsmash_form_qtff_box_type
520 lsmash_compact_box_type_t type
523 /* precedence of the box position
524 * Box with higher value will precede physically other boxes with lower one.
525 * The lower 32-bits are intended to determine order of boxes with the same box type. */
526 #define LSMASH_BOX_PRECEDENCE_L 0x0000000000800000ULL /* Lowest */
527 #define LSMASH_BOX_PRECEDENCE_LP 0x000FFFFF00000000ULL /* Lowest+ */
528 #define LSMASH_BOX_PRECEDENCE_N 0x0080000000000000ULL /* Normal */
529 #define LSMASH_BOX_PRECEDENCE_HM 0xFFEEEEEE00000000ULL /* Highest- */
530 #define LSMASH_BOX_PRECEDENCE_H 0xFFFFFFFF00800000ULL /* Highest */
531 #define LSMASH_BOX_PRECEDENCE_S 0x0000010000000000ULL /* Step */
533 /* Check if the type of two boxes is identical or not.
535 * Return 1 if the both box types are identical.
536 * Return 0 otherwise. */
537 int lsmash_check_box_type_identical
543 /* Check if the type of a given box is already specified or not.
545 * Return 1 if the box type is specified.
546 * Return 0 otherwise, i.e. LSMASH_BOX_TYPE_UNSPECIFIED. */
547 int lsmash_check_box_type_specified
549 const lsmash_box_type_t
*box_type
553 * The allocated box can be deallocated by lsmash_destroy_box().
555 * Return the address of an allocated box if successful.
556 * Return NULL otherwise. */
557 lsmash_box_t
*lsmash_create_box
559 lsmash_box_type_t type
,
565 /* Get a box under a given 'parent' box.
566 * The path of a box must be terminated by LSMASH_BOX_TYPE_UNSPECIFIED.
568 * Return the address of the box specified by 'box_path'.
569 * Return NULL otherwise. */
570 lsmash_box_t
*lsmash_get_box
572 lsmash_box_t
*parent
,
573 const lsmash_box_path_t box_path
[]
576 /* Add a box into 'parent' box as a child box.
578 * Return 0 if successful.
579 * Return a negative value otherwise. */
582 lsmash_box_t
*parent
,
586 /* Add a box into 'parent' box as a child box.
587 * If the adding child box is known and its children (if any) are known, expand them into known
588 * struct formats for the internal references within the L-SMASH library.
589 * If this function succeed, the adding child box is deallocated and the address is invalid.
590 * Instead of that, this function replaces the invalid address with the valid one of the new
591 * allocated memory block representing the added and expanded child box.
593 * Return 0 if successful.
594 * Return a negative value otherwise. */
595 int lsmash_add_box_ex
597 lsmash_box_t
*parent
,
601 /* Deallocate a given box and its children. */
602 void lsmash_destroy_box
607 /* Deallocate all children of a given box. */
608 void lsmash_destroy_children
613 /* Get the precedence of a given box.
615 * Return 0 if successful.
616 * Return a negative value otherwise. */
617 int lsmash_get_box_precedence
623 /* This function allows you to handle a ROOT as if it is a box.
624 * Of course, you can deallocate the ROOT by lsmash_destroy_box().
626 * Return the address of a given ROOT as a box. */
627 lsmash_box_t
*lsmash_root_as_box
632 /* This function allows you to handle the handle of a file as if it is a box.
633 * Of course, you can deallocate the handle of the file by lsmash_destroy_box().
635 * Return the address of the handle of a given file as a box. */
636 lsmash_box_t
*lsmash_file_as_box
641 /* Write a top level box and its children already added to a file.
643 * You should not use this function as long as media data is incompletely written.
644 * That is before starting to write a media data or after finishing of writing that.
646 * Return 0 if successful.
647 * Return a negative value otherwise. */
648 int lsmash_write_top_level_box
653 /* Export the data of a given box and its children as the binary string.
654 * The returned address is of the beginning of an allocated memory block.
655 * You can deallocate the memory block by lsmash_free().
657 * Note that some boxes cannot be exported since L-SMASH might skip the cache for them.
658 * Media Data Box is an unexportable example.
660 * Return the address to the beginning of the binary string if successful.
661 * Return NULL otherwise. */
662 uint8_t *lsmash_export_box
668 /****************************************************************************
670 ****************************************************************************/
671 typedef lsmash_box_type_t lsmash_codec_type_t
;
673 #define LSMASH_CODEC_TYPE_INITIALIZER LSMASH_BOX_TYPE_INITIALIZER
674 #define LSMASH_CODEC_TYPE_UNSPECIFIED LSMASH_BOX_TYPE_UNSPECIFIED
676 #ifndef LSMASH_INITIALIZE_CODEC_ID_HERE
677 #define DEFINE_ISOM_CODEC_TYPE( BOX_TYPE_NAME, BOX_TYPE_FOURCC ) \
678 LSMASH_API extern const lsmash_codec_type_t BOX_TYPE_NAME
679 #define DEFINE_QTFF_CODEC_TYPE( BOX_TYPE_NAME, BOX_TYPE_FOURCC ) \
680 LSMASH_API extern const lsmash_codec_type_t BOX_TYPE_NAME
682 #define DEFINE_ISOM_CODEC_TYPE( BOX_TYPE_NAME, BOX_TYPE_FOURCC ) \
683 const lsmash_codec_type_t BOX_TYPE_NAME = LSMASH_ISO_BOX_TYPE_INITIALIZER( BOX_TYPE_FOURCC )
684 #define DEFINE_QTFF_CODEC_TYPE( BOX_TYPE_NAME, BOX_TYPE_FOURCC ) \
685 const lsmash_codec_type_t BOX_TYPE_NAME = LSMASH_QTFF_BOX_TYPE_INITIALIZER( BOX_TYPE_FOURCC )
688 /* Audio CODEC identifiers */
689 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AC_3_AUDIO
, LSMASH_4CC( 'a', 'c', '-', '3' ) ); /* AC-3 audio */
690 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ALAC_AUDIO
, LSMASH_4CC( 'a', 'l', 'a', 'c' ) ); /* Apple lossless audio codec */
691 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DRA1_AUDIO
, LSMASH_4CC( 'd', 'r', 'a', '1' ) ); /* DRA Audio */
692 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSEL_AUDIO
, LSMASH_4CC( 'd', 't', 's', '+' ) ); /* Enhancement layer for DTS layered audio */
693 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSDL_AUDIO
, LSMASH_4CC( 'd', 't', 's', '-' ) ); /* Dependent base layer for DTS layered audio */
694 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSC_AUDIO
, LSMASH_4CC( 'd', 't', 's', 'c' ) ); /* DTS Coherent Acoustics audio */
695 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 */
696 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSH_AUDIO
, LSMASH_4CC( 'd', 't', 's', 'h' ) ); /* DTS-HD High Resolution Audio */
697 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSL_AUDIO
, LSMASH_4CC( 'd', 't', 's', 'l' ) ); /* DTS-HD Master Audio */
698 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DTSX_AUDIO
, LSMASH_4CC( 'd', 't', 's', 'x' ) ); /* DTS:X */
699 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_EC_3_AUDIO
, LSMASH_4CC( 'e', 'c', '-', '3' ) ); /* Enhanced AC-3 audio */
700 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCA_AUDIO
, LSMASH_4CC( 'e', 'n', 'c', 'a' ) ); /* Encrypted/Protected audio */
701 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_G719_AUDIO
, LSMASH_4CC( 'g', '7', '1', '9' ) ); /* ITU-T Recommendation G.719 (2008) ); */
702 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_G726_AUDIO
, LSMASH_4CC( 'g', '7', '2', '6' ) ); /* ITU-T Recommendation G.726 (1990) ); */
703 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_M4AE_AUDIO
, LSMASH_4CC( 'm', '4', 'a', 'e' ) ); /* MPEG-4 Audio Enhancement */
704 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MLPA_AUDIO
, LSMASH_4CC( 'm', 'l', 'p', 'a' ) ); /* MLP Audio */
705 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MP4A_AUDIO
, LSMASH_4CC( 'm', 'p', '4', 'a' ) ); /* MPEG-4 Audio */
706 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RAW_AUDIO
, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Uncompressed audio */
707 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SAMR_AUDIO
, LSMASH_4CC( 's', 'a', 'm', 'r' ) ); /* Narrowband AMR voice */
708 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SAWB_AUDIO
, LSMASH_4CC( 's', 'a', 'w', 'b' ) ); /* Wideband AMR voice */
709 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SAWP_AUDIO
, LSMASH_4CC( 's', 'a', 'w', 'p' ) ); /* Extended AMR-WB (AMR-WB+) ); */
710 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SEVC_AUDIO
, LSMASH_4CC( 's', 'e', 'v', 'c' ) ); /* EVRC Voice */
711 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SQCP_AUDIO
, LSMASH_4CC( 's', 'q', 'c', 'p' ) ); /* 13K Voice */
712 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SSMV_AUDIO
, LSMASH_4CC( 's', 's', 'm', 'v' ) ); /* SMV Voice */
713 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_TWOS_AUDIO
, LSMASH_4CC( 't', 'w', 'o', 's' ) ); /* Uncompressed 16-bit audio */
714 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_WMA_AUDIO
, LSMASH_4CC( 'w', 'm', 'a', ' ' ) ); /* Windows Media Audio V2 or V3 (not registered at MP4RA) */
716 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_23NI_AUDIO
, LSMASH_4CC( '2', '3', 'n', 'i' ) ); /* 32-bit little endian integer uncompressed */
717 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MAC3_AUDIO
, LSMASH_4CC( 'M', 'A', 'C', '3' ) ); /* MACE 3:1 */
718 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MAC6_AUDIO
, LSMASH_4CC( 'M', 'A', 'C', '6' ) ); /* MACE 6:1 */
719 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_NONE_AUDIO
, LSMASH_4CC( 'N', 'O', 'N', 'E' ) ); /* either 'raw ' or 'twos' */
720 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_QDM2_AUDIO
, LSMASH_4CC( 'Q', 'D', 'M', '2' ) ); /* Qdesign music 2 */
721 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_QDMC_AUDIO
, LSMASH_4CC( 'Q', 'D', 'M', 'C' ) ); /* Qdesign music 1 */
722 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_QCLP_AUDIO
, LSMASH_4CC( 'Q', 'c', 'l', 'p' ) ); /* Qualcomm PureVoice */
723 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AC_3_AUDIO
, LSMASH_4CC( 'a', 'c', '-', '3' ) ); /* Digital Audio Compression Standard (AC-3, Enhanced AC-3) */
724 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AGSM_AUDIO
, LSMASH_4CC( 'a', 'g', 's', 'm' ) ); /* GSM */
725 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ALAC_AUDIO
, LSMASH_4CC( 'a', 'l', 'a', 'c' ) ); /* Apple lossless audio codec */
726 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ALAW_AUDIO
, LSMASH_4CC( 'a', 'l', 'a', 'w' ) ); /* a-Law 2:1 */
727 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CDX2_AUDIO
, LSMASH_4CC( 'c', 'd', 'x', '2' ) ); /* CD/XA 2:1 */
728 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CDX4_AUDIO
, LSMASH_4CC( 'c', 'd', 'x', '4' ) ); /* CD/XA 4:1 */
729 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVCA_AUDIO
, LSMASH_4CC( 'd', 'v', 'c', 'a' ) ); /* DV Audio */
730 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVI_AUDIO
, LSMASH_4CC( 'd', 'v', 'i', ' ' ) ); /* DVI (as used in RTP, 4:1 compression) */
731 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FL32_AUDIO
, LSMASH_4CC( 'f', 'l', '3', '2' ) ); /* 32-bit float */
732 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FL64_AUDIO
, LSMASH_4CC( 'f', 'l', '6', '4' ) ); /* 64-bit float */
733 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_IMA4_AUDIO
, LSMASH_4CC( 'i', 'm', 'a', '4' ) ); /* IMA (International Multimedia Assocation, defunct, 4:1) */
734 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_IN24_AUDIO
, LSMASH_4CC( 'i', 'n', '2', '4' ) ); /* 24-bit integer uncompressed */
735 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_IN32_AUDIO
, LSMASH_4CC( 'i', 'n', '3', '2' ) ); /* 32-bit integer uncompressed */
736 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_LPCM_AUDIO
, LSMASH_4CC( 'l', 'p', 'c', 'm' ) ); /* Uncompressed audio (various integer and float formats) */
737 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MP4A_AUDIO
, LSMASH_4CC( 'm', 'p', '4', 'a' ) ); /* MPEG-4 Audio */
738 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RAW_AUDIO
, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* 8-bit offset-binary uncompressed */
739 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SOWT_AUDIO
, LSMASH_4CC( 's', 'o', 'w', 't' ) ); /* 16-bit little endian uncompressed */
740 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TWOS_AUDIO
, LSMASH_4CC( 't', 'w', 'o', 's' ) ); /* 8-bit or 16-bit big endian uncompressed */
741 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULAW_AUDIO
, LSMASH_4CC( 'u', 'l', 'a', 'w' ) ); /* uLaw 2:1 */
742 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_VDVA_AUDIO
, LSMASH_4CC( 'v', 'd', 'v', 'a' ) ); /* DV audio (variable duration per video frame) */
743 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FULLMP3_AUDIO
, LSMASH_4CC( '.', 'm', 'p', '3' ) ); /* MPEG-1 layer 3, CBR & VBR (QT4.1 and later) */
744 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MP3_AUDIO
, 0x6D730055 ); /* MPEG-1 layer 3, CBR only (pre-QT4.1) */
745 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ADPCM2_AUDIO
, 0x6D730002 ); /* Microsoft ADPCM - ACM code 2 */
746 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ADPCM17_AUDIO
, 0x6D730011 ); /* DVI/Intel IMA ADPCM - ACM code 17 */
747 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_GSM49_AUDIO
, 0x6D730031 ); /* Microsoft GSM 6.10 - ACM code 49 */
748 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_NOT_SPECIFIED
, 0x00000000 ); /* either 'raw ' or 'twos' */
750 /* Video CODEC identifiers */
751 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC1_VIDEO
, LSMASH_4CC( 'a', 'v', 'c', '1' ) ); /* Advanced Video Coding
752 * Any sample must not contain any paramerter set and filler data. */
753 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC2_VIDEO
, LSMASH_4CC( 'a', 'v', 'c', '2' ) ); /* Advanced Video Coding
754 * Any sample must not contain any paramerter set and filler data.
755 * May only be used when Extractors or Aggregators are required to be supported. */
756 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC3_VIDEO
, LSMASH_4CC( 'a', 'v', 'c', '3' ) ); /* Advanced Video Coding
757 * It is allowed that sample contains parameter sets and filler data. */
758 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVC4_VIDEO
, LSMASH_4CC( 'a', 'v', 'c', '4' ) ); /* Advanced Video Coding
759 * It is allowed that sample contains parameter sets and filler data.
760 * May only be used when Extractors or Aggregators are required to be supported. */
761 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_AVCP_VIDEO
, LSMASH_4CC( 'a', 'v', 'c', 'p' ) ); /* Advanced Video Coding Parameters */
762 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_DRAC_VIDEO
, LSMASH_4CC( 'd', 'r', 'a', 'c' ) ); /* Dirac Video Coder */
763 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCV_VIDEO
, LSMASH_4CC( 'e', 'n', 'c', 'v' ) ); /* Encrypted/protected video */
764 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_HVC1_VIDEO
, LSMASH_4CC( 'h', 'v', 'c', '1' ) ); /* High Efficiency Video Coding
765 * The default and mandatory value of array_completeness is 1 for arrays of
766 * all types of parameter sets, and 0 for all other arrays.
767 * This means any sample must not contain any paramerter set and filler data. */
768 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_HEV1_VIDEO
, LSMASH_4CC( 'h', 'e', 'v', '1' ) ); /* High Efficiency Video Coding
769 * The default value of array_completeness is 0 for all arrays.
770 * It is allowed that sample contains parameter sets and filler data. */
771 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MJP2_VIDEO
, LSMASH_4CC( 'm', 'j', 'p', '2' ) ); /* Motion JPEG 2000 */
772 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MP4V_VIDEO
, LSMASH_4CC( 'm', 'p', '4', 'v' ) ); /* MPEG-4 Visual */
773 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MVC1_VIDEO
, LSMASH_4CC( 'm', 'v', 'c', '1' ) ); /* Multiview coding */
774 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MVC2_VIDEO
, LSMASH_4CC( 'm', 'v', 'c', '2' ) ); /* Multiview coding */
775 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_S263_VIDEO
, LSMASH_4CC( 's', '2', '6', '3' ) ); /* ITU H.263 video (3GPP format) */
776 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SVC1_VIDEO
, LSMASH_4CC( 's', 'v', 'c', '1' ) ); /* Scalable Video Coding */
777 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_VC_1_VIDEO
, LSMASH_4CC( 'v', 'c', '-', '1' ) ); /* SMPTE VC-1 */
779 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
780 * |Cb(8)|Y'0(8)|Cr(8)|Y'1(8)| */
781 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CFHD_VIDEO
, LSMASH_4CC( 'C', 'F', 'H', 'D' ) ); /* CineForm High-Definition (HD) wavelet codec */
782 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DV10_VIDEO
, LSMASH_4CC( 'D', 'V', '1', '0' ) ); /* Digital Voodoo 10 bit Uncompressed 4:2:2 codec */
783 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVOO_VIDEO
, LSMASH_4CC( 'D', 'V', 'O', 'O' ) ); /* Digital Voodoo 8 bit Uncompressed 4:2:2 codec */
784 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVOR_VIDEO
, LSMASH_4CC( 'D', 'V', 'O', 'R' ) ); /* Digital Voodoo intermediate raw */
785 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVTV_VIDEO
, LSMASH_4CC( 'D', 'V', 'T', 'V' ) ); /* Digital Voodoo intermediate 2vuy */
786 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVVT_VIDEO
, LSMASH_4CC( 'D', 'V', 'V', 'T' ) ); /* Digital Voodoo intermediate v210 */
787 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 */
788 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*/
789 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_PNTG_VIDEO
, LSMASH_4CC( 'P', 'N', 'T', 'G' ) ); /* Apple MacPaint image format */
790 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SVQ1_VIDEO
, LSMASH_4CC( 'S', 'V', 'Q', '1' ) ); /* Sorenson Video 1 video */
791 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SVQ3_VIDEO
, LSMASH_4CC( 'S', 'V', 'Q', '3' ) ); /* Sorenson Video 3 video */
792 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR0_VIDEO
, LSMASH_4CC( 'S', 'h', 'r', '0' ) ); /* Generic SheerVideo codec */
793 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_SHR1_VIDEO
, LSMASH_4CC( 'S', 'h', 'r', '1' ) ); /* SheerVideo RGB[A] 8b - at 8 bits/channel */
794 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 */
795 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 */
796 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 */
797 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_WRLE_VIDEO
, LSMASH_4CC( 'W', 'R', 'L', 'E' ) ); /* Windows BMP image format */
798 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCH_VIDEO
, LSMASH_4CC( 'a', 'p', 'c', 'h' ) ); /* Apple ProRes 422 High Quality */
799 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCN_VIDEO
, LSMASH_4CC( 'a', 'p', 'c', 'n' ) ); /* Apple ProRes 422 Standard Definition */
800 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCS_VIDEO
, LSMASH_4CC( 'a', 'p', 'c', 's' ) ); /* Apple ProRes 422 LT */
801 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_APCO_VIDEO
, LSMASH_4CC( 'a', 'p', 'c', 'o' ) ); /* Apple ProRes 422 Proxy */
802 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AP4H_VIDEO
, LSMASH_4CC( 'a', 'p', '4', 'h' ) ); /* Apple ProRes 4444 */
803 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_AP4X_VIDEO
, LSMASH_4CC( 'a', 'p', '4', 'x' ) ); /* Apple ProRes 4444 XQ */
804 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_CIVD_VIDEO
, LSMASH_4CC( 'c', 'i', 'v', 'd' ) ); /* Cinepak Video */
805 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DRAC_VIDEO
, LSMASH_4CC( 'd', 'r', 'a', 'c' ) ); /* Dirac Video Coder */
806 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVC_VIDEO
, LSMASH_4CC( 'd', 'v', 'c', ' ' ) ); /* DV NTSC format */
807 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVCP_VIDEO
, LSMASH_4CC( 'd', 'v', 'c', 'p' ) ); /* DV PAL format */
808 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVPP_VIDEO
, LSMASH_4CC( 'd', 'v', 'p', 'p' ) ); /* Panasonic DVCPro PAL format */
809 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DV5N_VIDEO
, LSMASH_4CC( 'd', 'v', '5', 'n' ) ); /* Panasonic DVCPro-50 NTSC format */
810 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DV5P_VIDEO
, LSMASH_4CC( 'd', 'v', '5', 'p' ) ); /* Panasonic DVCPro-50 PAL format */
811 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH2_VIDEO
, LSMASH_4CC( 'd', 'v', 'h', '2' ) ); /* Panasonic DVCPro-HD 1080p25 format */
812 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH3_VIDEO
, LSMASH_4CC( 'd', 'v', 'h', '3' ) ); /* Panasonic DVCPro-HD 1080p30 format */
813 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH5_VIDEO
, LSMASH_4CC( 'd', 'v', 'h', '5' ) ); /* Panasonic DVCPro-HD 1080i50 format */
814 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVH6_VIDEO
, LSMASH_4CC( 'd', 'v', 'h', '6' ) ); /* Panasonic DVCPro-HD 1080i60 format */
815 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVHP_VIDEO
, LSMASH_4CC( 'd', 'v', 'h', 'p' ) ); /* Panasonic DVCPro-HD 720p60 format */
816 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_DVHQ_VIDEO
, LSMASH_4CC( 'd', 'v', 'h', 'q' ) ); /* Panasonic DVCPro-HD 720p50 format */
817 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_FLIC_VIDEO
, LSMASH_4CC( 'f', 'l', 'i', 'c' ) ); /* Autodesk FLIC animation format */
818 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_GIF_VIDEO
, LSMASH_4CC( 'g', 'i', 'f', ' ' ) ); /* GIF image format */
819 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_H261_VIDEO
, LSMASH_4CC( 'h', '2', '6', '1' ) ); /* ITU H.261 video */
820 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_H263_VIDEO
, LSMASH_4CC( 'h', '2', '6', '3' ) ); /* ITU H.263 video */
821 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_JPEG_VIDEO
, LSMASH_4CC( 'j', 'p', 'e', 'g' ) ); /* JPEG image format */
822 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MJPA_VIDEO
, LSMASH_4CC( 'm', 'j', 'p', 'a' ) ); /* Motion-JPEG (format A) */
823 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_MJPB_VIDEO
, LSMASH_4CC( 'm', 'j', 'p', 'b' ) ); /* Motion-JPEG (format B) */
824 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_PNG_VIDEO
, LSMASH_4CC( 'p', 'n', 'g', ' ' ) ); /* W3C Portable Network Graphics (PNG) */
825 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RAW_VIDEO
, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Uncompressed RGB */
826 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RLE_VIDEO
, LSMASH_4CC( 'r', 'l', 'e', ' ' ) ); /* Apple animation codec */
827 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_RPZA_VIDEO
, LSMASH_4CC( 'r', 'p', 'z', 'a' ) ); /* Apple simple video 'road pizza' compression */
828 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TGA_VIDEO
, LSMASH_4CC( 't', 'g', 'a', ' ' ) ); /* Truvision Targa video format */
829 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TIFF_VIDEO
, LSMASH_4CC( 't', 'i', 'f', 'f' ) ); /* Tagged Image File Format (Adobe) */
830 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 */
831 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_ULRG_VIDEO
, LSMASH_4CC( 'U', 'L', 'R', 'G' ) ); /* Ut Video RGB 4:4:4 8bit full-range */
832 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 */
833 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 */
834 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 */
835 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 */
836 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_UQY2_VIDEO
, LSMASH_4CC( 'U', 'Q', 'Y', '2' ) ); /* Ut Video Pro YCbCr 4:2:2 10bit */
837 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
838 * |Cb0(10)|Y'0(10)|Cr0(10)|XX(2)|
839 * |Y'1(10)|Cb1(10)|Y'2(10)|XX(2)|
840 * |Cr1(10)|Y'3(10)|Cb2(10)|XX(2)|
841 * |Y'4(10)|Cr2(10)|Y'5(10)|XX(2)| (X is a zero bit) */
842 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
843 * |Cb(16 LE)|Y'0(16 LE)|Cr(16 LE)|Y'1(16 LE)| */
844 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
845 * |Cr(8)|Y'(8)|Cb(8)| */
846 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
847 * |Cb(8)|Y'(8)|Cr(8)|A(8)| */
848 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
849 * |XX(2)|Cb(10)|Y'(10)|Cr(10)| (X is a zero bit) */
850 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
851 * |Y'0(8)|Cb(8)|Y'1(8)|Cr(8)| */
853 /* Text CODEC identifiers */
854 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCT_TEXT
, LSMASH_4CC( 'e', 'n', 'c', 't' ) ); /* Encrypted Text */
855 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_STPP_TEXT
, LSMASH_4CC( 's', 't', 'p', 'p' ) ); /* Sub-titles (Timed Text) */
856 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_TX3G_TEXT
, LSMASH_4CC( 't', 'x', '3', 'g' ) ); /* 3GPP Timed Text stream */
858 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TEXT_TEXT
, LSMASH_4CC( 't', 'e', 'x', 't' ) ); /* QuickTime Text Media */
860 /* Hint CODEC identifiers */
861 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_FDP_HINT
, LSMASH_4CC( 'f', 'd', 'p', ' ' ) ); /* File delivery hints */
862 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_M2TS_HINT
, LSMASH_4CC( 'm', '2', 't', 's' ) ); /* MPEG-2 transport stream for DMB */
863 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_PM2T_HINT
, LSMASH_4CC( 'p', 'm', '2', 't' ) ); /* Protected MPEG-2 Transport */
864 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_PRTP_HINT
, LSMASH_4CC( 'p', 'r', 't', 'p' ) ); /* Protected RTP Reception */
865 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RM2T_HINT
, LSMASH_4CC( 'r', 'm', '2', 't' ) ); /* MPEG-2 Transport Reception */
866 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RRTP_HINT
, LSMASH_4CC( 'r', 'r', 't', 'p' ) ); /* RTP reception */
867 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RSRP_HINT
, LSMASH_4CC( 'r', 's', 'r', 'p' ) ); /* SRTP Reception */
868 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_RTP_HINT
, LSMASH_4CC( 'r', 't', 'p', ' ' ) ); /* RTP Hints */
869 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SM2T_HINT
, LSMASH_4CC( 's', 'm', '2', 't' ) ); /* MPEG-2 Transport Server */
870 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SRTP_HINT
, LSMASH_4CC( 's', 'r', 't', 'p' ) ); /* SRTP Hints */
872 /* Metadata CODEC identifiers */
873 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_IXSE_META
, LSMASH_4CC( 'i', 'x', 's', 'e' ) ); /* DVB Track Level Index Track */
874 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_METT_META
, LSMASH_4CC( 'm', 'e', 't', 't' ) ); /* Text timed metadata */
875 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_METX_META
, LSMASH_4CC( 'm', 'e', 't', 'x' ) ); /* XML timed metadata */
876 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MLIX_META
, LSMASH_4CC( 'm', 'l', 'i', 'x' ) ); /* DVB Movie level index track */
877 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_OKSD_META
, LSMASH_4CC( 'o', 'k', 's', 'd' ) ); /* OMA Keys */
878 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_SVCM_META
, LSMASH_4CC( 's', 'v', 'c', 'M' ) ); /* SVC metadata */
879 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_TEXT_META
, LSMASH_4CC( 't', 'e', 'x', 't' ) ); /* Textual meta-data with MIME type */
880 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_URIM_META
, LSMASH_4CC( 'u', 'r', 'i', 'm' ) ); /* URI identified timed metadata */
881 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_XML_META
, LSMASH_4CC( 'x', 'm', 'l', ' ' ) ); /* XML-formatted meta-data */
883 /* Other CODEC identifiers */
884 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_ENCS_SYSTEM
, LSMASH_4CC( 'e', 'n', 'c', 's' ) ); /* Encrypted Systems stream */
885 DEFINE_ISOM_CODEC_TYPE( ISOM_CODEC_TYPE_MP4S_SYSTEM
, LSMASH_4CC( 'm', 'p', '4', 's' ) ); /* MPEG-4 Systems */
887 DEFINE_QTFF_CODEC_TYPE( LSMASH_CODEC_TYPE_RAW
, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Either video or audio */
889 /* Check if the identifier of two CODECs is identical or not.
891 * Return 1 if the both CODEC identifiers are identical.
892 * Return 0 otherwise. */
893 int lsmash_check_codec_type_identical
895 lsmash_codec_type_t a
,
896 lsmash_codec_type_t b
899 /****************************************************************************
900 * Summary of Stream Configuration
901 * This is L-SMASH's original structure.
902 ****************************************************************************/
905 LSMASH_SUMMARY_TYPE_UNKNOWN
= 0,
906 LSMASH_SUMMARY_TYPE_VIDEO
,
907 LSMASH_SUMMARY_TYPE_AUDIO
,
908 LSMASH_SUMMARY_TYPE_HINT
,
909 } lsmash_summary_type
;
913 LSMASH_CODEC_SPECIFIC_DATA_TYPE_UNSPECIFIED
= -1, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED */
915 LSMASH_CODEC_SPECIFIC_DATA_TYPE_UNKNOWN
= 0, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */
917 LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG
,
919 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264
,
920 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_HEVC
,
921 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_VC_1
,
922 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_AC_3
,
923 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_EC_3
,
924 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_DTS
,
925 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_ALAC
,
927 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_SAMPLE_SCALE
,
928 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264_BITRATE
,
929 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_RTP_HINT_COMMON
,
931 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_COMMON
, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
932 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_COMMON
, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
933 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_FORMAT_SPECIFIC_FLAGS
, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
934 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_DECOMPRESSION_PARAMETERS
, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */
936 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_FIELD_INFO
,
937 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_PIXEL_FORMAT
,
938 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_SIGNIFICANT_BITS
,
939 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_GAMMA_LEVEL
,
940 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_CHANNEL_LAYOUT
,
942 LSMASH_CODEC_SPECIFIC_DATA_TYPE_CODEC_GLOBAL_HEADER
,
943 } lsmash_codec_specific_data_type
;
947 LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED
= -1,
948 LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED
= 0,
949 LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED
= 1
950 } lsmash_codec_specific_format
;
954 void *always_null
; /* LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED */
955 void *structured
; /* LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */
956 uint8_t *unstructured
; /* LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */
957 } lsmash_codec_specific_data_t
;
959 typedef void (*lsmash_codec_specific_destructor_t
)( void * );
962 lsmash_codec_specific_data_type type
;
963 lsmash_codec_specific_format format
;
964 lsmash_codec_specific_data_t data
;
966 lsmash_codec_specific_destructor_t destruct
;
967 } lsmash_codec_specific_t
;
969 typedef struct lsmash_codec_specific_list_tag lsmash_codec_specific_list_t
;
973 LSMASH_CODEC_SUPPORT_FLAG_NONE
= 0,
974 LSMASH_CODEC_SUPPORT_FLAG_MUX
= 1 << 0, /* It's expected that L-SMASH can mux CODEC stream properly.
975 * If not flagged, L-SMASH may recognize and/or handle CODEC specific info incorrectly when muxing. */
976 LSMASH_CODEC_SUPPORT_FLAG_DEMUX
= 1 << 1, /* It's expected that L-SMASH can demux CODEC stream properly.
977 * If not flagged, L-SMASH may recognize and/or handle CODEC specific info incorrectly when demuxing. */
978 LSMASH_CODEC_SUPPORT_FLAG_REMUX
= LSMASH_CODEC_SUPPORT_FLAG_MUX
| LSMASH_CODEC_SUPPORT_FLAG_DEMUX
,
979 } lsmash_codec_support_flag
;
981 #define LSMASH_BASE_SUMMARY \
982 lsmash_summary_type summary_type; \
983 lsmash_codec_type_t sample_type; \
984 lsmash_codec_specific_list_t *opaque; \
985 uint32_t max_au_length; /* buffer length for 1 access unit, \
986 * typically max size of 1 audio/video frame */ \
987 uint32_t data_ref_index; /* the index of a data reference */
994 /* Allocate a summary by 'summary_type'.
995 * The allocated summary can be deallocated by lsmash_cleanup_summary().
997 * Return the address of an allocated summary if successful.
998 * Return NULL otherwise. */
999 lsmash_summary_t
*lsmash_create_summary
1001 lsmash_summary_type summary_type
/* a type of summary you want */
1004 /* Deallocate a given summary. */
1005 void lsmash_cleanup_summary
1007 lsmash_summary_t
*summary
/* the address of a summary you want to deallocate */
1010 /* Allocate and append a new sample description to a track by 'summary'.
1012 * Return the index of an allocated and appended sample description if successful.
1013 * Return 0 otherwise. */
1014 int lsmash_add_sample_entry
1016 lsmash_root_t
*root
, /* the address of the ROOT containing a track to which you want to append a new sample description */
1017 uint32_t track_ID
, /* the track_ID of a track to which you want to append a new sample description */
1018 void *summary
/* the summary of a sample description you want to append */
1021 /* Count the number of summaries in a track.
1023 * Return the number of summaries in a track if no error.
1024 * Return 0 otherwise. */
1025 uint32_t lsmash_count_summary
1027 lsmash_root_t
*root
, /* the address of the ROOT containing a track in which you want to count the number of summaries */
1028 uint32_t track_ID
/* the track_ID of a track in which you want to count the number of summaries */
1031 /* Get the summary of a sample description you want in a track.
1032 * The summary returned by this function is allocated internally, and can be deallocate by lsmash_cleanup_summary().
1034 * Return the address of an allocated summary you want if successful.
1035 * Return NULL otherwise. */
1036 lsmash_summary_t
*lsmash_get_summary
1038 lsmash_root_t
*root
, /* the address of the ROOT containing a track which contains a sample description you want */
1039 uint32_t track_ID
, /* the track_ID of a track containing a sample description you want */
1040 uint32_t description_number
/* the index of a sample description you want */
1043 /* Allocate and initialize a CODEC specific configuration by 'type' and 'format'.
1044 * The allocated CODEC specific configuration can be deallocated by lsmash_destroy_codec_specific_data().
1046 * Return the address of an allocated and initialized CODEC specific configuration if successful.
1047 * Return NULL otherwise. */
1048 lsmash_codec_specific_t
*lsmash_create_codec_specific_data
1050 lsmash_codec_specific_data_type type
,
1051 lsmash_codec_specific_format format
1054 /* Deallocate a CODEC specific configuration. */
1055 void lsmash_destroy_codec_specific_data
1057 lsmash_codec_specific_t
*specific
/* the address of a CODEC specific configuration you want to deallocate */
1060 /* Allocate a CODEC specific configuration which is a copy of 'specific', and append it to 'summary'.
1062 * Return 0 if successful.
1063 * Return a negative value otherwise. */
1064 int lsmash_add_codec_specific_data
1066 lsmash_summary_t
*summary
,
1067 lsmash_codec_specific_t
*specific
1070 /* Count the number of CODEC specific configuration in a summary.
1072 * Return the number of CODEC specific configuration in a summary if successful.
1073 * Return 0 otherwise. */
1074 uint32_t lsmash_count_codec_specific_data
1076 lsmash_summary_t
*summary
/* the address of a summary in which you want to count the number of CODEC specific configuration */
1079 /* Get a CODEC specific configuration you want in a summary.
1081 * Return the address of a CODEC specific configuration if successful.
1082 * Return NULL otherwise. */
1083 lsmash_codec_specific_t
*lsmash_get_codec_specific_data
1085 lsmash_summary_t
*summary
,
1086 uint32_t extension_number
1089 /* Convert a data format of CODEC specific configuration into another.
1090 * User can specify the same data format for the destination.
1091 * If so, a returned CODEC specific configuration is a copy of the source.
1093 * Return an allocated CODEC specific configuration by specified 'format' from 'specific' if successful.
1094 * Return NULL otherwise. */
1095 lsmash_codec_specific_t
*lsmash_convert_codec_specific_format
1097 lsmash_codec_specific_t
*specific
, /* the address of a CODEC specific configuration as the source */
1098 lsmash_codec_specific_format format
/* a data format of the destination */
1101 /* Compare two summaries.
1103 * Return 0 if the two summaries are identical.
1104 * Return 1 if the two summaries are different.
1105 * Return a negative value if there is any error. */
1106 int lsmash_compare_summary
1108 lsmash_summary_t
*a
,
1112 /* Check status of CODEC support.
1114 * Return support flags of a given CODEC. */
1115 lsmash_codec_support_flag lsmash_check_codec_support
1117 lsmash_codec_type_t codec_type
1120 /****************************************************************************
1121 * Audio Description Layer
1122 ****************************************************************************/
1123 /* Audio Object Types */
1126 MP4A_AUDIO_OBJECT_TYPE_NULL
= 0,
1127 MP4A_AUDIO_OBJECT_TYPE_AAC_MAIN
= 1, /* ISO/IEC 14496-3 subpart 4 */
1128 MP4A_AUDIO_OBJECT_TYPE_AAC_LC
= 2, /* ISO/IEC 14496-3 subpart 4 */
1129 MP4A_AUDIO_OBJECT_TYPE_AAC_SSR
= 3, /* ISO/IEC 14496-3 subpart 4 */
1130 MP4A_AUDIO_OBJECT_TYPE_AAC_LTP
= 4, /* ISO/IEC 14496-3 subpart 4 */
1131 MP4A_AUDIO_OBJECT_TYPE_SBR
= 5, /* ISO/IEC 14496-3 subpart 4 */
1132 MP4A_AUDIO_OBJECT_TYPE_AAC_scalable
= 6, /* ISO/IEC 14496-3 subpart 4 */
1133 MP4A_AUDIO_OBJECT_TYPE_TwinVQ
= 7, /* ISO/IEC 14496-3 subpart 4 */
1134 MP4A_AUDIO_OBJECT_TYPE_CELP
= 8, /* ISO/IEC 14496-3 subpart 3 */
1135 MP4A_AUDIO_OBJECT_TYPE_HVXC
= 9, /* ISO/IEC 14496-3 subpart 2 */
1136 MP4A_AUDIO_OBJECT_TYPE_TTSI
= 12, /* ISO/IEC 14496-3 subpart 6 */
1137 MP4A_AUDIO_OBJECT_TYPE_Main_synthetic
= 13, /* ISO/IEC 14496-3 subpart 5 */
1138 MP4A_AUDIO_OBJECT_TYPE_Wavetable_synthesis
= 14, /* ISO/IEC 14496-3 subpart 5 */
1139 MP4A_AUDIO_OBJECT_TYPE_General_MIDI
= 15, /* ISO/IEC 14496-3 subpart 5 */
1140 MP4A_AUDIO_OBJECT_TYPE_Algorithmic_Synthesis_Audio_FX
= 16, /* ISO/IEC 14496-3 subpart 5 */
1141 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LC
= 17, /* ISO/IEC 14496-3 subpart 4 */
1142 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LTP
= 19, /* ISO/IEC 14496-3 subpart 4 */
1143 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_scalable
= 20, /* ISO/IEC 14496-3 subpart 4 */
1144 MP4A_AUDIO_OBJECT_TYPE_ER_Twin_VQ
= 21, /* ISO/IEC 14496-3 subpart 4 */
1145 MP4A_AUDIO_OBJECT_TYPE_ER_BSAC
= 22, /* ISO/IEC 14496-3 subpart 4 */
1146 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LD
= 23, /* ISO/IEC 14496-3 subpart 4 */
1147 MP4A_AUDIO_OBJECT_TYPE_ER_CELP
= 24, /* ISO/IEC 14496-3 subpart 3 */
1148 MP4A_AUDIO_OBJECT_TYPE_ER_HVXC
= 25, /* ISO/IEC 14496-3 subpart 2 */
1149 MP4A_AUDIO_OBJECT_TYPE_ER_HILN
= 26, /* ISO/IEC 14496-3 subpart 7 */
1150 MP4A_AUDIO_OBJECT_TYPE_ER_Parametric
= 27, /* ISO/IEC 14496-3 subpart 2 and 7 */
1151 MP4A_AUDIO_OBJECT_TYPE_SSC
= 28, /* ISO/IEC 14496-3 subpart 8 */
1152 MP4A_AUDIO_OBJECT_TYPE_PS
= 29, /* ISO/IEC 14496-3 subpart 8 */
1153 MP4A_AUDIO_OBJECT_TYPE_MPEG_Surround
= 30, /* ISO/IEC 23003-1 */
1154 MP4A_AUDIO_OBJECT_TYPE_ESCAPE
= 31,
1155 MP4A_AUDIO_OBJECT_TYPE_Layer_1
= 32, /* ISO/IEC 14496-3 subpart 9 */
1156 MP4A_AUDIO_OBJECT_TYPE_Layer_2
= 33, /* ISO/IEC 14496-3 subpart 9 */
1157 MP4A_AUDIO_OBJECT_TYPE_Layer_3
= 34, /* ISO/IEC 14496-3 subpart 9 */
1158 MP4A_AUDIO_OBJECT_TYPE_DST
= 35, /* ISO/IEC 14496-3 subpart 10 */
1159 MP4A_AUDIO_OBJECT_TYPE_ALS
= 36, /* ISO/IEC 14496-3 subpart 11 */
1160 MP4A_AUDIO_OBJECT_TYPE_SLS
= 37, /* ISO/IEC 14496-3 subpart 12 */
1161 MP4A_AUDIO_OBJECT_TYPE_SLS_non_core
= 38, /* ISO/IEC 14496-3 subpart 12 */
1162 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_ELD
= 39, /* ISO/IEC 14496-3 subpart 4 */
1163 MP4A_AUDIO_OBJECT_TYPE_SMR_Simple
= 40, /* ISO/IEC 14496-23 */
1164 MP4A_AUDIO_OBJECT_TYPE_SMR_Main
= 41, /* ISO/IEC 14496-23 */
1165 MP4A_AUDIO_OBJECT_TYPE_SAOC
= 43, /* ISO/IEC 23003-2 */
1166 } lsmash_mp4a_AudioObjectType
;
1168 /* See ISO/IEC 14496-3 Signaling of SBR, SBR Signaling and Corresponding Decoder Behavior */
1171 MP4A_AAC_SBR_NOT_SPECIFIED
= 0x0, /* not mention to SBR presence. Implicit signaling. */
1172 MP4A_AAC_SBR_NONE
, /* explicitly signals SBR does not present. Useless in general. */
1173 MP4A_AAC_SBR_BACKWARD_COMPATIBLE
, /* explicitly signals SBR present. Recommended method to signal SBR. */
1174 MP4A_AAC_SBR_HIERARCHICAL
/* SBR exists. SBR dedicated method. */
1175 } lsmash_mp4a_aac_sbr_mode
;
1180 lsmash_mp4a_AudioObjectType aot
; /* detailed codec type
1181 * If neither ISOM_CODEC_TYPE_MP4A_AUDIO nor QT_CODEC_TYPE_MP4A_AUDIO, just ignored. */
1182 uint32_t frequency
; /* the audio sampling rate (in Hz) at the default output playback
1183 * For some audio, this field is used as a nominal value.
1184 * For HE-AAC v1/SBR stream, this is base AAC's one.
1185 * For ISOM_CODEC_TYPE_AC_3_AUDIO and ISOM_CODEC_TYPE_EC_3_AUDIO, this shall be
1186 * equal to the sampling rate (in Hz) of the stream and the media timescale. */
1187 uint32_t channels
; /* the number of audio channels at the default output playback
1188 * Even if the stream is HE-AAC v2/SBR+PS, this is base AAC's one. */
1189 uint32_t sample_size
; /* For uncompressed audio,
1190 * the number of bits in each uncompressed sample for a single channel.
1191 * For some compressed audio, such as audio that uses MDCT,
1192 * N/A (not applicable), and may be set to 16. */
1193 uint32_t samples_in_frame
; /* the number of decoded PCM samples in an audio frame at 'frequency'
1194 * Even if the stream is HE-AAC/aacPlus/SBR(+PS), this is base AAC's one, so 1024. */
1195 lsmash_mp4a_aac_sbr_mode sbr_mode
; /* SBR treatment
1196 * Currently we always set this as mp4a_AAC_SBR_NOT_SPECIFIED (Implicit signaling).
1197 * User can set this for treatment in other way. */
1198 uint32_t bytes_per_frame
; /* the number of bytes per audio frame
1199 * If variable, shall be set to 0. */
1200 } lsmash_audio_summary_t
;
1202 /* Facilitate to make exdata (typically DecoderSpecificInfo or AudioSpecificConfig). */
1203 int lsmash_setup_AudioSpecificConfig
1205 lsmash_audio_summary_t
* summary
1208 /****************************************************************************
1209 * Video Description Layer
1210 ****************************************************************************/
1211 /* Clean Aperture */
1214 lsmash_rational_u32_t width
;
1215 lsmash_rational_u32_t height
;
1216 lsmash_rational_s32_t horizontal_offset
;
1217 lsmash_rational_s32_t vertical_offset
;
1222 lsmash_rational_u32_t top
;
1223 lsmash_rational_u32_t left
;
1224 lsmash_rational_u32_t bottom
;
1225 lsmash_rational_u32_t right
;
1231 ISOM_DEPTH_TEMPLATE
= 0x0018,
1234 AVC_DEPTH_COLOR_WITH_NO_ALPHA
= 0x0018, /* color with no alpha */
1235 AVC_DEPTH_GRAYSCALE_WITH_NO_ALPHA
= 0x0028, /* grayscale with no alpha */
1236 AVC_DEPTH_WITH_ALPHA
= 0x0020, /* gray or color with alpha */
1239 * (1-32) or (33-40 grayscale) */
1240 QT_VIDEO_DEPTH_COLOR_1
= 0x0001,
1241 QT_VIDEO_DEPTH_COLOR_2
= 0x0002,
1242 QT_VIDEO_DEPTH_COLOR_4
= 0x0004,
1243 QT_VIDEO_DEPTH_COLOR_8
= 0x0008,
1244 QT_VIDEO_DEPTH_COLOR_16
= 0x0010,
1245 QT_VIDEO_DEPTH_COLOR_24
= 0x0018,
1246 QT_VIDEO_DEPTH_COLOR_32
= 0x0020,
1247 QT_VIDEO_DEPTH_GRAYSCALE_1
= 0x0021,
1248 QT_VIDEO_DEPTH_GRAYSCALE_2
= 0x0022,
1249 QT_VIDEO_DEPTH_GRAYSCALE_4
= 0x0024,
1250 QT_VIDEO_DEPTH_GRAYSCALE_8
= 0x0028,
1252 /* QuickTime Uncompressed RGB */
1253 QT_VIDEO_DEPTH_555RGB
= 0x0010,
1254 QT_VIDEO_DEPTH_24RGB
= 0x0018,
1255 QT_VIDEO_DEPTH_32ARGB
= 0x0020,
1256 } lsmash_video_depth
;
1258 /* Index for the chromaticity coordinates of the color primaries */
1261 /* for ISO Base Media file format */
1262 ISOM_PRIMARIES_INDEX_ITU_R709_5
= 1, /* ITU-R BT.709-2/5, ITU-R BT.1361,
1263 * SMPTE 274M-1995, SMPTE 296M-1997,
1264 * IEC 61966-2-1 (sRGB or sYCC), IEC 61966-2-4 (xvYCC),
1265 * SMPTE RP 177M-1993 Annex B
1266 * green x = 0.300 y = 0.600
1267 * blue x = 0.150 y = 0.060
1268 * red x = 0.640 y = 0.330
1269 * white x = 0.3127 y = 0.3290 (CIE III. D65) */
1270 ISOM_PRIMARIES_INDEX_UNSPECIFIED
= 2, /* Unspecified */
1271 ISOM_PRIMARIES_INDEX_ITU_R470M
= 4, /* ITU-R BT.470-6 System M
1272 * green x = 0.21 y = 0.71
1273 * blue x = 0.14 y = 0.08
1274 * red x = 0.67 y = 0.33
1275 * white x = 0.310 y = 0.316 */
1276 ISOM_PRIMARIES_INDEX_ITU_R470BG
= 5, /* EBU Tech. 3213 (1981), ITU-R BT.470-6 System B, G,
1277 * ITU-R BT.601-6 625, ITU-R BT.1358 625,
1278 * ITU-R BT.1700 625 PAL and 625 SECAM
1279 * green x = 0.29 y = 0.60
1280 * blue x = 0.15 y = 0.06
1281 * red x = 0.64 y = 0.33
1282 * white x = 0.3127 y = 0.3290 (CIE III. D65) */
1283 ISOM_PRIMARIES_INDEX_SMPTE_170M_2004
= 6, /* SMPTE C Primaries from SMPTE RP 145-1993, SMPTE 170M-2004,
1284 * ITU-R BT.601-6 525, ITU-R BT.1358 525,
1285 * ITU-R BT.1700 NTSC, SMPTE 170M-2004
1286 * green x = 0.310 y = 0.595
1287 * blue x = 0.155 y = 0.070
1288 * red x = 0.630 y = 0.340
1289 * white x = 0.3127 y = 0.3290 (CIE III. D65) */
1290 ISOM_PRIMARIES_INDEX_SMPTE_240M_1999
= 7, /* SMPTE 240M-1999
1291 * functionally the same as the value ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 */
1293 /* for QuickTime file format */
1294 QT_PRIMARIES_INDEX_ITU_R709_2
= 1, /* the same as the value ISOM_PRIMARIES_INDEX_ITU_R709_5 */
1295 QT_PRIMARIES_INDEX_UNSPECIFIED
= 2, /* Unspecified */
1296 QT_PRIMARIES_INDEX_EBU_3213
= 5, /* the same as the value ISOM_PRIMARIES_INDEX_ITU_R470BG */
1297 QT_PRIMARIES_INDEX_SMPTE_C
= 6, /* the same as the value ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 */
1300 /* Index for the opto-electronic transfer characteristic of the image color components */
1303 /* for ISO Base Media file format */
1304 ISOM_TRANSFER_INDEX_ITU_R709_5
= 1, /* ITU-R BT.709-2/5, ITU-R BT.1361
1305 * SMPTE 274M-1995, SMPTE 296M-1997,
1306 * SMPTE 293M-1996, SMPTE 170M-1994
1307 * vV = 1.099 * vLc^0.45 - 0.099 for 1 >= vLc >= 0.018
1308 * vV = 4.500 * vLc for 0.018 > vLc >= 0 */
1309 ISOM_TRANSFER_INDEX_UNSPECIFIED
= 2, /* Unspecified */
1310 ISOM_TRANSFER_INDEX_ITU_R470M
= 4, /* ITU-R BT.470-6 System M, ITU-R BT.1700 625 PAL and 625 SECAM
1311 * Assumed display gamma 2.2 */
1312 ISOM_TRANSFER_INDEX_ITU_R470BG
= 5, /* ITU-R BT.470-6 System B, G
1313 * Assumed display gamma 2.8 */
1314 ISOM_TRANSFER_INDEX_SMPTE_170M_2004
= 6, /* ITU-R BT.601-6 525 or 625, ITU-R BT.1358 525 or 625,
1315 * ITU-R BT.1700 NTSC, SMPTE 170M-2004
1316 * functionally the same as the value ISOM_TRANSFER_INDEX_ITU_R709_5
1317 * vV = 1.099 * vLc^0.45 - 0.099 for 1 >= vLc >= 0.018
1318 * vV = 4.500 * vLc for 0.018 > vLc >= 0 */
1319 ISOM_TRANSFER_INDEX_SMPTE_240M_1999
= 7, /* SMPTE 240M-1995/1999, interim color implementation of SMPTE 274M-1995
1320 * vV = 1.1115 * vLc^0.45 - 0.1115 for 1 >= vLc >= 0.0228
1321 * vV = 4.0 * vLc for 0.0228 > vLc >= 0 */
1322 ISOM_TRANSFER_INDEX_LINEAR
= 8, /* Linear transfer characteristics */
1323 ISOM_TRANSFER_INDEX_XVYCC
= 11, /* IEC 61966-2-4 (xvYCC)
1324 * vV = 1.099 * vLc^0.45 - 0.099 for vLc >= 0.018
1325 * vV = 4.500 * vLc for 0.018 > vLc > -0.018
1326 * vV = -1.099 * (-vLc)^0.45 + 0.099 for -0.018 >= vLc */
1327 ISOM_TRANSFER_INDEX_ITU_R1361
= 12, /* ITU-R BT.1361
1328 * vV = 1.099 * vLc^0.45 - 0.099 for 1.33 > vLc >= 0.018
1329 * vV = 4.500 * vLc for 0.018 > vLc >= -0.0045
1330 * vV = -(1.099 * (-4 * vLc)^0.45 + 0.099) / 4 for -0.0045 > vLc >= -0.25 */
1331 ISOM_TRANSFER_INDEX_SRGB
= 13, /* IEC 61966-2-1 (sRGB or sYCC)
1332 * vV = 1.055 * vLc^(1/2.4) - 0.055 for 1 > vLc >= 0.0031308
1333 * vV = 12.92 * vLc for 0.0031308 > vLc >= 0 */
1335 /* for QuickTime file format */
1336 QT_TRANSFER_INDEX_ITU_R709_2
= 1, /* the same as the value ISOM_TRANSFER_INDEX_ITU_R709_5 */
1337 QT_TRANSFER_INDEX_UNSPECIFIED
= 2, /* Unspecified */
1338 QT_TRANSFER_INDEX_SMPTE_240M_1995
= 7, /* the same as the value ISOM_TRANSFER_INDEX_SMPTE_240M_1999 */
1341 /* Index for the matrix coefficients associated with derivation of luma and chroma signals from the green, blue, and red primaries */
1344 /* for ISO Base Media file format */
1345 ISOM_MATRIX_INDEX_NO_MATRIX
= 0, /* No matrix transformation
1346 * IEC 61966-2-1 (sRGB) */
1347 ISOM_MATRIX_INDEX_ITU_R_709_5
= 1, /* ITU-R BT.709-2/5, ITU-R BT.1361,
1348 * SMPTE 274M-1995, SMPTE 296M-1997
1349 * IEC 61966-2-1 (sYCC), IEC 61966-2-4 xvYCC_709,
1350 * SMPTE RP 177M-1993 Annex B
1351 * vKr = 0.2126; vKb = 0.0722 */
1352 ISOM_MATRIX_INDEX_UNSPECIFIED
= 2, /* Unspecified */
1353 ISOM_MATRIX_INDEX_USFCCT_47_CFR
= 4, /* United States Federal Communications Commission Title 47 Code of Federal Regulations
1354 * vKr = 0.30; vKb = 0.11 */
1355 ISOM_MATRIX_INDEX_ITU_R470BG
= 5, /* ITU-R BT.470-6 System B, G,
1356 * ITU-R BT.601-4/6 625, ITU-R BT.1358 625,
1357 * ITU-R BT.1700 625 PAL and 625 SECAM, IEC 61966-2-4 xvYCC601
1358 * vKr = 0.299; vKb = 0.114 */
1359 ISOM_MATRIX_INDEX_SMPTE_170M_2004
= 6, /* ITU-R BT.601-4/6 525, ITU-R BT.1358 525,
1360 * ITU-R BT.1700 NTSC,
1361 * SMPTE 170M-1994, SMPTE 293M-1996
1362 * functionally the same as the value ISOM_MATRIX_INDEX_ITU_R470BG
1363 * vKr = 0.299; vKb = 0.114 */
1364 ISOM_MATRIX_INDEX_SMPTE_240M_1999
= 7, /* SMPTE 240M-1995, interim color implementation of SMPTE 274M-1995
1365 * vKr = 0.212; vKb = 0.087 */
1366 ISOM_MATRIX_INDEX_YCGCO
= 8, /* YCoCg */
1368 /* for QuickTime file format */
1369 QT_MATRIX_INDEX_ITU_R_709_2
= 1, /* the same as the value ISOM_MATRIX_INDEX_ITU_R_709_5 */
1370 QT_MATRIX_INDEX_UNSPECIFIED
= 2, /* Unspecified */
1371 QT_MATRIX_INDEX_ITU_R_601_4
= 6, /* the same as the value ISOM_MATRIX_INDEX_SMPTE_170M_2004 */
1372 QT_MATRIX_INDEX_SMPTE_240M_1995
= 7 /* the same as the value ISOM_MATRIX_INDEX_SMPTE_240M_1999 */
1378 // lsmash_mp4v_VideoObjectType vot; /* Detailed codec type. If not mp4v, just ignored. */
1379 uint32_t timescale
; /* media timescale
1380 * User can't set this parameter manually. */
1381 uint32_t timebase
; /* increment unit of timestamp
1382 * User can't set this parameter manually. */
1383 uint8_t vfr
; /* whether a stream is assumed as variable frame rate
1384 * User can't set this parameter manually. */
1385 uint8_t sample_per_field
; /* whether a stream may have a sample per field
1386 * User can't set this parameter manually. */
1387 uint32_t width
; /* pixel counts of width samples have */
1388 uint32_t height
; /* pixel counts of height samples have */
1389 char compressorname
[33]; /* a 32-byte Pascal string containing the name of the compressor that created the image */
1390 lsmash_video_depth depth
; /* data size of a pixel */
1391 lsmash_clap_t clap
; /* clean aperture */
1392 uint32_t par_h
; /* horizontal factor of pixel aspect ratio */
1393 uint32_t par_v
; /* vertical factor of pixel aspect ratio */
1396 /* To omit to write these field, set zero value to all them. */
1397 uint16_t primaries_index
; /* the chromaticity coordinates of the color primaries */
1398 uint16_t transfer_index
; /* the opto-electronic transfer characteristic of the image color components */
1399 uint16_t matrix_index
; /* the matrix coefficients associated with derivation of luma and chroma signals from the green, blue, and red primaries */
1402 } lsmash_video_summary_t
;
1404 int lsmash_convert_crop_into_clap
1412 int lsmash_convert_clap_into_crop
1420 /****************************************************************************
1421 * Hint Description Layer
1422 ****************************************************************************/
1427 uint16_t version
; /* = 1 */
1428 uint16_t highestcompatibleversion
; /* = 1 */
1429 uint32_t maxpacketsize
; /* maximum size of one packet */
1430 } lsmash_hint_summary_t
;
1432 /****************************************************************************
1434 ****************************************************************************/
1438 QT_SAMPLE_EARLIER_PTS_ALLOWED
= 1,
1440 ISOM_SAMPLE_LEADING_UNKNOWN
= 0,
1441 ISOM_SAMPLE_IS_UNDECODABLE_LEADING
= 1,
1442 ISOM_SAMPLE_IS_NOT_LEADING
= 2,
1443 ISOM_SAMPLE_IS_DECODABLE_LEADING
= 3,
1445 ISOM_SAMPLE_INDEPENDENCY_UNKNOWN
= 0,
1446 ISOM_SAMPLE_IS_NOT_INDEPENDENT
= 1,
1447 ISOM_SAMPLE_IS_INDEPENDENT
= 2,
1449 ISOM_SAMPLE_DISPOSABLE_UNKNOWN
= 0,
1450 ISOM_SAMPLE_IS_NOT_DISPOSABLE
= 1,
1451 ISOM_SAMPLE_IS_DISPOSABLE
= 2,
1453 ISOM_SAMPLE_REDUNDANCY_UNKNOWN
= 0,
1454 ISOM_SAMPLE_HAS_REDUNDANCY
= 1,
1455 ISOM_SAMPLE_HAS_NO_REDUNDANCY
= 2,
1456 } lsmash_sample_dependency
;
1460 /* flags for ISO Base Media file format */
1461 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_NONE
= 0,
1462 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_SYNC
= 1 << 0, /* a sync sample */
1463 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP
= 1 << 2, /* the first sample of a closed or an open GOP */
1464 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED
= 1 << 3, /* a sample in a closed GOP
1465 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP. */
1466 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN
= 1 << 4, /* a sample in an open GOP
1467 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP. */
1468 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR
= 1 << 5, /* a sample on gradual decoder refresh or random access recovery */
1469 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_START
= 1 << 6, /* a sample that is the starting point of gradual decoder refresh or random access recovery
1470 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR. */
1471 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_END
= 1 << 7, /* a sample that is the ending point of gradual decoder refresh or random access recovery
1472 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR. */
1474 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP
/* the first sample of a closed GOP */
1475 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1476 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED
,
1477 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP
/* the first sample of an open GOP */
1478 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1479 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN
,
1480 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_POST_ROLL_START
/* the post-roll starting point of random access recovery */
1481 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR
1482 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_START
,
1483 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_PRE_ROLL_END
/* the pre-roll ending point of random access recovery */
1484 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR
1485 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_END
,
1487 /* flags for QuickTime file format */
1488 QT_SAMPLE_RANDOM_ACCESS_FLAG_NONE
= 0, /* alias of ISOM_SAMPLE_RANDOM_ACCESS_FLAG_NONE */
1489 QT_SAMPLE_RANDOM_ACCESS_FLAG_SYNC
= ISOM_SAMPLE_RANDOM_ACCESS_FLAG_SYNC
,
1490 QT_SAMPLE_RANDOM_ACCESS_FLAG_PARTIAL_SYNC
= 1 << 1, /* partial sync sample
1491 * Partial sync sample is a sample
1492 * such that this sample and samples following in decoding order can be correctly decoded
1493 * using the first sample of the previous GOP and samples following in decoding order,
1494 * in addition, this sample and non-leading samples following in decoding order can be correctly decoded from this. */
1495 QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP
= ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP
,
1496 QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED
= ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED
,
1497 QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN
= ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN
,
1499 QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP
/* the first sample of a closed GOP */
1500 = QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1501 | QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED
,
1502 QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP
/* the first sample of an open GOP */
1503 = QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP
1504 | QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN
,
1505 } lsmash_random_access_flag
;
1507 #define LSMASH_FLAGS_SATISFIED( x, y ) (((x) & (y)) == (y))
1508 #define LSMASH_IS_CLOSED_RAP( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP )
1509 #define LSMASH_IS_OPEN_RAP( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP )
1510 #define LSMASH_IS_POST_ROLL_START( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_POST_ROLL_START )
1511 #define LSMASH_IS_PRE_ROLL_END( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_PRE_ROLL_END )
1515 uint32_t identifier
; /* the identifier of sample
1516 * If this identifier equals a certain identifier of random access recovery point,
1517 * then this sample is the random access recovery point of the earliest unestablished post-roll group. */
1518 uint32_t complete
; /* the identifier of future random access recovery point, which is necessary for the recovery from its starting point to be completed
1519 * For muxing, this value is used only if (ra_flags & ISOM_SAMPLE_RANDOM_ACCESS_TYPE_POST_ROLL_START) is true.
1520 * The following is an example of use for gradual decoder refresh of H.264/AVC.
1521 * For each sample, set 'frame_num' to the 'identifier'.
1522 * For samples with recovery point SEI message, add ISOM_SAMPLE_RANDOM_ACCESS_TYPE_POST_ROLL_START to ra_flags
1523 * and set '(frame_num + recovery_frame_cnt) % MaxFrameNum' to the 'complete'.
1524 * The above-mentioned values are set appropriately, then L-SMASH will establish appropriate post-roll grouping. */
1525 } lsmash_post_roll_t
;
1529 uint32_t distance
; /* the distance from the previous random access point or pre-roll starting point
1530 * of the random access recovery point to this sample.
1531 * For muxing, this value is used only if ra_flags is not set to ISOM_SAMPLE_RANDOM_ACCESS_TYPE_NONE
1532 * and LSMASH_IS_POST_ROLL_START( ra_flags ) is false.
1533 * Some derived specifications forbid using pre-roll settings and use post-roll settings instead (e.g. AVC uses only post-roll).
1534 * The following is an example of pre-roll distance for representing audio decoder delay derived from composition.
1535 * Typical AAC encoding uses a transform over consecutive sets of 2048 audio samples,
1536 * applied every 1024 audio samples (MDCTs are overlapped).
1537 * For correct audio to be decoded, both transforms for any period of 1024 audio samples are needed.
1538 * For this AAC stream, therefore, 'distance' of each sample shall be set to 1 (one AAC access unit).
1539 * Note: the number of priming audio sample i.e. encoder delay shall be represented by 'start_time' in an edit. */
1540 } lsmash_pre_roll_t
;
1544 lsmash_random_access_flag ra_flags
; /* random access flags */
1545 lsmash_post_roll_t post_roll
;
1546 lsmash_pre_roll_t pre_roll
;
1547 uint8_t allow_earlier
; /* only for QuickTime file format */
1549 uint8_t independent
;
1552 uint8_t reserved
[3]; /* broken link
1554 } lsmash_sample_property_t
;
1558 #define LSMASH_TIMESTAMP_UNDEFINED UINT64_MAX
1559 uint32_t length
; /* size of sample data
1560 * Note: this is NOT always an allocated size. */
1561 uint8_t *data
; /* sample data */
1562 uint64_t dts
; /* Decoding TimeStamp in units of media timescale
1563 * No two samples in the same track have the same Decoding TimeStamp.
1564 * Any user must not set Decoding TimeStamp of any sample to LSMASH_TIMESTAMP_UNDEFINED. */
1565 uint64_t cts
; /* Composition TimeStamp in units of media timescale
1566 * No two samples in the same track have the same Composition TimeStamp.
1567 * If sample is a non-output sample i.e. decoded but not used, set its Composition TimeStamp to LSMASH_TIMESTAMP_UNDEFINED.
1568 * Composition TimeStamp of any non-output sample makes no sense. Note that explicit timeline maps shall be used to exclude
1569 * non-output samples from presentation timeline. */
1570 uint64_t pos
; /* absolute file offset of sample data (read-only) */
1571 uint32_t index
; /* index of sample description */
1572 lsmash_sample_property_t prop
;
1577 uint64_t dts
; /* Decoding TimeStamp in units of media timescale */
1578 uint64_t cts
; /* Composition TimeStamp in units of media timescale */
1579 } lsmash_media_ts_t
;
1583 uint32_t sample_count
;
1584 lsmash_media_ts_t
*timestamp
;
1585 } lsmash_media_ts_list_t
;
1587 /* Allocate a sample and then allocate data of the allocated sample by 'size'.
1588 * If 'size' is set to 0, data of the allocated sample won't be allocated and will be set to NULL instead.
1589 * The allocated sample can be deallocated by lsmash_delete_sample().
1591 * Return the address of an allocated sample if successful.
1592 * Return NULL otherwise. */
1593 lsmash_sample_t
*lsmash_create_sample
1595 uint32_t size
/* size of sample data you request */
1598 /* Allocate data of a given allocated sample by 'size'.
1599 * If the sample data is already allocated, reallocate it by 'size'.
1601 * Return 0 if successful.
1602 * Return a negative value otherwise. */
1603 int lsmash_sample_alloc
1605 lsmash_sample_t
*sample
, /* the address of a sample you want to allocate its sample data */
1606 uint32_t size
/* size of sample data you request */
1609 /* Deallocate a given sample. */
1610 void lsmash_delete_sample
1612 lsmash_sample_t
*sample
/* the address of a sample you want to deallocate */
1615 /* Append a sample to a track.
1617 * The appended sample will be deleted by lsmash_delete_sample() internally.
1618 * Users shall not deallocate the sample by lsmash_delete_sample() if successful to append the sample.
1620 * Return 0 if successful.
1621 * Return a negative value otherwise. */
1622 int lsmash_append_sample
1624 lsmash_root_t
*root
,
1626 lsmash_sample_t
*sample
1629 /****************************************************************************
1631 ****************************************************************************/
1632 /* Media handler types */
1635 ISOM_MEDIA_HANDLER_TYPE_3GPP_SCENE_DESCRIPTION
= LSMASH_4CC( '3', 'g', 's', 'd' ),
1636 ISOM_MEDIA_HANDLER_TYPE_ID3_VERSION2_METADATA
= LSMASH_4CC( 'I', 'D', '3', '2' ),
1637 ISOM_MEDIA_HANDLER_TYPE_AUXILIARY_VIDEO_TRACK
= LSMASH_4CC( 'a', 'u', 'x', 'v' ),
1638 ISOM_MEDIA_HANDLER_TYPE_CPCM_AUXILIARY_METADATA
= LSMASH_4CC( 'c', 'p', 'a', 'd' ),
1639 ISOM_MEDIA_HANDLER_TYPE_CLOCK_REFERENCE_STREAM
= LSMASH_4CC( 'c', 'r', 's', 'm' ),
1640 ISOM_MEDIA_HANDLER_TYPE_DVB_MANDATORY_BASIC_DESCRIPTION
= LSMASH_4CC( 'd', 'm', 'b', 'd' ),
1641 ISOM_MEDIA_HANDLER_TYPE_TV_ANYTIME
= LSMASH_4CC( 'd', 't', 'v', 'a' ),
1642 ISOM_MEDIA_HANDLER_TYPE_BROADBAND_CONTENT_GUIDE
= LSMASH_4CC( 'd', 't', 'v', 'a' ),
1643 ISOM_MEDIA_HANDLER_TYPE_FONT_DATA_STREAM
= LSMASH_4CC( 'f', 'd', 's', 'm' ),
1644 ISOM_MEDIA_HANDLER_TYPE_GENERAL_MPEG4_SYSTEM_STREAM
= LSMASH_4CC( 'g', 'e', 's', 'm' ),
1645 ISOM_MEDIA_HANDLER_TYPE_HINT_TRACK
= LSMASH_4CC( 'h', 'i', 'n', 't' ),
1646 ISOM_MEDIA_HANDLER_TYPE_IPDC_ELECTRONIC_SERVICE_GUIDE
= LSMASH_4CC( 'i', 'p', 'd', 'c' ),
1647 ISOM_MEDIA_HANDLER_TYPE_IPMP_STREAM
= LSMASH_4CC( 'i', 'p', 's', 'm' ),
1648 ISOM_MEDIA_HANDLER_TYPE_MPEG7_STREAM
= LSMASH_4CC( 'm', '7', 's', 'm' ),
1649 ISOM_MEDIA_HANDLER_TYPE_TIMED_METADATA_TRACK
= LSMASH_4CC( 'm', 'e', 't', 'a' ),
1650 ISOM_MEDIA_HANDLER_TYPE_MPEGJ_STREAM
= LSMASH_4CC( 'm', 'j', 's', 'm' ),
1651 ISOM_MEDIA_HANDLER_TYPE_MPEG21_DIGITAL_ITEM
= LSMASH_4CC( 'm', 'p', '2', '1' ),
1652 ISOM_MEDIA_HANDLER_TYPE_OBJECT_CONTENT_INFO_STREAM
= LSMASH_4CC( 'o', 'c', 's', 'm' ),
1653 ISOM_MEDIA_HANDLER_TYPE_OBJECT_DESCRIPTOR_STREAM
= LSMASH_4CC( 'o', 'd', 's', 'm' ),
1654 ISOM_MEDIA_HANDLER_TYPE_SCENE_DESCRIPTION_STREAM
= LSMASH_4CC( 's', 'd', 's', 'm' ),
1655 ISOM_MEDIA_HANDLER_TYPE_KEY_MANAGEMENT_MESSAGES
= LSMASH_4CC( 's', 'k', 'm', 'm' ),
1656 ISOM_MEDIA_HANDLER_TYPE_AUDIO_TRACK
= LSMASH_4CC( 's', 'o', 'u', 'n' ),
1657 ISOM_MEDIA_HANDLER_TYPE_TEXT_TRACK
= LSMASH_4CC( 't', 'e', 'x', 't' ),
1658 ISOM_MEDIA_HANDLER_TYPE_PROPRIETARY_DESCRIPTIVE_METADATA
= LSMASH_4CC( 'u', 'r', 'i', ' ' ),
1659 ISOM_MEDIA_HANDLER_TYPE_VIDEO_TRACK
= LSMASH_4CC( 'v', 'i', 'd', 'e' ),
1660 } lsmash_media_type
;
1662 /* ISO language codes */
1665 #define LSMASH_PACK_ISO_LANGUAGE( a, b, c ) ((((a-0x60)&0x1f)<<10) | (((b-0x60)&0x1f)<<5) | ((c-0x60)&0x1f))
1666 ISOM_LANGUAGE_CODE_ENGLISH
= LSMASH_PACK_ISO_LANGUAGE( 'e', 'n', 'g' ),
1667 ISOM_LANGUAGE_CODE_FRENCH
= LSMASH_PACK_ISO_LANGUAGE( 'f', 'r', 'a' ),
1668 ISOM_LANGUAGE_CODE_GERMAN
= LSMASH_PACK_ISO_LANGUAGE( 'd', 'e', 'u' ),
1669 ISOM_LANGUAGE_CODE_ITALIAN
= LSMASH_PACK_ISO_LANGUAGE( 'i', 't', 'a' ),
1670 ISOM_LANGUAGE_CODE_DUTCH_M
= LSMASH_PACK_ISO_LANGUAGE( 'd', 'u', 'm' ),
1671 ISOM_LANGUAGE_CODE_SWEDISH
= LSMASH_PACK_ISO_LANGUAGE( 's', 'w', 'e' ),
1672 ISOM_LANGUAGE_CODE_SPANISH
= LSMASH_PACK_ISO_LANGUAGE( 's', 'p', 'a' ),
1673 ISOM_LANGUAGE_CODE_DANISH
= LSMASH_PACK_ISO_LANGUAGE( 'd', 'a', 'n' ),
1674 ISOM_LANGUAGE_CODE_PORTUGUESE
= LSMASH_PACK_ISO_LANGUAGE( 'p', 'o', 'r' ),
1675 ISOM_LANGUAGE_CODE_NORWEGIAN
= LSMASH_PACK_ISO_LANGUAGE( 'n', 'o', 'r' ),
1676 ISOM_LANGUAGE_CODE_HEBREW
= LSMASH_PACK_ISO_LANGUAGE( 'h', 'e', 'b' ),
1677 ISOM_LANGUAGE_CODE_JAPANESE
= LSMASH_PACK_ISO_LANGUAGE( 'j', 'p', 'n' ),
1678 ISOM_LANGUAGE_CODE_ARABIC
= LSMASH_PACK_ISO_LANGUAGE( 'a', 'r', 'a' ),
1679 ISOM_LANGUAGE_CODE_FINNISH
= LSMASH_PACK_ISO_LANGUAGE( 'f', 'i', 'n' ),
1680 ISOM_LANGUAGE_CODE_GREEK
= LSMASH_PACK_ISO_LANGUAGE( 'e', 'l', 'l' ),
1681 ISOM_LANGUAGE_CODE_ICELANDIC
= LSMASH_PACK_ISO_LANGUAGE( 'i', 's', 'l' ),
1682 ISOM_LANGUAGE_CODE_MALTESE
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'l', 't' ),
1683 ISOM_LANGUAGE_CODE_TURKISH
= LSMASH_PACK_ISO_LANGUAGE( 't', 'u', 'r' ),
1684 ISOM_LANGUAGE_CODE_CROATIAN
= LSMASH_PACK_ISO_LANGUAGE( 'h', 'r', 'v' ),
1685 ISOM_LANGUAGE_CODE_CHINESE
= LSMASH_PACK_ISO_LANGUAGE( 'z', 'h', 'o' ),
1686 ISOM_LANGUAGE_CODE_URDU
= LSMASH_PACK_ISO_LANGUAGE( 'u', 'r', 'd' ),
1687 ISOM_LANGUAGE_CODE_HINDI
= LSMASH_PACK_ISO_LANGUAGE( 'h', 'i', 'n' ),
1688 ISOM_LANGUAGE_CODE_THAI
= LSMASH_PACK_ISO_LANGUAGE( 't', 'h', 'a' ),
1689 ISOM_LANGUAGE_CODE_KOREAN
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'o', 'r' ),
1690 ISOM_LANGUAGE_CODE_LITHUANIAN
= LSMASH_PACK_ISO_LANGUAGE( 'l', 'i', 't' ),
1691 ISOM_LANGUAGE_CODE_POLISH
= LSMASH_PACK_ISO_LANGUAGE( 'p', 'o', 'l' ),
1692 ISOM_LANGUAGE_CODE_HUNGARIAN
= LSMASH_PACK_ISO_LANGUAGE( 'h', 'u', 'n' ),
1693 ISOM_LANGUAGE_CODE_ESTONIAN
= LSMASH_PACK_ISO_LANGUAGE( 'e', 's', 't' ),
1694 ISOM_LANGUAGE_CODE_LATVIAN
= LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 'v' ),
1695 ISOM_LANGUAGE_CODE_SAMI
= LSMASH_PACK_ISO_LANGUAGE( 's', 'm', 'i' ),
1696 ISOM_LANGUAGE_CODE_FAROESE
= LSMASH_PACK_ISO_LANGUAGE( 'f', 'a', 'o' ),
1697 ISOM_LANGUAGE_CODE_RUSSIAN
= LSMASH_PACK_ISO_LANGUAGE( 'r', 'u', 's' ),
1698 ISOM_LANGUAGE_CODE_DUTCH
= LSMASH_PACK_ISO_LANGUAGE( 'n', 'l', 'd' ),
1699 ISOM_LANGUAGE_CODE_IRISH
= LSMASH_PACK_ISO_LANGUAGE( 'g', 'l', 'e' ),
1700 ISOM_LANGUAGE_CODE_ALBANIAN
= LSMASH_PACK_ISO_LANGUAGE( 's', 'q', 'i' ),
1701 ISOM_LANGUAGE_CODE_ROMANIAN
= LSMASH_PACK_ISO_LANGUAGE( 'r', 'o', 'n' ),
1702 ISOM_LANGUAGE_CODE_CZECH
= LSMASH_PACK_ISO_LANGUAGE( 'c', 'e', 's' ),
1703 ISOM_LANGUAGE_CODE_SLOVAK
= LSMASH_PACK_ISO_LANGUAGE( 's', 'l', 'k' ),
1704 ISOM_LANGUAGE_CODE_SLOVENIA
= LSMASH_PACK_ISO_LANGUAGE( 's', 'l', 'v' ),
1705 ISOM_LANGUAGE_CODE_YIDDISH
= LSMASH_PACK_ISO_LANGUAGE( 'y', 'i', 'd' ),
1706 ISOM_LANGUAGE_CODE_SERBIAN
= LSMASH_PACK_ISO_LANGUAGE( 's', 'r', 'p' ),
1707 ISOM_LANGUAGE_CODE_MACEDONIAN
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'k', 'd' ),
1708 ISOM_LANGUAGE_CODE_BULGARIAN
= LSMASH_PACK_ISO_LANGUAGE( 'b', 'u', 'l' ),
1709 ISOM_LANGUAGE_CODE_UKRAINIAN
= LSMASH_PACK_ISO_LANGUAGE( 'u', 'k', 'r' ),
1710 ISOM_LANGUAGE_CODE_BELARUSIAN
= LSMASH_PACK_ISO_LANGUAGE( 'b', 'e', 'l' ),
1711 ISOM_LANGUAGE_CODE_UZBEK
= LSMASH_PACK_ISO_LANGUAGE( 'u', 'z', 'b' ),
1712 ISOM_LANGUAGE_CODE_KAZAKH
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 'z' ),
1713 ISOM_LANGUAGE_CODE_AZERBAIJANI
= LSMASH_PACK_ISO_LANGUAGE( 'a', 'z', 'e' ),
1714 ISOM_LANGUAGE_CODE_ARMENIAN
= LSMASH_PACK_ISO_LANGUAGE( 'h', 'y', 'e' ),
1715 ISOM_LANGUAGE_CODE_GEORGIAN
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 't' ),
1716 ISOM_LANGUAGE_CODE_MOLDAVIAN
= LSMASH_PACK_ISO_LANGUAGE( 'r', 'o', 'n' ),
1717 ISOM_LANGUAGE_CODE_KIRGHIZ
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'i', 'r' ),
1718 ISOM_LANGUAGE_CODE_TAJIK
= LSMASH_PACK_ISO_LANGUAGE( 't', 'g', 'k' ),
1719 ISOM_LANGUAGE_CODE_TURKMEN
= LSMASH_PACK_ISO_LANGUAGE( 't', 'u', 'k' ),
1720 ISOM_LANGUAGE_CODE_MONGOLIAN
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'o', 'n' ),
1721 ISOM_LANGUAGE_CODE_PASHTO
= LSMASH_PACK_ISO_LANGUAGE( 'p', 'u', 's' ),
1722 ISOM_LANGUAGE_CODE_KURDISH
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'u', 'r' ),
1723 ISOM_LANGUAGE_CODE_KASHMIRI
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 's' ),
1724 ISOM_LANGUAGE_CODE_SINDHI
= LSMASH_PACK_ISO_LANGUAGE( 's', 'n', 'd' ),
1725 ISOM_LANGUAGE_CODE_TIBETAN
= LSMASH_PACK_ISO_LANGUAGE( 'b', 'o', 'd' ),
1726 ISOM_LANGUAGE_CODE_NEPALI
= LSMASH_PACK_ISO_LANGUAGE( 'n', 'e', 'p' ),
1727 ISOM_LANGUAGE_CODE_SANSKRIT
= LSMASH_PACK_ISO_LANGUAGE( 's', 'a', 'n' ),
1728 ISOM_LANGUAGE_CODE_MARATHI
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'a', 'r' ),
1729 ISOM_LANGUAGE_CODE_BENGALI
= LSMASH_PACK_ISO_LANGUAGE( 'b', 'e', 'n' ),
1730 ISOM_LANGUAGE_CODE_ASSAMESE
= LSMASH_PACK_ISO_LANGUAGE( 'a', 's', 'm' ),
1731 ISOM_LANGUAGE_CODE_GUJARATI
= LSMASH_PACK_ISO_LANGUAGE( 'g', 'u', 'j' ),
1732 ISOM_LANGUAGE_CODE_PUNJABI
= LSMASH_PACK_ISO_LANGUAGE( 'p', 'a', 'n' ),
1733 ISOM_LANGUAGE_CODE_ORIYA
= LSMASH_PACK_ISO_LANGUAGE( 'o', 'r', 'i' ),
1734 ISOM_LANGUAGE_CODE_MALAYALAM
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'a', 'l' ),
1735 ISOM_LANGUAGE_CODE_KANNADA
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 'n' ),
1736 ISOM_LANGUAGE_CODE_TAMIL
= LSMASH_PACK_ISO_LANGUAGE( 't', 'a', 'm' ),
1737 ISOM_LANGUAGE_CODE_TELUGU
= LSMASH_PACK_ISO_LANGUAGE( 't', 'e', 'l' ),
1738 ISOM_LANGUAGE_CODE_SINHALESE
= LSMASH_PACK_ISO_LANGUAGE( 's', 'i', 'n' ),
1739 ISOM_LANGUAGE_CODE_BURMESE
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'y', 'a' ),
1740 ISOM_LANGUAGE_CODE_KHMER
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'h', 'm' ),
1741 ISOM_LANGUAGE_CODE_LAO
= LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 'o' ),
1742 ISOM_LANGUAGE_CODE_VIETNAMESE
= LSMASH_PACK_ISO_LANGUAGE( 'v', 'i', 'e' ),
1743 ISOM_LANGUAGE_CODE_INDONESIAN
= LSMASH_PACK_ISO_LANGUAGE( 'i', 'n', 'd' ),
1744 ISOM_LANGUAGE_CODE_TAGALOG
= LSMASH_PACK_ISO_LANGUAGE( 't', 'g', 'l' ),
1745 ISOM_LANGUAGE_CODE_MALAY_ROMAN
= LSMASH_PACK_ISO_LANGUAGE( 'm', 's', 'a' ),
1746 ISOM_LANGUAGE_CODE_MAYAY_ARABIC
= LSMASH_PACK_ISO_LANGUAGE( 'm', 's', 'a' ),
1747 ISOM_LANGUAGE_CODE_AMHARIC
= LSMASH_PACK_ISO_LANGUAGE( 'a', 'm', 'h' ),
1748 ISOM_LANGUAGE_CODE_OROMO
= LSMASH_PACK_ISO_LANGUAGE( 'o', 'r', 'm' ),
1749 ISOM_LANGUAGE_CODE_SOMALI
= LSMASH_PACK_ISO_LANGUAGE( 's', 'o', 'm' ),
1750 ISOM_LANGUAGE_CODE_SWAHILI
= LSMASH_PACK_ISO_LANGUAGE( 's', 'w', 'a' ),
1751 ISOM_LANGUAGE_CODE_KINYARWANDA
= LSMASH_PACK_ISO_LANGUAGE( 'k', 'i', 'n' ),
1752 ISOM_LANGUAGE_CODE_RUNDI
= LSMASH_PACK_ISO_LANGUAGE( 'r', 'u', 'n' ),
1753 ISOM_LANGUAGE_CODE_CHEWA
= LSMASH_PACK_ISO_LANGUAGE( 'n', 'y', 'a' ),
1754 ISOM_LANGUAGE_CODE_MALAGASY
= LSMASH_PACK_ISO_LANGUAGE( 'm', 'l', 'g' ),
1755 ISOM_LANGUAGE_CODE_ESPERANTO
= LSMASH_PACK_ISO_LANGUAGE( 'e', 'p', 'o' ),
1756 ISOM_LANGUAGE_CODE_WELSH
= LSMASH_PACK_ISO_LANGUAGE( 'c', 'y', 'm' ),
1757 ISOM_LANGUAGE_CODE_BASQUE
= LSMASH_PACK_ISO_LANGUAGE( 'e', 'u', 's' ),
1758 ISOM_LANGUAGE_CODE_CATALAN
= LSMASH_PACK_ISO_LANGUAGE( 'c', 'a', 't' ),
1759 ISOM_LANGUAGE_CODE_LATIN
= LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 't' ),
1760 ISOM_LANGUAGE_CODE_QUECHUA
= LSMASH_PACK_ISO_LANGUAGE( 'q', 'u', 'e' ),
1761 ISOM_LANGUAGE_CODE_GUARANI
= LSMASH_PACK_ISO_LANGUAGE( 'g', 'r', 'n' ),
1762 ISOM_LANGUAGE_CODE_AYMARA
= LSMASH_PACK_ISO_LANGUAGE( 'a', 'y', 'm' ),
1763 ISOM_LANGUAGE_CODE_TATAR
= LSMASH_PACK_ISO_LANGUAGE( 'c', 'r', 'h' ),
1764 ISOM_LANGUAGE_CODE_UIGHUR
= LSMASH_PACK_ISO_LANGUAGE( 'u', 'i', 'g' ),
1765 ISOM_LANGUAGE_CODE_DZONGKHA
= LSMASH_PACK_ISO_LANGUAGE( 'd', 'z', 'o' ),
1766 ISOM_LANGUAGE_CODE_JAVANESE
= LSMASH_PACK_ISO_LANGUAGE( 'j', 'a', 'v' ),
1767 ISOM_LANGUAGE_CODE_UNDEFINED
= LSMASH_PACK_ISO_LANGUAGE( 'u', 'n', 'd' ),
1768 } lsmash_iso_language_code
;
1772 lsmash_media_type handler_type
; /* the nature of the media
1773 * You can't change handler_type through this parameter manually. */
1774 uint32_t timescale
; /* media timescale: timescale for this media */
1775 uint64_t duration
; /* the duration of this media, expressed in the media timescale
1776 * You can't set this parameter manually. */
1777 uint8_t roll_grouping
; /* roll recovery grouping present
1778 * Require 'avc1' brand, or ISO Base Media File Format version 2 or later. */
1779 uint8_t rap_grouping
; /* random access point grouping present
1780 * Require ISO Base Media File Format version 6 or later. */
1781 /* Use either type of language code. */
1782 uint16_t MAC_language
; /* Macintosh language code for this media */
1783 uint16_t ISO_language
; /* ISO 639-2/T language code for this media */
1784 /* human-readable name for the track type (for debugging and inspection purposes) */
1785 char *media_handler_name
;
1786 char *data_handler_name
;
1787 /* Any user shouldn't use the following parameters. */
1788 PRIVATE
char media_handler_name_shadow
[256];
1789 PRIVATE
char data_handler_name_shadow
[256];
1791 uint8_t compact_sample_size_table
; /* 1: Use compact size table if possible. (output/muxing mode)
1792 * Compact sample size table is used. (input/demuxing mode) */
1793 uint8_t no_sample_dependency_table
; /* 1: Don't write sample dependency type table. (output/muxing mode)
1794 * Sample dependency type table is absent. (input/demuxing mode) */
1795 uint8_t reserved
[2];
1796 } lsmash_media_parameters_t
;
1800 uint32_t index
; /* the index of a data reference */
1801 char *location
; /* URL; location of referenced media file */
1802 /* Probably, additional string fields such as thing to indicate URN will be added in the future. */
1803 } lsmash_data_reference_t
;
1805 /* Set all the given media parameters to default. */
1806 void lsmash_initialize_media_parameters
1808 lsmash_media_parameters_t
*param
/* the address of the media parameters to which you want to set default value */
1811 /* Set media parameters to a track.
1813 * Return 0 if successful.
1814 * Return a negative value otherwise. */
1815 int lsmash_set_media_parameters
1817 lsmash_root_t
*root
, /* the address of a ROOT containing a track to which you want to set the media parameters */
1818 uint32_t track_ID
, /* the track_ID of a track to which you want to set the media parameters */
1819 lsmash_media_parameters_t
*param
/* the address of the media parameters you want to set to a track. */
1822 /* Set the duration of the last sample to a track.
1824 * Return 0 if successful.
1825 * Return a negative value otherwise. */
1826 int lsmash_set_last_sample_delta
1828 lsmash_root_t
*root
,
1830 uint32_t sample_delta
1833 /* Flush samples in the internal pool in a track.
1834 * Users shall call this function for each track before calling lsmash_finish_movie() or lsmash_create_fragment_movie().
1836 * Return 0 if successful.
1837 * Return a negative value otherwise. */
1838 int lsmash_flush_pooled_samples
1840 lsmash_root_t
*root
,
1842 uint32_t last_sample_delta
1845 /* Update the modification time of a media to the most recent.
1846 * If the creation time of that media is larger than the modification time,
1847 * then override the creation one with the modification one.
1849 * Return 0 if successful.
1850 * Return a negative value otherwise. */
1851 int lsmash_update_media_modification_time
1853 lsmash_root_t
*root
,
1857 /* Get the media parameters in a track.
1859 * Return 0 if successful.
1860 * Return a negative value otherwise. */
1861 int lsmash_get_media_parameters
1863 lsmash_root_t
*root
,
1865 lsmash_media_parameters_t
*param
1868 /* Get the duration of a media.
1870 * Return the duration of a media if successful.
1871 * Return 0 otherwise. */
1872 uint64_t lsmash_get_media_duration
1874 lsmash_root_t
*root
,
1878 /* Get the timescale of a media.
1880 * Return the timescale of a media if successful.
1881 * Return 0 otherwise. */
1882 uint32_t lsmash_get_media_timescale
1884 lsmash_root_t
*root
,
1888 /* Get the duration of the last sample in a track.
1890 * Return the duration of the last sample in a track if successful.
1891 * Return 0 otherwise. */
1892 uint32_t lsmash_get_last_sample_delta
1894 lsmash_root_t
*root
,
1898 /* Get the composition time offset of the first sample in a track.
1900 * Return the composition time offset of the first sample in a track if successful.
1901 * Return 0 otherwise. */
1902 uint32_t lsmash_get_start_time_offset
1904 lsmash_root_t
*root
,
1908 /* Get the shift of composition timeline to decode timeline in a track.
1910 * Return the shift of composition timeline to decode timeline in a track. if successful.
1911 * Return 0 otherwise. */
1912 uint32_t lsmash_get_composition_to_decode_shift
1914 lsmash_root_t
*root
,
1918 /* Pack a string of ISO 639-2/T language code into 16-bit data.
1920 * Return a packed 16-bit ISO 639-2/T language if successful.
1921 * Return 0 otherwise. */
1922 uint16_t lsmash_pack_iso_language
1924 char *iso_language
/* a string of ISO 639-2/T language code */
1927 /* Count the number of data references in a track.
1929 * Return the number of data references in a track if no error.
1930 * Return 0 otherwise. */
1931 uint32_t lsmash_count_data_reference
1933 lsmash_root_t
*root
,
1937 /* Get the location of a data reference in a track by specifying the index in 'data_ref'.
1938 * The string fields in 'data_ref' may be allocated if referencing external media data.
1939 * If referencing self-contained media data, the all string fields are set to NULL.
1940 * You can deallocate the allocated fields by lsmash_free().
1941 * Also you can deallocate all of the allocated fields by lsmash_cleanup_data_reference() at a time.
1943 * Return 0 if successful.
1944 * Return a negative value otherwise. */
1945 int lsmash_get_data_reference
1947 lsmash_root_t
*root
,
1949 lsmash_data_reference_t
*data_ref
1952 /* Deallocate all of allocated fields in a given data reference at a time.
1953 * The deallocated fields are set to NULL. */
1954 void lsmash_cleanup_data_reference
1956 lsmash_data_reference_t
*data_ref
1959 /* Create a data reference in a track and specify its location on playback for writing.
1960 * If no settings for data references in a track, the location of the first data reference is specified to
1961 * the location of the same file implicitly.
1962 * Note that referenced files shall be used as a media, i.e. LSMASH_FILE_MODE_MEDIA shall be set to the 'mode'
1963 * in the lsmash_file_parameters_t before calling lsmash_set_file().
1965 * As restrictions of the libary,
1966 * WARNING1: The box structured media files cannot be used as a reference data yet.
1967 * WARNING2: The external media files cannot be used as a reference data for movie fragments yet.
1969 * Return 0 if successful.
1970 * Return a negative value otherwise. */
1971 int lsmash_create_data_reference
1973 lsmash_root_t
*root
,
1975 lsmash_data_reference_t
*data_ref
,
1979 /* Assign a data reference in a track to a read file.
1981 * Return 0 if successful.
1982 * Return a negative value otherwise. */
1983 int lsmash_assign_data_reference
1985 lsmash_root_t
*root
,
1987 uint32_t data_ref_index
,
1991 /****************************************************************************
1993 ****************************************************************************/
1997 /* 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,
1998 * then all tracks shall be treated as if both flags were set on all tracks. */
1999 ISOM_TRACK_ENABLED
= 0x000001, /* Track_enabled: Indicates that the track is enabled.
2000 * A disabled track is treated as if it were not present. */
2001 ISOM_TRACK_IN_MOVIE
= 0x000002, /* Track_in_movie: Indicates that the track is used in the presentation. */
2002 ISOM_TRACK_IN_PREVIEW
= 0x000004, /* Track_in_preview: Indicates that the track is used when previewing the presentation. */
2004 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) */
2005 } lsmash_track_mode
;
2009 lsmash_track_mode mode
;
2010 uint32_t track_ID
; /* an integer that uniquely identifies the track
2011 * Don't set to value already used except for zero value.
2012 * Zero value don't override established track_ID. */
2013 uint64_t duration
; /* the duration of this track expressed in the movie timescale units
2014 * If there is any edit, your setting is ignored. */
2015 int16_t alternate_group
; /* an integer that specifies a group or collection of tracks
2016 * If this field is not 0, it should be the same for tracks that contain alternate data for one another
2017 * and different for tracks belonging to different such groups.
2018 * Only one track within an alternate group should be played or streamed at any one time.
2019 * Note: alternate_group is ignored when a file is read as an MPEG-4. */
2020 /* The following parameters are ignored when a file is read as an MPEG-4 or 3GPP file format. */
2021 int16_t video_layer
; /* the front-to-back ordering of video tracks; tracks with lower numbers are closer to the viewer. */
2022 int16_t audio_volume
; /* fixed point 8.8 number. 0x0100 is full volume. */
2023 int32_t matrix
[9]; /* transformation matrix for the video
2024 * Each value represents, in order, a, b, u, c, d, v, x, y and w.
2025 * All the values in a matrix are stored as 16.16 fixed-point values,
2026 * except for u, v and w, which are stored as 2.30 fixed-point values.
2027 * Not all derived specifications use matrices.
2028 * If a matrix is used, the point (p, q) is transformed into (p', q') using the matrix as follows:
2030 * (p, q, 1) * | c d v | = z * (p', q', 1)
2032 * p' = (a * p + c * q + x) / z; q' = (b * p + d * q + y) / z; z = u * p + v * q + w
2033 * Note: transformation matrix is applied after scaling to display size up to display_width and display_height. */
2034 /* visual presentation region size */
2035 uint32_t display_width
; /* visual presentation region size of horizontal direction as fixed point 16.16 number. */
2036 uint32_t display_height
; /* visual presentation region size of vertical direction as fixed point 16.16 number. */
2038 uint8_t aperture_modes
; /* track aperture modes present
2039 * This feature is only available under QuickTime file format.
2040 * Automatically disabled if multiple sample description is present or scaling method is specified. */
2041 } lsmash_track_parameters_t
;
2043 /* Explicit Timeline Map (Edit)
2044 * There are two types of timeline; one is the media timeline, the other is the presentation timeline (or the movie timeline).
2045 * An edit maps the presentation timeline to the media timeline.
2046 * Therefore, an edit can select any portion within the media and specify its playback speed.
2047 * The media within the track is played through the presentation timeline, so you can construct any complex presentation from a media by edits.
2048 * 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.
2049 * 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,
2050 * the decoder shall start to decode from there but player shall not display any sample in outside of that edit. */
2051 #define ISOM_EDIT_MODE_NORMAL (1<<16)
2052 #define ISOM_EDIT_MODE_DWELL 0
2053 #define ISOM_EDIT_MODE_EMPTY -1
2054 #define ISOM_EDIT_DURATION_UNKNOWN32 0xffffffff
2055 #define ISOM_EDIT_DURATION_UNKNOWN64 0xffffffffffffffff
2056 #define ISOM_EDIT_DURATION_IMPLICIT 0
2060 uint64_t duration
; /* the duration of this edit expressed in the movie timescale units
2061 * An edit can refer to the media within fragmented tracks.
2062 * The duration can be unknown at the time of creation of the initial movie due to various limiting factors that include
2063 * real-time generation of content, such as live streaming. In such a case it is recommended that the duration is set to
2064 * either ISOM_EDIT_DURATION_UNKNOWN32 (the maximum 32-bit unsigned integer), ISOM_EDIT_DURATION_UNKNOWN64 (the maximum
2065 * 64-bit unsigned integer) or ISOM_EDIT_DURATION_IMPLICIT.
2066 * If you have no interest in the duration of this edit but want to set the offset from media composition time to movie
2067 * presentation time, ISOM_EDIT_DURATION_IMPLICIT is useful for the provision of the offset for the movie and subsequent
2068 * movie fragments. The duration is expected to be constructed by demuxer. */
2069 int64_t start_time
; /* the starting composition time within the media of this edit
2070 * If set to ISOM_EDIT_MODE_EMPTY (-1), it construct an empty edit, which doesn't select any portion within the media. */
2071 int32_t rate
; /* the relative rate at which to play the media corresponding to this edit, expressed as 16.16 fixed-point number
2072 * If set to ISOM_EDIT_MODE_NORMAL (0x00010000), there is no rate change for timeline mapping.
2073 * If set to ISOM_EDIT_MODE_DWELL (0), the media at start_time is presented for the duration. */
2076 /* Create a track in a movie.
2077 * Users can destroy the created track by lsmash_delete_track().
2078 * When a track is created, its track_ID is assigned automatically so that any duplication of track_ID may be avoided.
2080 * Return the current track_ID of a track created by this function if successful.
2081 * Return 0 otherwise. */
2082 uint32_t lsmash_create_track
2084 lsmash_root_t
*root
,
2085 lsmash_media_type media_type
2088 /* Destroy the track of a given track_ID in a movie. */
2089 void lsmash_delete_track
2091 lsmash_root_t
*root
,
2095 /* Set all the given track parameters to default. */
2096 void lsmash_initialize_track_parameters
2098 lsmash_track_parameters_t
*param
2101 /* Set track parameters to a track.
2103 * Return 0 if successful.
2104 * Return a negative value otherwise. */
2105 int lsmash_set_track_parameters
2107 lsmash_root_t
*root
,
2109 lsmash_track_parameters_t
*param
2112 /* Update the duration of a track with a new duration of its last sample.
2114 * Return 0 if successful.
2115 * Return a negative value otherwise. */
2116 int lsmash_update_track_duration
2118 lsmash_root_t
*root
,
2120 uint32_t last_sample_delta
2123 /* Update the modification time of a track to the most recent.
2124 * If the creation time of that track is larger than the modification time,
2125 * then override the creation one with the modification one.
2127 * Return 0 if successful.
2128 * Return a negative value otherwise. */
2129 int lsmash_update_track_modification_time
2131 lsmash_root_t
*root
,
2135 /* Get a track_ID by a track number.
2136 * A track number is given in created order in a movie.
2137 * If a track is removed, the track number of tracks with higher track number than one of just removed track will be decremented.
2139 * Return a track_ID if successful.
2140 * Return 0 otherwise. */
2141 uint32_t lsmash_get_track_ID
2143 lsmash_root_t
*root
,
2144 uint32_t track_number
2147 /* Get the track parameters in a track.
2149 * Return 0 if successful.
2150 * Return a negative value otherwise. */
2151 int lsmash_get_track_parameters
2153 lsmash_root_t
*root
,
2155 lsmash_track_parameters_t
*param
2158 /* Get the duration of a track.
2160 * Return the duration of a track if successful.
2161 * Return 0 otherwise. */
2162 uint64_t lsmash_get_track_duration
2164 lsmash_root_t
*root
,
2168 /* Create an explicit timeline map (edit) and append it into a track.
2169 * Users can destroy ALL created edits in a track by lsmash_delete_explicit_timeline_map().
2171 * Return 0 if successful.
2172 * Return a negative value otherwise. */
2173 int lsmash_create_explicit_timeline_map
2175 lsmash_root_t
*root
,
2180 /* Destroy ALL created edits in a track.
2182 * Return 0 if successful.
2183 * Return a negative value otherwise. */
2184 int lsmash_delete_explicit_timeline_map
2186 lsmash_root_t
*root
,
2190 /* Count the number of edits in a track.
2192 * Return the number of edits in a track if successful.
2193 * Return 0 otherwise. */
2194 uint32_t lsmash_count_explicit_timeline_map
2196 lsmash_root_t
*root
,
2200 /* Get an edit in a track by an edit number.
2201 * An edit number is given in created order in a track.
2202 * If an edit is removed, the edit number of edits with higher edit number than one of just removed edit will be decremented.
2204 * Return 0 if successful.
2205 * Return a negative value otherwise. */
2206 int lsmash_get_explicit_timeline_map
2208 lsmash_root_t
*root
,
2210 uint32_t edit_number
,
2214 /* Modify an edit in a track by an edit number.
2215 * An edit number is given in created order in a track.
2216 * If an edit is removed, the edit number of edits with higher edit number than one of just removed edit will be decremented.
2218 * Return 0 if successful.
2219 * Return a negative value otherwise. */
2220 int lsmash_modify_explicit_timeline_map
2222 lsmash_root_t
*root
,
2224 uint32_t edit_number
,
2228 /****************************************************************************
2230 ****************************************************************************/
2233 uint32_t timescale
; /* movie timescale: timescale for the entire presentation */
2234 uint64_t duration
; /* the duration, expressed in movie timescale, of the longest track
2235 * You can't set this parameter manually. */
2236 uint32_t number_of_tracks
; /* the number of tracks in the movie
2237 * You can't set this parameter manually. */
2238 /* The following parameters are recognized only when a file is read as an Apple MPEG-4 or QuickTime file format. */
2239 int32_t playback_rate
; /* fixed point 16.16 number. 0x00010000 is normal forward playback and default value. */
2240 int32_t playback_volume
; /* fixed point 8.8 number. 0x0100 is full volume and default value. */
2241 int32_t preview_time
; /* the time value in the movie at which the preview begins */
2242 int32_t preview_duration
; /* the duration of the movie preview in movie timescale units */
2243 int32_t poster_time
; /* the time value of the time of the movie poster */
2244 } lsmash_movie_parameters_t
;
2246 /* Set all the given movie parameters to default. */
2247 void lsmash_initialize_movie_parameters
2249 lsmash_movie_parameters_t
*param
2252 /* Set movie parameters to a movie.
2254 * Return 0 if successful.
2255 * Return a negative value otherwise. */
2256 int lsmash_set_movie_parameters
2258 lsmash_root_t
*root
,
2259 lsmash_movie_parameters_t
*param
2262 /* Finalize a movie.
2263 * If the movie is not fragmented and 'remux' is set to non-NULL,
2264 * move overall necessary data to access and decode samples into the very front of the file at the end.
2265 * This is useful for progressive downloading.
2266 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function.
2268 * Return 0 if successful.
2269 * Return a negative value otherwise. */
2270 int lsmash_finish_movie
2272 lsmash_root_t
*root
,
2273 lsmash_adhoc_remux_t
*remux
2276 /* Update the modification time of a movie to the most recent.
2277 * If the creation time of that movie is larger than the modification time,
2278 * then override the creation one with the modification one.
2280 * Return 0 if successful.
2281 * Return a negative value otherwise. */
2282 int lsmash_update_movie_modification_time
2287 /* Get the movie parameters in a movie.
2289 * Return 0 if successful.
2290 * Return a negative value otherwise. */
2291 int lsmash_get_movie_parameters
2293 lsmash_root_t
*root
,
2294 lsmash_movie_parameters_t
*param
2297 /* Get the timescale of a movie.
2299 * Return the timescale of a movie if successful.
2300 * Return 0 otherwise. */
2301 uint32_t lsmash_get_movie_timescale
2306 /* Reserve the size of the media data region for a non-fragmented movie.
2307 * This enables to get rid of requirement of seekability for rewriting the actual size of the media data region when finishing
2308 * a non-fragmented movie. Note that the specified size is excluding the type and the size fields of the enclosing box and
2309 * this function must be called before any lsmash_append_sample(). If the actual size is greater than the reserved size when
2310 * finishing a non-fragmented movie, seek and rewrite the size of the box enclosing the media data region.
2312 * Return 0 if successful.
2313 * Return a negative value otherwise. */
2314 int lsmash_reserve_media_data_size
2316 lsmash_root_t
*root
,
2317 uint64_t media_data_size
2320 /****************************************************************************
2322 ****************************************************************************/
2323 /* Create a track as a chapter list referenced by another track.
2325 * Return 0 if successful.
2326 * Return a negative value otherwise. */
2327 int lsmash_create_reference_chapter_track
2329 lsmash_root_t
*root
,
2334 /* Create and set a chapter list as a user data to a movie.
2335 * The created chapter list in a movie can be destroyed by lsmash_delete_tyrant_chapter().
2337 * Return 0 if successful.
2338 * Return a negative value otherwise. */
2339 int lsmash_set_tyrant_chapter
2341 lsmash_root_t
*root
,
2346 /* Destroy a chapter list as a user data in a movie. */
2347 void lsmash_delete_tyrant_chapter
2352 /* Count chapters in the chapter list (moov.udta.chpl). */
2353 uint32_t lsmash_count_tyrant_chapter
2358 /* Retrieve a chapter entry from the chapter list (moov.udta.chpl).
2359 * Returned pointer is owned by the ROOT structure, so user shall not
2360 * modify or free it.
2362 * Return chapter title string if successful, otherwise NULL.
2364 char *lsmash_get_tyrant_chapter
2366 lsmash_root_t
*root
,
2367 uint32_t index
, /* index of chapter ( >= 1) */
2368 double *timestamp
/* timestamp of the chapter entry (in seconds) */
2371 /****************************************************************************
2373 ****************************************************************************/
2374 /* Flush the current movie fragment and create a new movie fragment.
2375 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function.
2377 * Return 0 if successful.
2378 * Return a negative value otherwise. */
2379 int lsmash_create_fragment_movie
2384 /* Create an empty duration track in the current movie fragment.
2385 * Don't specify track_ID any track fragment in the current movie fragment has.
2387 * Return 0 if successful.
2388 * Return a negative value otherwise. */
2389 int lsmash_create_fragment_empty_duration
2391 lsmash_root_t
*root
,
2396 /****************************************************************************
2398 ****************************************************************************/
2399 /* Dump and print box structure of ROOT into the destination.
2401 * Return 0 if successful.
2402 * Return a negative value otherwise. */
2403 int lsmash_print_movie
2405 lsmash_root_t
*root
, /* the address of ROOT you want to dump and print */
2406 const char *filename
/* the path of a file as the destination */
2409 /* Print a chapter list written as a user data on stdout.
2410 * This function might output BOM on Windows.
2412 * Return 0 if successful.
2413 * Return a negative value otherwise. */
2414 int lsmash_print_chapter_list
2419 /****************************************************************************
2421 ****************************************************************************/
2422 /* Copy all edits from the source track to the destination track.
2424 * Return 0 if successful.
2425 * Return a negative value otherwise. */
2426 int lsmash_copy_timeline_map
2429 uint32_t dst_track_ID
,
2431 uint32_t src_track_ID
2434 /* Construct the timeline for a track.
2435 * The constructed timeline can be destructed by lsmash_destruct_timeline().
2437 * Return 0 if successful.
2438 * Return a negative value otherwise. */
2439 int lsmash_construct_timeline
2441 lsmash_root_t
*root
,
2445 /* Destruct the timeline for a given track. */
2446 void lsmash_destruct_timeline
2448 lsmash_root_t
*root
,
2452 /* Get the duration of the last sample from the media timeline for a track.
2454 * Return 0 if successful.
2455 * Return a negative value otherwise. */
2456 int lsmash_get_last_sample_delta_from_media_timeline
2458 lsmash_root_t
*root
,
2460 uint32_t *last_sample_delta
/* the address of a variable to which the duration of the last sample will be set */
2463 /* Get the duration of a sample from the media timeline for a track.
2465 * Return 0 if successful.
2466 * Return a negative value otherwise. */
2467 int lsmash_get_sample_delta_from_media_timeline
2469 lsmash_root_t
*root
,
2471 uint32_t sample_number
,
2472 uint32_t *sample_delta
/* the address of a variable to which the duration of a sample will be set */
2475 /* Get the decoding timestamp of a sample from the media timeline for a track.
2477 * Return 0 if successful.
2478 * Return a negative value otherwise. */
2479 int lsmash_get_dts_from_media_timeline
2481 lsmash_root_t
*root
,
2483 uint32_t sample_number
,
2484 uint64_t *dts
/* the address of a variable to which a decoding timestamp will be set */
2487 /* Get the composition timestamp of a sample from the media timeline for a track.
2489 * Return 0 if successful.
2490 * Return a negative value otherwise. */
2491 int lsmash_get_cts_from_media_timeline
2493 lsmash_root_t
*root
,
2495 uint32_t sample_number
,
2496 uint64_t *cts
/* the address of a variable to which a composition timestamp will be set */
2499 /* Get the shift of composition timeline to decode timeline from the media timeline for a track.
2501 * Return 0 if successful.
2502 * Return a negative value otherwise. */
2503 int lsmash_get_composition_to_decode_shift_from_media_timeline
2505 lsmash_root_t
*root
,
2507 uint32_t *ctd_shift
/* the address of a variable to which the shift of composition timeline to decode timeline will be set */
2510 /* Get the sample number which is the closest random accessible point to the sample
2511 * corresponding to a given sample number from the media timeline for a track.
2512 * This function tries to find the closest random accessible point from the past at the first.
2513 * If not found, try to find it from the future.
2515 * the closest random accessible point doesn't always guarantee that
2516 * the sample corresponding to a given number can be decodable correctly by decoding from there.
2518 * Return 0 if successful.
2519 * Return a negative value otherwise. */
2520 int lsmash_get_closest_random_accessible_point_from_media_timeline
2522 lsmash_root_t
*root
,
2524 uint32_t sample_number
,
2525 uint32_t *rap_number
/* the address of a variable to which the sample number of the closest random accessible point will be set */
2528 /* Get the detailed information of the closest random accessible point to the sample
2529 * corresponding to a given sample number from the media timeline for a track.
2531 * the closest random accessible point doesn't always guarantee that
2532 * the sample corresponding to a given number can be decodable correctly by decoding from there.
2534 * Return 0 if successful.
2535 * Return a negative value otherwise. */
2536 int lsmash_get_closest_random_accessible_point_detail_from_media_timeline
2538 lsmash_root_t
*root
,
2540 uint32_t sample_number
,
2541 uint32_t *rap_number
, /* the address of a variable to which the sample number of the closest random accessible point will be set */
2542 lsmash_random_access_flag
*ra_flags
, /* the address of a variable to which the flags of the closest random accessible point will be set */
2543 uint32_t *leading
, /* the address of a variable to which the number of leading samples will be set */
2544 uint32_t *distance
/* the address of a variable to which a distance from the closest random accessible point to a point which guarantees
2545 * that the sample corresponding to a given number can be decodable correctly by decoding from there will be set */
2548 /* Get the number of samples in the media timeline for a track.
2550 * Return the number of samples in a track if successful.
2551 * Return 0 otherwise. */
2552 uint32_t lsmash_get_sample_count_in_media_timeline
2554 lsmash_root_t
*root
,
2558 /* Get the maximum size of sample in the media timeline for a track.
2560 * Return the maximum size of the samples in a track if successful.
2561 * Return 0 otherwise. */
2562 uint32_t lsmash_get_max_sample_size_in_media_timeline
2564 lsmash_root_t
*root
,
2568 /* Get the duration of the media from the media timeline for a track.
2570 * Return the duration of the media in a track if successful.
2571 * Return 0 otherwise. */
2572 uint64_t lsmash_get_media_duration_from_media_timeline
2574 lsmash_root_t
*root
,
2578 /* Allocate and get the sample corresponding to a given sample number from the media timeline for a track.
2579 * The allocated sample can be deallocated by lsmash_delete_sample().
2581 * Return the address of an allocated and gotten sample if successful.
2582 * Return NULL otherwise. */
2583 lsmash_sample_t
*lsmash_get_sample_from_media_timeline
2585 lsmash_root_t
*root
,
2587 uint32_t sample_number
2590 /* Get the information of the sample correspondint to a given sample number from the media timeline for a track.
2591 * The information includes the size, timestamps and properties of the sample.
2593 * Return 0 if successful.
2594 * Return a negative value otherwise. */
2595 int lsmash_get_sample_info_from_media_timeline
2597 lsmash_root_t
*root
,
2599 uint32_t sample_number
,
2600 lsmash_sample_t
*sample
2603 /* Get the properties of the sample correspondint to a given sample number from the media timeline for a track.
2605 * Return 0 if successful.
2606 * Return a negative value otherwise. */
2607 int lsmash_get_sample_property_from_media_timeline
2609 lsmash_root_t
*root
,
2611 uint32_t sample_number
,
2612 lsmash_sample_property_t
*prop
2615 /* Check if the sample corresponding to a given sample number exists in the media timeline for a track.
2617 * Return 1 if the sample exists.
2618 * Return 0 otherwise. */
2619 int lsmash_check_sample_existence_in_media_timeline
2621 lsmash_root_t
*root
,
2623 uint32_t sample_number
2626 /* Set or change the decoding and composition timestamps in the media timeline for a track.
2627 * This function doesn't support for any LPCM track currently.
2629 * Return 0 if successful.
2630 * Return a negative value othewise. */
2631 int lsmash_set_media_timestamps
2633 lsmash_root_t
*root
,
2635 lsmash_media_ts_list_t
*ts_list
2638 /* Allocate and get the decoding and composition timestamps from the media timeline for a track.
2639 * The allocated decoding and composition timestamps can be deallocated by lsmash_delete_media_timestamps().
2641 * Return 0 if successful.
2642 * Return a negative value othewise. */
2643 int lsmash_get_media_timestamps
2645 lsmash_root_t
*root
,
2647 lsmash_media_ts_list_t
*ts_list
2650 /* Deallocate the decoding and composition timestamps in a given media timestamp list. */
2651 void lsmash_delete_media_timestamps
2653 lsmash_media_ts_list_t
*ts_list
2656 /* Get the maximum composition delay derived from composition reordering.
2658 * Return 0 if successful.
2659 * Return a negative value otherwise. */
2660 int lsmash_get_max_sample_delay
2662 lsmash_media_ts_list_t
*ts_list
,
2663 uint32_t *max_sample_delay
2666 /* Sort decoding and composition timestamps in decoding order. */
2667 void lsmash_sort_timestamps_decoding_order
2669 lsmash_media_ts_list_t
*ts_list
2672 /* Sort decoding and composition timestamps in composition order. */
2673 void lsmash_sort_timestamps_composition_order
2675 lsmash_media_ts_list_t
*ts_list
2678 /****************************************************************************
2679 * Tools for creating CODEC Specific Information Extensions (Magic Cookies)
2680 ****************************************************************************/
2681 /* MPEG-4 Systems Specific Information
2683 * ISOM_CODEC_TYPE_MP4A_AUDIO
2684 * QT_CODEC_TYPE_MP4A_AUDIO
2685 * ISOM_CODEC_TYPE_MP4V_AUDIO
2686 * ISOM_CODEC_TYPE_MP4S_AUDIO */
2687 /* objectTypeIndication */
2690 MP4SYS_OBJECT_TYPE_Forbidden
= 0x00, /* Forbidden */
2691 MP4SYS_OBJECT_TYPE_Systems_ISO_14496_1
= 0x01, /* Systems ISO/IEC 14496-1
2692 * For all 14496-1 streams unless specifically indicated to the contrary.
2693 * Scene Description scenes, which are identified with StreamType=0x03, using
2694 * this object type value shall use the BIFSConfig. */
2695 MP4SYS_OBJECT_TYPE_Systems_ISO_14496_1_BIFSv2
= 0x02, /* Systems ISO/IEC 14496-1
2696 * This object type shall be used, with StreamType=0x03, for Scene
2697 * Description streams that use the BIFSv2Config.
2698 * Its use with other StreamTypes is reserved. */
2699 MP4SYS_OBJECT_TYPE_Interaction_Stream
= 0x03, /* Interaction Stream */
2700 MP4SYS_OBJECT_TYPE_Extended_BIFS
= 0x04, /* Extended BIFS
2701 * Used, with StreamType=0x03, for Scene Description streams that use the BIFSConfigEx;
2702 * its use with other StreamTypes is reserved.
2703 * (Was previously reserved for MUCommandStream but not used for that purpose.) */
2704 MP4SYS_OBJECT_TYPE_AFX_Stream
= 0x05, /* AFX Stream
2705 * Used, with StreamType=0x03, for Scene Description streams that use the AFXConfig;
2706 * its use with other StreamTypes is reserved. */
2707 MP4SYS_OBJECT_TYPE_Font_Data_Stream
= 0x06, /* Font Data Stream */
2708 MP4SYS_OBJECT_TYPE_Synthetised_Texture
= 0x07, /* Synthetised Texture */
2709 MP4SYS_OBJECT_TYPE_Text_Stream
= 0x08, /* Text Stream */
2710 MP4SYS_OBJECT_TYPE_Visual_ISO_14496_2
= 0x20, /* Visual ISO/IEC 14496-2
2711 * The actual object types are within the DecoderSpecificInfo and defined in 14496-2. */
2712 MP4SYS_OBJECT_TYPE_Visual_H264_ISO_14496_10
= 0x21, /* Visual ITU-T Recommendation H.264 | ISO/IEC 14496-10
2713 * The actual object types are within the DecoderSpecificInfo and defined in H.264 | 14496-10. */
2714 MP4SYS_OBJECT_TYPE_Parameter_Sets_H_264_ISO_14496_10
= 0x22, /* Parameter Sets for ITU-T Recommendation H.264 | ISO/IEC 14496-10
2715 * The actual object types are within the DecoderSpecificInfo and defined in H.264 | 14496-10. */
2716 MP4SYS_OBJECT_TYPE_Audio_ISO_14496_3
= 0x40, /* Audio ISO/IEC 14496-3 (MPEG-4 Audio)
2717 * The actual object types are defined in 14496-3 and are in the DecoderSpecificInfo as specified in 14496-3. */
2718 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Simple_Profile
= 0x60, /* Visual ISO/IEC 13818-2 Simple Profile (MPEG-2 Video) */
2719 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Main_Profile
= 0x61, /* Visual ISO/IEC 13818-2 Main Profile */
2720 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_SNR_Profile
= 0x62, /* Visual ISO/IEC 13818-2 SNR Profile */
2721 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Spatial_Profile
= 0x63, /* Visual ISO/IEC 13818-2 Spatial Profile */
2722 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_High_Profile
= 0x64, /* Visual ISO/IEC 13818-2 High Profile */
2723 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_422_Profile
= 0x65, /* Visual ISO/IEC 13818-2 422 Profile */
2724 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_Main_Profile
= 0x66, /* Audio ISO/IEC 13818-7 Main Profile (MPEG-2 Audio)(AAC) */
2725 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_LC_Profile
= 0x67, /* Audio ISO/IEC 13818-7 LowComplexity Profile */
2726 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_SSR_Profile
= 0x68, /* Audio ISO/IEC 13818-7 Scaleable Sampling Rate Profile
2727 * For streams kinda 13818-7 the decoder specific information consists of the ADIF header if present
2728 * (or none if not present) and an access unit is a "raw_data_block()" as defined in 13818-7. */
2729 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_3
= 0x69, /* Audio ISO/IEC 13818-3 (MPEG-2 BC-Audio)(redefined MPEG-1 Audio in MPEG-2)
2730 * For streams kinda 13818-3 the decoder specific information is empty since all necessary data is in the bitstream frames itself.
2731 * The access units in this case are the "frame()" bitstream element as is defined in 11172-3. */
2732 MP4SYS_OBJECT_TYPE_Visual_ISO_11172_2
= 0x6A, /* Visual ISO/IEC 11172-2 (MPEG-1 Video) */
2733 MP4SYS_OBJECT_TYPE_Audio_ISO_11172_3
= 0x6B, /* Audio ISO/IEC 11172-3 (MPEG-1 Audio) */
2734 MP4SYS_OBJECT_TYPE_Visual_ISO_10918_1
= 0x6C, /* Visual ISO/IEC 10918-1 (JPEG) */
2735 MP4SYS_OBJECT_TYPE_PNG
= 0x6D, /* Portable Network Graphics */
2736 MP4SYS_OBJECT_TYPE_Visual_ISO_15444_1_JPEG2000
= 0x6E, /* Visual ISO/IEC 15444-1 (JPEG 2000) */
2738 /* FIXME: rename these symbols to be explaining, rather than based on four cc */
2739 MP4SYS_OBJECT_TYPE_EVRC_AUDIO
= 0xA0, /* EVRC Voice */
2740 MP4SYS_OBJECT_TYPE_SSMV_AUDIO
= 0xA1, /* SMV Voice */
2741 MP4SYS_OBJECT_TYPE_3GPP2_CMF
= 0xA2, /* 3GPP2 Compact Multimedia Format (CMF) */
2742 MP4SYS_OBJECT_TYPE_VC_1_VIDEO
= 0xA3, /* SMPTE VC-1 Video */
2743 MP4SYS_OBJECT_TYPE_DRAC_VIDEO
= 0xA4, /* Dirac Video Coder */
2744 MP4SYS_OBJECT_TYPE_AC_3_AUDIO
= 0xA5, /* AC-3 Audio */
2745 MP4SYS_OBJECT_TYPE_EC_3_AUDIO
= 0xA6, /* Enhanced AC-3 audio */
2746 MP4SYS_OBJECT_TYPE_DRA1_AUDIO
= 0xA7, /* DRA Audio */
2747 MP4SYS_OBJECT_TYPE_G719_AUDIO
= 0xA8, /* ITU G.719 Audio */
2748 MP4SYS_OBJECT_TYPE_DTSC_AUDIO
= 0xA9, /* DTS Coherent Acoustics audio */
2749 MP4SYS_OBJECT_TYPE_DTSH_AUDIO
= 0xAA, /* DTS-HD High Resolution Audio */
2750 MP4SYS_OBJECT_TYPE_DTSL_AUDIO
= 0xAB, /* DTS-HD Master Audio */
2751 MP4SYS_OBJECT_TYPE_DTSE_AUDIO
= 0xAC, /* DTS Express low bit rate audio, also known as DTS LBR */
2752 MP4SYS_OBJECT_TYPE_SQCP_AUDIO
= 0xE1, /* 13K Voice */
2754 MP4SYS_OBJECT_TYPE_NONE
= 0xFF, /* no object type specified
2755 * Streams with this value with a StreamType indicating a systems stream (values 1,2,3,6,7,8,9)
2756 * shall be treated as if the ObjectTypeIndication had been set to 0x01. */
2757 } lsmash_mp4sys_object_type_indication
;
2762 MP4SYS_STREAM_TYPE_Forbidden
= 0x00, /* Forbidden */
2763 MP4SYS_STREAM_TYPE_ObjectDescriptorStream
= 0x01, /* ObjectDescriptorStream */
2764 MP4SYS_STREAM_TYPE_ClockReferenceStream
= 0x02, /* ClockReferenceStream */
2765 MP4SYS_STREAM_TYPE_SceneDescriptionStream
= 0x03, /* SceneDescriptionStream */
2766 MP4SYS_STREAM_TYPE_VisualStream
= 0x04, /* VisualStream */
2767 MP4SYS_STREAM_TYPE_AudioStream
= 0x05, /* AudioStream */
2768 MP4SYS_STREAM_TYPE_MPEG7Stream
= 0x06, /* MPEG7Stream */
2769 MP4SYS_STREAM_TYPE_IPMPStream
= 0x07, /* IPMPStream */
2770 MP4SYS_STREAM_TYPE_ObjectContentInfoStream
= 0x08, /* ObjectContentInfoStream */
2771 MP4SYS_STREAM_TYPE_MPEGJStream
= 0x09, /* MPEGJStream */
2772 MP4SYS_STREAM_TYPE_InteractionStream
= 0x0A, /* Interaction Stream */
2773 MP4SYS_STREAM_TYPE_IPMPToolStream
= 0x0B, /* IPMPToolStream */
2774 MP4SYS_STREAM_TYPE_FontDataStream
= 0x0C, /* FontDataStream */
2775 MP4SYS_STREAM_TYPE_StreamingText
= 0x0D, /* StreamingText */
2776 } lsmash_mp4sys_stream_type
;
2778 /* MPEG-4 Systems Decoder Specific Information
2779 * an opaque container with information for a specific media decoder
2780 * The existence and semantics of decoder specific information depends on the values of streamType and objectTypeIndication. */
2781 typedef struct lsmash_mp4sys_decoder_specific_info_tag lsmash_mp4sys_decoder_specific_info_t
;
2783 /* Note: bufferSizeDB, maxBitrate and avgBitrate are calculated internally when calling lsmash_finish_movie().
2784 * You need not to set up them manually when muxing streams by L-SMASH. */
2787 lsmash_mp4sys_object_type_indication objectTypeIndication
;
2788 lsmash_mp4sys_stream_type streamType
;
2789 uint32_t bufferSizeDB
; /* the size of the decoding buffer for this elementary stream in byte */
2790 uint32_t maxBitrate
; /* the maximum bitrate in bits per second of the elementary stream in
2791 * any time window of one second duration */
2792 uint32_t avgBitrate
; /* the average bitrate in bits per second of the elementary stream
2793 * Set to 0 if the stream is encoded as variable bitrate. */
2794 lsmash_mp4sys_decoder_specific_info_t
*dsi
; /* zero or one decoder specific information */
2795 } lsmash_mp4sys_decoder_parameters_t
;
2797 int lsmash_set_mp4sys_decoder_specific_info
2799 lsmash_mp4sys_decoder_parameters_t
*param
,
2801 uint32_t payload_length
2804 void lsmash_destroy_mp4sys_decoder_specific_info
2806 lsmash_mp4sys_decoder_parameters_t
*param
2809 uint8_t *lsmash_create_mp4sys_decoder_config
2811 lsmash_mp4sys_decoder_parameters_t
*param
,
2812 uint32_t *data_length
2815 /* Return MP4SYS_OBJECT_TYPE_Forbidden if objectTypeIndication is not found or there is an error to find it. */
2816 lsmash_mp4sys_object_type_indication lsmash_mp4sys_get_object_type_indication
2818 lsmash_summary_t
*summary
2821 /* Return -1 if any error.
2822 * 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. */
2823 int lsmash_get_mp4sys_decoder_specific_info
2825 lsmash_mp4sys_decoder_parameters_t
*param
,
2827 uint32_t *payload_length
2830 /* AC-3 Specific Information
2832 * ISOM_CODEC_TYPE_AC_3_AUDIO
2834 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization.
2835 * Each AC-3 sample is self-contained.
2836 * Users shall set the actual sample rate to 'frequency', which is a member of lsmash_audio_summary_t. */
2839 uint8_t fscod
; /* the same value as the fscod field in the AC-3 bitstream */
2840 uint8_t bsid
; /* the same value as the bsid field in the AC-3 bitstream */
2841 uint8_t bsmod
; /* the same value as the bsmod field in the AC-3 bitstream */
2842 uint8_t acmod
; /* the same value as the acmod field in the AC-3 bitstream */
2843 uint8_t lfeon
; /* the same value as the lfeon field in the AC-3 bitstream */
2844 uint8_t frmsizecod
; /* the same value as the frmsizecod field in the AC-3 bitstream */
2845 } lsmash_ac3_specific_parameters_t
;
2847 int lsmash_setup_ac3_specific_parameters_from_syncframe
2849 lsmash_ac3_specific_parameters_t
*param
,
2851 uint32_t data_length
2854 uint8_t *lsmash_create_ac3_specific_info
2856 lsmash_ac3_specific_parameters_t
*param
,
2857 uint32_t *data_length
2860 /* Enhanced AC-3 Specific Information
2862 * ISOM_CODEC_TYPE_EC_3_AUDIO
2864 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization.
2865 * Each Enhanced AC-3 sample is self-contained.
2866 * Note that this cannot document reduced sample rates (24000, 22050 or 16000 Hz).
2867 * Therefore, users shall set the actual sample rate to 'frequency', which is a member of lsmash_audio_summary_t. */
2870 uint8_t fscod
; /* the same value as the fscod field in the independent substream */
2871 uint8_t bsid
; /* the same value as the bsid field in the independent substream */
2872 uint8_t bsmod
; /* the same value as the bsmod field in the independent substream
2873 * If the bsmod field is not present in the independent substream, this field shall be set to 0. */
2874 uint8_t acmod
; /* the same value as the acmod field in the independent substream */
2875 uint8_t lfeon
; /* the same value as the lfeon field in the independent substream */
2876 uint8_t num_dep_sub
; /* the number of dependent substreams that are associated with the independent substream */
2877 uint16_t chan_loc
; /* channel locations of dependent substreams associated with the independent substream
2878 * This information is extracted from the chanmap field of each dependent substream. */
2879 } lsmash_eac3_substream_info_t
;
2883 uint16_t data_rate
; /* the data rate of the Enhanced AC-3 bitstream in kbit/s
2884 * If the Enhanced AC-3 stream is variable bitrate, then this value indicates the maximum data rate of the stream. */
2885 uint8_t num_ind_sub
; /* the number of independent substreams that are present in the Enhanced AC-3 bitstream
2886 * The value of this field is one less than the number of independent substreams present
2887 * and shall be in the range of 0 to 7, inclusive. */
2888 lsmash_eac3_substream_info_t independent_info
[8];
2889 } lsmash_eac3_specific_parameters_t
;
2891 int lsmash_setup_eac3_specific_parameters_from_frame
2893 lsmash_eac3_specific_parameters_t
*param
,
2895 uint32_t data_length
2898 uint16_t lsmash_eac3_get_chan_loc_from_chanmap
2903 uint8_t *lsmash_create_eac3_specific_info
2905 lsmash_eac3_specific_parameters_t
*param
,
2906 uint32_t *data_length
2909 /* DTS Audio Specific Information
2911 * ISOM_CODEC_TYPE_DTSC_AUDIO
2912 * ISOM_CODEC_TYPE_DTSH_AUDIO
2913 * ISOM_CODEC_TYPE_DTSL_AUDIO
2914 * ISOM_CODEC_TYPE_DTSE_AUDIO
2916 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization.
2917 * Each DTS Audio sample is self-contained. */
2920 DTS_CORE_SUBSTREAM_CORE_FLAG
= 0x00000001,
2921 DTS_CORE_SUBSTREAM_XXCH_FLAG
= 0x00000002,
2922 DTS_CORE_SUBSTREAM_X96_FLAG
= 0x00000004,
2923 DTS_CORE_SUBSTREAM_XCH_FLAG
= 0x00000008,
2924 DTS_EXT_SUBSTREAM_CORE_FLAG
= 0x00000010,
2925 DTS_EXT_SUBSTREAM_XBR_FLAG
= 0x00000020,
2926 DTS_EXT_SUBSTREAM_XXCH_FLAG
= 0x00000040,
2927 DTS_EXT_SUBSTREAM_X96_FLAG
= 0x00000080,
2928 DTS_EXT_SUBSTREAM_LBR_FLAG
= 0x00000100,
2929 DTS_EXT_SUBSTREAM_XLL_FLAG
= 0x00000200,
2930 } lsmash_dts_construction_flag
;
2932 typedef struct lsmash_dts_reserved_box_tag lsmash_dts_reserved_box_t
;
2936 uint32_t DTSSamplingFrequency
; /* the maximum sampling frequency stored in the compressed audio stream
2937 * 'frequency', which is a member of lsmash_audio_summary_t, shall be set according to DTSSamplingFrequency of either:
2938 * 48000 for original sampling frequencies of 24000Hz, 48000Hz, 96000Hz or 192000Hz;
2939 * 44100 for original sampling frequencies of 22050Hz, 44100Hz, 88200Hz or 176400Hz;
2940 * 32000 for original sampling frequencies of 16000Hz, 32000Hz, 64000Hz or 128000Hz. */
2941 uint32_t maxBitrate
; /* the peak bit rate, in bits per second, of the audio elementary stream for the duration of the track,
2942 * including the core substream (if present) and all extension substreams.
2943 * If the stream is a constant bit rate, this parameter shall have the same value as avgBitrate.
2944 * If the maximum bit rate is unknown, this parameter shall be set to 0. */
2945 uint32_t avgBitrate
; /* the average bit rate, in bits per second, of the audio elementary stream for the duration of the track,
2946 * including the core substream and any extension substream that may be present. */
2947 uint8_t pcmSampleDepth
; /* the bit depth of the rendered audio
2948 * The value is 16 or 24 bits. */
2949 uint8_t FrameDuration
; /* the number of audio samples decoded in a complete audio access unit at DTSSamplingFrequency
2950 * 0: 512, 1: 1024, 2: 2048, 3: 4096 */
2951 uint8_t StreamConstruction
; /* complete information on the existence and of location of extensions in any synchronized frame */
2952 uint8_t CoreLFEPresent
; /* the presence of an LFE channel in the core
2955 uint8_t CoreLayout
; /* the channel layout of the core within the core substream
2956 * If no core substream exists, this parameter shall be ignored and ChannelLayout or
2957 * RepresentationType shall be used to determine channel configuration. */
2958 uint16_t CoreSize
; /* The size of a core substream AU in bytes.
2959 * If no core substream exists, CoreSize = 0. */
2960 uint8_t StereoDownmix
; /* the presence of an embedded stereo downmix in the stream
2962 * 1: embedded downmix present */
2963 uint8_t RepresentationType
; /* This indicates special properties of the audio presentation.
2964 * 0: Audio asset designated for mixing with another audio asset
2965 * 2: Lt/Rt Encoded for matrix surround decoding
2966 * 3: Audio processed for headphone playback
2967 * otherwise: Reserved
2968 * If ChannelLayout != 0, this value shall be ignored. */
2969 uint16_t ChannelLayout
; /* complete information on channels coded in the audio stream including core and extensions */
2970 uint8_t MultiAssetFlag
; /* This flag shall set if the stream contains more than one asset.
2973 * When multiple assets exist, the remaining parameters only reflect the coding parameters of the first asset. */
2974 uint8_t LBRDurationMod
; /* This flag indicates a special case of the LBR coding bandwidth, resulting in 1/3 or 2/3 band limiting.
2975 * If set to 1, LBR frame duration is 50 % larger than indicated in FrameDuration */
2976 lsmash_dts_reserved_box_t
*box
;
2977 } lsmash_dts_specific_parameters_t
;
2979 int lsmash_setup_dts_specific_parameters_from_frame
2981 lsmash_dts_specific_parameters_t
*param
,
2983 uint32_t data_length
2986 uint8_t lsmash_dts_get_stream_construction
2988 lsmash_dts_construction_flag flags
2991 lsmash_dts_construction_flag lsmash_dts_get_construction_flags
2993 uint8_t stream_construction
2996 lsmash_codec_type_t lsmash_dts_get_codingname
2998 lsmash_dts_specific_parameters_t
*param
3001 uint8_t *lsmash_create_dts_specific_info
3003 lsmash_dts_specific_parameters_t
*param
,
3004 uint32_t *data_length
3007 int lsmash_append_dts_reserved_box
3009 lsmash_dts_specific_parameters_t
*param
,
3010 const uint8_t *box_data
,
3014 void lsmash_remove_dts_reserved_box
3016 lsmash_dts_specific_parameters_t
*param
3019 /* Apple Lossless Audio Specific Information
3021 * ISOM_CODEC_TYPE_ALAC_AUDIO
3022 * QT_CODEC_TYPE_ALAC_AUDIO */
3025 uint32_t frameLength
; /* the frames per packet when no explicit frames per packet setting is present in the packet header
3026 * The encoder frames per packet can be explicitly set but for maximum compatibility,
3027 * the default encoder setting of 4096 should be used. */
3028 uint8_t bitDepth
; /* the bit depth of the source PCM data (maximum value = 32) */
3029 uint8_t numChannels
; /* the channel count (1 = mono, 2 = stereo, etc...)
3030 * When channel layout info is not provided in the Channel Layout extension,
3031 * a channel count > 2 describes a set of discreet channels with no specific ordering. */
3032 uint32_t maxFrameBytes
; /* the maximum size of an Apple Lossless packet within the encoded stream
3033 * Value of 0 indicates unknown. */
3034 uint32_t avgBitrate
; /* the average bit rate in bits per second of the Apple Lossless stream
3035 * Value of 0 indicates unknown. */
3036 uint32_t sampleRate
; /* sample rate of the encoded stream */
3037 } lsmash_alac_specific_parameters_t
;
3039 uint8_t *lsmash_create_alac_specific_info
3041 lsmash_alac_specific_parameters_t
*param
,
3042 uint32_t *data_length
3045 /* MPEG-4 Bitrate Information.
3047 * ISOM_CODEC_TYPE_AVC1_VIDEO
3048 * ISOM_CODEC_TYPE_AVC2_VIDEO
3049 * ISOM_CODEC_TYPE_AVC3_VIDEO
3050 * ISOM_CODEC_TYPE_AVC4_VIDEO
3051 * ISOM_CODEC_TYPE_HVC1_VIDEO
3052 * ISOM_CODEC_TYPE_HEV1_VIDEO
3054 * Though you need not to set these fields manually since lsmash_finish_movie() calls the function
3055 * that calculates these values internally, these fields are optional.
3056 * 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. */
3059 uint32_t bufferSizeDB
; /* the size of the decoding buffer for the elementary stream in bytes */
3060 uint32_t maxBitrate
; /* the maximum rate in bits/second over any window of one second */
3061 uint32_t avgBitrate
; /* the average rate in bits/second over the entire presentation */
3062 } lsmash_h264_bitrate_t
;
3064 /* Appendability of NAL unit into Decoder Configuration Record */
3067 DCR_NALU_APPEND_NEW_SAMPLE_ENTRY_REQUIRED
= -3, /* A new sample description entry is needed because e.g. visual presentation size changes. */
3068 DCR_NALU_APPEND_NEW_DCR_REQUIRED
= -2, /* A new Decoder Configuration Record is needed. */
3069 DCR_NALU_APPEND_ERROR
= -1, /* something of errors */
3070 DCR_NALU_APPEND_DUPLICATED
= 0, /* The same NAL unit is in the Decoder Configuration Record. */
3071 DCR_NALU_APPEND_POSSIBLE
= 1, /* It is possible to append the NAL unit into the Decoder Configuration Record. */
3072 } lsmash_dcr_nalu_appendable
;
3074 /* H.264/AVC Specific Information
3076 * ISOM_CODEC_TYPE_AVC1_VIDEO
3077 * ISOM_CODEC_TYPE_AVC2_VIDEO
3078 * ISOM_CODEC_TYPE_AVC3_VIDEO
3079 * ISOM_CODEC_TYPE_AVC4_VIDEO
3081 * All members in lsmash_h264_specific_parameters_t except for lengthSizeMinusOne shall be automatically set up
3082 * when appending SPS NAL units by calling lsmash_append_h264_parameter_set(). */
3085 H264_PARAMETER_SET_TYPE_SPS
= 0, /* SPS (Sequence Parameter Set) */
3086 H264_PARAMETER_SET_TYPE_PPS
= 1, /* PPS (Picture Parameter Set) */
3087 H264_PARAMETER_SET_TYPE_SPSEXT
= 2, /* SPS Ext (Sequence Parameter Set Extension) */
3088 /* The number of the NAL unit types defined for AVC Decoder Configuration Record */
3089 H264_PARAMETER_SET_TYPE_NUM
3090 } lsmash_h264_parameter_set_type
;
3092 typedef struct lsmash_h264_parameter_sets_tag lsmash_h264_parameter_sets_t
;
3096 uint8_t AVCProfileIndication
; /* profile_idc in sequence parameter sets
3097 * This field must indicate a profile to which the stream associated with
3098 * this configuration record conforms.
3099 * Note: there is no profile to which the entire stream conforms, then
3100 * the entire stream must be split into two or more sub-streams with
3101 * separate configuration records in which these rules can be met. */
3102 uint8_t profile_compatibility
; /* constraint_set_flags in sequence parameter sets
3103 * The each bit may only be set if all the included parameter sets set that flag. */
3104 uint8_t AVCLevelIndication
; /* level_idc in sequence parameter sets
3105 * This field must indicate a level of capability equal to or greater than
3106 * the highest level indicated in the included parameter sets. */
3107 uint8_t lengthSizeMinusOne
; /* the length in bytes of the NALUnitLength field prior to NAL unit
3108 * The value of this field shall be one of 0, 1, or 3
3109 * corresponding to a length encoded with 1, 2, or 4 bytes, respectively.
3110 * NALUnitLength indicates the size of a NAL unit measured in bytes,
3111 * and includes the size of both the one byte NAL header and the EBSP payload
3112 * but does not include the length field itself. */
3113 /* chroma format and bit depth information
3114 * These fields must be identical in all the parameter sets. */
3115 uint8_t chroma_format
; /* chroma_format_idc in sequence parameter sets */
3116 uint8_t bit_depth_luma_minus8
; /* bit_depth_luma_minus8 in sequence parameter sets */
3117 uint8_t bit_depth_chroma_minus8
; /* bit_depth_chroma_minus8 in sequence parameter sets */
3118 /* a set of arrays to carry initialization NAL units
3119 * The NAL unit types are restricted to indicate SPS, PPS and SPS Ext NAL units only. */
3120 lsmash_h264_parameter_sets_t
*parameter_sets
;
3121 } lsmash_h264_specific_parameters_t
;
3123 int lsmash_setup_h264_specific_parameters_from_access_unit
3125 lsmash_h264_specific_parameters_t
*param
,
3127 uint32_t data_length
3130 void lsmash_destroy_h264_parameter_sets
3132 lsmash_h264_specific_parameters_t
*param
3135 lsmash_dcr_nalu_appendable lsmash_check_h264_parameter_set_appendable
3137 lsmash_h264_specific_parameters_t
*param
,
3138 lsmash_h264_parameter_set_type ps_type
,
3143 int lsmash_append_h264_parameter_set
3145 lsmash_h264_specific_parameters_t
*param
,
3146 lsmash_h264_parameter_set_type ps_type
,
3151 uint8_t *lsmash_create_h264_specific_info
3153 lsmash_h264_specific_parameters_t
*param
,
3154 uint32_t *data_length
3157 /* H.265/HEVC Specific Information
3159 * ISOM_CODEC_TYPE_HVC1_VIDEO
3160 * ISOM_CODEC_TYPE_HEV1_VIDEO
3162 * All members in lsmash_hevc_specific_parameters_t except for avgFrameRate and lengthSizeMinusOne shall be
3163 * automatically set up when appending VPS and SPS NAL units by calling lsmash_append_hevc_dcr_nalu().
3164 * It is recommended that you should append VPS, SPS and PPS in this order so that a parameter set can reference
3165 * another parameter set. */
3169 * When the CODEC identifier ISOM_CODEC_TYPE_HVC1_VIDEO is used, at least one parameter set for each array
3170 * of parameter set shall be in the configuration record. */
3171 HEVC_DCR_NALU_TYPE_VPS
= 0, /* VPS (Video Parameter Set) */
3172 HEVC_DCR_NALU_TYPE_SPS
= 1, /* SPS (Sequence Parameter Set) */
3173 HEVC_DCR_NALU_TYPE_PPS
= 2, /* PPS (Picture Parameter Set) */
3174 /* SEI (Supplemental Enhancement Information)
3175 * Only the 'declarative' SEI messages that provide information about the stream as
3176 * a whole are allowed because SEIs themselves basically have no identifier and
3177 * no one can reference dynamically in a configuration record. */
3178 HEVC_DCR_NALU_TYPE_PREFIX_SEI
= 3, /* Prefix SEI */
3179 HEVC_DCR_NALU_TYPE_SUFFIX_SEI
= 4, /* Suffix SEI */
3180 /* The number of the NAL unit types defined for HEVC Decoder Configuration Record */
3181 HEVC_DCR_NALU_TYPE_NUM
3182 } lsmash_hevc_dcr_nalu_type
;
3184 typedef struct lsmash_hevc_parameter_arrays_tag lsmash_hevc_parameter_arrays_t
;
3188 /* general profile, tier and level from VPS and/or SPS */
3189 uint8_t general_profile_space
; /* general_profile_space
3190 * The value in all the parameter sets must be identical. */
3191 uint8_t general_tier_flag
; /* general_tier_flag
3192 * The value must indicate a tier equal to or greater than the highest
3193 * tier indicated in all the parameter sets. */
3194 uint8_t general_profile_idc
; /* general_profile_idc
3195 * The value must indicate a profile to which the stream associated with
3196 * this configuration record conforms.
3197 * Note: there is no profile to which the entire stream conforms, then
3198 * the entire stream must be split into two or more sub-streams with
3199 * separate configuration records in which these rules can be met. */
3200 uint32_t general_profile_compatibility_flags
; /* general_profile_compatibility_flag[j] for j from 0 to 31
3201 * The each bit may only be set if all the parameter sets set that bit. */
3202 uint64_t general_constraint_indicator_flags
; /* the 6 bytes starting with the byte containing the general_progressive_source_flag
3203 * The each bit may only be set if all the parameter sets set that bit. */
3204 uint8_t general_level_idc
; /* general_level_idc
3205 * The value must indicate a level of capability equal to or greater
3206 * than the highest level indicated for the highest tier in all the
3207 * parameter sets. */
3209 uint16_t min_spatial_segmentation_idc
; /* min_spatial_segmentation_idc in VUI (Video Usability Information)
3210 * The value must indicate a level of spatial segmentation equal to
3211 * or less than the lowest level of spatial segmentation indicated in
3212 * all the parameter sets. */
3213 uint8_t parallelismType
; /* parallelismType indicates the type of parallelism that is used to meet the
3214 * restrictions imposed by min_spatial_segmentation_idc when the value of
3215 * min_spatial_segmentation_idc is greater than 0.
3216 * For the stream to which this configuration record applies,
3217 * 0: mixed types of parallel decoding or parallelism type is unknown
3218 * 1: slice based parallel decoding
3219 * 2: tile based parallel decoding
3220 * 3: entropy coding synchronization based parallel decoding
3221 * (WPP: Wavefront Parallel Processing) */
3222 /* chroma format and bit depth information
3223 * These fields must be identical in all the parameter sets. */
3224 uint8_t chromaFormat
; /* chroma_format_idc in sequence parameter sets */
3225 uint8_t bitDepthLumaMinus8
; /* bit_depth_luma_minus8 in sequence parameter sets */
3226 uint8_t bitDepthChromaMinus8
; /* bit_depth_chroma_minus8 in sequence parameter sets */
3228 uint16_t avgFrameRate
; /* the average frame rate in units of frames/(256 seconds)
3229 * Value 0 indicates an unspecified average frame rate. */
3230 uint8_t constantFrameRate
; /* 0: the stream may or may not be of constant frame rate.
3231 * 1: that the stream to which this configuration record applies is of
3232 * constant frame rate
3233 * 2: the representation of each temporal layer in the stream is of
3234 * constant frame rate. */
3235 uint8_t numTemporalLayers
; /* 0: it is unknown whether the stream is temporally scalable.
3236 * 1: the stream is not temporally scalable.
3237 * otherwise: the stream to which this configuration record applies is
3238 * temporally scalable and the contained number of temporal layers
3239 * (also referred to as temporal sublayer or sub-layer) is equal
3240 * is equal to numTemporalLayers. */
3241 uint8_t temporalIdNested
; /* 0: at least one of the SPSs that are activated when the stream to which
3242 * this configuration record applies is decoded has sps_temporal_id_nesting_flag
3244 * 1: all SPSs that are activated when the stream to which this configuration
3245 * record applies is decoded have sps_temporal_id_nesting_flag equal to 1
3246 * and temporal sub-layer up-switching to any higher temporal layer can be
3247 * performed at any sample.
3248 * Any step-wise temporal sub-layer access picture shall not be present in
3249 * the sequences to which this configuration record applies. */
3250 uint8_t lengthSizeMinusOne
; /* the length in bytes of the NALUnitLength field prior to NAL unit
3251 * The value of this field shall be one of 0, 1, or 3
3252 * corresponding to a length encoded with 1, 2, or 4 bytes, respectively.
3253 * NALUnitLength indicates the size of a NAL unit measured in bytes,
3254 * and includes the size of both the one byte NAL header and the EBSP payload
3255 * but does not include the length field itself. */
3256 /* a set of arrays to carry initialization NAL units
3257 * The NAL unit types are restricted to indicate VPS, SPS, PPS, and SEI NAL units only. */
3258 lsmash_hevc_parameter_arrays_t
*parameter_arrays
;
3259 } lsmash_hevc_specific_parameters_t
;
3261 int lsmash_setup_hevc_specific_parameters_from_access_unit
3263 lsmash_hevc_specific_parameters_t
*param
,
3265 uint32_t data_length
3268 void lsmash_destroy_hevc_parameter_arrays
3270 lsmash_hevc_specific_parameters_t
*param
3273 lsmash_dcr_nalu_appendable lsmash_check_hevc_dcr_nalu_appendable
3275 lsmash_hevc_specific_parameters_t
*param
,
3276 lsmash_hevc_dcr_nalu_type ps_type
,
3281 int lsmash_append_hevc_dcr_nalu
3283 lsmash_hevc_specific_parameters_t
*param
,
3284 lsmash_hevc_dcr_nalu_type ps_type
,
3289 int lsmash_set_hevc_array_completeness
3291 lsmash_hevc_specific_parameters_t
*param
,
3292 lsmash_hevc_dcr_nalu_type ps_type
,
3293 int array_completeness
3296 int lsmash_get_hevc_array_completeness
3298 lsmash_hevc_specific_parameters_t
*param
,
3299 lsmash_hevc_dcr_nalu_type ps_type
,
3300 int *array_completeness
3303 uint8_t *lsmash_create_hevc_specific_info
3305 lsmash_hevc_specific_parameters_t
*param
,
3306 uint32_t *data_length
3309 /* VC-1 Specific Information
3311 * ISOM_CODEC_TYPE_VC_1_VIDEO
3313 * We support only advanced profile at present. */
3314 typedef struct lsmash_vc1_header_tag lsmash_vc1_header_t
;
3318 /* Note: multiple_sequence, multiple_entry, slice_present and bframe_present shall be decided through overall VC-1 bitstream. */
3319 uint8_t profile
; /* the encoding profile used in the VC-1 bitstream
3320 * 0: simple profile (not supported)
3321 * 4: main profile (not supported)
3322 * 12: advanced profile
3323 * Currently, only 12 for advanced profile is available. */
3324 uint8_t level
; /* the highest encoding level used in the VC-1 bitstream */
3325 uint8_t cbr
; /* 0: non-constant bitrate model
3326 * 1: constant bitrate model */
3327 uint8_t interlaced
; /* 0: interlaced coding of frames is not used.
3328 * 1: frames may use interlaced coding. */
3329 uint8_t multiple_sequence
; /* 0: the track contains no sequence headers (stored only in VC-1 specific info structure),
3331 * all sequence headers in the track are identical to the sequence header that is specified in the seqhdr field.
3332 * In this case, random access points are samples that contain an entry-point header.
3333 * 1: the track may contain Sequence headers that are different from the sequence header specified in the seqhdr field.
3334 * In this case, random access points are samples that contain both a sequence Header and an entry-point header. */
3335 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.
3336 * 1: the track may contain entry-point headers that are different from the entry-point header specified in the ephdr field. */
3337 uint8_t slice_present
; /* 0: frames are not coded as multiple slices.
3338 * 1: frames may be coded as multiple slices. */
3339 uint8_t bframe_present
; /* 0: neither B-frames nor BI-frames are present in the track.
3340 * 1: B-frames or BI-frames may be present in the track. */
3341 uint32_t framerate
; /* the rounded frame rate (frames per second) of the track
3342 * Should be set to 0xffffffff if the frame rate is not known, unspecified, or non-constant. */
3343 lsmash_vc1_header_t
*seqhdr
; /* a sequence header EBDU (mandatory) */
3344 lsmash_vc1_header_t
*ephdr
; /* an entry-point header EBDU (mandatory) */
3345 } lsmash_vc1_specific_parameters_t
;
3347 int lsmash_setup_vc1_specific_parameters_from_access_unit
3349 lsmash_vc1_specific_parameters_t
*param
,
3351 uint32_t data_length
3354 void lsmash_destroy_vc1_headers
3356 lsmash_vc1_specific_parameters_t
*param
3359 int lsmash_put_vc1_header
3361 lsmash_vc1_specific_parameters_t
*param
,
3366 uint8_t *lsmash_create_vc1_specific_info
3368 lsmash_vc1_specific_parameters_t
*param
,
3369 uint32_t *data_length
3373 * Without this extension, video samples are scaled into the visual presentation region to fill it. */
3376 ISOM_SCALE_METHOD_FILL
= 1,
3377 ISOM_SCALE_METHOD_HIDDEN
= 2,
3378 ISOM_SCALE_METHOD_MEET
= 3,
3379 ISOM_SCALE_METHOD_SLICE_X
= 4,
3380 ISOM_SCALE_METHOD_SLICE_Y
= 5,
3381 } lsmash_scale_method
;
3385 uint8_t constraint_flag
; /* Upper 7-bits are reserved.
3386 * If this flag is set, all samples described by this sample entry shall be scaled
3387 * according to the method specified by the field 'scale_method'. */
3388 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. */
3389 int16_t display_center_x
;
3390 int16_t display_center_y
;
3391 } lsmash_isom_sample_scale_t
;
3393 /* QuickTime Video CODEC tools */
3396 QT_COMPRESSION_QUALITY_LOSSLESS
= 0x00000400, /* only valid for spatial compression */
3397 QT_COMPRESSION_QUALITY_MAX
= 0x000003FF,
3398 QT_COMPRESSION_QUALITY_MIN
= 0x00000000,
3399 QT_COMPRESSION_QUALITY_LOW
= 0x00000100,
3400 QT_COMPRESSION_QUALITY_NORMAL
= 0x00000200,
3401 QT_COMPRESSION_QUALITY_HIGH
= 0x00000300
3402 } lsmash_qt_compression_quality
;
3406 uint32_t seed
; /* Must be set to 0. */
3407 uint16_t flags
; /* Must be set to 0x8000. */
3408 uint16_t size
; /* the number of colors in the following color array
3409 * This is a zero-relative value;
3410 * setting this field to 0 means that there is one color in the array. */
3412 * An array of colors. Each color is made of four unsigned 16-bit integers.
3413 * We support up to 256 elements. */
3416 uint16_t unused
; /* Must be set to 0. */
3418 uint16_t r
; /* magnitude of red component */
3419 uint16_t g
; /* magnitude of green component */
3420 uint16_t b
; /* magnitude of blue component */
3422 } lsmash_qt_color_table_t
;
3426 int16_t revision_level
; /* version of the CODEC */
3427 int32_t vendor
; /* whose CODEC */
3428 lsmash_qt_compression_quality temporalQuality
; /* the temporal quality factor (0-1023) */
3429 lsmash_qt_compression_quality spatialQuality
; /* the spatial quality factor (0-1024) */
3430 uint32_t horizontal_resolution
; /* a 16.16 fixed-point number containing the horizontal resolution of the image in pixels per inch. */
3431 uint32_t vertical_resolution
; /* a 16.16 fixed-point number containing the vertical resolution of the image in pixels per inch. */
3432 uint32_t dataSize
; /* if known, the size of data for this descriptor */
3433 uint16_t frame_count
; /* frame per sample */
3434 int16_t color_table_ID
; /* color table ID
3435 * If this field is set to -1, the default color table should be used for the specified depth
3436 * If the color table ID is set to 0, a color table is contained within the sample description itself.
3437 * The color table immediately follows the color table ID field. */
3438 lsmash_qt_color_table_t color_table
; /* a list of preferred colors for displaying the movie on devices that support only 256 colors */
3439 } lsmash_qt_video_common_t
;
3443 uint32_t level
; /* A fixed-point 16.16 number indicating the gamma level at which the image was captured. */
3444 } lsmash_qt_gamma_t
;
3448 QT_FIELEDS_SCAN_PROGRESSIVE
= 1, /* progressive scan */
3449 QT_FIELEDS_SCAN_INTERLACED
= 2, /* 2:1 interlaced */
3450 } lsmash_qt_number_of_fields
;
3452 /* field ordering for interlaced material */
3455 QT_FIELD_ORDERINGS_UNKNOWN
= 0,
3456 QT_FIELD_ORDERINGS_TEMPORAL_TOP_FIRST
= 1,
3457 QT_FIELD_ORDERINGS_TEMPORAL_BOTTOM_FIRST
= 6,
3458 QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_EARLY
= 9,
3459 QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_LATE
= 14
3460 } lsmash_qt_field_orderings
;
3464 lsmash_qt_number_of_fields fields
;
3465 lsmash_qt_field_orderings detail
;
3466 } lsmash_qt_field_info_t
;
3468 /* the native pixel format */
3471 QT_PIXEL_FORMAT_TYPE_1_MONOCHROME
= 0x00000001, /* 1 bit indexed */
3472 QT_PIXEL_FORMAT_TYPE_2_INDEXED
= 0x00000002, /* 2 bit indexed */
3473 QT_PIXEL_FORMAT_TYPE_4_INDEXED
= 0x00000004, /* 4 bit indexed */
3474 QT_PIXEL_FORMAT_TYPE_8_INDEXED
= 0x00000008, /* 8 bit indexed */
3475 QT_PIXEL_FORMAT_TYPE_1_INDEXED_GRAY_WHITE_IS_ZERO
= 0x00000021, /* 1 bit indexed gray, white is zero */
3476 QT_PIXEL_FORMAT_TYPE_2_INDEXED_GRAY_WHITE_IS_ZERO
= 0x00000022, /* 2 bit indexed gray, white is zero */
3477 QT_PIXEL_FORMAT_TYPE_4_INDEXED_GRAY_WHITE_IS_ZERO
= 0x00000024, /* 4 bit indexed gray, white is zero */
3478 QT_PIXEL_FORMAT_TYPE_8_INDEXED_GRAY_WHITE_IS_ZERO
= 0x00000028, /* 8 bit indexed gray, white is zero */
3479 QT_PIXEL_FORMAT_TYPE_16BE555
= 0x00000010, /* 16 bit BE RGB 555 */
3480 QT_PIXEL_FORMAT_TYPE_16LE555
= LSMASH_4CC( 'L', '5', '5', '5' ), /* 16 bit LE RGB 555 */
3481 QT_PIXEL_FORMAT_TYPE_16LE5551
= LSMASH_4CC( '5', '5', '5', '1' ), /* 16 bit LE RGB 5551 */
3482 QT_PIXEL_FORMAT_TYPE_16BE565
= LSMASH_4CC( 'B', '5', '6', '5' ), /* 16 bit BE RGB 565 */
3483 QT_PIXEL_FORMAT_TYPE_16LE565
= LSMASH_4CC( 'L', '5', '6', '5' ), /* 16 bit LE RGB 565 */
3484 QT_PIXEL_FORMAT_TYPE_24RGB
= 0x00000018, /* 24 bit RGB */
3485 QT_PIXEL_FORMAT_TYPE_24BGR
= LSMASH_4CC( '2', '4', 'B', 'G' ), /* 24 bit BGR */
3486 QT_PIXEL_FORMAT_TYPE_32ARGB
= 0x00000020, /* 32 bit ARGB */
3487 QT_PIXEL_FORMAT_TYPE_32BGRA
= LSMASH_4CC( 'B', 'G', 'R', 'A' ), /* 32 bit BGRA */
3488 QT_PIXEL_FORMAT_TYPE_32ABGR
= LSMASH_4CC( 'A', 'B', 'G', 'R' ), /* 32 bit ABGR */
3489 QT_PIXEL_FORMAT_TYPE_32RGBA
= LSMASH_4CC( 'R', 'G', 'B', 'A' ), /* 32 bit RGBA */
3490 QT_PIXEL_FORMAT_TYPE_64ARGB
= LSMASH_4CC( 'b', '6', '4', 'a' ), /* 64 bit ARGB, 16-bit big-endian samples */
3491 QT_PIXEL_FORMAT_TYPE_48RGB
= LSMASH_4CC( 'b', '4', '8', 'r' ), /* 48 bit RGB, 16-bit big-endian samples */
3492 QT_PIXEL_FORMAT_TYPE_32_ALPHA_GRAY
= LSMASH_4CC( 'b', '3', '2', 'a' ), /* 32 bit AlphaGray, 16-bit big-endian samples, black is zero */
3493 QT_PIXEL_FORMAT_TYPE_16_GRAY
= LSMASH_4CC( 'b', '1', '6', 'g' ), /* 16 bit Grayscale, 16-bit big-endian samples, black is zero */
3494 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) */
3495 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 */
3496 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 */
3497 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 */
3498 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 */
3499 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 */
3500 QT_PIXEL_FORMAT_TYPE_444YpCbCr8
= LSMASH_4CC( 'v', '3', '0', '8' ), /* Component Y'CbCr 8-bit 4:4:4 */
3501 QT_PIXEL_FORMAT_TYPE_422YpCbCr16
= LSMASH_4CC( 'v', '2', '1', '6' ), /* Component Y'CbCr 10,12,14,16-bit 4:2:2 */
3502 QT_PIXEL_FORMAT_TYPE_422YpCbCr10
= LSMASH_4CC( 'v', '2', '1', '0' ), /* Component Y'CbCr 10-bit 4:2:2 */
3503 QT_PIXEL_FORMAT_TYPE_444YpCbCr10
= LSMASH_4CC( 'v', '4', '1', '0' ), /* Component Y'CbCr 10-bit 4:4:4 */
3504 QT_PIXEL_FORMAT_TYPE_420YpCbCr8_PLANAR
= LSMASH_4CC( 'y', '4', '2', '0' ), /* Planar Component Y'CbCr 8-bit 4:2:0 */
3505 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 */
3506 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 */
3507 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]) */
3508 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]) */
3509 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 */
3510 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 */
3512 /* Developer specific FourCCs (from dispatch 20) */
3513 QT_PIXEL_FORMAT_TYPE_SOFTVOUT_SOFTCODEC
= LSMASH_4CC( 's', 'o', 'f', 't' ), /* Intermediary pixel format used by SoftVout and SoftCodec */
3514 QT_PIXEL_FORMAT_TYPE_VIEW_GRAPHICS
= LSMASH_4CC( 'v', 'w', 'g', 'r' ), /* Intermediary pixel format used by View Graphics */
3515 QT_PIXEL_FORMAT_TYPE_SGI
= LSMASH_4CC( 'S', 'G', 'V', 'C' ), /* Intermediary pixel format used by SGI */
3516 } lsmash_qt_pixel_format
;
3520 lsmash_qt_pixel_format pixel_format
; /* the native pixel format of an image */
3521 } lsmash_qt_pixel_format_t
;
3523 /* Significant Bits Extension
3524 * mandatory extension for 'v216' (Uncompressed Y'CbCr, 10, 12, 14, or 16-bit-per-component 4:2:2) */
3527 uint8_t significantBits
; /* the number of significant bits per component */
3528 } lsmash_qt_significant_bits_t
;
3530 /* QuickTime Audio CODEC tools */
3533 QT_AUDIO_COMPRESSION_ID_NOT_COMPRESSED
= 0,
3534 QT_AUDIO_COMPRESSION_ID_FIXED_COMPRESSION
= -1,
3535 QT_AUDIO_COMPRESSION_ID_VARIABLE_COMPRESSION
= -2,
3536 QT_AUDIO_COMPRESSION_ID_TWO_TO_ONE
= 1,
3537 QT_AUDIO_COMPRESSION_ID_EIGHT_TO_THREE
= 2,
3538 QT_AUDIO_COMPRESSION_ID_THREE_TO_ONE
= 3,
3539 QT_AUDIO_COMPRESSION_ID_SIX_TO_ONE
= 4,
3540 QT_AUDIO_COMPRESSION_ID_SIX_TO_ONE_PACKET_SIZE
= 8,
3541 QT_AUDIO_COMPRESSION_ID_THREE_TO_ONE_PACKET_SIZE
= 16,
3542 } lsmash_qt_audio_compression_id
;
3546 int16_t revision_level
; /* version of the CODEC */
3547 int32_t vendor
; /* whose CODEC */
3548 lsmash_qt_audio_compression_id compression_ID
;
3549 } lsmash_qt_audio_common_t
;
3551 /* Audio Channel Layout
3552 * This CODEC specific extension is for
3553 * QuickTime Audio inside QuickTime file format
3555 * Apple Lossless Audio inside ISO Base Media file format.
3556 * When audio stream has 3 or more number of channels, this extension shall be present. */
3559 QT_CHANNEL_LABEL_UNKNOWN
= (signed)0xffffffff, /* unknown or unspecified other use */
3560 QT_CHANNEL_LABEL_UNUSED
= 0, /* channel is present, but has no intended use or destination */
3561 QT_CHANNEL_LABEL_USE_COORDINATES
= 100, /* channel is described by the coordinates fields. */
3563 QT_CHANNEL_LABEL_LEFT
= 1,
3564 QT_CHANNEL_LABEL_RIGHT
= 2,
3565 QT_CHANNEL_LABEL_CENTER
= 3,
3566 QT_CHANNEL_LABEL_LFE_SCREEN
= 4,
3567 QT_CHANNEL_LABEL_LEFT_SURROUND
= 5, /* WAVE: "Back Left" */
3568 QT_CHANNEL_LABEL_RIGHT_SUROUND
= 6, /* WAVE: "Back Right" */
3569 QT_CHANNEL_LABEL_LEFT_CENTER
= 7,
3570 QT_CHANNEL_LABEL_RIGHT_CENTER
= 8,
3571 QT_CHANNEL_LABEL_CENTER_SURROUND
= 9, /* WAVE: "Back Center" or plain "Rear Surround" */
3572 QT_CHANNEL_LABEL_LEFT_SURROUND_DIRECT
= 10, /* WAVE: "Side Left" */
3573 QT_CHANNEL_LABEL_RIGHT_SURROUND_DIRECT
= 11, /* WAVE: "Side Right" */
3574 QT_CHANNEL_LABEL_TOP_CENTER_SURROUND
= 12,
3575 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_LEFT
= 13, /* WAVE: "Top Front Left" */
3576 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_CENTER
= 14, /* WAVE: "Top Front Center" */
3577 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_RIGHT
= 15, /* WAVE: "Top Front Right" */
3579 QT_CHANNEL_LABEL_TOP_BACK_LEFT
= 16,
3580 QT_CHANNEL_LABEL_TOP_BACK_CENTER
= 17,
3581 QT_CHANNEL_LABEL_TOP_BACK_RIGHT
= 18,
3583 QT_CHANNEL_LABEL_REAR_SURROUND_LEFT
= 33,
3584 QT_CHANNEL_LABEL_REAR_SURROUND_RIGHT
= 34,
3585 QT_CHANNEL_LABEL_LEFT_WIDE
= 35,
3586 QT_CHANNEL_LABEL_RIGHT_WIDE
= 36,
3587 QT_CHANNEL_LABEL_LFE2
= 37,
3588 QT_CHANNEL_LABEL_LEFT_TOTAL
= 38, /* matrix encoded 4 channels */
3589 QT_CHANNEL_LABEL_RIGHT_TOTAL
= 39, /* matrix encoded 4 channels */
3590 QT_CHANNEL_LABEL_HEARING_IMPAIRED
= 40,
3591 QT_CHANNEL_LABEL_NARRATION
= 41,
3592 QT_CHANNEL_LABEL_MONO
= 42,
3593 QT_CHANNEL_LABEL_DIALOG_CENTRIC_MIX
= 43,
3595 QT_CHANNEL_LABEL_CENTER_SURROUND_DIRECT
= 44, /* back center, non diffuse */
3597 QT_CHANNEL_LABEL_HAPTIC
= 45,
3599 /* first order ambisonic channels */
3600 QT_CHANNEL_LABEL_AMBISONIC_W
= 200,
3601 QT_CHANNEL_LABEL_AMBISONIC_X
= 201,
3602 QT_CHANNEL_LABEL_AMBISONIC_Y
= 202,
3603 QT_CHANNEL_LABEL_AMBISONIC_Z
= 203,
3605 /* Mid/Side Recording */
3606 QT_CHANNEL_LABEL_MS_MID
= 204,
3607 QT_CHANNEL_LABEL_MS_SIDE
= 205,
3610 QT_CHANNEL_LABEL_XY_X
= 206,
3611 QT_CHANNEL_LABEL_XY_Y
= 207,
3614 QT_CHANNEL_LABEL_HEADPHONES_LEFT
= 301,
3615 QT_CHANNEL_LABEL_HEADPHONES_RIGHT
= 302,
3616 QT_CHANNEL_LABEL_CLICK_TRACK
= 304,
3617 QT_CHANNEL_LABEL_FOREIGN_LANGUAGE
= 305,
3619 /* generic discrete channel */
3620 QT_CHANNEL_LABEL_DISCRETE
= 400,
3622 /* numbered discrete channel */
3623 QT_CHANNEL_LABEL_DISCRETE_0
= (1<<16),
3624 QT_CHANNEL_LABEL_DISCRETE_1
= (1<<16) | 1,
3625 QT_CHANNEL_LABEL_DISCRETE_2
= (1<<16) | 2,
3626 QT_CHANNEL_LABEL_DISCRETE_3
= (1<<16) | 3,
3627 QT_CHANNEL_LABEL_DISCRETE_4
= (1<<16) | 4,
3628 QT_CHANNEL_LABEL_DISCRETE_5
= (1<<16) | 5,
3629 QT_CHANNEL_LABEL_DISCRETE_6
= (1<<16) | 6,
3630 QT_CHANNEL_LABEL_DISCRETE_7
= (1<<16) | 7,
3631 QT_CHANNEL_LABEL_DISCRETE_8
= (1<<16) | 8,
3632 QT_CHANNEL_LABEL_DISCRETE_9
= (1<<16) | 9,
3633 QT_CHANNEL_LABEL_DISCRETE_10
= (1<<16) | 10,
3634 QT_CHANNEL_LABEL_DISCRETE_11
= (1<<16) | 11,
3635 QT_CHANNEL_LABEL_DISCRETE_12
= (1<<16) | 12,
3636 QT_CHANNEL_LABEL_DISCRETE_13
= (1<<16) | 13,
3637 QT_CHANNEL_LABEL_DISCRETE_14
= (1<<16) | 14,
3638 QT_CHANNEL_LABEL_DISCRETE_15
= (1<<16) | 15,
3639 QT_CHANNEL_LABEL_DISCRETE_65535
= (1<<16) | 65535,
3640 } lsmash_channel_label
;
3644 QT_CHANNEL_BIT_LEFT
= 1,
3645 QT_CHANNEL_BIT_RIGHT
= 1<<1,
3646 QT_CHANNEL_BIT_CENTER
= 1<<2,
3647 QT_CHANNEL_BIT_LFE_SCREEN
= 1<<3,
3648 QT_CHANNEL_BIT_LEFT_SURROUND
= 1<<4, /* WAVE: "Back Left" */
3649 QT_CHANNEL_BIT_RIGHT_SURROUND
= 1<<5, /* WAVE: "Back Right" */
3650 QT_CHANNEL_BIT_LEFT_CENTER
= 1<<6,
3651 QT_CHANNEL_BIT_RIGHT_CENTER
= 1<<7,
3652 QT_CHANNEL_BIT_CENTER_SURROUND
= 1<<8, /* WAVE: "Back Center" */
3653 QT_CHANNEL_BIT_LEFT_SURROUND_DIRECT
= 1<<9, /* WAVE: "Side Left" */
3654 QT_CHANNEL_BIT_RIGHT_SURROUND_DIRECT
= 1<<10, /* WAVE: "Side Right" */
3655 QT_CHANNEL_BIT_TOP_CENTER_SURROUND
= 1<<11,
3656 QT_CHANNEL_BIT_VERTICAL_HEIGHT_LEFT
= 1<<12, /* WAVE: "Top Front Left" */
3657 QT_CHANNEL_BIT_VERTICAL_HEIGHT_CENTER
= 1<<13, /* WAVE: "Top Front Center" */
3658 QT_CHANNEL_BIT_VERTICAL_HEIGHT_RIGHT
= 1<<14, /* WAVE: "Top Front Right" */
3659 QT_CHANNEL_BIT_TOP_BACK_LEFT
= 1<<15,
3660 QT_CHANNEL_BIT_TOP_BACK_CENTER
= 1<<16,
3661 QT_CHANNEL_BIT_TOP_BACK_RIGHT
= 1<<17,
3662 QT_CHANNEL_BIT_FULL
= 0x3ffff,
3663 } lsmash_channel_bitmap
;
3667 QT_CHANNEL_FLAGS_ALL_OFF
= 0,
3668 QT_CHANNEL_FLAGS_RECTANGULAR_COORDINATES
= 1,
3669 QT_CHANNEL_FLAGS_SPHERICAL_COORDINATES
= 1<<1,
3670 QT_CHANNEL_FLAGS_METERS
= 1<<2,
3671 } lsmash_channel_flags
;
3675 /* indices for accessing the coordinates array in Channel Descriptions */
3676 /* for rectangulare coordinates */
3677 QT_CHANNEL_COORDINATES_LEFT_RIGHT
= 0, /* Negative is left and positive is right. */
3678 QT_CHANNEL_COORDINATES_BACK_FRONT
= 1, /* Negative is back and positive is front. */
3679 QT_CHANNEL_COORDINATES_DOWN_UP
= 2, /* Negative is below ground level, 0 is ground level, and positive is above ground level. */
3680 /* for spherical coordinates */
3681 QT_CHANNEL_COORDINATES_AZIMUTH
= 0, /* 0 is front center, positive is right, negative is left. This is measured in degrees. */
3682 QT_CHANNEL_COORDINATES_ELEVATION
= 1, /* +90 is zenith, 0 is horizontal, -90 is nadir. This is measured in degrees. */
3683 QT_CHANNEL_COORDINATES_DISTANCE
= 2, /* The units are described by flags. */
3684 } lsmash_channel_coordinates_index
;
3688 /* channel abbreviations:
3692 * Ls - left surround
3693 * Rs - right surround
3694 * Cs - center surround
3695 * Rls - rear left surround
3696 * Rrs - rear right surround
3699 * Lsd - left surround direct
3700 * Rsd - right surround direct
3704 * Vhl - vertical height left
3705 * Vhc - vertical height center
3706 * Vhr - vertical height right
3707 * Lt - left matrix total. for matrix encoded stereo.
3708 * Rt - right matrix total. for matrix encoded stereo. */
3710 /* General layouts */
3711 QT_CHANNEL_LAYOUT_USE_CHANNEL_DESCRIPTIONS
= 0, /* use the array of Channel Descriptions to define the mapping. */
3712 QT_CHANNEL_LAYOUT_USE_CHANNEL_BITMAP
= 1<<16, /* use the bitmap to define the mapping. */
3714 QT_CHANNEL_LAYOUT_MONO
= (100<<16) | 1, /* a standard mono stream */
3715 QT_CHANNEL_LAYOUT_STEREO
= (101<<16) | 2, /* a standard stereo stream (L R) - implied playback */
3716 QT_CHANNEL_LAYOUT_STEREO_HEADPHONES
= (102<<16) | 2, /* a standard stereo stream (L R) - implied headphone playback */
3717 QT_CHANNEL_LAYOUT_MATRIX_STEREO
= (103<<16) | 2, /* a matrix encoded stereo stream (Lt, Rt) */
3718 QT_CHANNEL_LAYOUT_MID_SIDE
= (104<<16) | 2, /* mid/side recording */
3719 QT_CHANNEL_LAYOUT_XY
= (105<<16) | 2, /* coincident mic pair (often 2 figure 8's) */
3720 QT_CHANNEL_LAYOUT_BINAURAL
= (106<<16) | 2, /* binaural stereo (left, right) */
3721 QT_CHANNEL_LAYOUT_AMBISONIC_B_FORMAT
= (107<<16) | 4, /* W, X, Y, Z */
3723 QT_CHANNEL_LAYOUT_QUADRAPHONIC
= (108<<16) | 4, /* front left, front right, back left, back right */
3725 QT_CHANNEL_LAYOUT_PENTAGONAL
= (109<<16) | 5, /* left, right, rear left, rear right, center */
3727 QT_CHANNEL_LAYOUT_HEXAGONAL
= (110<<16) | 6, /* left, right, rear left, rear right, center, rear */
3729 QT_CHANNEL_LAYOUT_OCTAGONAL
= (111<<16) | 8, /* front left, front right, rear left, rear right,
3730 * front center, rear center, side left, side right */
3732 QT_CHANNEL_LAYOUT_CUBE
= (112<<16) | 8, /* left, right, rear left, rear right,
3733 * top left, top right, top rear left, top rear right */
3735 /* MPEG defined layouts */
3736 QT_CHANNEL_LAYOUT_MPEG_1_0
= QT_CHANNEL_LAYOUT_MONO
, /* C */
3737 QT_CHANNEL_LAYOUT_MPEG_2_0
= QT_CHANNEL_LAYOUT_STEREO
, /* L R */
3738 QT_CHANNEL_LAYOUT_MPEG_3_0_A
= (113<<16) | 3, /* L R C */
3739 QT_CHANNEL_LAYOUT_MPEG_3_0_B
= (114<<16) | 3, /* C L R */
3740 QT_CHANNEL_LAYOUT_MPEG_4_0_A
= (115<<16) | 4, /* L R C Cs */
3741 QT_CHANNEL_LAYOUT_MPEG_4_0_B
= (116<<16) | 4, /* C L R Cs */
3742 QT_CHANNEL_LAYOUT_MPEG_5_0_A
= (117<<16) | 5, /* L R C Ls Rs */
3743 QT_CHANNEL_LAYOUT_MPEG_5_0_B
= (118<<16) | 5, /* L R Ls Rs C */
3744 QT_CHANNEL_LAYOUT_MPEG_5_0_C
= (119<<16) | 5, /* L C R Ls Rs */
3745 QT_CHANNEL_LAYOUT_MPEG_5_0_D
= (120<<16) | 5, /* C L R Ls Rs */
3746 QT_CHANNEL_LAYOUT_MPEG_5_1_A
= (121<<16) | 6, /* L R C LFE Ls Rs */
3747 QT_CHANNEL_LAYOUT_MPEG_5_1_B
= (122<<16) | 6, /* L R Ls Rs C LFE */
3748 QT_CHANNEL_LAYOUT_MPEG_5_1_C
= (123<<16) | 6, /* L C R Ls Rs LFE */
3749 QT_CHANNEL_LAYOUT_MPEG_5_1_D
= (124<<16) | 6, /* C L R Ls Rs LFE */
3750 QT_CHANNEL_LAYOUT_MPEG_6_1_A
= (125<<16) | 7, /* L R C LFE Ls Rs Cs */
3751 QT_CHANNEL_LAYOUT_MPEG_7_1_A
= (126<<16) | 8, /* L R C LFE Ls Rs Lc Rc */
3752 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) */
3753 QT_CHANNEL_LAYOUT_MPEG_7_1_C
= (128<<16) | 8, /* L R C LFE Ls Rs Rls Rrs */
3754 QT_CHANNEL_LAYOUT_EMAGIC_DEFAULT_7_1
= (129<<16) | 8, /* L R Ls Rs C LFE Lc Rc */
3755 QT_CHANNEL_LAYOUT_SMPTE_DTV
= (130<<16) | 8, /* L R C LFE Ls Rs Lt Rt */
3757 /* ITU defined layouts */
3758 QT_CHANNEL_LAYOUT_ITU_1_0
= QT_CHANNEL_LAYOUT_MONO
, /* C */
3759 QT_CHANNEL_LAYOUT_ITU_2_0
= QT_CHANNEL_LAYOUT_STEREO
, /* L R */
3761 QT_CHANNEL_LAYOUT_ITU_2_1
= (131<<16) | 3, /* L R Cs */
3762 QT_CHANNEL_LAYOUT_ITU_2_2
= (132<<16) | 4, /* L R Ls Rs */
3763 QT_CHANNEL_LAYOUT_ITU_3_0
= QT_CHANNEL_LAYOUT_MPEG_3_0_A
, /* L R C */
3764 QT_CHANNEL_LAYOUT_ITU_3_1
= QT_CHANNEL_LAYOUT_MPEG_4_0_A
, /* L R C Cs */
3766 QT_CHANNEL_LAYOUT_ITU_3_2
= QT_CHANNEL_LAYOUT_MPEG_5_0_A
, /* L R C Ls Rs */
3767 QT_CHANNEL_LAYOUT_ITU_3_2_1
= QT_CHANNEL_LAYOUT_MPEG_5_1_A
, /* L R C LFE Ls Rs */
3768 QT_CHANNEL_LAYOUT_ITU_3_4_1
= QT_CHANNEL_LAYOUT_MPEG_7_1_C
, /* L R C LFE Ls Rs Rls Rrs */
3770 /* DVD defined layouts */
3771 QT_CHANNEL_LAYOUT_DVD_0
= QT_CHANNEL_LAYOUT_MONO
, /* C (mono) */
3772 QT_CHANNEL_LAYOUT_DVD_1
= QT_CHANNEL_LAYOUT_STEREO
, /* L R */
3773 QT_CHANNEL_LAYOUT_DVD_2
= QT_CHANNEL_LAYOUT_ITU_2_1
, /* L R Cs */
3774 QT_CHANNEL_LAYOUT_DVD_3
= QT_CHANNEL_LAYOUT_ITU_2_2
, /* L R Ls Rs */
3775 QT_CHANNEL_LAYOUT_DVD_4
= (133<<16) | 3, /* L R LFE */
3776 QT_CHANNEL_LAYOUT_DVD_5
= (134<<16) | 4, /* L R LFE Cs */
3777 QT_CHANNEL_LAYOUT_DVD_6
= (135<<16) | 5, /* L R LFE Ls Rs */
3778 QT_CHANNEL_LAYOUT_DVD_7
= QT_CHANNEL_LAYOUT_MPEG_3_0_A
, /* L R C */
3779 QT_CHANNEL_LAYOUT_DVD_8
= QT_CHANNEL_LAYOUT_MPEG_4_0_A
, /* L R C Cs */
3780 QT_CHANNEL_LAYOUT_DVD_9
= QT_CHANNEL_LAYOUT_MPEG_5_0_A
, /* L R C Ls Rs */
3781 QT_CHANNEL_LAYOUT_DVD_10
= (136<<16) | 4, /* L R C LFE */
3782 QT_CHANNEL_LAYOUT_DVD_11
= (137<<16) | 5, /* L R C LFE Cs */
3783 QT_CHANNEL_LAYOUT_DVD_12
= QT_CHANNEL_LAYOUT_MPEG_5_1_A
, /* L R C LFE Ls Rs */
3784 /* 13 through 17 are duplicates of 8 through 12. */
3785 QT_CHANNEL_LAYOUT_DVD_13
= QT_CHANNEL_LAYOUT_DVD_8
, /* L R C Cs */
3786 QT_CHANNEL_LAYOUT_DVD_14
= QT_CHANNEL_LAYOUT_DVD_9
, /* L R C Ls Rs */
3787 QT_CHANNEL_LAYOUT_DVD_15
= QT_CHANNEL_LAYOUT_DVD_10
, /* L R C LFE */
3788 QT_CHANNEL_LAYOUT_DVD_16
= QT_CHANNEL_LAYOUT_DVD_11
, /* L R C LFE Cs */
3789 QT_CHANNEL_LAYOUT_DVD_17
= QT_CHANNEL_LAYOUT_DVD_12
, /* L R C LFE Ls Rs */
3790 QT_CHANNEL_LAYOUT_DVD_18
= (138<<16) | 5, /* L R Ls Rs LFE */
3791 QT_CHANNEL_LAYOUT_DVD_19
= QT_CHANNEL_LAYOUT_MPEG_5_0_B
, /* L R Ls Rs C */
3792 QT_CHANNEL_LAYOUT_DVD_20
= QT_CHANNEL_LAYOUT_MPEG_5_1_B
, /* L R Ls Rs C LFE */
3794 /* These are the symmetrical layouts. */
3795 QT_CHANNEL_LAYOUT_AUDIO_UNIT_4
= QT_CHANNEL_LAYOUT_QUADRAPHONIC
,
3796 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5
= QT_CHANNEL_LAYOUT_PENTAGONAL
,
3797 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6
= QT_CHANNEL_LAYOUT_HEXAGONAL
,
3798 QT_CHANNEL_LAYOUT_AUDIO_UNIT_8
= QT_CHANNEL_LAYOUT_OCTAGONAL
,
3799 /* These are the surround-based layouts. */
3800 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5_0
= QT_CHANNEL_LAYOUT_MPEG_5_0_B
, /* L R Ls Rs C */
3801 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6_0
= (139<<16) | 6, /* L R Ls Rs C Cs */
3802 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_0
= (140<<16) | 7, /* L R Ls Rs C Rls Rrs */
3803 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_0_FRONT
= (148<<16) | 7, /* L R Ls Rs C Lc Rc */
3804 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5_1
= QT_CHANNEL_LAYOUT_MPEG_5_1_A
, /* L R C LFE Ls Rs */
3805 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6_1
= QT_CHANNEL_LAYOUT_MPEG_6_1_A
, /* L R C LFE Ls Rs Cs */
3806 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_1
= QT_CHANNEL_LAYOUT_MPEG_7_1_C
, /* L R C LFE Ls Rs Rls Rrs */
3807 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_1_FRONT
= QT_CHANNEL_LAYOUT_MPEG_7_1_A
, /* L R C LFE Ls Rs Lc Rc */
3809 QT_CHANNEL_LAYOUT_AAC_3_0
= QT_CHANNEL_LAYOUT_MPEG_3_0_B
, /* C L R */
3810 QT_CHANNEL_LAYOUT_AAC_QUADRAPHONIC
= QT_CHANNEL_LAYOUT_QUADRAPHONIC
, /* L R Ls Rs */
3811 QT_CHANNEL_LAYOUT_AAC_4_0
= QT_CHANNEL_LAYOUT_MPEG_4_0_B
, /* C L R Cs */
3812 QT_CHANNEL_LAYOUT_AAC_5_0
= QT_CHANNEL_LAYOUT_MPEG_5_0_D
, /* C L R Ls Rs */
3813 QT_CHANNEL_LAYOUT_AAC_5_1
= QT_CHANNEL_LAYOUT_MPEG_5_1_D
, /* C L R Ls Rs LFE */
3814 QT_CHANNEL_LAYOUT_AAC_6_0
= (141<<16) | 6, /* C L R Ls Rs Cs */
3815 QT_CHANNEL_LAYOUT_AAC_6_1
= (142<<16) | 7, /* C L R Ls Rs Cs LFE */
3816 QT_CHANNEL_LAYOUT_AAC_7_0
= (143<<16) | 7, /* C L R Ls Rs Rls Rrs */
3817 QT_CHANNEL_LAYOUT_AAC_7_1
= QT_CHANNEL_LAYOUT_MPEG_7_1_B
, /* C Lc Rc L R Ls Rs LFE */
3818 QT_CHANNEL_LAYOUT_AAC_OCTAGONAL
= (144<<16) | 8, /* C L R Ls Rs Rls Rrs Cs */
3820 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 */
3821 QT_CHANNEL_LAYOUT_TMH_10_2_FULL
= (146<<16) | 21, /* TMH_10_2_std plus: Lc Rc HI VI Haptic */
3823 QT_CHANNEL_LAYOUT_AC3_1_0_1
= (149<<16) | 2, /* C LFE */
3824 QT_CHANNEL_LAYOUT_AC3_3_0
= (150<<16) | 3, /* L C R */
3825 QT_CHANNEL_LAYOUT_AC3_3_1
= (151<<16) | 4, /* L C R Cs */
3826 QT_CHANNEL_LAYOUT_AC3_3_0_1
= (152<<16) | 4, /* L C R LFE */
3827 QT_CHANNEL_LAYOUT_AC3_2_1_1
= (153<<16) | 4, /* L R Cs LFE */
3828 QT_CHANNEL_LAYOUT_AC3_3_1_1
= (154<<16) | 5, /* L C R Cs LFE */
3830 QT_CHANNEL_LAYOUT_EAC_6_0_A
= (155<<16) | 6, /* L C R Ls Rs Cs */
3831 QT_CHANNEL_LAYOUT_EAC_7_0_A
= (156<<16) | 7, /* L C R Ls Rs Rls Rrs */
3833 QT_CHANNEL_LAYOUT_EAC3_6_1_A
= (157<<16) | 7, /* L C R Ls Rs LFE Cs */
3834 QT_CHANNEL_LAYOUT_EAC3_6_1_B
= (158<<16) | 7, /* L C R Ls Rs LFE Ts */
3835 QT_CHANNEL_LAYOUT_EAC3_6_1_C
= (159<<16) | 7, /* L C R Ls Rs LFE Vhc */
3836 QT_CHANNEL_LAYOUT_EAC3_7_1_A
= (160<<16) | 8, /* L C R Ls Rs LFE Rls Rrs */
3837 QT_CHANNEL_LAYOUT_EAC3_7_1_B
= (161<<16) | 8, /* L C R Ls Rs LFE Lc Rc */
3838 QT_CHANNEL_LAYOUT_EAC3_7_1_C
= (162<<16) | 8, /* L C R Ls Rs LFE Lsd Rsd */
3839 QT_CHANNEL_LAYOUT_EAC3_7_1_D
= (163<<16) | 8, /* L C R Ls Rs LFE Lw Rw */
3840 QT_CHANNEL_LAYOUT_EAC3_7_1_E
= (164<<16) | 8, /* L C R Ls Rs LFE Vhl Vhr */
3842 QT_CHANNEL_LAYOUT_EAC3_7_1_F
= (165<<16) | 8, /* L C R Ls Rs LFE Cs Ts */
3843 QT_CHANNEL_LAYOUT_EAC3_7_1_G
= (166<<16) | 8, /* L C R Ls Rs LFE Cs Vhc */
3844 QT_CHANNEL_LAYOUT_EAC3_7_1_H
= (167<<16) | 8, /* L C R Ls Rs LFE Ts Vhc */
3846 QT_CHANNEL_LAYOUT_DTS_3_1
= (168<<16) | 4, /* C L R LFE */
3847 QT_CHANNEL_LAYOUT_DTS_4_1
= (169<<16) | 5, /* C L R Cs LFE */
3848 QT_CHANNEL_LAYOUT_DTS_6_0_A
= (170<<16) | 6, /* Lc Rc L R Ls Rs */
3849 QT_CHANNEL_LAYOUT_DTS_6_0_B
= (171<<16) | 6, /* C L R Rls Rrs Ts */
3850 QT_CHANNEL_LAYOUT_DTS_6_0_C
= (172<<16) | 6, /* C Cs L R Rls Rrs */
3851 QT_CHANNEL_LAYOUT_DTS_6_1_A
= (173<<16) | 7, /* Lc Rc L R Ls Rs LFE */
3852 QT_CHANNEL_LAYOUT_DTS_6_1_B
= (174<<16) | 7, /* C L R Rls Rrs Ts LFE */
3853 QT_CHANNEL_LAYOUT_DTS_6_1_C
= (175<<16) | 7, /* C Cs L R Rls Rrs LFE */
3854 QT_CHANNEL_LAYOUT_DTS_7_0
= (176<<16) | 7, /* Lc C Rc L R Ls Rs */
3855 QT_CHANNEL_LAYOUT_DTS_7_1
= (177<<16) | 8, /* Lc C Rc L R Ls Rs LFE */
3856 QT_CHANNEL_LAYOUT_DTS_8_0_A
= (178<<16) | 8, /* Lc Rc L R Ls Rs Rls Rrs */
3857 QT_CHANNEL_LAYOUT_DTS_8_0_B
= (179<<16) | 8, /* Lc C Rc L R Ls Cs Rs */
3858 QT_CHANNEL_LAYOUT_DTS_8_1_A
= (180<<16) | 9, /* Lc Rc L R Ls Rs Rls Rrs LFE */
3859 QT_CHANNEL_LAYOUT_DTS_8_1_B
= (181<<16) | 9, /* Lc C Rc L R Ls Cs Rs LFE */
3860 QT_CHANNEL_LAYOUT_DTS_6_1_D
= (182<<16) | 7, /* C L R Ls Rs LFE Cs */
3862 QT_CHANNEL_LAYOUT_ALAC_MONO
= QT_CHANNEL_LAYOUT_MONO
, /* C */
3863 QT_CHANNEL_LAYOUT_ALAC_STEREO
= QT_CHANNEL_LAYOUT_STEREO
, /* L R */
3864 QT_CHANNEL_LAYOUT_ALAC_3_0
= QT_CHANNEL_LAYOUT_MPEG_3_0_B
, /* C L R */
3865 QT_CHANNEL_LAYOUT_ALAC_4_0
= QT_CHANNEL_LAYOUT_MPEG_4_0_B
, /* C L R Cs */
3866 QT_CHANNEL_LAYOUT_ALAC_5_0
= QT_CHANNEL_LAYOUT_MPEG_5_0_D
, /* C L R Ls Rs */
3867 QT_CHANNEL_LAYOUT_ALAC_5_1
= QT_CHANNEL_LAYOUT_MPEG_5_1_D
, /* C L R Ls Rs LFE */
3868 QT_CHANNEL_LAYOUT_ALAC_6_1
= QT_CHANNEL_LAYOUT_AAC_6_1
, /* C L R Ls Rs Cs LFE */
3869 QT_CHANNEL_LAYOUT_ALAC_7_1
= QT_CHANNEL_LAYOUT_MPEG_7_1_B
, /* C Lc Rc L R Ls Rs LFE */
3871 QT_CHANNEL_LAYOUT_DISCRETE_IN_ORDER
= 147<<16, /* needs to be ORed with the actual number of channels */
3872 QT_CHANNEL_LAYOUT_UNKNOWN
= (signed)0xffff0000, /* needs to be ORed with the actual number of channels */
3873 } lsmash_channel_layout_tag
;
3877 lsmash_channel_layout_tag channelLayoutTag
; /* channel layout */
3878 lsmash_channel_bitmap channelBitmap
; /* Only available when layout_tag is set to QT_CHANNEL_LAYOUT_USE_CHANNEL_BITMAP. */
3879 } lsmash_qt_audio_channel_layout_t
;
3881 /* QuickTime Audio Format Specific Flags
3882 * Some values are ignored i.e. as if treated as unspecified when you specify certain CODECs.
3883 * For instance, you specify QT_CODEC_TYPE_SOWT_AUDIO, then all these values are ignored.
3884 * These values are basically used for QT_CODEC_TYPE_LPCM_AUDIO.
3885 * 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. */
3888 QT_AUDIO_FORMAT_FLAG_FLOAT
= 1, /* Set for floating point, clear for integer. */
3889 QT_AUDIO_FORMAT_FLAG_BIG_ENDIAN
= 1<<1, /* Set for big endian, clear for little endian. */
3890 QT_AUDIO_FORMAT_FLAG_SIGNED_INTEGER
= 1<<2, /* Set for signed integer, clear for unsigned integer.
3891 * This is only valid if QT_AUDIO_FORMAT_FLAG_FLOAT is clear. */
3892 QT_AUDIO_FORMAT_FLAG_PACKED
= 1<<3, /* Set if the sample bits occupy the entire available bits for the channel,
3893 * clear if they are high or low aligned within the channel. */
3894 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.
3895 * This is only valid if QT_AUDIO_FORMAT_FLAG_PACKED is clear. */
3896 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,
3897 * clear if the samples for each frame are layed out contiguously and the frames layed out end to end. */
3898 QT_AUDIO_FORMAT_FLAG_NON_MIXABLE
= 1<<6, /* Set to indicate when a format is non-mixable.
3899 * Note that this flag is only used when interacting with the HAL's stream format information.
3900 * It is not a valid flag for any other uses. */
3901 QT_AUDIO_FORMAT_FLAG_ALL_CLEAR
= (int)(1u << 31), /* Set if all the flags would be clear in order to preserve 0 as the wild card value. */
3903 QT_LPCM_FORMAT_FLAG_FLOAT
= QT_AUDIO_FORMAT_FLAG_FLOAT
,
3904 QT_LPCM_FORMAT_FLAG_BIG_ENDIAN
= QT_AUDIO_FORMAT_FLAG_BIG_ENDIAN
,
3905 QT_LPCM_FORMAT_FLAG_SIGNED_INTEGER
= QT_AUDIO_FORMAT_FLAG_SIGNED_INTEGER
,
3906 QT_LPCM_FORMAT_FLAG_PACKED
= QT_AUDIO_FORMAT_FLAG_PACKED
,
3907 QT_LPCM_FORMAT_FLAG_ALIGNED_HIGH
= QT_AUDIO_FORMAT_FLAG_ALIGNED_HIGH
,
3908 QT_LPCM_FORMAT_FLAG_NON_INTERLEAVED
= QT_AUDIO_FORMAT_FLAG_NON_INTERLEAVED
,
3909 QT_LPCM_FORMAT_FLAG_NON_MIXABLE
= QT_AUDIO_FORMAT_FLAG_NON_MIXABLE
,
3910 QT_LPCM_FORMAT_FLAG_ALL_CLEAR
= QT_AUDIO_FORMAT_FLAG_ALL_CLEAR
,
3912 /* These flags are set for Apple Lossless data that was sourced from N bit native endian signed integer data. */
3913 QT_ALAC_FORMAT_FLAG_16BIT_SOURCE_DATA
= 1,
3914 QT_ALAC_FORMAT_FLAG_20BIT_SOURCE_DATA
= 2,
3915 QT_ALAC_FORMAT_FLAG_24BIT_SOURCE_DATA
= 3,
3916 QT_ALAC_FORMAT_FLAG_32BIT_SOURCE_DATA
= 4,
3917 } lsmash_qt_audio_format_specific_flag
;
3921 lsmash_qt_audio_format_specific_flag format_flags
;
3922 } lsmash_qt_audio_format_specific_flags_t
;
3925 * Ut Video inside QuickTime file format requires this extension for storing CODEC specific information. */
3928 uint32_t header_size
;
3929 uint8_t *header_data
;
3930 } lsmash_codec_global_header_t
;
3932 /****************************************************************************
3934 ****************************************************************************/
3937 /* UTF String type */
3938 ITUNES_METADATA_ITEM_ALBUM_NAME
= (int)LSMASH_4CC( 0xA9u
, 'a', 'l', 'b' ), /* Album Name */
3939 ITUNES_METADATA_ITEM_ARTIST
= (int)LSMASH_4CC( 0xA9u
, 'A', 'R', 'T' ), /* Artist */
3940 ITUNES_METADATA_ITEM_USER_COMMENT
= (int)LSMASH_4CC( 0xA9u
, 'c', 'm', 't' ), /* User Comment */
3941 ITUNES_METADATA_ITEM_RELEASE_DATE
= (int)LSMASH_4CC( 0xA9u
, 'd', 'a', 'y' ), /* YYYY-MM-DD format string (may be incomplete, i.e. only year) */
3942 ITUNES_METADATA_ITEM_ENCODED_BY
= (int)LSMASH_4CC( 0xA9u
, 'e', 'n', 'c' ), /* Person or company that encoded the recording */
3943 ITUNES_METADATA_ITEM_USER_GENRE
= (int)LSMASH_4CC( 0xA9u
, 'g', 'e', 'n' ), /* User Genre user-specified string */
3944 ITUNES_METADATA_ITEM_GROUPING
= (int)LSMASH_4CC( 0xA9u
, 'g', 'r', 'p' ), /* Grouping */
3945 ITUNES_METADATA_ITEM_LYRICS
= (int)LSMASH_4CC( 0xA9u
, 'l', 'y', 'r' ), /* Lyrics */
3946 ITUNES_METADATA_ITEM_TITLE
= (int)LSMASH_4CC( 0xA9u
, 'n', 'a', 'm' ), /* Title / Song Name */
3947 ITUNES_METADATA_ITEM_TRACK_SUBTITLE
= (int)LSMASH_4CC( 0xA9u
, 's', 't', '3' ), /* Track Sub-Title */
3948 ITUNES_METADATA_ITEM_ENCODING_TOOL
= (int)LSMASH_4CC( 0xA9u
, 't', 'o', 'o' ), /* Software which encoded the recording */
3949 ITUNES_METADATA_ITEM_COMPOSER
= (int)LSMASH_4CC( 0xA9u
, 'w', 'r', 't' ), /* Composer */
3950 ITUNES_METADATA_ITEM_ALBUM_ARTIST
= LSMASH_4CC( 'a', 'A', 'R', 'T' ), /* Artist for the whole album (if different than the individual tracks) */
3951 ITUNES_METADATA_ITEM_PODCAST_CATEGORY
= LSMASH_4CC( 'c', 'a', 't', 'g' ), /* Podcast Category */
3952 ITUNES_METADATA_ITEM_COPYRIGHT
= LSMASH_4CC( 'c', 'p', 'r', 't' ), /* Copyright */
3953 ITUNES_METADATA_ITEM_DESCRIPTION
= LSMASH_4CC( 'd', 'e', 's', 'c' ), /* Description (limited to 255 bytes) */
3954 ITUNES_METADATA_ITEM_GROUPING_DRAFT
= LSMASH_4CC( 'g', 'r', 'u', 'p' ), /* Grouping
3955 * Note: This identifier is defined in
3956 * iTunes Metadata Format Specification (Preliminary draft),
3957 * but not used by iTunes actually it seems.
3958 * We recommend you use ITUNES_METADATA_ITEM_GROUPING instead of this. */
3959 ITUNES_METADATA_ITEM_PODCAST_KEYWORD
= LSMASH_4CC( 'k', 'e', 'y', 'w' ), /* Podcast Keywords */
3960 ITUNES_METADATA_ITEM_LONG_DESCRIPTION
= LSMASH_4CC( 'l', 'd', 'e', 's' ), /* Long Description */
3961 ITUNES_METADATA_ITEM_PURCHASE_DATE
= LSMASH_4CC( 'p', 'u', 'r', 'd' ), /* Purchase Date */
3962 ITUNES_METADATA_ITEM_TV_EPISODE_ID
= LSMASH_4CC( 't', 'v', 'e', 'n' ), /* TV Episode ID */
3963 ITUNES_METADATA_ITEM_TV_NETWORK
= LSMASH_4CC( 't', 'v', 'n', 'n' ), /* TV Network Name */
3964 ITUNES_METADATA_ITEM_TV_SHOW_NAME
= LSMASH_4CC( 't', 'v', 's', 'h' ), /* TV Show Name */
3965 ITUNES_METADATA_ITEM_ITUNES_PURCHASE_ACCOUNT_ID
= LSMASH_4CC( 'a', 'p', 'I', 'D' ), /* iTunes Account Used for Purchase */
3966 ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM
= LSMASH_4CC( 's', 'o', 'a', 'l' ), /* Sort Album */
3967 ITUNES_METADATA_ITEM_ITUNES_SORT_ARTIST
= LSMASH_4CC( 's', 'o', 'a', 'r' ), /* Sort Artist */
3968 ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM_ARTIST
= LSMASH_4CC( 's', 'o', 'a', 'a' ), /* Sort Album Artist */
3969 ITUNES_METADATA_ITEM_ITUNES_SORT_COMPOSER
= LSMASH_4CC( 's', 'o', 'c', 'o' ), /* Sort Composer */
3970 ITUNES_METADATA_ITEM_ITUNES_SORT_NAME
= LSMASH_4CC( 's', 'o', 'n', 'm' ), /* Sort Name */
3971 ITUNES_METADATA_ITEM_ITUNES_SORT_SHOW
= LSMASH_4CC( 's', 'o', 's', 'n' ), /* Sort Show */
3974 * (X): X means length of bytes */
3975 ITUNES_METADATA_ITEM_EPISODE_GLOBAL_ID
= LSMASH_4CC( 'e', 'g', 'i', 'd' ), /* (1) Episode Global Unique ID */
3976 ITUNES_METADATA_ITEM_PREDEFINED_GENRE
= LSMASH_4CC( 'g', 'n', 'r', 'e' ), /* (2) Pre-defined Genre / Enumerated value from ID3 tag set, plus 1 */
3977 ITUNES_METADATA_ITEM_PODCAST_URL
= LSMASH_4CC( 'p', 'u', 'r', 'l' ), /* (?) Podcast URL */
3978 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 */
3979 ITUNES_METADATA_ITEM_MEDIA_TYPE
= LSMASH_4CC( 's', 't', 'i', 'k' ), /* (1) Media Type */
3980 ITUNES_METADATA_ITEM_BEATS_PER_MINUTE
= LSMASH_4CC( 't', 'm', 'p', 'o' ), /* (2) Beats Per Minute */
3981 ITUNES_METADATA_ITEM_TV_EPISODE
= LSMASH_4CC( 't', 'v', 'e', 's' ), /* (4) TV Episode */
3982 ITUNES_METADATA_ITEM_TV_SEASON
= LSMASH_4CC( 't', 'v', 's', 'n' ), /* (4) TV Season */
3983 ITUNES_METADATA_ITEM_ITUNES_ACCOUNT_TYPE
= LSMASH_4CC( 'a', 'k', 'I', 'D' ), /* (1) iTunes Account Type / 0: iTunes, 1: AOL */
3984 ITUNES_METADATA_ITEM_ITUNES_ARTIST_ID
= LSMASH_4CC( 'a', 't', 'I', 'D' ), /* (4) iTunes Artist ID */
3985 ITUNES_METADATA_ITEM_ITUNES_COMPOSER_ID
= LSMASH_4CC( 'c', 'm', 'I', 'D' ), /* (4) iTunes Composer ID */
3986 ITUNES_METADATA_ITEM_ITUNES_CATALOG_ID
= LSMASH_4CC( 'c', 'n', 'I', 'D' ), /* (4) iTunes Catalog ID */
3987 ITUNES_METADATA_ITEM_ITUNES_TV_GENRE_ID
= LSMASH_4CC( 'g', 'e', 'I', 'D' ), /* (4) iTunes TV Genre ID */
3988 ITUNES_METADATA_ITEM_ITUNES_PLAYLIST_ID
= LSMASH_4CC( 'p', 'l', 'I', 'D' ), /* (8) iTunes Playlist ID */
3989 ITUNES_METADATA_ITEM_ITUNES_COUNTRY_CODE
= LSMASH_4CC( 's', 'f', 'I', 'D' ), /* (4) iTunes Country Code */
3992 ITUNES_METADATA_ITEM_DISC_COMPILATION
= LSMASH_4CC( 'c', 'p', 'i', 'l' ), /* Disc Compilation / Is disc part of a compilation? 0: No, 1: Yes */
3993 ITUNES_METADATA_ITEM_HIGH_DEFINITION_VIDEO
= LSMASH_4CC( 'h', 'd', 'v', 'd' ), /* High Definition Video / 0: No, 1: Yes */
3994 ITUNES_METADATA_ITEM_PODCAST
= LSMASH_4CC( 'p', 'c', 's', 't' ), /* Podcast / 0: No, 1: Yes */
3995 ITUNES_METADATA_ITEM_GAPLESS_PLAYBACK
= LSMASH_4CC( 'p', 'g', 'a', 'p' ), /* Gapless Playback / 0: insert gap, 1: no gap */
3998 ITUNES_METADATA_ITEM_COVER_ART
= LSMASH_4CC( 'c', 'o', 'v', 'r' ), /* One or more cover art images (JPEG/PNG/BMP data) */
3999 ITUNES_METADATA_ITEM_DISC_NUMBER
= LSMASH_4CC( 'd', 'i', 's', 'k' ), /* Disc Number */
4000 ITUNES_METADATA_ITEM_TRACK_NUMBER
= LSMASH_4CC( 't', 'r', 'k', 'n' ), /* Track Number */
4003 ITUNES_METADATA_ITEM_CUSTOM
= LSMASH_4CC( '-', '-', '-', '-' ), /* Custom */
4004 } lsmash_itunes_metadata_item
;
4008 ITUNES_METADATA_TYPE_NONE
= 0,
4009 ITUNES_METADATA_TYPE_STRING
= 1,
4010 ITUNES_METADATA_TYPE_INTEGER
= 2,
4011 ITUNES_METADATA_TYPE_BOOLEAN
= 3,
4012 ITUNES_METADATA_TYPE_BINARY
= 4,
4013 } lsmash_itunes_metadata_type
;
4017 ITUNES_METADATA_SUBTYPE_IMPLICIT
= 0, /* for use with tags for which no type needs to be indicated because only one type is allowed */
4018 ITUNES_METADATA_SUBTYPE_UTF8
= 1, /* without any count or null terminator */
4019 ITUNES_METADATA_SUBTYPE_UTF16
= 2, /* also known as UTF-16BE */
4020 ITUNES_METADATA_SUBTYPE_SJIS
= 3, /* deprecated unless it is needed for special Japanese characters */
4021 ITUNES_METADATA_SUBTYPE_HTML
= 6, /* the HTML file header specifies which HTML version */
4022 ITUNES_METADATA_SUBTYPE_XML
= 7, /* the XML header must identify the DTD or schemas */
4023 ITUNES_METADATA_SUBTYPE_UUID
= 8, /* also known as GUID; stored as 16 bytes in binary (valid as an ID) */
4024 ITUNES_METADATA_SUBTYPE_ISRC
= 9, /* stored as UTF-8 text (valid as an ID) */
4025 ITUNES_METADATA_SUBTYPE_MI3P
= 10, /* stored as UTF-8 text (valid as an ID) */
4026 ITUNES_METADATA_SUBTYPE_GIF
= 12, /* (deprecated) a GIF image */
4027 ITUNES_METADATA_SUBTYPE_JPEG
= 13, /* in a JFIF wrapper */
4028 ITUNES_METADATA_SUBTYPE_PNG
= 14, /* in a PNG wrapper */
4029 ITUNES_METADATA_SUBTYPE_URL
= 15, /* absolute, in UTF-8 characters */
4030 ITUNES_METADATA_SUBTYPE_DURATION
= 16, /* in milliseconds, a 32-bit integer */
4031 ITUNES_METADATA_SUBTYPE_TIME
= 17, /* in UTC, counting seconds since midnight on 1 January, 1904; 32 or 64 bits */
4032 ITUNES_METADATA_SUBTYPE_GENRES
= 18, /* a list of values from the enumerated set */
4033 ITUNES_METADATA_SUBTYPE_INTEGER
= 21, /* A signed big-endian integer in 1,2,3,4 or 8 bytes */
4034 ITUNES_METADATA_SUBTYPE_RIAAPA
= 24, /* RIAA Parental advisory; -1=no, 1=yes, 0=unspecified. 8-bit integer */
4035 ITUNES_METADATA_SUBTYPE_UPC
= 25, /* Universal Product Code, in text UTF-8 format (valid as an ID) */
4036 ITUNES_METADATA_SUBTYPE_BMP
= 27, /* Windows bitmap format graphics */
4037 } lsmash_itunes_metadata_subtype
;
4041 char *string
; /* for ITUNES_METADATA_TYPE_STRING (UTF-8 string) */
4042 uint64_t integer
; /* for ITUNES_METADATA_TYPE_INTEGER */
4043 lsmash_boolean_t boolean
; /* for ITUNES_METADATA_TYPE_BOOLEAN */
4044 /* for ITUNES_METADATA_TYPE_BINARY */
4047 lsmash_itunes_metadata_subtype subtype
;
4051 } lsmash_itunes_metadata_value_t
;
4055 /* When 'item' is specified as ITUNES_METADATA_ITEM_CUSTOM, 'type' and 'meaning' is mandatory while 'name' is optionally valid.
4056 * Otherwise 'type', 'meaning' and 'name' are just ignored. 'value' is always mandatory. */
4057 lsmash_itunes_metadata_item item
;
4058 lsmash_itunes_metadata_type type
;
4059 lsmash_itunes_metadata_value_t value
;
4062 } lsmash_itunes_metadata_t
;
4064 /* Append an iTunes metadata to a movie.
4066 * Return 0 if successful.
4067 * Return a negative value otherwise. */
4068 int lsmash_set_itunes_metadata
4070 lsmash_root_t
*root
,
4071 lsmash_itunes_metadata_t metadata
4074 /* Count the number of iTunes metadata in a movie.
4076 * Return the number of iTunes metadata in a movie if successful.
4077 * Return 0 otherwise. */
4078 uint32_t lsmash_count_itunes_metadata
4083 /* Get an iTunes metadata in a movie.
4084 * String and/or binary fields in 'metadata' are allocated if successful.
4085 * You can deallocate the allocated fields by lsmash_free().
4086 * Also you can deallocate all of the allocated fields by lsmash_cleanup_itunes_metadata() at a time.
4088 * Return 0 if successful.
4089 * Return a negative value otherwise. */
4090 int lsmash_get_itunes_metadata
4092 lsmash_root_t
*root
,
4093 uint32_t metadata_number
,
4094 lsmash_itunes_metadata_t
*metadata
4097 /* Deallocate all of allocated fields in a given iTunes metadata at a time.
4098 * The deallocated fields are set to NULL.
4099 * Note: the given iTunes metadata itself is NOT deallocated by this function. */
4100 void lsmash_cleanup_itunes_metadata
4102 lsmash_itunes_metadata_t
*metadata
4105 /****************************************************************************
4107 ****************************************************************************/
4108 /* Set a copyright declaration to a track.
4109 * track_ID == 0 means copyright declaration applies to the entire presentation, not an entire track.
4111 * Return 0 if successful.
4112 * Return a negative value otherwise. */
4113 int lsmash_set_copyright
4115 lsmash_root_t
*root
,
4117 uint16_t ISO_language
,
4121 int lsmash_create_object_descriptor
4126 /* Set a session description protocol (SDP) to a track.
4127 * track_ID == 0 means SDP applies to the entire presentation, not an entire track.
4128 * Recommendation: Record session level section of SDP to movie and media-level sections to track
4130 * Return 0 if successful.
4131 * Return a negative value otherwise. */
4134 lsmash_root_t
*root
,
4139 /* Timestamp synchronization */
4143 ISOM_SYNC_RECIEVED_RTP
= 1,
4144 ISOM_SYNC_OTHER_TRACKS
= 2,
4145 ISOM_SYNC_RESERVED
= 3,
4150 uint32_t timescale
; /* timscale of this track */
4151 uint32_t time_offset
; /* Beginning time stamp offset compared to */
4152 uint8_t reserved_timestamp_sync
; /* first 6 bits = 0, last two indicate whether tracks have been synchronized */
4153 } lsmash_isom_rtp_reception_hint_t
;
4156 /* Convert string encoded by ACP (ANSI CODE PAGE) to UTF-8.
4158 * Return the size of converted string (bytes) if successful.
4159 * Return 0 otherwise. */
4160 int lsmash_convert_ansi_to_utf8
4162 const char *string_ansi
, /* string encoded by ACP */
4163 char *string_utf8
, /* buffer for converted string from ACP */
4164 int max_length
/* size of 'string_utf8' */