1 /***************************************************************************** 2 * lsmash.h 3 ***************************************************************************** 4 * Copyright (C) 2010-2017 L-SMASH project 5 * 6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com> 7 * 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. 11 * 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 *****************************************************************************/ 20 21 /* This file is available under an ISC license. */ 22 23 #ifndef LSMASH_H 24 #define LSMASH_H 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 #include <stddef.h> 31 #include <stdint.h> 32 33 #define PRIVATE /* If this declaration is placed at a variable, any user shall NOT use it. */ 34 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) 40 #else 41 #define LSMASH_API 42 #endif 43 44 #define LSMASH_4CC( a, b, c, d ) (((a)<<24) | ((b)<<16) | ((c)<<8) | (d)) 45 46 /**************************************************************************** 47 * Version 48 ****************************************************************************/ 49 #define LSMASH_VERSION_MAJOR 2 50 #define LSMASH_VERSION_MINOR 14 51 #define LSMASH_VERSION_MICRO 5 52 53 #define LSMASH_VERSION_INT( a, b, c ) (((a) << 16) | ((b) << 8) | (c)) 54 55 #define LIBLSMASH_VERSION_INT LSMASH_VERSION_INT( LSMASH_VERSION_MAJOR, \ 56 LSMASH_VERSION_MINOR, \ 57 LSMASH_VERSION_MICRO ) 58 59 /**************************************************************************** 60 * Error Values 61 ****************************************************************************/ 62 enum 63 { 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. */ 71 }; 72 73 /**************************************************************************** 74 * ROOT 75 * The top-level opaque handler for whole file handling. 76 ****************************************************************************/ 77 typedef struct lsmash_root_tag lsmash_root_t; 78 79 /* Allocate a ROOT. 80 * The allocated ROOT can be deallocate by lsmash_destroy_root(). 81 * 82 * Return the address of an allocated ROOT if successful. 83 * Return NULL otherwise. */ 84 lsmash_root_t *lsmash_create_root 85 ( 86 void 87 ); 88 89 /* Deallocate a given ROOT. */ 90 void lsmash_destroy_root 91 ( 92 lsmash_root_t *root /* the address of a ROOT you want to deallocate */ 93 ); 94 95 /**************************************************************************** 96 * File Layer 97 ****************************************************************************/ 98 typedef struct lsmash_file_tag lsmash_file_t; 99 100 typedef enum 101 { 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 */ 112 } lsmash_file_mode; 113 114 typedef enum 115 { 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 */ 202 } lsmash_brand_type; 203 204 typedef struct 205 { 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'. 210 * 211 * Return the number of bytes read if successful. 212 * Return 0 if no more read. 213 * Return a negative value otherwise. */ 214 int (*read) 215 ( 216 void *opaque, 217 uint8_t *buf, 218 int size 219 ); 220 /* Write up to 'size' bytes to the file referenced by 'opaque' from the buffer starting at 'buf'. 221 * 222 * Return the number of bytes written if successful. 223 * Return a negative value otherwise. */ 224 int (*write) 225 ( 226 void *opaque, 227 uint8_t *buf, 228 int size 229 ); 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. 235 * 236 * Return the resulting offset of the location in bytes from the beginning of the file if successful. 237 * Return a negative value otherwise. */ 238 int64_t (*seek) 239 ( 240 void *opaque, 241 int64_t offset, 242 int whence 243 ); 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. */ 251 /** muxing only **/ 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; 259 260 typedef int (*lsmash_adhoc_remux_callback)( void *param, uint64_t done, uint64_t total ); 261 typedef struct 262 { 263 uint64_t buffer_size; 264 lsmash_adhoc_remux_callback func; 265 void *param; 266 } lsmash_adhoc_remux_t; 267 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. 277 * 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. 282 * 283 * The opened file can be closed by lsmash_close_file(). 284 * 285 * Note: 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. 288 * 289 * Return 0 if successful. 290 * Return a negative value otherwise. */ 291 int lsmash_open_file 292 ( 293 const char *filename, 294 int open_mode, 295 lsmash_file_parameters_t *param 296 ); 297 298 /* Close a file opened by lsmash_open_file(). 299 * 300 * Return 0 if successful. 301 * Return a negative value otherwise. */ 302 int lsmash_close_file 303 ( 304 lsmash_file_parameters_t *param 305 ); 306 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. 310 * 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 314 ( 315 lsmash_root_t *root, 316 lsmash_file_parameters_t *param 317 ); 318 319 /* Read whole boxes in a given file. 320 * You can also get file modes and file types or segment types by this function. 321 * 322 * Return the file size (if seekable) or 0 if successful. 323 * Return a negative value otherwise. */ 324 int64_t lsmash_read_file 325 ( 326 lsmash_file_t *file, 327 lsmash_file_parameters_t *param 328 ); 329 330 /* Deallocate all boxes within the current active file in a given ROOT. */ 331 void lsmash_discard_boxes 332 ( 333 lsmash_root_t *root /* the address of a ROOT you want to deallocate all boxes within the active file in it */ 334 ); 335 336 /* Activate a file associated with a ROOT. 337 * 338 * Return 0 if successful. 339 * Return a negative value otherwise. */ 340 int lsmash_activate_file 341 ( 342 lsmash_root_t *root, 343 lsmash_file_t *file 344 ); 345 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. 348 * 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. 352 * 353 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function. 354 * 355 * Return 0 if successful. 356 * Return a negative value otherwise. */ 357 int lsmash_switch_media_segment 358 ( 359 lsmash_root_t *root, 360 lsmash_file_t *successor, 361 lsmash_adhoc_remux_t *remux 362 ); 363 364 /**************************************************************************** 365 * Basic Types 366 ****************************************************************************/ 367 /* rational types */ 368 typedef struct 369 { 370 uint32_t n; /* numerator */ 371 uint32_t d; /* denominator */ 372 } lsmash_rational_u32_t; 373 374 typedef struct 375 { 376 int32_t n; /* numerator */ 377 uint32_t d; /* denominator */ 378 } lsmash_rational_s32_t; 379 380 typedef enum 381 { 382 LSMASH_BOOLEAN_FALSE = 0, 383 LSMASH_BOOLEAN_TRUE = 1 384 } lsmash_boolean_t; 385 386 /**************************************************************************** 387 * Allocation 388 ****************************************************************************/ 389 /* Allocate a memory block. 390 * The allocated memory block can be deallocate by lsmash_free(). 391 * 392 * Return the address to the beginning of a memory block if successful. 393 * Return NULL otherwise. */ 394 void *lsmash_malloc 395 ( 396 size_t size /* size of a memory block, in bytes */ 397 ); 398 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(). 402 * 403 * Return the address to the beginning of a memory block if successful. 404 * Return NULL otherwise. */ 405 void *lsmash_malloc_zero 406 ( 407 size_t size /* size of a memory block, in bytes */ 408 ); 409 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. 414 * 415 * Return the address to the beginning of a memory block if successful. 416 * Return NULL otherwise. */ 417 void *lsmash_realloc 418 ( 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 */ 423 ); 424 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(). 427 * 428 * Return the address to the beginning of an allocated memory block if successful. 429 * Return NULL otherwise. */ 430 void *lsmash_memdup 431 ( 432 const void *ptr, /* an address to the source of data to be copied */ 433 size_t size /* number of bytes to copy */ 434 ); 435 436 /* Deallocate a given memory block. 437 * If the given address to a memory block is NULL, this function does nothing. */ 438 void lsmash_free 439 ( 440 void *ptr /* an address to a memory block previously allocated with 441 * lsmash_malloc(), lsmash_malloc_zero(), lsmash_realloc() or lsmash_memdup() */ 442 ); 443 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. 447 * 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 ). 451 */ 452 void lsmash_freep 453 ( 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() */ 456 ); 457 458 /**************************************************************************** 459 * Box 460 ****************************************************************************/ 461 typedef struct lsmash_box_tag lsmash_box_t; 462 typedef uint32_t lsmash_compact_box_type_t; 463 464 /* An UUID structure for extended box type */ 465 typedef struct 466 { 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; 477 478 typedef struct 479 { 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. */ 484 } lsmash_box_type_t; 485 486 typedef struct 487 { 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. */ 491 } lsmash_box_path_t; 492 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; 496 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 499 ( 500 uint32_t fourcc, 501 const uint8_t id[12] 502 ); 503 504 /* Return box type that consists of combination of given compact and extended box type. */ 505 lsmash_box_type_t lsmash_form_box_type 506 ( 507 lsmash_compact_box_type_t type, 508 lsmash_extended_box_type_t user 509 ); 510 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 514 ( 515 lsmash_compact_box_type_t type 516 ); 517 518 lsmash_box_type_t lsmash_form_qtff_box_type 519 ( 520 lsmash_compact_box_type_t type 521 ); 522 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 */ 532 533 /* Check if the type of two boxes is identical or not. 534 * 535 * Return 1 if the both box types are identical. 536 * Return 0 otherwise. */ 537 int lsmash_check_box_type_identical 538 ( 539 lsmash_box_type_t a, 540 lsmash_box_type_t b 541 ); 542 543 /* Check if the type of a given box is already specified or not. 544 * 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 548 ( 549 const lsmash_box_type_t *box_type 550 ); 551 552 /* Allocate a box. 553 * The allocated box can be deallocated by lsmash_destroy_box(). 554 * 555 * Return the address of an allocated box if successful. 556 * Return NULL otherwise. */ 557 lsmash_box_t *lsmash_create_box 558 ( 559 lsmash_box_type_t type, 560 uint8_t *data, 561 uint32_t size, 562 uint64_t precedence 563 ); 564 565 /* Get a box under a given 'parent' box. 566 * The path of a box must be terminated by LSMASH_BOX_TYPE_UNSPECIFIED. 567 * 568 * Return the address of the box specified by 'box_path'. 569 * Return NULL otherwise. */ 570 lsmash_box_t *lsmash_get_box 571 ( 572 lsmash_box_t *parent, 573 const lsmash_box_path_t box_path[] 574 ); 575 576 /* Add a box into 'parent' box as a child box. 577 * 578 * Return 0 if successful. 579 * Return a negative value otherwise. */ 580 int lsmash_add_box 581 ( 582 lsmash_box_t *parent, 583 lsmash_box_t *box 584 ); 585 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. 592 * 593 * Return 0 if successful. 594 * Return a negative value otherwise. */ 595 int lsmash_add_box_ex 596 ( 597 lsmash_box_t *parent, 598 lsmash_box_t **box 599 ); 600 601 /* Deallocate a given box and its children. */ 602 void lsmash_destroy_box 603 ( 604 lsmash_box_t *box 605 ); 606 607 /* Deallocate all children of a given box. */ 608 void lsmash_destroy_children 609 ( 610 lsmash_box_t *box 611 ); 612 613 /* Get the precedence of a given box. 614 * 615 * Return 0 if successful. 616 * Return a negative value otherwise. */ 617 int lsmash_get_box_precedence 618 ( 619 lsmash_box_t *box, 620 uint64_t *precedence 621 ); 622 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(). 625 * 626 * Return the address of a given ROOT as a box. */ 627 lsmash_box_t *lsmash_root_as_box 628 ( 629 lsmash_root_t *root 630 ); 631 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(). 634 * 635 * Return the address of the handle of a given file as a box. */ 636 lsmash_box_t *lsmash_file_as_box 637 ( 638 lsmash_file_t *file 639 ); 640 641 /* Write a top level box and its children already added to a file. 642 * WARNING: 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. 645 * 646 * Return 0 if successful. 647 * Return a negative value otherwise. */ 648 int lsmash_write_top_level_box 649 ( 650 lsmash_box_t *box 651 ); 652 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(). 656 * 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. 659 * 660 * Return the address to the beginning of the binary string if successful. 661 * Return NULL otherwise. */ 662 uint8_t *lsmash_export_box 663 ( 664 lsmash_box_t *box, 665 uint32_t *size 666 ); 667 668 /**************************************************************************** 669 * CODEC identifiers 670 ****************************************************************************/ 671 typedef lsmash_box_type_t lsmash_codec_type_t; 672 673 #define LSMASH_CODEC_TYPE_INITIALIZER LSMASH_BOX_TYPE_INITIALIZER 674 #define LSMASH_CODEC_TYPE_UNSPECIFIED LSMASH_BOX_TYPE_UNSPECIFIED 675 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 681 #else 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 ) 686 #endif 687 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) */ 715 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' */ 749 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 */ 778 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)| */ 852 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 */ 857 858 DEFINE_QTFF_CODEC_TYPE( QT_CODEC_TYPE_TEXT_TEXT, LSMASH_4CC( 't', 'e', 'x', 't' ) ); /* QuickTime Text Media */ 859 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 */ 871 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 */ 882 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 */ 886 887 DEFINE_QTFF_CODEC_TYPE( LSMASH_CODEC_TYPE_RAW, LSMASH_4CC( 'r', 'a', 'w', ' ' ) ); /* Either video or audio */ 888 889 /* Check if the identifier of two CODECs is identical or not. 890 * 891 * Return 1 if the both CODEC identifiers are identical. 892 * Return 0 otherwise. */ 893 int lsmash_check_codec_type_identical 894 ( 895 lsmash_codec_type_t a, 896 lsmash_codec_type_t b 897 ); 898 899 /**************************************************************************** 900 * Summary of Stream Configuration 901 * This is L-SMASH's original structure. 902 ****************************************************************************/ 903 typedef enum 904 { 905 LSMASH_SUMMARY_TYPE_UNKNOWN = 0, 906 LSMASH_SUMMARY_TYPE_VIDEO, 907 LSMASH_SUMMARY_TYPE_AUDIO, 908 } lsmash_summary_type; 909 910 typedef enum 911 { 912 LSMASH_CODEC_SPECIFIC_DATA_TYPE_UNSPECIFIED = -1, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED */ 913 914 LSMASH_CODEC_SPECIFIC_DATA_TYPE_UNKNOWN = 0, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */ 915 916 LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG, 917 918 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264, 919 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_HEVC, 920 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_VC_1, 921 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_AC_3, 922 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_EC_3, 923 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_DTS, 924 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_AUDIO_ALAC, 925 926 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_SAMPLE_SCALE, 927 LSMASH_CODEC_SPECIFIC_DATA_TYPE_ISOM_VIDEO_H264_BITRATE, 928 929 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_COMMON, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */ 930 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_COMMON, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */ 931 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_FORMAT_SPECIFIC_FLAGS, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */ 932 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_DECOMPRESSION_PARAMETERS, /* must be LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */ 933 934 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_FIELD_INFO, 935 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_PIXEL_FORMAT, 936 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_SIGNIFICANT_BITS, 937 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_VIDEO_GAMMA_LEVEL, 938 LSMASH_CODEC_SPECIFIC_DATA_TYPE_QT_AUDIO_CHANNEL_LAYOUT, 939 940 LSMASH_CODEC_SPECIFIC_DATA_TYPE_CODEC_GLOBAL_HEADER, 941 } lsmash_codec_specific_data_type; 942 943 typedef enum 944 { 945 LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED = -1, 946 LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED = 0, 947 LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED = 1 948 } lsmash_codec_specific_format; 949 950 typedef union 951 { 952 void *always_null; /* LSMASH_CODEC_SPECIFIC_FORMAT_UNSPECIFIED */ 953 void *structured; /* LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED */ 954 uint8_t *unstructured; /* LSMASH_CODEC_SPECIFIC_FORMAT_UNSTRUCTURED */ 955 } lsmash_codec_specific_data_t; 956 957 typedef void (*lsmash_codec_specific_destructor_t)( void * ); 958 typedef struct 959 { 960 lsmash_codec_specific_data_type type; 961 lsmash_codec_specific_format format; 962 lsmash_codec_specific_data_t data; 963 uint32_t size; 964 lsmash_codec_specific_destructor_t destruct; 965 } lsmash_codec_specific_t; 966 967 typedef struct lsmash_codec_specific_list_tag lsmash_codec_specific_list_t; 968 969 typedef enum 970 { 971 LSMASH_CODEC_SUPPORT_FLAG_NONE = 0, 972 LSMASH_CODEC_SUPPORT_FLAG_MUX = 1 << 0, /* It's expected that L-SMASH can mux CODEC stream properly. 973 * If not flagged, L-SMASH may recognize and/or handle CODEC specific info incorrectly when muxing. */ 974 LSMASH_CODEC_SUPPORT_FLAG_DEMUX = 1 << 1, /* It's expected that L-SMASH can demux CODEC stream properly. 975 * If not flagged, L-SMASH may recognize and/or handle CODEC specific info incorrectly when demuxing. */ 976 LSMASH_CODEC_SUPPORT_FLAG_REMUX = LSMASH_CODEC_SUPPORT_FLAG_MUX | LSMASH_CODEC_SUPPORT_FLAG_DEMUX, 977 } lsmash_codec_support_flag; 978 979 #define LSMASH_BASE_SUMMARY \ 980 lsmash_summary_type summary_type; \ 981 lsmash_codec_type_t sample_type; \ 982 lsmash_codec_specific_list_t *opaque; \ 983 uint32_t max_au_length; /* buffer length for 1 access unit, \ 984 * typically max size of 1 audio/video frame */ \ 985 uint32_t data_ref_index; /* the index of a data reference */ 986 987 typedef struct 988 { 989 LSMASH_BASE_SUMMARY 990 } lsmash_summary_t; 991 992 /* Allocate a summary by 'summary_type'. 993 * The allocated summary can be deallocated by lsmash_cleanup_summary(). 994 * 995 * Return the address of an allocated summary if successful. 996 * Return NULL otherwise. */ 997 lsmash_summary_t *lsmash_create_summary 998 ( 999 lsmash_summary_type summary_type /* a type of summary you want */ 1000 ); 1001 1002 /* Deallocate a given summary. */ 1003 void lsmash_cleanup_summary 1004 ( 1005 lsmash_summary_t *summary /* the address of a summary you want to deallocate */ 1006 ); 1007 1008 /* Allocate and append a new sample description to a track by 'summary'. 1009 * 1010 * Return the index of an allocated and appended sample description if successful. 1011 * Return 0 otherwise. */ 1012 int lsmash_add_sample_entry 1013 ( 1014 lsmash_root_t *root, /* the address of the ROOT containing a track to which you want to append a new sample description */ 1015 uint32_t track_ID, /* the track_ID of a track to which you want to append a new sample description */ 1016 void *summary /* the summary of a sample description you want to append */ 1017 ); 1018 1019 /* Count the number of summaries in a track. 1020 * 1021 * Return the number of summaries in a track if no error. 1022 * Return 0 otherwise. */ 1023 uint32_t lsmash_count_summary 1024 ( 1025 lsmash_root_t *root, /* the address of the ROOT containing a track in which you want to count the number of summaries */ 1026 uint32_t track_ID /* the track_ID of a track in which you want to count the number of summaries */ 1027 ); 1028 1029 /* Get the summary of a sample description you want in a track. 1030 * The summary returned by this function is allocated internally, and can be deallocate by lsmash_cleanup_summary(). 1031 * 1032 * Return the address of an allocated summary you want if successful. 1033 * Return NULL otherwise. */ 1034 lsmash_summary_t *lsmash_get_summary 1035 ( 1036 lsmash_root_t *root, /* the address of the ROOT containing a track which contains a sample description you want */ 1037 uint32_t track_ID, /* the track_ID of a track containing a sample description you want */ 1038 uint32_t description_number /* the index of a sample description you want */ 1039 ); 1040 1041 /* Allocate and initialize a CODEC specific configuration by 'type' and 'format'. 1042 * The allocated CODEC specific configuration can be deallocated by lsmash_destroy_codec_specific_data(). 1043 * 1044 * Return the address of an allocated and initialized CODEC specific configuration if successful. 1045 * Return NULL otherwise. */ 1046 lsmash_codec_specific_t *lsmash_create_codec_specific_data 1047 ( 1048 lsmash_codec_specific_data_type type, 1049 lsmash_codec_specific_format format 1050 ); 1051 1052 /* Deallocate a CODEC specific configuration. */ 1053 void lsmash_destroy_codec_specific_data 1054 ( 1055 lsmash_codec_specific_t *specific /* the address of a CODEC specific configuration you want to deallocate */ 1056 ); 1057 1058 /* Allocate a CODEC specific configuration which is a copy of 'specific', and append it to 'summary'. 1059 * 1060 * Return 0 if successful. 1061 * Return a negative value otherwise. */ 1062 int lsmash_add_codec_specific_data 1063 ( 1064 lsmash_summary_t *summary, 1065 lsmash_codec_specific_t *specific 1066 ); 1067 1068 /* Count the number of CODEC specific configuration in a summary. 1069 * 1070 * Return the number of CODEC specific configuration in a summary if successful. 1071 * Return 0 otherwise. */ 1072 uint32_t lsmash_count_codec_specific_data 1073 ( 1074 lsmash_summary_t *summary /* the address of a summary in which you want to count the number of CODEC specific configuration */ 1075 ); 1076 1077 /* Get a CODEC specific configuration you want in a summary. 1078 * 1079 * Return the address of a CODEC specific configuration if successful. 1080 * Return NULL otherwise. */ 1081 lsmash_codec_specific_t *lsmash_get_codec_specific_data 1082 ( 1083 lsmash_summary_t *summary, 1084 uint32_t extension_number 1085 ); 1086 1087 /* Convert a data format of CODEC specific configuration into another. 1088 * User can specify the same data format for the destination. 1089 * If so, a returned CODEC specific configuration is a copy of the source. 1090 * 1091 * Return an allocated CODEC specific configuration by specified 'format' from 'specific' if successful. 1092 * Return NULL otherwise. */ 1093 lsmash_codec_specific_t *lsmash_convert_codec_specific_format 1094 ( 1095 lsmash_codec_specific_t *specific, /* the address of a CODEC specific configuration as the source */ 1096 lsmash_codec_specific_format format /* a data format of the destination */ 1097 ); 1098 1099 /* Compare two summaries. 1100 * 1101 * Return 0 if the two summaries are identical. 1102 * Return 1 if the two summaries are different. 1103 * Return a negative value if there is any error. */ 1104 int lsmash_compare_summary 1105 ( 1106 lsmash_summary_t *a, 1107 lsmash_summary_t *b 1108 ); 1109 1110 /* Check status of CODEC support. 1111 * 1112 * Return support flags of a given CODEC. */ 1113 lsmash_codec_support_flag lsmash_check_codec_support 1114 ( 1115 lsmash_codec_type_t codec_type 1116 ); 1117 1118 /**************************************************************************** 1119 * Audio Description Layer 1120 ****************************************************************************/ 1121 /* Audio Object Types */ 1122 typedef enum 1123 { 1124 MP4A_AUDIO_OBJECT_TYPE_NULL = 0, 1125 MP4A_AUDIO_OBJECT_TYPE_AAC_MAIN = 1, /* ISO/IEC 14496-3 subpart 4 */ 1126 MP4A_AUDIO_OBJECT_TYPE_AAC_LC = 2, /* ISO/IEC 14496-3 subpart 4 */ 1127 MP4A_AUDIO_OBJECT_TYPE_AAC_SSR = 3, /* ISO/IEC 14496-3 subpart 4 */ 1128 MP4A_AUDIO_OBJECT_TYPE_AAC_LTP = 4, /* ISO/IEC 14496-3 subpart 4 */ 1129 MP4A_AUDIO_OBJECT_TYPE_SBR = 5, /* ISO/IEC 14496-3 subpart 4 */ 1130 MP4A_AUDIO_OBJECT_TYPE_AAC_scalable = 6, /* ISO/IEC 14496-3 subpart 4 */ 1131 MP4A_AUDIO_OBJECT_TYPE_TwinVQ = 7, /* ISO/IEC 14496-3 subpart 4 */ 1132 MP4A_AUDIO_OBJECT_TYPE_CELP = 8, /* ISO/IEC 14496-3 subpart 3 */ 1133 MP4A_AUDIO_OBJECT_TYPE_HVXC = 9, /* ISO/IEC 14496-3 subpart 2 */ 1134 MP4A_AUDIO_OBJECT_TYPE_TTSI = 12, /* ISO/IEC 14496-3 subpart 6 */ 1135 MP4A_AUDIO_OBJECT_TYPE_Main_synthetic = 13, /* ISO/IEC 14496-3 subpart 5 */ 1136 MP4A_AUDIO_OBJECT_TYPE_Wavetable_synthesis = 14, /* ISO/IEC 14496-3 subpart 5 */ 1137 MP4A_AUDIO_OBJECT_TYPE_General_MIDI = 15, /* ISO/IEC 14496-3 subpart 5 */ 1138 MP4A_AUDIO_OBJECT_TYPE_Algorithmic_Synthesis_Audio_FX = 16, /* ISO/IEC 14496-3 subpart 5 */ 1139 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LC = 17, /* ISO/IEC 14496-3 subpart 4 */ 1140 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LTP = 19, /* ISO/IEC 14496-3 subpart 4 */ 1141 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_scalable = 20, /* ISO/IEC 14496-3 subpart 4 */ 1142 MP4A_AUDIO_OBJECT_TYPE_ER_Twin_VQ = 21, /* ISO/IEC 14496-3 subpart 4 */ 1143 MP4A_AUDIO_OBJECT_TYPE_ER_BSAC = 22, /* ISO/IEC 14496-3 subpart 4 */ 1144 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_LD = 23, /* ISO/IEC 14496-3 subpart 4 */ 1145 MP4A_AUDIO_OBJECT_TYPE_ER_CELP = 24, /* ISO/IEC 14496-3 subpart 3 */ 1146 MP4A_AUDIO_OBJECT_TYPE_ER_HVXC = 25, /* ISO/IEC 14496-3 subpart 2 */ 1147 MP4A_AUDIO_OBJECT_TYPE_ER_HILN = 26, /* ISO/IEC 14496-3 subpart 7 */ 1148 MP4A_AUDIO_OBJECT_TYPE_ER_Parametric = 27, /* ISO/IEC 14496-3 subpart 2 and 7 */ 1149 MP4A_AUDIO_OBJECT_TYPE_SSC = 28, /* ISO/IEC 14496-3 subpart 8 */ 1150 MP4A_AUDIO_OBJECT_TYPE_PS = 29, /* ISO/IEC 14496-3 subpart 8 */ 1151 MP4A_AUDIO_OBJECT_TYPE_MPEG_Surround = 30, /* ISO/IEC 23003-1 */ 1152 MP4A_AUDIO_OBJECT_TYPE_ESCAPE = 31, 1153 MP4A_AUDIO_OBJECT_TYPE_Layer_1 = 32, /* ISO/IEC 14496-3 subpart 9 */ 1154 MP4A_AUDIO_OBJECT_TYPE_Layer_2 = 33, /* ISO/IEC 14496-3 subpart 9 */ 1155 MP4A_AUDIO_OBJECT_TYPE_Layer_3 = 34, /* ISO/IEC 14496-3 subpart 9 */ 1156 MP4A_AUDIO_OBJECT_TYPE_DST = 35, /* ISO/IEC 14496-3 subpart 10 */ 1157 MP4A_AUDIO_OBJECT_TYPE_ALS = 36, /* ISO/IEC 14496-3 subpart 11 */ 1158 MP4A_AUDIO_OBJECT_TYPE_SLS = 37, /* ISO/IEC 14496-3 subpart 12 */ 1159 MP4A_AUDIO_OBJECT_TYPE_SLS_non_core = 38, /* ISO/IEC 14496-3 subpart 12 */ 1160 MP4A_AUDIO_OBJECT_TYPE_ER_AAC_ELD = 39, /* ISO/IEC 14496-3 subpart 4 */ 1161 MP4A_AUDIO_OBJECT_TYPE_SMR_Simple = 40, /* ISO/IEC 14496-23 */ 1162 MP4A_AUDIO_OBJECT_TYPE_SMR_Main = 41, /* ISO/IEC 14496-23 */ 1163 MP4A_AUDIO_OBJECT_TYPE_SAOC = 43, /* ISO/IEC 23003-2 */ 1164 } lsmash_mp4a_AudioObjectType; 1165 1166 /* See ISO/IEC 14496-3 Signaling of SBR, SBR Signaling and Corresponding Decoder Behavior */ 1167 typedef enum 1168 { 1169 MP4A_AAC_SBR_NOT_SPECIFIED = 0x0, /* not mention to SBR presence. Implicit signaling. */ 1170 MP4A_AAC_SBR_NONE, /* explicitly signals SBR does not present. Useless in general. */ 1171 MP4A_AAC_SBR_BACKWARD_COMPATIBLE, /* explicitly signals SBR present. Recommended method to signal SBR. */ 1172 MP4A_AAC_SBR_HIERARCHICAL /* SBR exists. SBR dedicated method. */ 1173 } lsmash_mp4a_aac_sbr_mode; 1174 1175 typedef struct 1176 { 1177 LSMASH_BASE_SUMMARY 1178 lsmash_mp4a_AudioObjectType aot; /* detailed codec type 1179 * If neither ISOM_CODEC_TYPE_MP4A_AUDIO nor QT_CODEC_TYPE_MP4A_AUDIO, just ignored. */ 1180 uint32_t frequency; /* the audio sampling rate (in Hz) at the default output playback 1181 * For some audio, this field is used as a nominal value. 1182 * For HE-AAC v1/SBR stream, this is base AAC's one. 1183 * For ISOM_CODEC_TYPE_AC_3_AUDIO and ISOM_CODEC_TYPE_EC_3_AUDIO, this shall be 1184 * equal to the sampling rate (in Hz) of the stream and the media timescale. */ 1185 uint32_t channels; /* the number of audio channels at the default output playback 1186 * Even if the stream is HE-AAC v2/SBR+PS, this is base AAC's one. */ 1187 uint32_t sample_size; /* For uncompressed audio, 1188 * the number of bits in each uncompressed sample for a single channel. 1189 * For some compressed audio, such as audio that uses MDCT, 1190 * N/A (not applicable), and may be set to 16. */ 1191 uint32_t samples_in_frame; /* the number of decoded PCM samples in an audio frame at 'frequency' 1192 * Even if the stream is HE-AAC/aacPlus/SBR(+PS), this is base AAC's one, so 1024. */ 1193 lsmash_mp4a_aac_sbr_mode sbr_mode; /* SBR treatment 1194 * Currently we always set this as mp4a_AAC_SBR_NOT_SPECIFIED (Implicit signaling). 1195 * User can set this for treatment in other way. */ 1196 uint32_t bytes_per_frame; /* the number of bytes per audio frame 1197 * If variable, shall be set to 0. */ 1198 } lsmash_audio_summary_t; 1199 1200 /* Facilitate to make exdata (typically DecoderSpecificInfo or AudioSpecificConfig). */ 1201 int lsmash_setup_AudioSpecificConfig 1202 ( 1203 lsmash_audio_summary_t* summary 1204 ); 1205 1206 /**************************************************************************** 1207 * Video Description Layer 1208 ****************************************************************************/ 1209 /* Clean Aperture */ 1210 typedef struct 1211 { 1212 lsmash_rational_u32_t width; 1213 lsmash_rational_u32_t height; 1214 lsmash_rational_s32_t horizontal_offset; 1215 lsmash_rational_s32_t vertical_offset; 1216 } lsmash_clap_t; 1217 1218 typedef struct 1219 { 1220 lsmash_rational_u32_t top; 1221 lsmash_rational_u32_t left; 1222 lsmash_rational_u32_t bottom; 1223 lsmash_rational_u32_t right; 1224 } lsmash_crop_t; 1225 1226 /* Video depth */ 1227 typedef enum 1228 { 1229 ISOM_DEPTH_TEMPLATE = 0x0018, 1230 1231 /* H.264/AVC */ 1232 AVC_DEPTH_COLOR_WITH_NO_ALPHA = 0x0018, /* color with no alpha */ 1233 AVC_DEPTH_GRAYSCALE_WITH_NO_ALPHA = 0x0028, /* grayscale with no alpha */ 1234 AVC_DEPTH_WITH_ALPHA = 0x0020, /* gray or color with alpha */ 1235 1236 /* QuickTime Video 1237 * (1-32) or (33-40 grayscale) */ 1238 QT_VIDEO_DEPTH_COLOR_1 = 0x0001, 1239 QT_VIDEO_DEPTH_COLOR_2 = 0x0002, 1240 QT_VIDEO_DEPTH_COLOR_4 = 0x0004, 1241 QT_VIDEO_DEPTH_COLOR_8 = 0x0008, 1242 QT_VIDEO_DEPTH_COLOR_16 = 0x0010, 1243 QT_VIDEO_DEPTH_COLOR_24 = 0x0018, 1244 QT_VIDEO_DEPTH_COLOR_32 = 0x0020, 1245 QT_VIDEO_DEPTH_GRAYSCALE_1 = 0x0021, 1246 QT_VIDEO_DEPTH_GRAYSCALE_2 = 0x0022, 1247 QT_VIDEO_DEPTH_GRAYSCALE_4 = 0x0024, 1248 QT_VIDEO_DEPTH_GRAYSCALE_8 = 0x0028, 1249 1250 /* QuickTime Uncompressed RGB */ 1251 QT_VIDEO_DEPTH_555RGB = 0x0010, 1252 QT_VIDEO_DEPTH_24RGB = 0x0018, 1253 QT_VIDEO_DEPTH_32ARGB = 0x0020, 1254 } lsmash_video_depth; 1255 1256 /* Index for the chromaticity coordinates of the color primaries */ 1257 enum 1258 { 1259 /* for ISO Base Media file format */ 1260 ISOM_PRIMARIES_INDEX_ITU_R709_5 = 1, /* ITU-R BT.709-2/5, ITU-R BT.1361, 1261 * SMPTE 274M-1995, SMPTE 296M-1997, 1262 * IEC 61966-2-1 (sRGB or sYCC), IEC 61966-2-4 (xvYCC), 1263 * SMPTE RP 177M-1993 Annex B 1264 * green x = 0.300 y = 0.600 1265 * blue x = 0.150 y = 0.060 1266 * red x = 0.640 y = 0.330 1267 * white x = 0.3127 y = 0.3290 (CIE III. D65) */ 1268 ISOM_PRIMARIES_INDEX_UNSPECIFIED = 2, /* Unspecified */ 1269 ISOM_PRIMARIES_INDEX_ITU_R470M = 4, /* ITU-R BT.470-6 System M 1270 * green x = 0.21 y = 0.71 1271 * blue x = 0.14 y = 0.08 1272 * red x = 0.67 y = 0.33 1273 * white x = 0.310 y = 0.316 */ 1274 ISOM_PRIMARIES_INDEX_ITU_R470BG = 5, /* EBU Tech. 3213 (1981), ITU-R BT.470-6 System B, G, 1275 * ITU-R BT.601-6 625, ITU-R BT.1358 625, 1276 * ITU-R BT.1700 625 PAL and 625 SECAM 1277 * green x = 0.29 y = 0.60 1278 * blue x = 0.15 y = 0.06 1279 * red x = 0.64 y = 0.33 1280 * white x = 0.3127 y = 0.3290 (CIE III. D65) */ 1281 ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 = 6, /* SMPTE C Primaries from SMPTE RP 145-1993, SMPTE 170M-2004, 1282 * ITU-R BT.601-6 525, ITU-R BT.1358 525, 1283 * ITU-R BT.1700 NTSC, SMPTE 170M-2004 1284 * green x = 0.310 y = 0.595 1285 * blue x = 0.155 y = 0.070 1286 * red x = 0.630 y = 0.340 1287 * white x = 0.3127 y = 0.3290 (CIE III. D65) */ 1288 ISOM_PRIMARIES_INDEX_SMPTE_240M_1999 = 7, /* SMPTE 240M-1999 1289 * functionally the same as the value ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 */ 1290 1291 /* for QuickTime file format */ 1292 QT_PRIMARIES_INDEX_ITU_R709_2 = 1, /* the same as the value ISOM_PRIMARIES_INDEX_ITU_R709_5 */ 1293 QT_PRIMARIES_INDEX_UNSPECIFIED = 2, /* Unspecified */ 1294 QT_PRIMARIES_INDEX_EBU_3213 = 5, /* the same as the value ISOM_PRIMARIES_INDEX_ITU_R470BG */ 1295 QT_PRIMARIES_INDEX_SMPTE_C = 6, /* the same as the value ISOM_PRIMARIES_INDEX_SMPTE_170M_2004 */ 1296 }; 1297 1298 /* Index for the opto-electronic transfer characteristic of the image color components */ 1299 enum 1300 { 1301 /* for ISO Base Media file format */ 1302 ISOM_TRANSFER_INDEX_ITU_R709_5 = 1, /* ITU-R BT.709-2/5, ITU-R BT.1361 1303 * SMPTE 274M-1995, SMPTE 296M-1997, 1304 * SMPTE 293M-1996, SMPTE 170M-1994 1305 * vV = 1.099 * vLc^0.45 - 0.099 for 1 >= vLc >= 0.018 1306 * vV = 4.500 * vLc for 0.018 > vLc >= 0 */ 1307 ISOM_TRANSFER_INDEX_UNSPECIFIED = 2, /* Unspecified */ 1308 ISOM_TRANSFER_INDEX_ITU_R470M = 4, /* ITU-R BT.470-6 System M, ITU-R BT.1700 625 PAL and 625 SECAM 1309 * Assumed display gamma 2.2 */ 1310 ISOM_TRANSFER_INDEX_ITU_R470BG = 5, /* ITU-R BT.470-6 System B, G 1311 * Assumed display gamma 2.8 */ 1312 ISOM_TRANSFER_INDEX_SMPTE_170M_2004 = 6, /* ITU-R BT.601-6 525 or 625, ITU-R BT.1358 525 or 625, 1313 * ITU-R BT.1700 NTSC, SMPTE 170M-2004 1314 * functionally the same as the value ISOM_TRANSFER_INDEX_ITU_R709_5 1315 * vV = 1.099 * vLc^0.45 - 0.099 for 1 >= vLc >= 0.018 1316 * vV = 4.500 * vLc for 0.018 > vLc >= 0 */ 1317 ISOM_TRANSFER_INDEX_SMPTE_240M_1999 = 7, /* SMPTE 240M-1995/1999, interim color implementation of SMPTE 274M-1995 1318 * vV = 1.1115 * vLc^0.45 - 0.1115 for 1 >= vLc >= 0.0228 1319 * vV = 4.0 * vLc for 0.0228 > vLc >= 0 */ 1320 ISOM_TRANSFER_INDEX_LINEAR = 8, /* Linear transfer characteristics */ 1321 ISOM_TRANSFER_INDEX_XVYCC = 11, /* IEC 61966-2-4 (xvYCC) 1322 * vV = 1.099 * vLc^0.45 - 0.099 for vLc >= 0.018 1323 * vV = 4.500 * vLc for 0.018 > vLc > -0.018 1324 * vV = -1.099 * (-vLc)^0.45 + 0.099 for -0.018 >= vLc */ 1325 ISOM_TRANSFER_INDEX_ITU_R1361 = 12, /* ITU-R BT.1361 1326 * vV = 1.099 * vLc^0.45 - 0.099 for 1.33 > vLc >= 0.018 1327 * vV = 4.500 * vLc for 0.018 > vLc >= -0.0045 1328 * vV = -(1.099 * (-4 * vLc)^0.45 + 0.099) / 4 for -0.0045 > vLc >= -0.25 */ 1329 ISOM_TRANSFER_INDEX_SRGB = 13, /* IEC 61966-2-1 (sRGB or sYCC) 1330 * vV = 1.055 * vLc^(1/2.4) - 0.055 for 1 > vLc >= 0.0031308 1331 * vV = 12.92 * vLc for 0.0031308 > vLc >= 0 */ 1332 1333 /* for QuickTime file format */ 1334 QT_TRANSFER_INDEX_ITU_R709_2 = 1, /* the same as the value ISOM_TRANSFER_INDEX_ITU_R709_5 */ 1335 QT_TRANSFER_INDEX_UNSPECIFIED = 2, /* Unspecified */ 1336 QT_TRANSFER_INDEX_SMPTE_240M_1995 = 7, /* the same as the value ISOM_TRANSFER_INDEX_SMPTE_240M_1999 */ 1337 }; 1338 1339 /* Index for the matrix coefficients associated with derivation of luma and chroma signals from the green, blue, and red primaries */ 1340 enum 1341 { 1342 /* for ISO Base Media file format */ 1343 ISOM_MATRIX_INDEX_NO_MATRIX = 0, /* No matrix transformation 1344 * IEC 61966-2-1 (sRGB) */ 1345 ISOM_MATRIX_INDEX_ITU_R_709_5 = 1, /* ITU-R BT.709-2/5, ITU-R BT.1361, 1346 * SMPTE 274M-1995, SMPTE 296M-1997 1347 * IEC 61966-2-1 (sYCC), IEC 61966-2-4 xvYCC_709, 1348 * SMPTE RP 177M-1993 Annex B 1349 * vKr = 0.2126; vKb = 0.0722 */ 1350 ISOM_MATRIX_INDEX_UNSPECIFIED = 2, /* Unspecified */ 1351 ISOM_MATRIX_INDEX_USFCCT_47_CFR = 4, /* United States Federal Communications Commission Title 47 Code of Federal Regulations 1352 * vKr = 0.30; vKb = 0.11 */ 1353 ISOM_MATRIX_INDEX_ITU_R470BG = 5, /* ITU-R BT.470-6 System B, G, 1354 * ITU-R BT.601-4/6 625, ITU-R BT.1358 625, 1355 * ITU-R BT.1700 625 PAL and 625 SECAM, IEC 61966-2-4 xvYCC601 1356 * vKr = 0.299; vKb = 0.114 */ 1357 ISOM_MATRIX_INDEX_SMPTE_170M_2004 = 6, /* ITU-R BT.601-4/6 525, ITU-R BT.1358 525, 1358 * ITU-R BT.1700 NTSC, 1359 * SMPTE 170M-1994, SMPTE 293M-1996 1360 * functionally the same as the value ISOM_MATRIX_INDEX_ITU_R470BG 1361 * vKr = 0.299; vKb = 0.114 */ 1362 ISOM_MATRIX_INDEX_SMPTE_240M_1999 = 7, /* SMPTE 240M-1995, interim color implementation of SMPTE 274M-1995 1363 * vKr = 0.212; vKb = 0.087 */ 1364 ISOM_MATRIX_INDEX_YCGCO = 8, /* YCoCg */ 1365 1366 /* for QuickTime file format */ 1367 QT_MATRIX_INDEX_ITU_R_709_2 = 1, /* the same as the value ISOM_MATRIX_INDEX_ITU_R_709_5 */ 1368 QT_MATRIX_INDEX_UNSPECIFIED = 2, /* Unspecified */ 1369 QT_MATRIX_INDEX_ITU_R_601_4 = 6, /* the same as the value ISOM_MATRIX_INDEX_SMPTE_170M_2004 */ 1370 QT_MATRIX_INDEX_SMPTE_240M_1995 = 7 /* the same as the value ISOM_MATRIX_INDEX_SMPTE_240M_1999 */ 1371 }; 1372 1373 typedef struct 1374 { 1375 LSMASH_BASE_SUMMARY 1376 // lsmash_mp4v_VideoObjectType vot; /* Detailed codec type. If not mp4v, just ignored. */ 1377 uint32_t timescale; /* media timescale 1378 * User can't set this parameter manually. */ 1379 uint32_t timebase; /* increment unit of timestamp 1380 * User can't set this parameter manually. */ 1381 uint8_t vfr; /* whether a stream is assumed as variable frame rate 1382 * User can't set this parameter manually. */ 1383 uint8_t sample_per_field; /* whether a stream may have a sample per field 1384 * User can't set this parameter manually. */ 1385 uint32_t width; /* pixel counts of width samples have */ 1386 uint32_t height; /* pixel counts of height samples have */ 1387 char compressorname[33]; /* a 32-byte Pascal string containing the name of the compressor that created the image */ 1388 lsmash_video_depth depth; /* data size of a pixel */ 1389 lsmash_clap_t clap; /* clean aperture */ 1390 uint32_t par_h; /* horizontal factor of pixel aspect ratio */ 1391 uint32_t par_v; /* vertical factor of pixel aspect ratio */ 1392 struct 1393 { 1394 /* To omit to write these field, set zero value to all them. */ 1395 uint16_t primaries_index; /* the chromaticity coordinates of the color primaries */ 1396 uint16_t transfer_index; /* the opto-electronic transfer characteristic of the image color components */ 1397 uint16_t matrix_index; /* the matrix coefficients associated with derivation of luma and chroma signals from the green, blue, and red primaries */ 1398 uint8_t full_range; 1399 } color; 1400 } lsmash_video_summary_t; 1401 1402 int lsmash_convert_crop_into_clap 1403 ( 1404 lsmash_crop_t crop, 1405 uint32_t width, 1406 uint32_t height, 1407 lsmash_clap_t *clap 1408 ); 1409 1410 int lsmash_convert_clap_into_crop 1411 ( 1412 lsmash_clap_t clap, 1413 uint32_t width, 1414 uint32_t height, 1415 lsmash_crop_t *crop 1416 ); 1417 1418 /**************************************************************************** 1419 * Media Sample 1420 ****************************************************************************/ 1421 typedef enum 1422 { 1423 /* allow_ealier */ 1424 QT_SAMPLE_EARLIER_PTS_ALLOWED = 1, 1425 /* leading */ 1426 ISOM_SAMPLE_LEADING_UNKNOWN = 0, 1427 ISOM_SAMPLE_IS_UNDECODABLE_LEADING = 1, 1428 ISOM_SAMPLE_IS_NOT_LEADING = 2, 1429 ISOM_SAMPLE_IS_DECODABLE_LEADING = 3, 1430 /* independent */ 1431 ISOM_SAMPLE_INDEPENDENCY_UNKNOWN = 0, 1432 ISOM_SAMPLE_IS_NOT_INDEPENDENT = 1, 1433 ISOM_SAMPLE_IS_INDEPENDENT = 2, 1434 /* disposable */ 1435 ISOM_SAMPLE_DISPOSABLE_UNKNOWN = 0, 1436 ISOM_SAMPLE_IS_NOT_DISPOSABLE = 1, 1437 ISOM_SAMPLE_IS_DISPOSABLE = 2, 1438 /* redundant */ 1439 ISOM_SAMPLE_REDUNDANCY_UNKNOWN = 0, 1440 ISOM_SAMPLE_HAS_REDUNDANCY = 1, 1441 ISOM_SAMPLE_HAS_NO_REDUNDANCY = 2, 1442 } lsmash_sample_dependency; 1443 1444 typedef enum 1445 { 1446 /* flags for ISO Base Media file format */ 1447 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_NONE = 0, 1448 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_SYNC = 1 << 0, /* a sync sample */ 1449 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP = 1 << 2, /* the first sample of a closed or an open GOP */ 1450 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED = 1 << 3, /* a sample in a closed GOP 1451 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP. */ 1452 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN = 1 << 4, /* a sample in an open GOP 1453 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP. */ 1454 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR = 1 << 5, /* a sample on gradual decoder refresh or random access recovery */ 1455 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_START = 1 << 6, /* a sample that is the starting point of gradual decoder refresh or random access recovery 1456 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR. */ 1457 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_END = 1 << 7, /* a sample that is the ending point of gradual decoder refresh or random access recovery 1458 * This flag shall be set together with ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR. */ 1459 1460 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP /* the first sample of a closed GOP */ 1461 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP 1462 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED, 1463 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP /* the first sample of an open GOP */ 1464 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP 1465 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN, 1466 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_POST_ROLL_START /* the post-roll starting point of random access recovery */ 1467 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR 1468 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_START, 1469 ISOM_SAMPLE_RANDOM_ACCESS_FLAG_PRE_ROLL_END /* the pre-roll ending point of random access recovery */ 1470 = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR 1471 | ISOM_SAMPLE_RANDOM_ACCESS_FLAG_GDR_END, 1472 1473 /* flags for QuickTime file format */ 1474 QT_SAMPLE_RANDOM_ACCESS_FLAG_NONE = 0, /* alias of ISOM_SAMPLE_RANDOM_ACCESS_FLAG_NONE */ 1475 QT_SAMPLE_RANDOM_ACCESS_FLAG_SYNC = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_SYNC, 1476 QT_SAMPLE_RANDOM_ACCESS_FLAG_PARTIAL_SYNC = 1 << 1, /* partial sync sample 1477 * Partial sync sample is a sample 1478 * such that this sample and samples following in decoding order can be correctly decoded 1479 * using the first sample of the previous GOP and samples following in decoding order, 1480 * in addition, this sample and non-leading samples following in decoding order can be correctly decoded from this. */ 1481 QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_RAP, 1482 QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED, 1483 QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN = ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN, 1484 1485 QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP /* the first sample of a closed GOP */ 1486 = QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP 1487 | QT_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED, 1488 QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP /* the first sample of an open GOP */ 1489 = QT_SAMPLE_RANDOM_ACCESS_FLAG_RAP 1490 | QT_SAMPLE_RANDOM_ACCESS_FLAG_OPEN, 1491 } lsmash_random_access_flag; 1492 1493 #define LSMASH_FLAGS_SATISFIED( x, y ) (((x) & (y)) == (y)) 1494 #define LSMASH_IS_CLOSED_RAP( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_CLOSED_RAP ) 1495 #define LSMASH_IS_OPEN_RAP( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_OPEN_RAP ) 1496 #define LSMASH_IS_POST_ROLL_START( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_POST_ROLL_START ) 1497 #define LSMASH_IS_PRE_ROLL_END( x ) LSMASH_FLAGS_SATISFIED( (x), ISOM_SAMPLE_RANDOM_ACCESS_FLAG_PRE_ROLL_END ) 1498 1499 typedef struct 1500 { 1501 uint32_t identifier; /* the identifier of sample 1502 * If this identifier equals a certain identifier of random access recovery point, 1503 * then this sample is the random access recovery point of the earliest unestablished post-roll group. */ 1504 uint32_t complete; /* the identifier of future random access recovery point, which is necessary for the recovery from its starting point to be completed 1505 * For muxing, this value is used only if (ra_flags & ISOM_SAMPLE_RANDOM_ACCESS_TYPE_POST_ROLL_START) is true. 1506 * The following is an example of use for gradual decoder refresh of H.264/AVC. 1507 * For each sample, set 'frame_num' to the 'identifier'. 1508 * For samples with recovery point SEI message, add ISOM_SAMPLE_RANDOM_ACCESS_TYPE_POST_ROLL_START to ra_flags 1509 * and set '(frame_num + recovery_frame_cnt) % MaxFrameNum' to the 'complete'. 1510 * The above-mentioned values are set appropriately, then L-SMASH will establish appropriate post-roll grouping. */ 1511 } lsmash_post_roll_t; 1512 1513 typedef struct 1514 { 1515 uint32_t distance; /* the distance from the previous random access point or pre-roll starting point 1516 * of the random access recovery point to this sample. 1517 * For muxing, this value is used only if ra_flags is not set to ISOM_SAMPLE_RANDOM_ACCESS_TYPE_NONE 1518 * and LSMASH_IS_POST_ROLL_START( ra_flags ) is false. 1519 * Some derived specifications forbid using pre-roll settings and use post-roll settings instead (e.g. AVC uses only post-roll). 1520 * The following is an example of pre-roll distance for representing audio decoder delay derived from composition. 1521 * Typical AAC encoding uses a transform over consecutive sets of 2048 audio samples, 1522 * applied every 1024 audio samples (MDCTs are overlapped). 1523 * For correct audio to be decoded, both transforms for any period of 1024 audio samples are needed. 1524 * For this AAC stream, therefore, 'distance' of each sample shall be set to 1 (one AAC access unit). 1525 * Note: the number of priming audio sample i.e. encoder delay shall be represented by 'start_time' in an edit. */ 1526 } lsmash_pre_roll_t; 1527 1528 typedef struct 1529 { 1530 lsmash_random_access_flag ra_flags; /* random access flags */ 1531 lsmash_post_roll_t post_roll; 1532 lsmash_pre_roll_t pre_roll; 1533 uint8_t allow_earlier; /* only for QuickTime file format */ 1534 uint8_t leading; 1535 uint8_t independent; 1536 uint8_t disposable; 1537 uint8_t redundant; 1538 uint8_t reserved[3]; /* broken link 1539 * ??? */ 1540 } lsmash_sample_property_t; 1541 1542 typedef struct 1543 { 1544 #define LSMASH_TIMESTAMP_UNDEFINED UINT64_MAX 1545 uint32_t length; /* size of sample data 1546 * Note: this is NOT always an allocated size. */ 1547 uint8_t *data; /* sample data */ 1548 uint64_t dts; /* Decoding TimeStamp in units of media timescale 1549 * No two samples in the same track have the same Decoding TimeStamp. 1550 * Any user must not set Decoding TimeStamp of any sample to LSMASH_TIMESTAMP_UNDEFINED. */ 1551 uint64_t cts; /* Composition TimeStamp in units of media timescale 1552 * No two samples in the same track have the same Composition TimeStamp. 1553 * If sample is a non-output sample i.e. decoded but not used, set its Composition TimeStamp to LSMASH_TIMESTAMP_UNDEFINED. 1554 * Composition TimeStamp of any non-output sample makes no sense. Note that explicit timeline maps shall be used to exclude 1555 * non-output samples from presentation timeline. */ 1556 uint64_t pos; /* absolute file offset of sample data (read-only) */ 1557 uint32_t index; /* index of sample description */ 1558 lsmash_sample_property_t prop; 1559 } lsmash_sample_t; 1560 1561 typedef struct 1562 { 1563 uint64_t dts; /* Decoding TimeStamp in units of media timescale */ 1564 uint64_t cts; /* Composition TimeStamp in units of media timescale */ 1565 } lsmash_media_ts_t; 1566 1567 typedef struct 1568 { 1569 uint32_t sample_count; 1570 lsmash_media_ts_t *timestamp; 1571 } lsmash_media_ts_list_t; 1572 1573 /* Allocate a sample and then allocate data of the allocated sample by 'size'. 1574 * If 'size' is set to 0, data of the allocated sample won't be allocated and will be set to NULL instead. 1575 * The allocated sample can be deallocated by lsmash_delete_sample(). 1576 * 1577 * Return the address of an allocated sample if successful. 1578 * Return NULL otherwise. */ 1579 lsmash_sample_t *lsmash_create_sample 1580 ( 1581 uint32_t size /* size of sample data you request */ 1582 ); 1583 1584 /* Allocate data of a given allocated sample by 'size'. 1585 * If the sample data is already allocated, reallocate it by 'size'. 1586 * 1587 * Return 0 if successful. 1588 * Return a negative value otherwise. */ 1589 int lsmash_sample_alloc 1590 ( 1591 lsmash_sample_t *sample, /* the address of a sample you want to allocate its sample data */ 1592 uint32_t size /* size of sample data you request */ 1593 ); 1594 1595 /* Deallocate a given sample. */ 1596 void lsmash_delete_sample 1597 ( 1598 lsmash_sample_t *sample /* the address of a sample you want to deallocate */ 1599 ); 1600 1601 /* Append a sample to a track. 1602 * Note: 1603 * The appended sample will be deleted by lsmash_delete_sample() internally. 1604 * Users shall not deallocate the sample by lsmash_delete_sample() if successful to append the sample. 1605 * 1606 * Return 0 if successful. 1607 * Return a negative value otherwise. */ 1608 int lsmash_append_sample 1609 ( 1610 lsmash_root_t *root, 1611 uint32_t track_ID, 1612 lsmash_sample_t *sample 1613 ); 1614 1615 /**************************************************************************** 1616 * Media Layer 1617 ****************************************************************************/ 1618 /* Media handler types */ 1619 typedef enum 1620 { 1621 ISOM_MEDIA_HANDLER_TYPE_3GPP_SCENE_DESCRIPTION = LSMASH_4CC( '3', 'g', 's', 'd' ), 1622 ISOM_MEDIA_HANDLER_TYPE_ID3_VERSION2_METADATA = LSMASH_4CC( 'I', 'D', '3', '2' ), 1623 ISOM_MEDIA_HANDLER_TYPE_AUXILIARY_VIDEO_TRACK = LSMASH_4CC( 'a', 'u', 'x', 'v' ), 1624 ISOM_MEDIA_HANDLER_TYPE_CPCM_AUXILIARY_METADATA = LSMASH_4CC( 'c', 'p', 'a', 'd' ), 1625 ISOM_MEDIA_HANDLER_TYPE_CLOCK_REFERENCE_STREAM = LSMASH_4CC( 'c', 'r', 's', 'm' ), 1626 ISOM_MEDIA_HANDLER_TYPE_DVB_MANDATORY_BASIC_DESCRIPTION = LSMASH_4CC( 'd', 'm', 'b', 'd' ), 1627 ISOM_MEDIA_HANDLER_TYPE_TV_ANYTIME = LSMASH_4CC( 'd', 't', 'v', 'a' ), 1628 ISOM_MEDIA_HANDLER_TYPE_BROADBAND_CONTENT_GUIDE = LSMASH_4CC( 'd', 't', 'v', 'a' ), 1629 ISOM_MEDIA_HANDLER_TYPE_FONT_DATA_STREAM = LSMASH_4CC( 'f', 'd', 's', 'm' ), 1630 ISOM_MEDIA_HANDLER_TYPE_GENERAL_MPEG4_SYSTEM_STREAM = LSMASH_4CC( 'g', 'e', 's', 'm' ), 1631 ISOM_MEDIA_HANDLER_TYPE_HINT_TRACK = LSMASH_4CC( 'h', 'i', 'n', 't' ), 1632 ISOM_MEDIA_HANDLER_TYPE_IPDC_ELECTRONIC_SERVICE_GUIDE = LSMASH_4CC( 'i', 'p', 'd', 'c' ), 1633 ISOM_MEDIA_HANDLER_TYPE_IPMP_STREAM = LSMASH_4CC( 'i', 'p', 's', 'm' ), 1634 ISOM_MEDIA_HANDLER_TYPE_MPEG7_STREAM = LSMASH_4CC( 'm', '7', 's', 'm' ), 1635 ISOM_MEDIA_HANDLER_TYPE_TIMED_METADATA_TRACK = LSMASH_4CC( 'm', 'e', 't', 'a' ), 1636 ISOM_MEDIA_HANDLER_TYPE_MPEGJ_STREAM = LSMASH_4CC( 'm', 'j', 's', 'm' ), 1637 ISOM_MEDIA_HANDLER_TYPE_MPEG21_DIGITAL_ITEM = LSMASH_4CC( 'm', 'p', '2', '1' ), 1638 ISOM_MEDIA_HANDLER_TYPE_OBJECT_CONTENT_INFO_STREAM = LSMASH_4CC( 'o', 'c', 's', 'm' ), 1639 ISOM_MEDIA_HANDLER_TYPE_OBJECT_DESCRIPTOR_STREAM = LSMASH_4CC( 'o', 'd', 's', 'm' ), 1640 ISOM_MEDIA_HANDLER_TYPE_SCENE_DESCRIPTION_STREAM = LSMASH_4CC( 's', 'd', 's', 'm' ), 1641 ISOM_MEDIA_HANDLER_TYPE_KEY_MANAGEMENT_MESSAGES = LSMASH_4CC( 's', 'k', 'm', 'm' ), 1642 ISOM_MEDIA_HANDLER_TYPE_AUDIO_TRACK = LSMASH_4CC( 's', 'o', 'u', 'n' ), 1643 ISOM_MEDIA_HANDLER_TYPE_TEXT_TRACK = LSMASH_4CC( 't', 'e', 'x', 't' ), 1644 ISOM_MEDIA_HANDLER_TYPE_PROPRIETARY_DESCRIPTIVE_METADATA = LSMASH_4CC( 'u', 'r', 'i', ' ' ), 1645 ISOM_MEDIA_HANDLER_TYPE_VIDEO_TRACK = LSMASH_4CC( 'v', 'i', 'd', 'e' ), 1646 } lsmash_media_type; 1647 1648 /* ISO language codes */ 1649 typedef enum 1650 { 1651 #define LSMASH_PACK_ISO_LANGUAGE( a, b, c ) ((((a-0x60)&0x1f)<<10) | (((b-0x60)&0x1f)<<5) | ((c-0x60)&0x1f)) 1652 ISOM_LANGUAGE_CODE_ENGLISH = LSMASH_PACK_ISO_LANGUAGE( 'e', 'n', 'g' ), 1653 ISOM_LANGUAGE_CODE_FRENCH = LSMASH_PACK_ISO_LANGUAGE( 'f', 'r', 'a' ), 1654 ISOM_LANGUAGE_CODE_GERMAN = LSMASH_PACK_ISO_LANGUAGE( 'd', 'e', 'u' ), 1655 ISOM_LANGUAGE_CODE_ITALIAN = LSMASH_PACK_ISO_LANGUAGE( 'i', 't', 'a' ), 1656 ISOM_LANGUAGE_CODE_DUTCH_M = LSMASH_PACK_ISO_LANGUAGE( 'd', 'u', 'm' ), 1657 ISOM_LANGUAGE_CODE_SWEDISH = LSMASH_PACK_ISO_LANGUAGE( 's', 'w', 'e' ), 1658 ISOM_LANGUAGE_CODE_SPANISH = LSMASH_PACK_ISO_LANGUAGE( 's', 'p', 'a' ), 1659 ISOM_LANGUAGE_CODE_DANISH = LSMASH_PACK_ISO_LANGUAGE( 'd', 'a', 'n' ), 1660 ISOM_LANGUAGE_CODE_PORTUGUESE = LSMASH_PACK_ISO_LANGUAGE( 'p', 'o', 'r' ), 1661 ISOM_LANGUAGE_CODE_NORWEGIAN = LSMASH_PACK_ISO_LANGUAGE( 'n', 'o', 'r' ), 1662 ISOM_LANGUAGE_CODE_HEBREW = LSMASH_PACK_ISO_LANGUAGE( 'h', 'e', 'b' ), 1663 ISOM_LANGUAGE_CODE_JAPANESE = LSMASH_PACK_ISO_LANGUAGE( 'j', 'p', 'n' ), 1664 ISOM_LANGUAGE_CODE_ARABIC = LSMASH_PACK_ISO_LANGUAGE( 'a', 'r', 'a' ), 1665 ISOM_LANGUAGE_CODE_FINNISH = LSMASH_PACK_ISO_LANGUAGE( 'f', 'i', 'n' ), 1666 ISOM_LANGUAGE_CODE_GREEK = LSMASH_PACK_ISO_LANGUAGE( 'e', 'l', 'l' ), 1667 ISOM_LANGUAGE_CODE_ICELANDIC = LSMASH_PACK_ISO_LANGUAGE( 'i', 's', 'l' ), 1668 ISOM_LANGUAGE_CODE_MALTESE = LSMASH_PACK_ISO_LANGUAGE( 'm', 'l', 't' ), 1669 ISOM_LANGUAGE_CODE_TURKISH = LSMASH_PACK_ISO_LANGUAGE( 't', 'u', 'r' ), 1670 ISOM_LANGUAGE_CODE_CROATIAN = LSMASH_PACK_ISO_LANGUAGE( 'h', 'r', 'v' ), 1671 ISOM_LANGUAGE_CODE_CHINESE = LSMASH_PACK_ISO_LANGUAGE( 'z', 'h', 'o' ), 1672 ISOM_LANGUAGE_CODE_URDU = LSMASH_PACK_ISO_LANGUAGE( 'u', 'r', 'd' ), 1673 ISOM_LANGUAGE_CODE_HINDI = LSMASH_PACK_ISO_LANGUAGE( 'h', 'i', 'n' ), 1674 ISOM_LANGUAGE_CODE_THAI = LSMASH_PACK_ISO_LANGUAGE( 't', 'h', 'a' ), 1675 ISOM_LANGUAGE_CODE_KOREAN = LSMASH_PACK_ISO_LANGUAGE( 'k', 'o', 'r' ), 1676 ISOM_LANGUAGE_CODE_LITHUANIAN = LSMASH_PACK_ISO_LANGUAGE( 'l', 'i', 't' ), 1677 ISOM_LANGUAGE_CODE_POLISH = LSMASH_PACK_ISO_LANGUAGE( 'p', 'o', 'l' ), 1678 ISOM_LANGUAGE_CODE_HUNGARIAN = LSMASH_PACK_ISO_LANGUAGE( 'h', 'u', 'n' ), 1679 ISOM_LANGUAGE_CODE_ESTONIAN = LSMASH_PACK_ISO_LANGUAGE( 'e', 's', 't' ), 1680 ISOM_LANGUAGE_CODE_LATVIAN = LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 'v' ), 1681 ISOM_LANGUAGE_CODE_SAMI = LSMASH_PACK_ISO_LANGUAGE( 's', 'm', 'i' ), 1682 ISOM_LANGUAGE_CODE_FAROESE = LSMASH_PACK_ISO_LANGUAGE( 'f', 'a', 'o' ), 1683 ISOM_LANGUAGE_CODE_RUSSIAN = LSMASH_PACK_ISO_LANGUAGE( 'r', 'u', 's' ), 1684 ISOM_LANGUAGE_CODE_DUTCH = LSMASH_PACK_ISO_LANGUAGE( 'n', 'l', 'd' ), 1685 ISOM_LANGUAGE_CODE_IRISH = LSMASH_PACK_ISO_LANGUAGE( 'g', 'l', 'e' ), 1686 ISOM_LANGUAGE_CODE_ALBANIAN = LSMASH_PACK_ISO_LANGUAGE( 's', 'q', 'i' ), 1687 ISOM_LANGUAGE_CODE_ROMANIAN = LSMASH_PACK_ISO_LANGUAGE( 'r', 'o', 'n' ), 1688 ISOM_LANGUAGE_CODE_CZECH = LSMASH_PACK_ISO_LANGUAGE( 'c', 'e', 's' ), 1689 ISOM_LANGUAGE_CODE_SLOVAK = LSMASH_PACK_ISO_LANGUAGE( 's', 'l', 'k' ), 1690 ISOM_LANGUAGE_CODE_SLOVENIA = LSMASH_PACK_ISO_LANGUAGE( 's', 'l', 'v' ), 1691 ISOM_LANGUAGE_CODE_YIDDISH = LSMASH_PACK_ISO_LANGUAGE( 'y', 'i', 'd' ), 1692 ISOM_LANGUAGE_CODE_SERBIAN = LSMASH_PACK_ISO_LANGUAGE( 's', 'r', 'p' ), 1693 ISOM_LANGUAGE_CODE_MACEDONIAN = LSMASH_PACK_ISO_LANGUAGE( 'm', 'k', 'd' ), 1694 ISOM_LANGUAGE_CODE_BULGARIAN = LSMASH_PACK_ISO_LANGUAGE( 'b', 'u', 'l' ), 1695 ISOM_LANGUAGE_CODE_UKRAINIAN = LSMASH_PACK_ISO_LANGUAGE( 'u', 'k', 'r' ), 1696 ISOM_LANGUAGE_CODE_BELARUSIAN = LSMASH_PACK_ISO_LANGUAGE( 'b', 'e', 'l' ), 1697 ISOM_LANGUAGE_CODE_UZBEK = LSMASH_PACK_ISO_LANGUAGE( 'u', 'z', 'b' ), 1698 ISOM_LANGUAGE_CODE_KAZAKH = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 'z' ), 1699 ISOM_LANGUAGE_CODE_AZERBAIJANI = LSMASH_PACK_ISO_LANGUAGE( 'a', 'z', 'e' ), 1700 ISOM_LANGUAGE_CODE_ARMENIAN = LSMASH_PACK_ISO_LANGUAGE( 'h', 'y', 'e' ), 1701 ISOM_LANGUAGE_CODE_GEORGIAN = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 't' ), 1702 ISOM_LANGUAGE_CODE_MOLDAVIAN = LSMASH_PACK_ISO_LANGUAGE( 'r', 'o', 'n' ), 1703 ISOM_LANGUAGE_CODE_KIRGHIZ = LSMASH_PACK_ISO_LANGUAGE( 'k', 'i', 'r' ), 1704 ISOM_LANGUAGE_CODE_TAJIK = LSMASH_PACK_ISO_LANGUAGE( 't', 'g', 'k' ), 1705 ISOM_LANGUAGE_CODE_TURKMEN = LSMASH_PACK_ISO_LANGUAGE( 't', 'u', 'k' ), 1706 ISOM_LANGUAGE_CODE_MONGOLIAN = LSMASH_PACK_ISO_LANGUAGE( 'm', 'o', 'n' ), 1707 ISOM_LANGUAGE_CODE_PASHTO = LSMASH_PACK_ISO_LANGUAGE( 'p', 'u', 's' ), 1708 ISOM_LANGUAGE_CODE_KURDISH = LSMASH_PACK_ISO_LANGUAGE( 'k', 'u', 'r' ), 1709 ISOM_LANGUAGE_CODE_KASHMIRI = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 's' ), 1710 ISOM_LANGUAGE_CODE_SINDHI = LSMASH_PACK_ISO_LANGUAGE( 's', 'n', 'd' ), 1711 ISOM_LANGUAGE_CODE_TIBETAN = LSMASH_PACK_ISO_LANGUAGE( 'b', 'o', 'd' ), 1712 ISOM_LANGUAGE_CODE_NEPALI = LSMASH_PACK_ISO_LANGUAGE( 'n', 'e', 'p' ), 1713 ISOM_LANGUAGE_CODE_SANSKRIT = LSMASH_PACK_ISO_LANGUAGE( 's', 'a', 'n' ), 1714 ISOM_LANGUAGE_CODE_MARATHI = LSMASH_PACK_ISO_LANGUAGE( 'm', 'a', 'r' ), 1715 ISOM_LANGUAGE_CODE_BENGALI = LSMASH_PACK_ISO_LANGUAGE( 'b', 'e', 'n' ), 1716 ISOM_LANGUAGE_CODE_ASSAMESE = LSMASH_PACK_ISO_LANGUAGE( 'a', 's', 'm' ), 1717 ISOM_LANGUAGE_CODE_GUJARATI = LSMASH_PACK_ISO_LANGUAGE( 'g', 'u', 'j' ), 1718 ISOM_LANGUAGE_CODE_PUNJABI = LSMASH_PACK_ISO_LANGUAGE( 'p', 'a', 'n' ), 1719 ISOM_LANGUAGE_CODE_ORIYA = LSMASH_PACK_ISO_LANGUAGE( 'o', 'r', 'i' ), 1720 ISOM_LANGUAGE_CODE_MALAYALAM = LSMASH_PACK_ISO_LANGUAGE( 'm', 'a', 'l' ), 1721 ISOM_LANGUAGE_CODE_KANNADA = LSMASH_PACK_ISO_LANGUAGE( 'k', 'a', 'n' ), 1722 ISOM_LANGUAGE_CODE_TAMIL = LSMASH_PACK_ISO_LANGUAGE( 't', 'a', 'm' ), 1723 ISOM_LANGUAGE_CODE_TELUGU = LSMASH_PACK_ISO_LANGUAGE( 't', 'e', 'l' ), 1724 ISOM_LANGUAGE_CODE_SINHALESE = LSMASH_PACK_ISO_LANGUAGE( 's', 'i', 'n' ), 1725 ISOM_LANGUAGE_CODE_BURMESE = LSMASH_PACK_ISO_LANGUAGE( 'm', 'y', 'a' ), 1726 ISOM_LANGUAGE_CODE_KHMER = LSMASH_PACK_ISO_LANGUAGE( 'k', 'h', 'm' ), 1727 ISOM_LANGUAGE_CODE_LAO = LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 'o' ), 1728 ISOM_LANGUAGE_CODE_VIETNAMESE = LSMASH_PACK_ISO_LANGUAGE( 'v', 'i', 'e' ), 1729 ISOM_LANGUAGE_CODE_INDONESIAN = LSMASH_PACK_ISO_LANGUAGE( 'i', 'n', 'd' ), 1730 ISOM_LANGUAGE_CODE_TAGALOG = LSMASH_PACK_ISO_LANGUAGE( 't', 'g', 'l' ), 1731 ISOM_LANGUAGE_CODE_MALAY_ROMAN = LSMASH_PACK_ISO_LANGUAGE( 'm', 's', 'a' ), 1732 ISOM_LANGUAGE_CODE_MAYAY_ARABIC = LSMASH_PACK_ISO_LANGUAGE( 'm', 's', 'a' ), 1733 ISOM_LANGUAGE_CODE_AMHARIC = LSMASH_PACK_ISO_LANGUAGE( 'a', 'm', 'h' ), 1734 ISOM_LANGUAGE_CODE_OROMO = LSMASH_PACK_ISO_LANGUAGE( 'o', 'r', 'm' ), 1735 ISOM_LANGUAGE_CODE_SOMALI = LSMASH_PACK_ISO_LANGUAGE( 's', 'o', 'm' ), 1736 ISOM_LANGUAGE_CODE_SWAHILI = LSMASH_PACK_ISO_LANGUAGE( 's', 'w', 'a' ), 1737 ISOM_LANGUAGE_CODE_KINYARWANDA = LSMASH_PACK_ISO_LANGUAGE( 'k', 'i', 'n' ), 1738 ISOM_LANGUAGE_CODE_RUNDI = LSMASH_PACK_ISO_LANGUAGE( 'r', 'u', 'n' ), 1739 ISOM_LANGUAGE_CODE_CHEWA = LSMASH_PACK_ISO_LANGUAGE( 'n', 'y', 'a' ), 1740 ISOM_LANGUAGE_CODE_MALAGASY = LSMASH_PACK_ISO_LANGUAGE( 'm', 'l', 'g' ), 1741 ISOM_LANGUAGE_CODE_ESPERANTO = LSMASH_PACK_ISO_LANGUAGE( 'e', 'p', 'o' ), 1742 ISOM_LANGUAGE_CODE_WELSH = LSMASH_PACK_ISO_LANGUAGE( 'c', 'y', 'm' ), 1743 ISOM_LANGUAGE_CODE_BASQUE = LSMASH_PACK_ISO_LANGUAGE( 'e', 'u', 's' ), 1744 ISOM_LANGUAGE_CODE_CATALAN = LSMASH_PACK_ISO_LANGUAGE( 'c', 'a', 't' ), 1745 ISOM_LANGUAGE_CODE_LATIN = LSMASH_PACK_ISO_LANGUAGE( 'l', 'a', 't' ), 1746 ISOM_LANGUAGE_CODE_QUECHUA = LSMASH_PACK_ISO_LANGUAGE( 'q', 'u', 'e' ), 1747 ISOM_LANGUAGE_CODE_GUARANI = LSMASH_PACK_ISO_LANGUAGE( 'g', 'r', 'n' ), 1748 ISOM_LANGUAGE_CODE_AYMARA = LSMASH_PACK_ISO_LANGUAGE( 'a', 'y', 'm' ), 1749 ISOM_LANGUAGE_CODE_TATAR = LSMASH_PACK_ISO_LANGUAGE( 'c', 'r', 'h' ), 1750 ISOM_LANGUAGE_CODE_UIGHUR = LSMASH_PACK_ISO_LANGUAGE( 'u', 'i', 'g' ), 1751 ISOM_LANGUAGE_CODE_DZONGKHA = LSMASH_PACK_ISO_LANGUAGE( 'd', 'z', 'o' ), 1752 ISOM_LANGUAGE_CODE_JAVANESE = LSMASH_PACK_ISO_LANGUAGE( 'j', 'a', 'v' ), 1753 ISOM_LANGUAGE_CODE_UNDEFINED = LSMASH_PACK_ISO_LANGUAGE( 'u', 'n', 'd' ), 1754 } lsmash_iso_language_code; 1755 1756 typedef struct 1757 { 1758 lsmash_media_type handler_type; /* the nature of the media 1759 * You can't change handler_type through this parameter manually. */ 1760 uint32_t timescale; /* media timescale: timescale for this media */ 1761 uint64_t duration; /* the duration of this media, expressed in the media timescale 1762 * You can't set this parameter manually. */ 1763 uint8_t roll_grouping; /* roll recovery grouping present 1764 * Require 'avc1' brand, or ISO Base Media File Format version 2 or later. */ 1765 uint8_t rap_grouping; /* random access point grouping present 1766 * Require ISO Base Media File Format version 6 or later. */ 1767 /* Use either type of language code. */ 1768 uint16_t MAC_language; /* Macintosh language code for this media */ 1769 uint16_t ISO_language; /* ISO 639-2/T language code for this media */ 1770 /* human-readable name for the track type (for debugging and inspection purposes) */ 1771 char *media_handler_name; 1772 char *data_handler_name; 1773 /* Any user shouldn't use the following parameters. */ 1774 PRIVATE char media_handler_name_shadow[256]; 1775 PRIVATE char data_handler_name_shadow[256]; 1776 /* */ 1777 uint8_t compact_sample_size_table; /* 1: Use compact size table if possible. (output/muxing mode) 1778 * Compact sample size table is used. (input/demuxing mode) */ 1779 uint8_t no_sample_dependency_table; /* 1: Don't write sample dependency type table. (output/muxing mode) 1780 * Sample dependency type table is absent. (input/demuxing mode) */ 1781 uint8_t reserved[2]; 1782 } lsmash_media_parameters_t; 1783 1784 typedef struct 1785 { 1786 uint32_t index; /* the index of a data reference */ 1787 char *location; /* URL; location of referenced media file */ 1788 /* Probably, additional string fields such as thing to indicate URN will be added in the future. */ 1789 } lsmash_data_reference_t; 1790 1791 /* Set all the given media parameters to default. */ 1792 void lsmash_initialize_media_parameters 1793 ( 1794 lsmash_media_parameters_t *param /* the address of the media parameters to which you want to set default value */ 1795 ); 1796 1797 /* Set media parameters to a track. 1798 * 1799 * Return 0 if successful. 1800 * Return a negative value otherwise. */ 1801 int lsmash_set_media_parameters 1802 ( 1803 lsmash_root_t *root, /* the address of a ROOT containing a track to which you want to set the media parameters */ 1804 uint32_t track_ID, /* the track_ID of a track to which you want to set the media parameters */ 1805 lsmash_media_parameters_t *param /* the address of the media parameters you want to set to a track. */ 1806 ); 1807 1808 /* Set the duration of the last sample to a track. 1809 * 1810 * Return 0 if successful. 1811 * Return a negative value otherwise. */ 1812 int lsmash_set_last_sample_delta 1813 ( 1814 lsmash_root_t *root, 1815 uint32_t track_ID, 1816 uint32_t sample_delta 1817 ); 1818 1819 /* Flush samples in the internal pool in a track. 1820 * Users shall call this function for each track before calling lsmash_finish_movie() or lsmash_create_fragment_movie(). 1821 * 1822 * Return 0 if successful. 1823 * Return a negative value otherwise. */ 1824 int lsmash_flush_pooled_samples 1825 ( 1826 lsmash_root_t *root, 1827 uint32_t track_ID, 1828 uint32_t last_sample_delta 1829 ); 1830 1831 /* Update the modification time of a media to the most recent. 1832 * If the creation time of that media is larger than the modification time, 1833 * then override the creation one with the modification one. 1834 * 1835 * Return 0 if successful. 1836 * Return a negative value otherwise. */ 1837 int lsmash_update_media_modification_time 1838 ( 1839 lsmash_root_t *root, 1840 uint32_t track_ID 1841 ); 1842 1843 /* Get the media parameters in a track. 1844 * 1845 * Return 0 if successful. 1846 * Return a negative value otherwise. */ 1847 int lsmash_get_media_parameters 1848 ( 1849 lsmash_root_t *root, 1850 uint32_t track_ID, 1851 lsmash_media_parameters_t *param 1852 ); 1853 1854 /* Get the duration of a media. 1855 * 1856 * Return the duration of a media if successful. 1857 * Return 0 otherwise. */ 1858 uint64_t lsmash_get_media_duration 1859 ( 1860 lsmash_root_t *root, 1861 uint32_t track_ID 1862 ); 1863 1864 /* Get the timescale of a media. 1865 * 1866 * Return the timescale of a media if successful. 1867 * Return 0 otherwise. */ 1868 uint32_t lsmash_get_media_timescale 1869 ( 1870 lsmash_root_t *root, 1871 uint32_t track_ID 1872 ); 1873 1874 /* Get the duration of the last sample in a track. 1875 * 1876 * Return the duration of the last sample in a track if successful. 1877 * Return 0 otherwise. */ 1878 uint32_t lsmash_get_last_sample_delta 1879 ( 1880 lsmash_root_t *root, 1881 uint32_t track_ID 1882 ); 1883 1884 /* Get the composition time offset of the first sample in a track. 1885 * 1886 * Return the composition time offset of the first sample in a track if successful. 1887 * Return 0 otherwise. */ 1888 uint32_t lsmash_get_start_time_offset 1889 ( 1890 lsmash_root_t *root, 1891 uint32_t track_ID 1892 ); 1893 1894 /* Get the shift of composition timeline to decode timeline in a track. 1895 * 1896 * Return the shift of composition timeline to decode timeline in a track. if successful. 1897 * Return 0 otherwise. */ 1898 uint32_t lsmash_get_composition_to_decode_shift 1899 ( 1900 lsmash_root_t *root, 1901 uint32_t track_ID 1902 ); 1903 1904 /* Pack a string of ISO 639-2/T language code into 16-bit data. 1905 * 1906 * Return a packed 16-bit ISO 639-2/T language if successful. 1907 * Return 0 otherwise. */ 1908 uint16_t lsmash_pack_iso_language 1909 ( 1910 char *iso_language /* a string of ISO 639-2/T language code */ 1911 ); 1912 1913 /* Count the number of data references in a track. 1914 * 1915 * Return the number of data references in a track if no error. 1916 * Return 0 otherwise. */ 1917 uint32_t lsmash_count_data_reference 1918 ( 1919 lsmash_root_t *root, 1920 uint32_t track_ID 1921 ); 1922 1923 /* Get the location of a data reference in a track by specifying the index in 'data_ref'. 1924 * The string fields in 'data_ref' may be allocated if referencing external media data. 1925 * If referencing self-contained media data, the all string fields are set to NULL. 1926 * You can deallocate the allocated fields by lsmash_free(). 1927 * Also you can deallocate all of the allocated fields by lsmash_cleanup_data_reference() at a time. 1928 * 1929 * Return 0 if successful. 1930 * Return a negative value otherwise. */ 1931 int lsmash_get_data_reference 1932 ( 1933 lsmash_root_t *root, 1934 uint32_t track_ID, 1935 lsmash_data_reference_t *data_ref 1936 ); 1937 1938 /* Deallocate all of allocated fields in a given data reference at a time. 1939 * The deallocated fields are set to NULL. */ 1940 void lsmash_cleanup_data_reference 1941 ( 1942 lsmash_data_reference_t *data_ref 1943 ); 1944 1945 /* Create a data reference in a track and specify its location on playback for writing. 1946 * If no settings for data references in a track, the location of the first data reference is specified to 1947 * the location of the same file implicitly. 1948 * Note that referenced files shall be used as a media, i.e. LSMASH_FILE_MODE_MEDIA shall be set to the 'mode' 1949 * in the lsmash_file_parameters_t before calling lsmash_set_file(). 1950 * 1951 * As restrictions of the libary, 1952 * WARNING1: The box structured media files cannot be used as a reference data yet. 1953 * WARNING2: The external media files cannot be used as a reference data for movie fragments yet. 1954 * 1955 * Return 0 if successful. 1956 * Return a negative value otherwise. */ 1957 int lsmash_create_data_reference 1958 ( 1959 lsmash_root_t *root, 1960 uint32_t track_ID, 1961 lsmash_data_reference_t *data_ref, 1962 lsmash_file_t *file 1963 ); 1964 1965 /* Assign a data reference in a track to a read file. 1966 * 1967 * Return 0 if successful. 1968 * Return a negative value otherwise. */ 1969 int lsmash_assign_data_reference 1970 ( 1971 lsmash_root_t *root, 1972 uint32_t track_ID, 1973 uint32_t data_ref_index, 1974 lsmash_file_t *file 1975 ); 1976 1977 /**************************************************************************** 1978 * Track Layer 1979 ****************************************************************************/ 1980 /* Track mode */ 1981 typedef enum 1982 { 1983 /* 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, 1984 * then all tracks shall be treated as if both flags were set on all tracks. */ 1985 ISOM_TRACK_ENABLED = 0x000001, /* Track_enabled: Indicates that the track is enabled. 1986 * A disabled track is treated as if it were not present. */ 1987 ISOM_TRACK_IN_MOVIE = 0x000002, /* Track_in_movie: Indicates that the track is used in the presentation. */ 1988 ISOM_TRACK_IN_PREVIEW = 0x000004, /* Track_in_preview: Indicates that the track is used when previewing the presentation. */ 1989 1990 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) */ 1991 } lsmash_track_mode; 1992 1993 typedef struct 1994 { 1995 lsmash_track_mode mode; 1996 uint32_t track_ID; /* an integer that uniquely identifies the track 1997 * Don't set to value already used except for zero value. 1998 * Zero value don't override established track_ID. */ 1999 uint64_t duration; /* the duration of this track expressed in the movie timescale units 2000 * If there is any edit, your setting is ignored. */ 2001 int16_t alternate_group; /* an integer that specifies a group or collection of tracks 2002 * If this field is not 0, it should be the same for tracks that contain alternate data for one another 2003 * and different for tracks belonging to different such groups. 2004 * Only one track within an alternate group should be played or streamed at any one time. 2005 * Note: alternate_group is ignored when a file is read as an MPEG-4. */ 2006 /* The following parameters are ignored when a file is read as an MPEG-4 or 3GPP file format. */ 2007 int16_t video_layer; /* the front-to-back ordering of video tracks; tracks with lower numbers are closer to the viewer. */ 2008 int16_t audio_volume; /* fixed point 8.8 number. 0x0100 is full volume. */ 2009 int32_t matrix[9]; /* transformation matrix for the video 2010 * Each value represents, in order, a, b, u, c, d, v, x, y and w. 2011 * All the values in a matrix are stored as 16.16 fixed-point values, 2012 * except for u, v and w, which are stored as 2.30 fixed-point values. 2013 * Not all derived specifications use matrices. 2014 * If a matrix is used, the point (p, q) is transformed into (p', q') using the matrix as follows: 2015 * | a b u | 2016 * (p, q, 1) * | c d v | = z * (p', q', 1) 2017 * | x y w | 2018 * p' = (a * p + c * q + x) / z; q' = (b * p + d * q + y) / z; z = u * p + v * q + w 2019 * Note: transformation matrix is applied after scaling to display size up to display_width and display_height. */ 2020 /* visual presentation region size */ 2021 uint32_t display_width; /* visual presentation region size of horizontal direction as fixed point 16.16 number. */ 2022 uint32_t display_height; /* visual presentation region size of vertical direction as fixed point 16.16 number. */ 2023 /* */ 2024 uint8_t aperture_modes; /* track aperture modes present 2025 * This feature is only available under QuickTime file format. 2026 * Automatically disabled if multiple sample description is present or scaling method is specified. */ 2027 } lsmash_track_parameters_t; 2028 2029 /* Explicit Timeline Map (Edit) 2030 * There are two types of timeline; one is the media timeline, the other is the presentation timeline (or the movie timeline). 2031 * An edit maps the presentation timeline to the media timeline. 2032 * Therefore, an edit can select any portion within the media and specify its playback speed. 2033 * The media within the track is played through the presentation timeline, so you can construct any complex presentation from a media by edits. 2034 * 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. 2035 * 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, 2036 * the decoder shall start to decode from there but player shall not display any sample in outside of that edit. */ 2037 #define ISOM_EDIT_MODE_NORMAL (1<<16) 2038 #define ISOM_EDIT_MODE_DWELL 0 2039 #define ISOM_EDIT_MODE_EMPTY -1 2040 #define ISOM_EDIT_DURATION_UNKNOWN32 0xffffffff 2041 #define ISOM_EDIT_DURATION_UNKNOWN64 0xffffffffffffffff 2042 #define ISOM_EDIT_DURATION_IMPLICIT 0 2043 2044 typedef struct 2045 { 2046 uint64_t duration; /* the duration of this edit expressed in the movie timescale units 2047 * An edit can refer to the media within fragmented tracks. 2048 * The duration can be unknown at the time of creation of the initial movie due to various limiting factors that include 2049 * real-time generation of content, such as live streaming. In such a case it is recommended that the duration is set to 2050 * either ISOM_EDIT_DURATION_UNKNOWN32 (the maximum 32-bit unsigned integer), ISOM_EDIT_DURATION_UNKNOWN64 (the maximum 2051 * 64-bit unsigned integer) or ISOM_EDIT_DURATION_IMPLICIT. 2052 * If you have no interest in the duration of this edit but want to set the offset from media composition time to movie 2053 * presentation time, ISOM_EDIT_DURATION_IMPLICIT is useful for the provision of the offset for the movie and subsequent 2054 * movie fragments. The duration is expected to be constructed by demuxer. */ 2055 int64_t start_time; /* the starting composition time within the media of this edit 2056 * If set to ISOM_EDIT_MODE_EMPTY (-1), it construct an empty edit, which doesn't select any portion within the media. */ 2057 int32_t rate; /* the relative rate at which to play the media corresponding to this edit, expressed as 16.16 fixed-point number 2058 * If set to ISOM_EDIT_MODE_NORMAL (0x00010000), there is no rate change for timeline mapping. 2059 * If set to ISOM_EDIT_MODE_DWELL (0), the media at start_time is presented for the duration. */ 2060 } lsmash_edit_t; 2061 2062 /* Create a track in a movie. 2063 * Users can destroy the created track by lsmash_delete_track(). 2064 * When a track is created, its track_ID is assigned automatically so that any duplication of track_ID may be avoided. 2065 * 2066 * Return the current track_ID of a track created by this function if successful. 2067 * Return 0 otherwise. */ 2068 uint32_t lsmash_create_track 2069 ( 2070 lsmash_root_t *root, 2071 lsmash_media_type media_type 2072 ); 2073 2074 /* Destroy the track of a given track_ID in a movie. */ 2075 void lsmash_delete_track 2076 ( 2077 lsmash_root_t *root, 2078 uint32_t track_ID 2079 ); 2080 2081 /* Set all the given track parameters to default. */ 2082 void lsmash_initialize_track_parameters 2083 ( 2084 lsmash_track_parameters_t *param 2085 ); 2086 2087 /* Set track parameters to a track. 2088 * 2089 * Return 0 if successful. 2090 * Return a negative value otherwise. */ 2091 int lsmash_set_track_parameters 2092 ( 2093 lsmash_root_t *root, 2094 uint32_t track_ID, 2095 lsmash_track_parameters_t *param 2096 ); 2097 2098 /* Update the duration of a track with a new duration of its last sample. 2099 * 2100 * Return 0 if successful. 2101 * Return a negative value otherwise. */ 2102 int lsmash_update_track_duration 2103 ( 2104 lsmash_root_t *root, 2105 uint32_t track_ID, 2106 uint32_t last_sample_delta 2107 ); 2108 2109 /* Update the modification time of a track to the most recent. 2110 * If the creation time of that track is larger than the modification time, 2111 * then override the creation one with the modification one. 2112 * 2113 * Return 0 if successful. 2114 * Return a negative value otherwise. */ 2115 int lsmash_update_track_modification_time 2116 ( 2117 lsmash_root_t *root, 2118 uint32_t track_ID 2119 ); 2120 2121 /* Get a track_ID by a track number. 2122 * A track number is given in created order in a movie. 2123 * If a track is removed, the track number of tracks with higher track number than one of just removed track will be decremented. 2124 * 2125 * Return a track_ID if successful. 2126 * Return 0 otherwise. */ 2127 uint32_t lsmash_get_track_ID 2128 ( 2129 lsmash_root_t *root, 2130 uint32_t track_number 2131 ); 2132 2133 /* Get the track parameters in a track. 2134 * 2135 * Return 0 if successful. 2136 * Return a negative value otherwise. */ 2137 int lsmash_get_track_parameters 2138 ( 2139 lsmash_root_t *root, 2140 uint32_t track_ID, 2141 lsmash_track_parameters_t *param 2142 ); 2143 2144 /* Get the duration of a track. 2145 * 2146 * Return the duration of a track if successful. 2147 * Return 0 otherwise. */ 2148 uint64_t lsmash_get_track_duration 2149 ( 2150 lsmash_root_t *root, 2151 uint32_t track_ID 2152 ); 2153 2154 /* Create an explicit timeline map (edit) and append it into a track. 2155 * Users can destroy ALL created edits in a track by lsmash_delete_explicit_timeline_map(). 2156 * 2157 * Return 0 if successful. 2158 * Return a negative value otherwise. */ 2159 int lsmash_create_explicit_timeline_map 2160 ( 2161 lsmash_root_t *root, 2162 uint32_t track_ID, 2163 lsmash_edit_t edit 2164 ); 2165 2166 /* Destroy ALL created edits in a track. 2167 * 2168 * Return 0 if successful. 2169 * Return a negative value otherwise. */ 2170 int lsmash_delete_explicit_timeline_map 2171 ( 2172 lsmash_root_t *root, 2173 uint32_t track_ID 2174 ); 2175 2176 /* Count the number of edits in a track. 2177 * 2178 * Return the number of edits in a track if successful. 2179 * Return 0 otherwise. */ 2180 uint32_t lsmash_count_explicit_timeline_map 2181 ( 2182 lsmash_root_t *root, 2183 uint32_t track_ID 2184 ); 2185 2186 /* Get an edit in a track by an edit number. 2187 * An edit number is given in created order in a track. 2188 * If an edit is removed, the edit number of edits with higher edit number than one of just removed edit will be decremented. 2189 * 2190 * Return 0 if successful. 2191 * Return a negative value otherwise. */ 2192 int lsmash_get_explicit_timeline_map 2193 ( 2194 lsmash_root_t *root, 2195 uint32_t track_ID, 2196 uint32_t edit_number, 2197 lsmash_edit_t *edit 2198 ); 2199 2200 /* Modify 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. 2203 * 2204 * Return 0 if successful. 2205 * Return a negative value otherwise. */ 2206 int lsmash_modify_explicit_timeline_map 2207 ( 2208 lsmash_root_t *root, 2209 uint32_t track_ID, 2210 uint32_t edit_number, 2211 lsmash_edit_t edit 2212 ); 2213 2214 /**************************************************************************** 2215 * Movie Layer 2216 ****************************************************************************/ 2217 typedef struct 2218 { 2219 uint32_t timescale; /* movie timescale: timescale for the entire presentation */ 2220 uint64_t duration; /* the duration, expressed in movie timescale, of the longest track 2221 * You can't set this parameter manually. */ 2222 uint32_t number_of_tracks; /* the number of tracks in the movie 2223 * You can't set this parameter manually. */ 2224 /* The following parameters are recognized only when a file is read as an Apple MPEG-4 or QuickTime file format. */ 2225 int32_t playback_rate; /* fixed point 16.16 number. 0x00010000 is normal forward playback and default value. */ 2226 int32_t playback_volume; /* fixed point 8.8 number. 0x0100 is full volume and default value. */ 2227 int32_t preview_time; /* the time value in the movie at which the preview begins */ 2228 int32_t preview_duration; /* the duration of the movie preview in movie timescale units */ 2229 int32_t poster_time; /* the time value of the time of the movie poster */ 2230 } lsmash_movie_parameters_t; 2231 2232 /* Set all the given movie parameters to default. */ 2233 void lsmash_initialize_movie_parameters 2234 ( 2235 lsmash_movie_parameters_t *param 2236 ); 2237 2238 /* Set movie parameters to a movie. 2239 * 2240 * Return 0 if successful. 2241 * Return a negative value otherwise. */ 2242 int lsmash_set_movie_parameters 2243 ( 2244 lsmash_root_t *root, 2245 lsmash_movie_parameters_t *param 2246 ); 2247 2248 /* Finalize a movie. 2249 * If the movie is not fragmented and 'remux' is set to non-NULL, 2250 * move overall necessary data to access and decode samples into the very front of the file at the end. 2251 * This is useful for progressive downloading. 2252 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function. 2253 * 2254 * Return 0 if successful. 2255 * Return a negative value otherwise. */ 2256 int lsmash_finish_movie 2257 ( 2258 lsmash_root_t *root, 2259 lsmash_adhoc_remux_t *remux 2260 ); 2261 2262 /* Update the modification time of a movie to the most recent. 2263 * If the creation time of that movie is larger than the modification time, 2264 * then override the creation one with the modification one. 2265 * 2266 * Return 0 if successful. 2267 * Return a negative value otherwise. */ 2268 int lsmash_update_movie_modification_time 2269 ( 2270 lsmash_root_t *root 2271 ); 2272 2273 /* Get the movie parameters in a movie. 2274 * 2275 * Return 0 if successful. 2276 * Return a negative value otherwise. */ 2277 int lsmash_get_movie_parameters 2278 ( 2279 lsmash_root_t *root, 2280 lsmash_movie_parameters_t *param 2281 ); 2282 2283 /* Get the timescale of a movie. 2284 * 2285 * Return the timescale of a movie if successful. 2286 * Return 0 otherwise. */ 2287 uint32_t lsmash_get_movie_timescale 2288 ( 2289 lsmash_root_t *root 2290 ); 2291 2292 /* Reserve the size of the media data region for a non-fragmented movie. 2293 * This enables to get rid of requirement of seekability for rewriting the actual size of the media data region when finishing 2294 * a non-fragmented movie. Note that the specified size is excluding the type and the size fields of the enclosing box and 2295 * this function must be called before any lsmash_append_sample(). If the actual size is greater than the reserved size when 2296 * finishing a non-fragmented movie, seek and rewrite the size of the box enclosing the media data region. 2297 * 2298 * Return 0 if successful. 2299 * Return a negative value otherwise. */ 2300 int lsmash_reserve_media_data_size 2301 ( 2302 lsmash_root_t *root, 2303 uint64_t media_data_size 2304 ); 2305 2306 /**************************************************************************** 2307 * Chapter list 2308 ****************************************************************************/ 2309 /* Create a track as a chapter list referenced by another track. 2310 * 2311 * Return 0 if successful. 2312 * Return a negative value otherwise. */ 2313 int lsmash_create_reference_chapter_track 2314 ( 2315 lsmash_root_t *root, 2316 uint32_t track_ID, 2317 char *file_name 2318 ); 2319 2320 /* Create and set a chapter list as a user data to a movie. 2321 * The created chapter list in a movie can be destroyed by lsmash_delete_tyrant_chapter(). 2322 * 2323 * Return 0 if successful. 2324 * Return a negative value otherwise. */ 2325 int lsmash_set_tyrant_chapter 2326 ( 2327 lsmash_root_t *root, 2328 char *file_name, 2329 int add_bom 2330 ); 2331 2332 /* Destroy a chapter list as a user data in a movie. */ 2333 void lsmash_delete_tyrant_chapter 2334 ( 2335 lsmash_root_t *root 2336 ); 2337 2338 /* Count chapters in the chapter list (moov.udta.chpl). */ 2339 uint32_t lsmash_count_tyrant_chapter 2340 ( 2341 lsmash_root_t *root 2342 ); 2343 2344 /* Retrieve a chapter entry from the chapter list (moov.udta.chpl). 2345 * Returned pointer is owned by the ROOT structure, so user shall not 2346 * modify or free it. 2347 * 2348 * Return chapter title string if successful, otherwise NULL. 2349 */ 2350 char *lsmash_get_tyrant_chapter 2351 ( 2352 lsmash_root_t *root, 2353 uint32_t index, /* index of chapter ( >= 1) */ 2354 double *timestamp /* timestamp of the chapter entry (in seconds) */ 2355 ); 2356 2357 /**************************************************************************** 2358 * Fragments 2359 ****************************************************************************/ 2360 /* Flush the current movie fragment and create a new movie fragment. 2361 * Users shall call lsmash_flush_pooled_samples() for each track before calling this function. 2362 * 2363 * Return 0 if successful. 2364 * Return a negative value otherwise. */ 2365 int lsmash_create_fragment_movie 2366 ( 2367 lsmash_root_t *root 2368 ); 2369 2370 /* Create an empty duration track in the current movie fragment. 2371 * Don't specify track_ID any track fragment in the current movie fragment has. 2372 * 2373 * Return 0 if successful. 2374 * Return a negative value otherwise. */ 2375 int lsmash_create_fragment_empty_duration 2376 ( 2377 lsmash_root_t *root, 2378 uint32_t track_ID, 2379 uint32_t duration 2380 ); 2381 2382 /**************************************************************************** 2383 * Dump / Print 2384 ****************************************************************************/ 2385 /* Dump and print box structure of ROOT into the destination. 2386 * 2387 * Return 0 if successful. 2388 * Return a negative value otherwise. */ 2389 int lsmash_print_movie 2390 ( 2391 lsmash_root_t *root, /* the address of ROOT you want to dump and print */ 2392 const char *filename /* the path of a file as the destination */ 2393 ); 2394 2395 /* Print a chapter list written as a user data on stdout. 2396 * This function might output BOM on Windows. 2397 * 2398 * Return 0 if successful. 2399 * Return a negative value otherwise. */ 2400 int lsmash_print_chapter_list 2401 ( 2402 lsmash_root_t *root 2403 ); 2404 2405 /**************************************************************************** 2406 * Timeline 2407 ****************************************************************************/ 2408 /* Copy all edits from the source track to the destination track. 2409 * 2410 * Return 0 if successful. 2411 * Return a negative value otherwise. */ 2412 int lsmash_copy_timeline_map 2413 ( 2414 lsmash_root_t *dst, 2415 uint32_t dst_track_ID, 2416 lsmash_root_t *src, 2417 uint32_t src_track_ID 2418 ); 2419 2420 /* Construct the timeline for a track. 2421 * The constructed timeline can be destructed by lsmash_destruct_timeline(). 2422 * 2423 * Return 0 if successful. 2424 * Return a negative value otherwise. */ 2425 int lsmash_construct_timeline 2426 ( 2427 lsmash_root_t *root, 2428 uint32_t track_ID 2429 ); 2430 2431 /* Destruct the timeline for a given track. */ 2432 void lsmash_destruct_timeline 2433 ( 2434 lsmash_root_t *root, 2435 uint32_t track_ID 2436 ); 2437 2438 /* Get the duration of the last sample from the media timeline for a track. 2439 * 2440 * Return 0 if successful. 2441 * Return a negative value otherwise. */ 2442 int lsmash_get_last_sample_delta_from_media_timeline 2443 ( 2444 lsmash_root_t *root, 2445 uint32_t track_ID, 2446 uint32_t *last_sample_delta /* the address of a variable to which the duration of the last sample will be set */ 2447 ); 2448 2449 /* Get the duration of a sample from the media timeline for a track. 2450 * 2451 * Return 0 if successful. 2452 * Return a negative value otherwise. */ 2453 int lsmash_get_sample_delta_from_media_timeline 2454 ( 2455 lsmash_root_t *root, 2456 uint32_t track_ID, 2457 uint32_t sample_number, 2458 uint32_t *sample_delta /* the address of a variable to which the duration of a sample will be set */ 2459 ); 2460 2461 /* Get the decoding timestamp of a sample from the media timeline for a track. 2462 * 2463 * Return 0 if successful. 2464 * Return a negative value otherwise. */ 2465 int lsmash_get_dts_from_media_timeline 2466 ( 2467 lsmash_root_t *root, 2468 uint32_t track_ID, 2469 uint32_t sample_number, 2470 uint64_t *dts /* the address of a variable to which a decoding timestamp will be set */ 2471 ); 2472 2473 /* Get the composition timestamp of a sample from the media timeline for a track. 2474 * 2475 * Return 0 if successful. 2476 * Return a negative value otherwise. */ 2477 int lsmash_get_cts_from_media_timeline 2478 ( 2479 lsmash_root_t *root, 2480 uint32_t track_ID, 2481 uint32_t sample_number, 2482 uint64_t *cts /* the address of a variable to which a composition timestamp will be set */ 2483 ); 2484 2485 /* Get the shift of composition timeline to decode timeline from the media timeline for a track. 2486 * 2487 * Return 0 if successful. 2488 * Return a negative value otherwise. */ 2489 int lsmash_get_composition_to_decode_shift_from_media_timeline 2490 ( 2491 lsmash_root_t *root, 2492 uint32_t track_ID, 2493 uint32_t *ctd_shift /* the address of a variable to which the shift of composition timeline to decode timeline will be set */ 2494 ); 2495 2496 /* Get the sample number which is the closest random accessible point to the sample 2497 * corresponding to a given sample number from the media timeline for a track. 2498 * This function tries to find the closest random accessible point from the past at the first. 2499 * If not found, try to find it from the future. 2500 * Note: 2501 * the closest random accessible point doesn't always guarantee that 2502 * the sample corresponding to a given number can be decodable correctly by decoding from there. 2503 * 2504 * Return 0 if successful. 2505 * Return a negative value otherwise. */ 2506 int lsmash_get_closest_random_accessible_point_from_media_timeline 2507 ( 2508 lsmash_root_t *root, 2509 uint32_t track_ID, 2510 uint32_t sample_number, 2511 uint32_t *rap_number /* the address of a variable to which the sample number of the closest random accessible point will be set */ 2512 ); 2513 2514 /* Get the detailed information of the closest random accessible point to the sample 2515 * corresponding to a given sample number from the media timeline for a track. 2516 * Note: 2517 * the closest random accessible point doesn't always guarantee that 2518 * the sample corresponding to a given number can be decodable correctly by decoding from there. 2519 * 2520 * Return 0 if successful. 2521 * Return a negative value otherwise. */ 2522 int lsmash_get_closest_random_accessible_point_detail_from_media_timeline 2523 ( 2524 lsmash_root_t *root, 2525 uint32_t track_ID, 2526 uint32_t sample_number, 2527 uint32_t *rap_number, /* the address of a variable to which the sample number of the closest random accessible point will be set */ 2528 lsmash_random_access_flag *ra_flags, /* the address of a variable to which the flags of the closest random accessible point will be set */ 2529 uint32_t *leading, /* the address of a variable to which the number of leading samples will be set */ 2530 uint32_t *distance /* the address of a variable to which a distance from the closest random accessible point to a point which guarantees 2531 * that the sample corresponding to a given number can be decodable correctly by decoding from there will be set */ 2532 ); 2533 2534 /* Get the number of samples in the media timeline for a track. 2535 * 2536 * Return the number of samples in a track if successful. 2537 * Return 0 otherwise. */ 2538 uint32_t lsmash_get_sample_count_in_media_timeline 2539 ( 2540 lsmash_root_t *root, 2541 uint32_t track_ID 2542 ); 2543 2544 /* Get the maximum size of sample in the media timeline for a track. 2545 * 2546 * Return the maximum size of the samples in a track if successful. 2547 * Return 0 otherwise. */ 2548 uint32_t lsmash_get_max_sample_size_in_media_timeline 2549 ( 2550 lsmash_root_t *root, 2551 uint32_t track_ID 2552 ); 2553 2554 /* Get the duration of the media from the media timeline for a track. 2555 * 2556 * Return the duration of the media in a track if successful. 2557 * Return 0 otherwise. */ 2558 uint64_t lsmash_get_media_duration_from_media_timeline 2559 ( 2560 lsmash_root_t *root, 2561 uint32_t track_ID 2562 ); 2563 2564 /* Allocate and get the sample corresponding to a given sample number from the media timeline for a track. 2565 * The allocated sample can be deallocated by lsmash_delete_sample(). 2566 * 2567 * Return the address of an allocated and gotten sample if successful. 2568 * Return NULL otherwise. */ 2569 lsmash_sample_t *lsmash_get_sample_from_media_timeline 2570 ( 2571 lsmash_root_t *root, 2572 uint32_t track_ID, 2573 uint32_t sample_number 2574 ); 2575 2576 /* Get the information of the sample correspondint to a given sample number from the media timeline for a track. 2577 * The information includes the size, timestamps and properties of the sample. 2578 * 2579 * Return 0 if successful. 2580 * Return a negative value otherwise. */ 2581 int lsmash_get_sample_info_from_media_timeline 2582 ( 2583 lsmash_root_t *root, 2584 uint32_t track_ID, 2585 uint32_t sample_number, 2586 lsmash_sample_t *sample 2587 ); 2588 2589 /* Get the properties of the sample correspondint to a given sample number from the media timeline for a track. 2590 * 2591 * Return 0 if successful. 2592 * Return a negative value otherwise. */ 2593 int lsmash_get_sample_property_from_media_timeline 2594 ( 2595 lsmash_root_t *root, 2596 uint32_t track_ID, 2597 uint32_t sample_number, 2598 lsmash_sample_property_t *prop 2599 ); 2600 2601 /* Check if the sample corresponding to a given sample number exists in the media timeline for a track. 2602 * 2603 * Return 1 if the sample exists. 2604 * Return 0 otherwise. */ 2605 int lsmash_check_sample_existence_in_media_timeline 2606 ( 2607 lsmash_root_t *root, 2608 uint32_t track_ID, 2609 uint32_t sample_number 2610 ); 2611 2612 /* Set or change the decoding and composition timestamps in the media timeline for a track. 2613 * This function doesn't support for any LPCM track currently. 2614 * 2615 * Return 0 if successful. 2616 * Return a negative value othewise. */ 2617 int lsmash_set_media_timestamps 2618 ( 2619 lsmash_root_t *root, 2620 uint32_t track_ID, 2621 lsmash_media_ts_list_t *ts_list 2622 ); 2623 2624 /* Allocate and get the decoding and composition timestamps from the media timeline for a track. 2625 * The allocated decoding and composition timestamps can be deallocated by lsmash_delete_media_timestamps(). 2626 * 2627 * Return 0 if successful. 2628 * Return a negative value othewise. */ 2629 int lsmash_get_media_timestamps 2630 ( 2631 lsmash_root_t *root, 2632 uint32_t track_ID, 2633 lsmash_media_ts_list_t *ts_list 2634 ); 2635 2636 /* Deallocate the decoding and composition timestamps in a given media timestamp list. */ 2637 void lsmash_delete_media_timestamps 2638 ( 2639 lsmash_media_ts_list_t *ts_list 2640 ); 2641 2642 /* Get the maximum composition delay derived from composition reordering. 2643 * 2644 * Return 0 if successful. 2645 * Return a negative value otherwise. */ 2646 int lsmash_get_max_sample_delay 2647 ( 2648 lsmash_media_ts_list_t *ts_list, 2649 uint32_t *max_sample_delay 2650 ); 2651 2652 /* Sort decoding and composition timestamps in decoding order. */ 2653 void lsmash_sort_timestamps_decoding_order 2654 ( 2655 lsmash_media_ts_list_t *ts_list 2656 ); 2657 2658 /* Sort decoding and composition timestamps in composition order. */ 2659 void lsmash_sort_timestamps_composition_order 2660 ( 2661 lsmash_media_ts_list_t *ts_list 2662 ); 2663 2664 /**************************************************************************** 2665 * Tools for creating CODEC Specific Information Extensions (Magic Cookies) 2666 ****************************************************************************/ 2667 /* MPEG-4 Systems Specific Information 2668 * Mandatory : 2669 * ISOM_CODEC_TYPE_MP4A_AUDIO 2670 * QT_CODEC_TYPE_MP4A_AUDIO 2671 * ISOM_CODEC_TYPE_MP4V_AUDIO 2672 * ISOM_CODEC_TYPE_MP4S_AUDIO */ 2673 /* objectTypeIndication */ 2674 typedef enum 2675 { 2676 MP4SYS_OBJECT_TYPE_Forbidden = 0x00, /* Forbidden */ 2677 MP4SYS_OBJECT_TYPE_Systems_ISO_14496_1 = 0x01, /* Systems ISO/IEC 14496-1 2678 * For all 14496-1 streams unless specifically indicated to the contrary. 2679 * Scene Description scenes, which are identified with StreamType=0x03, using 2680 * this object type value shall use the BIFSConfig. */ 2681 MP4SYS_OBJECT_TYPE_Systems_ISO_14496_1_BIFSv2 = 0x02, /* Systems ISO/IEC 14496-1 2682 * This object type shall be used, with StreamType=0x03, for Scene 2683 * Description streams that use the BIFSv2Config. 2684 * Its use with other StreamTypes is reserved. */ 2685 MP4SYS_OBJECT_TYPE_Interaction_Stream = 0x03, /* Interaction Stream */ 2686 MP4SYS_OBJECT_TYPE_Extended_BIFS = 0x04, /* Extended BIFS 2687 * Used, with StreamType=0x03, for Scene Description streams that use the BIFSConfigEx; 2688 * its use with other StreamTypes is reserved. 2689 * (Was previously reserved for MUCommandStream but not used for that purpose.) */ 2690 MP4SYS_OBJECT_TYPE_AFX_Stream = 0x05, /* AFX Stream 2691 * Used, with StreamType=0x03, for Scene Description streams that use the AFXConfig; 2692 * its use with other StreamTypes is reserved. */ 2693 MP4SYS_OBJECT_TYPE_Font_Data_Stream = 0x06, /* Font Data Stream */ 2694 MP4SYS_OBJECT_TYPE_Synthetised_Texture = 0x07, /* Synthetised Texture */ 2695 MP4SYS_OBJECT_TYPE_Text_Stream = 0x08, /* Text Stream */ 2696 MP4SYS_OBJECT_TYPE_Visual_ISO_14496_2 = 0x20, /* Visual ISO/IEC 14496-2 2697 * The actual object types are within the DecoderSpecificInfo and defined in 14496-2. */ 2698 MP4SYS_OBJECT_TYPE_Visual_H264_ISO_14496_10 = 0x21, /* Visual ITU-T Recommendation H.264 | ISO/IEC 14496-10 2699 * The actual object types are within the DecoderSpecificInfo and defined in H.264 | 14496-10. */ 2700 MP4SYS_OBJECT_TYPE_Parameter_Sets_H_264_ISO_14496_10 = 0x22, /* Parameter Sets for ITU-T Recommendation H.264 | ISO/IEC 14496-10 2701 * The actual object types are within the DecoderSpecificInfo and defined in H.264 | 14496-10. */ 2702 MP4SYS_OBJECT_TYPE_Audio_ISO_14496_3 = 0x40, /* Audio ISO/IEC 14496-3 (MPEG-4 Audio) 2703 * The actual object types are defined in 14496-3 and are in the DecoderSpecificInfo as specified in 14496-3. */ 2704 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Simple_Profile = 0x60, /* Visual ISO/IEC 13818-2 Simple Profile (MPEG-2 Video) */ 2705 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Main_Profile = 0x61, /* Visual ISO/IEC 13818-2 Main Profile */ 2706 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_SNR_Profile = 0x62, /* Visual ISO/IEC 13818-2 SNR Profile */ 2707 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_Spatial_Profile = 0x63, /* Visual ISO/IEC 13818-2 Spatial Profile */ 2708 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_High_Profile = 0x64, /* Visual ISO/IEC 13818-2 High Profile */ 2709 MP4SYS_OBJECT_TYPE_Visual_ISO_13818_2_422_Profile = 0x65, /* Visual ISO/IEC 13818-2 422 Profile */ 2710 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_Main_Profile = 0x66, /* Audio ISO/IEC 13818-7 Main Profile (MPEG-2 Audio)(AAC) */ 2711 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_LC_Profile = 0x67, /* Audio ISO/IEC 13818-7 LowComplexity Profile */ 2712 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_7_SSR_Profile = 0x68, /* Audio ISO/IEC 13818-7 Scaleable Sampling Rate Profile 2713 * For streams kinda 13818-7 the decoder specific information consists of the ADIF header if present 2714 * (or none if not present) and an access unit is a "raw_data_block()" as defined in 13818-7. */ 2715 MP4SYS_OBJECT_TYPE_Audio_ISO_13818_3 = 0x69, /* Audio ISO/IEC 13818-3 (MPEG-2 BC-Audio)(redefined MPEG-1 Audio in MPEG-2) 2716 * For streams kinda 13818-3 the decoder specific information is empty since all necessary data is in the bitstream frames itself. 2717 * The access units in this case are the "frame()" bitstream element as is defined in 11172-3. */ 2718 MP4SYS_OBJECT_TYPE_Visual_ISO_11172_2 = 0x6A, /* Visual ISO/IEC 11172-2 (MPEG-1 Video) */ 2719 MP4SYS_OBJECT_TYPE_Audio_ISO_11172_3 = 0x6B, /* Audio ISO/IEC 11172-3 (MPEG-1 Audio) */ 2720 MP4SYS_OBJECT_TYPE_Visual_ISO_10918_1 = 0x6C, /* Visual ISO/IEC 10918-1 (JPEG) */ 2721 MP4SYS_OBJECT_TYPE_PNG = 0x6D, /* Portable Network Graphics */ 2722 MP4SYS_OBJECT_TYPE_Visual_ISO_15444_1_JPEG2000 = 0x6E, /* Visual ISO/IEC 15444-1 (JPEG 2000) */ 2723 2724 /* FIXME: rename these symbols to be explaining, rather than based on four cc */ 2725 MP4SYS_OBJECT_TYPE_EVRC_AUDIO = 0xA0, /* EVRC Voice */ 2726 MP4SYS_OBJECT_TYPE_SSMV_AUDIO = 0xA1, /* SMV Voice */ 2727 MP4SYS_OBJECT_TYPE_3GPP2_CMF = 0xA2, /* 3GPP2 Compact Multimedia Format (CMF) */ 2728 MP4SYS_OBJECT_TYPE_VC_1_VIDEO = 0xA3, /* SMPTE VC-1 Video */ 2729 MP4SYS_OBJECT_TYPE_DRAC_VIDEO = 0xA4, /* Dirac Video Coder */ 2730 MP4SYS_OBJECT_TYPE_AC_3_AUDIO = 0xA5, /* AC-3 Audio */ 2731 MP4SYS_OBJECT_TYPE_EC_3_AUDIO = 0xA6, /* Enhanced AC-3 audio */ 2732 MP4SYS_OBJECT_TYPE_DRA1_AUDIO = 0xA7, /* DRA Audio */ 2733 MP4SYS_OBJECT_TYPE_G719_AUDIO = 0xA8, /* ITU G.719 Audio */ 2734 MP4SYS_OBJECT_TYPE_DTSC_AUDIO = 0xA9, /* DTS Coherent Acoustics audio */ 2735 MP4SYS_OBJECT_TYPE_DTSH_AUDIO = 0xAA, /* DTS-HD High Resolution Audio */ 2736 MP4SYS_OBJECT_TYPE_DTSL_AUDIO = 0xAB, /* DTS-HD Master Audio */ 2737 MP4SYS_OBJECT_TYPE_DTSE_AUDIO = 0xAC, /* DTS Express low bit rate audio, also known as DTS LBR */ 2738 MP4SYS_OBJECT_TYPE_SQCP_AUDIO = 0xE1, /* 13K Voice */ 2739 2740 MP4SYS_OBJECT_TYPE_NONE = 0xFF, /* no object type specified 2741 * Streams with this value with a StreamType indicating a systems stream (values 1,2,3,6,7,8,9) 2742 * shall be treated as if the ObjectTypeIndication had been set to 0x01. */ 2743 } lsmash_mp4sys_object_type_indication; 2744 2745 /* streamType */ 2746 typedef enum 2747 { 2748 MP4SYS_STREAM_TYPE_Forbidden = 0x00, /* Forbidden */ 2749 MP4SYS_STREAM_TYPE_ObjectDescriptorStream = 0x01, /* ObjectDescriptorStream */ 2750 MP4SYS_STREAM_TYPE_ClockReferenceStream = 0x02, /* ClockReferenceStream */ 2751 MP4SYS_STREAM_TYPE_SceneDescriptionStream = 0x03, /* SceneDescriptionStream */ 2752 MP4SYS_STREAM_TYPE_VisualStream = 0x04, /* VisualStream */ 2753 MP4SYS_STREAM_TYPE_AudioStream = 0x05, /* AudioStream */ 2754 MP4SYS_STREAM_TYPE_MPEG7Stream = 0x06, /* MPEG7Stream */ 2755 MP4SYS_STREAM_TYPE_IPMPStream = 0x07, /* IPMPStream */ 2756 MP4SYS_STREAM_TYPE_ObjectContentInfoStream = 0x08, /* ObjectContentInfoStream */ 2757 MP4SYS_STREAM_TYPE_MPEGJStream = 0x09, /* MPEGJStream */ 2758 MP4SYS_STREAM_TYPE_InteractionStream = 0x0A, /* Interaction Stream */ 2759 MP4SYS_STREAM_TYPE_IPMPToolStream = 0x0B, /* IPMPToolStream */ 2760 MP4SYS_STREAM_TYPE_FontDataStream = 0x0C, /* FontDataStream */ 2761 MP4SYS_STREAM_TYPE_StreamingText = 0x0D, /* StreamingText */ 2762 } lsmash_mp4sys_stream_type; 2763 2764 /* MPEG-4 Systems Decoder Specific Information 2765 * an opaque container with information for a specific media decoder 2766 * The existence and semantics of decoder specific information depends on the values of streamType and objectTypeIndication. */ 2767 typedef struct lsmash_mp4sys_decoder_specific_info_tag lsmash_mp4sys_decoder_specific_info_t; 2768 2769 /* Note: bufferSizeDB, maxBitrate and avgBitrate are calculated internally when calling lsmash_finish_movie(). 2770 * You need not to set up them manually when muxing streams by L-SMASH. */ 2771 typedef struct 2772 { 2773 lsmash_mp4sys_object_type_indication objectTypeIndication; 2774 lsmash_mp4sys_stream_type streamType; 2775 uint32_t bufferSizeDB; /* the size of the decoding buffer for this elementary stream in byte */ 2776 uint32_t maxBitrate; /* the maximum bitrate in bits per second of the elementary stream in 2777 * any time window of one second duration */ 2778 uint32_t avgBitrate; /* the average bitrate in bits per second of the elementary stream 2779 * Set to 0 if the stream is encoded as variable bitrate. */ 2780 lsmash_mp4sys_decoder_specific_info_t *dsi; /* zero or one decoder specific information */ 2781 } lsmash_mp4sys_decoder_parameters_t; 2782 2783 int lsmash_set_mp4sys_decoder_specific_info 2784 ( 2785 lsmash_mp4sys_decoder_parameters_t *param, 2786 uint8_t *payload, 2787 uint32_t payload_length 2788 ); 2789 2790 void lsmash_destroy_mp4sys_decoder_specific_info 2791 ( 2792 lsmash_mp4sys_decoder_parameters_t *param 2793 ); 2794 2795 uint8_t *lsmash_create_mp4sys_decoder_config 2796 ( 2797 lsmash_mp4sys_decoder_parameters_t *param, 2798 uint32_t *data_length 2799 ); 2800 2801 /* Return MP4SYS_OBJECT_TYPE_Forbidden if objectTypeIndication is not found or there is an error to find it. */ 2802 lsmash_mp4sys_object_type_indication lsmash_mp4sys_get_object_type_indication 2803 ( 2804 lsmash_summary_t *summary 2805 ); 2806 2807 /* Return -1 if any error. 2808 * 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. */ 2809 int lsmash_get_mp4sys_decoder_specific_info 2810 ( 2811 lsmash_mp4sys_decoder_parameters_t *param, 2812 uint8_t **payload, 2813 uint32_t *payload_length 2814 ); 2815 2816 /* AC-3 Specific Information 2817 * Mandatory : 2818 * ISOM_CODEC_TYPE_AC_3_AUDIO 2819 * 2820 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization. 2821 * Each AC-3 sample is self-contained. 2822 * Users shall set the actual sample rate to 'frequency', which is a member of lsmash_audio_summary_t. */ 2823 typedef struct 2824 { 2825 uint8_t fscod; /* the same value as the fscod field in the AC-3 bitstream */ 2826 uint8_t bsid; /* the same value as the bsid field in the AC-3 bitstream */ 2827 uint8_t bsmod; /* the same value as the bsmod field in the AC-3 bitstream */ 2828 uint8_t acmod; /* the same value as the acmod field in the AC-3 bitstream */ 2829 uint8_t lfeon; /* the same value as the lfeon field in the AC-3 bitstream */ 2830 uint8_t frmsizecod; /* the same value as the frmsizecod field in the AC-3 bitstream */ 2831 } lsmash_ac3_specific_parameters_t; 2832 2833 int lsmash_setup_ac3_specific_parameters_from_syncframe 2834 ( 2835 lsmash_ac3_specific_parameters_t *param, 2836 uint8_t *data, 2837 uint32_t data_length 2838 ); 2839 2840 uint8_t *lsmash_create_ac3_specific_info 2841 ( 2842 lsmash_ac3_specific_parameters_t *param, 2843 uint32_t *data_length 2844 ); 2845 2846 /* Enhanced AC-3 Specific Information 2847 * Mandatory : 2848 * ISOM_CODEC_TYPE_EC_3_AUDIO 2849 * 2850 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization. 2851 * Each Enhanced AC-3 sample is self-contained. 2852 * Note that this cannot document reduced sample rates (24000, 22050 or 16000 Hz). 2853 * Therefore, users shall set the actual sample rate to 'frequency', which is a member of lsmash_audio_summary_t. */ 2854 typedef struct 2855 { 2856 uint8_t fscod; /* the same value as the fscod field in the independent substream */ 2857 uint8_t bsid; /* the same value as the bsid field in the independent substream */ 2858 uint8_t bsmod; /* the same value as the bsmod field in the independent substream 2859 * If the bsmod field is not present in the independent substream, this field shall be set to 0. */ 2860 uint8_t acmod; /* the same value as the acmod field in the independent substream */ 2861 uint8_t lfeon; /* the same value as the lfeon field in the independent substream */ 2862 uint8_t num_dep_sub; /* the number of dependent substreams that are associated with the independent substream */ 2863 uint16_t chan_loc; /* channel locations of dependent substreams associated with the independent substream 2864 * This information is extracted from the chanmap field of each dependent substream. */ 2865 } lsmash_eac3_substream_info_t; 2866 2867 typedef struct 2868 { 2869 uint16_t data_rate; /* the data rate of the Enhanced AC-3 bitstream in kbit/s 2870 * If the Enhanced AC-3 stream is variable bitrate, then this value indicates the maximum data rate of the stream. */ 2871 uint8_t num_ind_sub; /* the number of independent substreams that are present in the Enhanced AC-3 bitstream 2872 * The value of this field is one less than the number of independent substreams present 2873 * and shall be in the range of 0 to 7, inclusive. */ 2874 lsmash_eac3_substream_info_t independent_info[8]; 2875 } lsmash_eac3_specific_parameters_t; 2876 2877 int lsmash_setup_eac3_specific_parameters_from_frame 2878 ( 2879 lsmash_eac3_specific_parameters_t *param, 2880 uint8_t *data, 2881 uint32_t data_length 2882 ); 2883 2884 uint16_t lsmash_eac3_get_chan_loc_from_chanmap 2885 ( 2886 uint16_t chanmap 2887 ); 2888 2889 uint8_t *lsmash_create_eac3_specific_info 2890 ( 2891 lsmash_eac3_specific_parameters_t *param, 2892 uint32_t *data_length 2893 ); 2894 2895 /* DTS Audio Specific Information 2896 * Mandatory : 2897 * ISOM_CODEC_TYPE_DTSC_AUDIO 2898 * ISOM_CODEC_TYPE_DTSH_AUDIO 2899 * ISOM_CODEC_TYPE_DTSL_AUDIO 2900 * ISOM_CODEC_TYPE_DTSE_AUDIO 2901 * 2902 * Unlike MPEG-4 Audio formats, the decoder does not require this for the initialization. 2903 * Each DTS Audio sample is self-contained. */ 2904 typedef enum 2905 { 2906 DTS_CORE_SUBSTREAM_CORE_FLAG = 0x00000001, 2907 DTS_CORE_SUBSTREAM_XXCH_FLAG = 0x00000002, 2908 DTS_CORE_SUBSTREAM_X96_FLAG = 0x00000004, 2909 DTS_CORE_SUBSTREAM_XCH_FLAG = 0x00000008, 2910 DTS_EXT_SUBSTREAM_CORE_FLAG = 0x00000010, 2911 DTS_EXT_SUBSTREAM_XBR_FLAG = 0x00000020, 2912 DTS_EXT_SUBSTREAM_XXCH_FLAG = 0x00000040, 2913 DTS_EXT_SUBSTREAM_X96_FLAG = 0x00000080, 2914 DTS_EXT_SUBSTREAM_LBR_FLAG = 0x00000100, 2915 DTS_EXT_SUBSTREAM_XLL_FLAG = 0x00000200, 2916 } lsmash_dts_construction_flag; 2917 2918 typedef struct lsmash_dts_reserved_box_tag lsmash_dts_reserved_box_t; 2919 2920 typedef struct 2921 { 2922 uint32_t DTSSamplingFrequency; /* the maximum sampling frequency stored in the compressed audio stream 2923 * 'frequency', which is a member of lsmash_audio_summary_t, shall be set according to DTSSamplingFrequency of either: 2924 * 48000 for original sampling frequencies of 24000Hz, 48000Hz, 96000Hz or 192000Hz; 2925 * 44100 for original sampling frequencies of 22050Hz, 44100Hz, 88200Hz or 176400Hz; 2926 * 32000 for original sampling frequencies of 16000Hz, 32000Hz, 64000Hz or 128000Hz. */ 2927 uint32_t maxBitrate; /* the peak bit rate, in bits per second, of the audio elementary stream for the duration of the track, 2928 * including the core substream (if present) and all extension substreams. 2929 * If the stream is a constant bit rate, this parameter shall have the same value as avgBitrate. 2930 * If the maximum bit rate is unknown, this parameter shall be set to 0. */ 2931 uint32_t avgBitrate; /* the average bit rate, in bits per second, of the audio elementary stream for the duration of the track, 2932 * including the core substream and any extension substream that may be present. */ 2933 uint8_t pcmSampleDepth; /* the bit depth of the rendered audio 2934 * The value is 16 or 24 bits. */ 2935 uint8_t FrameDuration; /* the number of audio samples decoded in a complete audio access unit at DTSSamplingFrequency 2936 * 0: 512, 1: 1024, 2: 2048, 3: 4096 */ 2937 uint8_t StreamConstruction; /* complete information on the existence and of location of extensions in any synchronized frame */ 2938 uint8_t CoreLFEPresent; /* the presence of an LFE channel in the core 2939 * 0: none 2940 * 1: LFE exists */ 2941 uint8_t CoreLayout; /* the channel layout of the core within the core substream 2942 * If no core substream exists, this parameter shall be ignored and ChannelLayout or 2943 * RepresentationType shall be used to determine channel configuration. */ 2944 uint16_t CoreSize; /* The size of a core substream AU in bytes. 2945 * If no core substream exists, CoreSize = 0. */ 2946 uint8_t StereoDownmix; /* the presence of an embedded stereo downmix in the stream 2947 * 0: none 2948 * 1: embedded downmix present */ 2949 uint8_t RepresentationType; /* This indicates special properties of the audio presentation. 2950 * 0: Audio asset designated for mixing with another audio asset 2951 * 2: Lt/Rt Encoded for matrix surround decoding 2952 * 3: Audio processed for headphone playback 2953 * otherwise: Reserved 2954 * If ChannelLayout != 0, this value shall be ignored. */ 2955 uint16_t ChannelLayout; /* complete information on channels coded in the audio stream including core and extensions */ 2956 uint8_t MultiAssetFlag; /* This flag shall set if the stream contains more than one asset. 2957 * 0: single asset 2958 * 1: multiple asset 2959 * When multiple assets exist, the remaining parameters only reflect the coding parameters of the first asset. */ 2960 uint8_t LBRDurationMod; /* This flag indicates a special case of the LBR coding bandwidth, resulting in 1/3 or 2/3 band limiting. 2961 * If set to 1, LBR frame duration is 50 % larger than indicated in FrameDuration */ 2962 lsmash_dts_reserved_box_t *box; 2963 } lsmash_dts_specific_parameters_t; 2964 2965 int lsmash_setup_dts_specific_parameters_from_frame 2966 ( 2967 lsmash_dts_specific_parameters_t *param, 2968 uint8_t *data, 2969 uint32_t data_length 2970 ); 2971 2972 uint8_t lsmash_dts_get_stream_construction 2973 ( 2974 lsmash_dts_construction_flag flags 2975 ); 2976 2977 lsmash_dts_construction_flag lsmash_dts_get_construction_flags 2978 ( 2979 uint8_t stream_construction 2980 ); 2981 2982 lsmash_codec_type_t lsmash_dts_get_codingname 2983 ( 2984 lsmash_dts_specific_parameters_t *param 2985 ); 2986 2987 uint8_t *lsmash_create_dts_specific_info 2988 ( 2989 lsmash_dts_specific_parameters_t *param, 2990 uint32_t *data_length 2991 ); 2992 2993 int lsmash_append_dts_reserved_box 2994 ( 2995 lsmash_dts_specific_parameters_t *param, 2996 const uint8_t *box_data, 2997 uint32_t box_size 2998 ); 2999 3000 void lsmash_remove_dts_reserved_box 3001 ( 3002 lsmash_dts_specific_parameters_t *param 3003 ); 3004 3005 /* Apple Lossless Audio Specific Information 3006 * Mandatory : 3007 * ISOM_CODEC_TYPE_ALAC_AUDIO 3008 * QT_CODEC_TYPE_ALAC_AUDIO */ 3009 typedef struct 3010 { 3011 uint32_t frameLength; /* the frames per packet when no explicit frames per packet setting is present in the packet header 3012 * The encoder frames per packet can be explicitly set but for maximum compatibility, 3013 * the default encoder setting of 4096 should be used. */ 3014 uint8_t bitDepth; /* the bit depth of the source PCM data (maximum value = 32) */ 3015 uint8_t numChannels; /* the channel count (1 = mono, 2 = stereo, etc...) 3016 * When channel layout info is not provided in the Channel Layout extension, 3017 * a channel count > 2 describes a set of discreet channels with no specific ordering. */ 3018 uint32_t maxFrameBytes; /* the maximum size of an Apple Lossless packet within the encoded stream 3019 * Value of 0 indicates unknown. */ 3020 uint32_t avgBitrate; /* the average bit rate in bits per second of the Apple Lossless stream 3021 * Value of 0 indicates unknown. */ 3022 uint32_t sampleRate; /* sample rate of the encoded stream */ 3023 } lsmash_alac_specific_parameters_t; 3024 3025 uint8_t *lsmash_create_alac_specific_info 3026 ( 3027 lsmash_alac_specific_parameters_t *param, 3028 uint32_t *data_length 3029 ); 3030 3031 /* MPEG-4 Bitrate Information. 3032 * Optional : 3033 * ISOM_CODEC_TYPE_AVC1_VIDEO 3034 * ISOM_CODEC_TYPE_AVC2_VIDEO 3035 * ISOM_CODEC_TYPE_AVC3_VIDEO 3036 * ISOM_CODEC_TYPE_AVC4_VIDEO 3037 * ISOM_CODEC_TYPE_HVC1_VIDEO 3038 * ISOM_CODEC_TYPE_HEV1_VIDEO 3039 * 3040 * Though you need not to set these fields manually since lsmash_finish_movie() calls the function 3041 * that calculates these values internally, these fields are optional. 3042 * 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. */ 3043 typedef struct 3044 { 3045 uint32_t bufferSizeDB; /* the size of the decoding buffer for the elementary stream in bytes */ 3046 uint32_t maxBitrate; /* the maximum rate in bits/second over any window of one second */ 3047 uint32_t avgBitrate; /* the average rate in bits/second over the entire presentation */ 3048 } lsmash_h264_bitrate_t; 3049 3050 /* Appendability of NAL unit into Decoder Configuration Record */ 3051 typedef enum 3052 { 3053 DCR_NALU_APPEND_NEW_SAMPLE_ENTRY_REQUIRED = -3, /* A new sample description entry is needed because e.g. visual presentation size changes. */ 3054 DCR_NALU_APPEND_NEW_DCR_REQUIRED = -2, /* A new Decoder Configuration Record is needed. */ 3055 DCR_NALU_APPEND_ERROR = -1, /* something of errors */ 3056 DCR_NALU_APPEND_DUPLICATED = 0, /* The same NAL unit is in the Decoder Configuration Record. */ 3057 DCR_NALU_APPEND_POSSIBLE = 1, /* It is possible to append the NAL unit into the Decoder Configuration Record. */ 3058 } lsmash_dcr_nalu_appendable; 3059 3060 /* H.264/AVC Specific Information 3061 * Mandatory : 3062 * ISOM_CODEC_TYPE_AVC1_VIDEO 3063 * ISOM_CODEC_TYPE_AVC2_VIDEO 3064 * ISOM_CODEC_TYPE_AVC3_VIDEO 3065 * ISOM_CODEC_TYPE_AVC4_VIDEO 3066 * 3067 * All members in lsmash_h264_specific_parameters_t except for lengthSizeMinusOne shall be automatically set up 3068 * when appending SPS NAL units by calling lsmash_append_h264_parameter_set(). */ 3069 typedef enum 3070 { 3071 H264_PARAMETER_SET_TYPE_SPS = 0, /* SPS (Sequence Parameter Set) */ 3072 H264_PARAMETER_SET_TYPE_PPS = 1, /* PPS (Picture Parameter Set) */ 3073 H264_PARAMETER_SET_TYPE_SPSEXT = 2, /* SPS Ext (Sequence Parameter Set Extension) */ 3074 /* The number of the NAL unit types defined for AVC Decoder Configuration Record */ 3075 H264_PARAMETER_SET_TYPE_NUM 3076 } lsmash_h264_parameter_set_type; 3077 3078 typedef struct lsmash_h264_parameter_sets_tag lsmash_h264_parameter_sets_t; 3079 3080 typedef struct 3081 { 3082 uint8_t AVCProfileIndication; /* profile_idc in sequence parameter sets 3083 * This field must indicate a profile to which the stream associated with 3084 * this configuration record conforms. 3085 * Note: there is no profile to which the entire stream conforms, then 3086 * the entire stream must be split into two or more sub-streams with 3087 * separate configuration records in which these rules can be met. */ 3088 uint8_t profile_compatibility; /* constraint_set_flags in sequence parameter sets 3089 * The each bit may only be set if all the included parameter sets set that flag. */ 3090 uint8_t AVCLevelIndication; /* level_idc in sequence parameter sets 3091 * This field must indicate a level of capability equal to or greater than 3092 * the highest level indicated in the included parameter sets. */ 3093 uint8_t lengthSizeMinusOne; /* the length in bytes of the NALUnitLength field prior to NAL unit 3094 * The value of this field shall be one of 0, 1, or 3 3095 * corresponding to a length encoded with 1, 2, or 4 bytes, respectively. 3096 * NALUnitLength indicates the size of a NAL unit measured in bytes, 3097 * and includes the size of both the one byte NAL header and the EBSP payload 3098 * but does not include the length field itself. */ 3099 /* chroma format and bit depth information 3100 * These fields must be identical in all the parameter sets. */ 3101 uint8_t chroma_format; /* chroma_format_idc in sequence parameter sets */ 3102 uint8_t bit_depth_luma_minus8; /* bit_depth_luma_minus8 in sequence parameter sets */ 3103 uint8_t bit_depth_chroma_minus8; /* bit_depth_chroma_minus8 in sequence parameter sets */ 3104 /* a set of arrays to carry initialization NAL units 3105 * The NAL unit types are restricted to indicate SPS, PPS and SPS Ext NAL units only. */ 3106 lsmash_h264_parameter_sets_t *parameter_sets; 3107 } lsmash_h264_specific_parameters_t; 3108 3109 int lsmash_setup_h264_specific_parameters_from_access_unit 3110 ( 3111 lsmash_h264_specific_parameters_t *param, 3112 uint8_t *data, 3113 uint32_t data_length 3114 ); 3115 3116 void lsmash_destroy_h264_parameter_sets 3117 ( 3118 lsmash_h264_specific_parameters_t *param 3119 ); 3120 3121 lsmash_dcr_nalu_appendable lsmash_check_h264_parameter_set_appendable 3122 ( 3123 lsmash_h264_specific_parameters_t *param, 3124 lsmash_h264_parameter_set_type ps_type, 3125 void *ps_data, 3126 uint32_t ps_length 3127 ); 3128 3129 int lsmash_append_h264_parameter_set 3130 ( 3131 lsmash_h264_specific_parameters_t *param, 3132 lsmash_h264_parameter_set_type ps_type, 3133 void *ps_data, 3134 uint32_t ps_length 3135 ); 3136 3137 uint8_t *lsmash_create_h264_specific_info 3138 ( 3139 lsmash_h264_specific_parameters_t *param, 3140 uint32_t *data_length 3141 ); 3142 3143 /* H.265/HEVC Specific Information 3144 * Mandatory : 3145 * ISOM_CODEC_TYPE_HVC1_VIDEO 3146 * ISOM_CODEC_TYPE_HEV1_VIDEO 3147 * 3148 * All members in lsmash_hevc_specific_parameters_t except for avgFrameRate and lengthSizeMinusOne shall be 3149 * automatically set up when appending VPS and SPS NAL units by calling lsmash_append_hevc_dcr_nalu(). 3150 * It is recommended that you should append VPS, SPS and PPS in this order so that a parameter set can reference 3151 * another parameter set. */ 3152 typedef enum 3153 { 3154 /* Parameter sets 3155 * When the CODEC identifier ISOM_CODEC_TYPE_HVC1_VIDEO is used, at least one parameter set for each array 3156 * of parameter set shall be in the configuration record. */ 3157 HEVC_DCR_NALU_TYPE_VPS = 0, /* VPS (Video Parameter Set) */ 3158 HEVC_DCR_NALU_TYPE_SPS = 1, /* SPS (Sequence Parameter Set) */ 3159 HEVC_DCR_NALU_TYPE_PPS = 2, /* PPS (Picture Parameter Set) */ 3160 /* SEI (Supplemental Enhancement Information) 3161 * Only the 'declarative' SEI messages that provide information about the stream as 3162 * a whole are allowed because SEIs themselves basically have no identifier and 3163 * no one can reference dynamically in a configuration record. */ 3164 HEVC_DCR_NALU_TYPE_PREFIX_SEI = 3, /* Prefix SEI */ 3165 HEVC_DCR_NALU_TYPE_SUFFIX_SEI = 4, /* Suffix SEI */ 3166 /* The number of the NAL unit types defined for HEVC Decoder Configuration Record */ 3167 HEVC_DCR_NALU_TYPE_NUM 3168 } lsmash_hevc_dcr_nalu_type; 3169 3170 typedef struct lsmash_hevc_parameter_arrays_tag lsmash_hevc_parameter_arrays_t; 3171 3172 typedef struct 3173 { 3174 /* general profile, tier and level from VPS and/or SPS */ 3175 uint8_t general_profile_space; /* general_profile_space 3176 * The value in all the parameter sets must be identical. */ 3177 uint8_t general_tier_flag; /* general_tier_flag 3178 * The value must indicate a tier equal to or greater than the highest 3179 * tier indicated in all the parameter sets. */ 3180 uint8_t general_profile_idc; /* general_profile_idc 3181 * The value must indicate a profile to which the stream associated with 3182 * this configuration record conforms. 3183 * Note: there is no profile to which the entire stream conforms, then 3184 * the entire stream must be split into two or more sub-streams with 3185 * separate configuration records in which these rules can be met. */ 3186 uint32_t general_profile_compatibility_flags; /* general_profile_compatibility_flag[j] for j from 0 to 31 3187 * The each bit may only be set if all the parameter sets set that bit. */ 3188 uint64_t general_constraint_indicator_flags; /* the 6 bytes starting with the byte containing the general_progressive_source_flag 3189 * The each bit may only be set if all the parameter sets set that bit. */ 3190 uint8_t general_level_idc; /* general_level_idc 3191 * The value must indicate a level of capability equal to or greater 3192 * than the highest level indicated for the highest tier in all the 3193 * parameter sets. */ 3194 /* */ 3195 uint16_t min_spatial_segmentation_idc; /* min_spatial_segmentation_idc in VUI (Video Usability Information) 3196 * The value must indicate a level of spatial segmentation equal to 3197 * or less than the lowest level of spatial segmentation indicated in 3198 * all the parameter sets. */ 3199 uint8_t parallelismType; /* parallelismType indicates the type of parallelism that is used to meet the 3200 * restrictions imposed by min_spatial_segmentation_idc when the value of 3201 * min_spatial_segmentation_idc is greater than 0. 3202 * For the stream to which this configuration record applies, 3203 * 0: mixed types of parallel decoding or parallelism type is unknown 3204 * 1: slice based parallel decoding 3205 * 2: tile based parallel decoding 3206 * 3: entropy coding synchronization based parallel decoding 3207 * (WPP: Wavefront Parallel Processing) */ 3208 /* chroma format and bit depth information 3209 * These fields must be identical in all the parameter sets. */ 3210 uint8_t chromaFormat; /* chroma_format_idc in sequence parameter sets */ 3211 uint8_t bitDepthLumaMinus8; /* bit_depth_luma_minus8 in sequence parameter sets */ 3212 uint8_t bitDepthChromaMinus8; /* bit_depth_chroma_minus8 in sequence parameter sets */ 3213 /* miscellaneous */ 3214 uint16_t avgFrameRate; /* the average frame rate in units of frames/(256 seconds) 3215 * Value 0 indicates an unspecified average frame rate. */ 3216 uint8_t constantFrameRate; /* 0: the stream may or may not be of constant frame rate. 3217 * 1: that the stream to which this configuration record applies is of 3218 * constant frame rate 3219 * 2: the representation of each temporal layer in the stream is of 3220 * constant frame rate. */ 3221 uint8_t numTemporalLayers; /* 0: it is unknown whether the stream is temporally scalable. 3222 * 1: the stream is not temporally scalable. 3223 * otherwise: the stream to which this configuration record applies is 3224 * temporally scalable and the contained number of temporal layers 3225 * (also referred to as temporal sublayer or sub-layer) is equal 3226 * is equal to numTemporalLayers. */ 3227 uint8_t temporalIdNested; /* 0: at least one of the SPSs that are activated when the stream to which 3228 * this configuration record applies is decoded has sps_temporal_id_nesting_flag 3229 * equal to 0. 3230 * 1: all SPSs that are activated when the stream to which this configuration 3231 * record applies is decoded have sps_temporal_id_nesting_flag equal to 1 3232 * and temporal sub-layer up-switching to any higher temporal layer can be 3233 * performed at any sample. 3234 * Any step-wise temporal sub-layer access picture shall not be present in 3235 * the sequences to which this configuration record applies. */ 3236 uint8_t lengthSizeMinusOne; /* the length in bytes of the NALUnitLength field prior to NAL unit 3237 * The value of this field shall be one of 0, 1, or 3 3238 * corresponding to a length encoded with 1, 2, or 4 bytes, respectively. 3239 * NALUnitLength indicates the size of a NAL unit measured in bytes, 3240 * and includes the size of both the one byte NAL header and the EBSP payload 3241 * but does not include the length field itself. */ 3242 /* a set of arrays to carry initialization NAL units 3243 * The NAL unit types are restricted to indicate VPS, SPS, PPS, and SEI NAL units only. */ 3244 lsmash_hevc_parameter_arrays_t *parameter_arrays; 3245 } lsmash_hevc_specific_parameters_t; 3246 3247 int lsmash_setup_hevc_specific_parameters_from_access_unit 3248 ( 3249 lsmash_hevc_specific_parameters_t *param, 3250 uint8_t *data, 3251 uint32_t data_length 3252 ); 3253 3254 void lsmash_destroy_hevc_parameter_arrays 3255 ( 3256 lsmash_hevc_specific_parameters_t *param 3257 ); 3258 3259 lsmash_dcr_nalu_appendable lsmash_check_hevc_dcr_nalu_appendable 3260 ( 3261 lsmash_hevc_specific_parameters_t *param, 3262 lsmash_hevc_dcr_nalu_type ps_type, 3263 void *ps_data, 3264 uint32_t ps_length 3265 ); 3266 3267 int lsmash_append_hevc_dcr_nalu 3268 ( 3269 lsmash_hevc_specific_parameters_t *param, 3270 lsmash_hevc_dcr_nalu_type ps_type, 3271 void *ps_data, 3272 uint32_t ps_length 3273 ); 3274 3275 int lsmash_set_hevc_array_completeness 3276 ( 3277 lsmash_hevc_specific_parameters_t *param, 3278 lsmash_hevc_dcr_nalu_type ps_type, 3279 int array_completeness 3280 ); 3281 3282 int lsmash_get_hevc_array_completeness 3283 ( 3284 lsmash_hevc_specific_parameters_t *param, 3285 lsmash_hevc_dcr_nalu_type ps_type, 3286 int *array_completeness 3287 ); 3288 3289 uint8_t *lsmash_create_hevc_specific_info 3290 ( 3291 lsmash_hevc_specific_parameters_t *param, 3292 uint32_t *data_length 3293 ); 3294 3295 /* VC-1 Specific Information 3296 * Mandatory : 3297 * ISOM_CODEC_TYPE_VC_1_VIDEO 3298 * 3299 * We support only advanced profile at present. */ 3300 typedef struct lsmash_vc1_header_tag lsmash_vc1_header_t; 3301 3302 typedef struct 3303 { 3304 /* Note: multiple_sequence, multiple_entry, slice_present and bframe_present shall be decided through overall VC-1 bitstream. */ 3305 uint8_t profile; /* the encoding profile used in the VC-1 bitstream 3306 * 0: simple profile (not supported) 3307 * 4: main profile (not supported) 3308 * 12: advanced profile 3309 * Currently, only 12 for advanced profile is available. */ 3310 uint8_t level; /* the highest encoding level used in the VC-1 bitstream */ 3311 uint8_t cbr; /* 0: non-constant bitrate model 3312 * 1: constant bitrate model */ 3313 uint8_t interlaced; /* 0: interlaced coding of frames is not used. 3314 * 1: frames may use interlaced coding. */ 3315 uint8_t multiple_sequence; /* 0: the track contains no sequence headers (stored only in VC-1 specific info structure), 3316 * or 3317 * all sequence headers in the track are identical to the sequence header that is specified in the seqhdr field. 3318 * In this case, random access points are samples that contain an entry-point header. 3319 * 1: the track may contain Sequence headers that are different from the sequence header specified in the seqhdr field. 3320 * In this case, random access points are samples that contain both a sequence Header and an entry-point header. */ 3321 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. 3322 * 1: the track may contain entry-point headers that are different from the entry-point header specified in the ephdr field. */ 3323 uint8_t slice_present; /* 0: frames are not coded as multiple slices. 3324 * 1: frames may be coded as multiple slices. */ 3325 uint8_t bframe_present; /* 0: neither B-frames nor BI-frames are present in the track. 3326 * 1: B-frames or BI-frames may be present in the track. */ 3327 uint32_t framerate; /* the rounded frame rate (frames per second) of the track 3328 * Should be set to 0xffffffff if the frame rate is not known, unspecified, or non-constant. */ 3329 lsmash_vc1_header_t *seqhdr; /* a sequence header EBDU (mandatory) */ 3330 lsmash_vc1_header_t *ephdr; /* an entry-point header EBDU (mandatory) */ 3331 } lsmash_vc1_specific_parameters_t; 3332 3333 int lsmash_setup_vc1_specific_parameters_from_access_unit 3334 ( 3335 lsmash_vc1_specific_parameters_t *param, 3336 uint8_t *data, 3337 uint32_t data_length 3338 ); 3339 3340 void lsmash_destroy_vc1_headers 3341 ( 3342 lsmash_vc1_specific_parameters_t *param 3343 ); 3344 3345 int lsmash_put_vc1_header 3346 ( 3347 lsmash_vc1_specific_parameters_t *param, 3348 void *hdr_data, 3349 uint32_t hdr_length 3350 ); 3351 3352 uint8_t *lsmash_create_vc1_specific_info 3353 ( 3354 lsmash_vc1_specific_parameters_t *param, 3355 uint32_t *data_length 3356 ); 3357 3358 /* Sample scaling 3359 * Without this extension, video samples are scaled into the visual presentation region to fill it. */ 3360 typedef enum 3361 { 3362 ISOM_SCALE_METHOD_FILL = 1, 3363 ISOM_SCALE_METHOD_HIDDEN = 2, 3364 ISOM_SCALE_METHOD_MEET = 3, 3365 ISOM_SCALE_METHOD_SLICE_X = 4, 3366 ISOM_SCALE_METHOD_SLICE_Y = 5, 3367 } lsmash_scale_method; 3368 3369 typedef struct 3370 { 3371 uint8_t constraint_flag; /* Upper 7-bits are reserved. 3372 * If this flag is set, all samples described by this sample entry shall be scaled 3373 * according to the method specified by the field 'scale_method'. */ 3374 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. */ 3375 int16_t display_center_x; 3376 int16_t display_center_y; 3377 } lsmash_isom_sample_scale_t; 3378 3379 /* QuickTime Video CODEC tools */ 3380 typedef enum 3381 { 3382 QT_COMPRESSION_QUALITY_LOSSLESS = 0x00000400, /* only valid for spatial compression */ 3383 QT_COMPRESSION_QUALITY_MAX = 0x000003FF, 3384 QT_COMPRESSION_QUALITY_MIN = 0x00000000, 3385 QT_COMPRESSION_QUALITY_LOW = 0x00000100, 3386 QT_COMPRESSION_QUALITY_NORMAL = 0x00000200, 3387 QT_COMPRESSION_QUALITY_HIGH = 0x00000300 3388 } lsmash_qt_compression_quality; 3389 3390 typedef struct 3391 { 3392 uint32_t seed; /* Must be set to 0. */ 3393 uint16_t flags; /* Must be set to 0x8000. */ 3394 uint16_t size; /* the number of colors in the following color array 3395 * This is a zero-relative value; 3396 * setting this field to 0 means that there is one color in the array. */ 3397 /* Color array 3398 * An array of colors. Each color is made of four unsigned 16-bit integers. 3399 * We support up to 256 elements. */ 3400 struct 3401 { 3402 uint16_t unused; /* Must be set to 0. */ 3403 /* true color */ 3404 uint16_t r; /* magnitude of red component */ 3405 uint16_t g; /* magnitude of green component */ 3406 uint16_t b; /* magnitude of blue component */ 3407 } array[256]; 3408 } lsmash_qt_color_table_t; 3409 3410 typedef struct 3411 { 3412 int16_t revision_level; /* version of the CODEC */ 3413 int32_t vendor; /* whose CODEC */ 3414 lsmash_qt_compression_quality temporalQuality; /* the temporal quality factor (0-1023) */ 3415 lsmash_qt_compression_quality spatialQuality; /* the spatial quality factor (0-1024) */ 3416 uint32_t horizontal_resolution; /* a 16.16 fixed-point number containing the horizontal resolution of the image in pixels per inch. */ 3417 uint32_t vertical_resolution; /* a 16.16 fixed-point number containing the vertical resolution of the image in pixels per inch. */ 3418 uint32_t dataSize; /* if known, the size of data for this descriptor */ 3419 uint16_t frame_count; /* frame per sample */ 3420 int16_t color_table_ID; /* color table ID 3421 * If this field is set to -1, the default color table should be used for the specified depth 3422 * If the color table ID is set to 0, a color table is contained within the sample description itself. 3423 * The color table immediately follows the color table ID field. */ 3424 lsmash_qt_color_table_t color_table; /* a list of preferred colors for displaying the movie on devices that support only 256 colors */ 3425 } lsmash_qt_video_common_t; 3426 3427 typedef struct 3428 { 3429 uint32_t level; /* A fixed-point 16.16 number indicating the gamma level at which the image was captured. */ 3430 } lsmash_qt_gamma_t; 3431 3432 typedef enum 3433 { 3434 QT_FIELEDS_SCAN_PROGRESSIVE = 1, /* progressive scan */ 3435 QT_FIELEDS_SCAN_INTERLACED = 2, /* 2:1 interlaced */ 3436 } lsmash_qt_number_of_fields; 3437 3438 /* field ordering for interlaced material */ 3439 typedef enum 3440 { 3441 QT_FIELD_ORDERINGS_UNKNOWN = 0, 3442 QT_FIELD_ORDERINGS_TEMPORAL_TOP_FIRST = 1, 3443 QT_FIELD_ORDERINGS_TEMPORAL_BOTTOM_FIRST = 6, 3444 QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_EARLY = 9, 3445 QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_LATE = 14 3446 } lsmash_qt_field_orderings; 3447 3448 typedef struct 3449 { 3450 lsmash_qt_number_of_fields fields; 3451 lsmash_qt_field_orderings detail; 3452 } lsmash_qt_field_info_t; 3453 3454 /* the native pixel format */ 3455 typedef enum 3456 { 3457 QT_PIXEL_FORMAT_TYPE_1_MONOCHROME = 0x00000001, /* 1 bit indexed */ 3458 QT_PIXEL_FORMAT_TYPE_2_INDEXED = 0x00000002, /* 2 bit indexed */ 3459 QT_PIXEL_FORMAT_TYPE_4_INDEXED = 0x00000004, /* 4 bit indexed */ 3460 QT_PIXEL_FORMAT_TYPE_8_INDEXED = 0x00000008, /* 8 bit indexed */ 3461 QT_PIXEL_FORMAT_TYPE_1_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000021, /* 1 bit indexed gray, white is zero */ 3462 QT_PIXEL_FORMAT_TYPE_2_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000022, /* 2 bit indexed gray, white is zero */ 3463 QT_PIXEL_FORMAT_TYPE_4_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000024, /* 4 bit indexed gray, white is zero */ 3464 QT_PIXEL_FORMAT_TYPE_8_INDEXED_GRAY_WHITE_IS_ZERO = 0x00000028, /* 8 bit indexed gray, white is zero */ 3465 QT_PIXEL_FORMAT_TYPE_16BE555 = 0x00000010, /* 16 bit BE RGB 555 */ 3466 QT_PIXEL_FORMAT_TYPE_16LE555 = LSMASH_4CC( 'L', '5', '5', '5' ), /* 16 bit LE RGB 555 */ 3467 QT_PIXEL_FORMAT_TYPE_16LE5551 = LSMASH_4CC( '5', '5', '5', '1' ), /* 16 bit LE RGB 5551 */ 3468 QT_PIXEL_FORMAT_TYPE_16BE565 = LSMASH_4CC( 'B', '5', '6', '5' ), /* 16 bit BE RGB 565 */ 3469 QT_PIXEL_FORMAT_TYPE_16LE565 = LSMASH_4CC( 'L', '5', '6', '5' ), /* 16 bit LE RGB 565 */ 3470 QT_PIXEL_FORMAT_TYPE_24RGB = 0x00000018, /* 24 bit RGB */ 3471 QT_PIXEL_FORMAT_TYPE_24BGR = LSMASH_4CC( '2', '4', 'B', 'G' ), /* 24 bit BGR */ 3472 QT_PIXEL_FORMAT_TYPE_32ARGB = 0x00000020, /* 32 bit ARGB */ 3473 QT_PIXEL_FORMAT_TYPE_32BGRA = LSMASH_4CC( 'B', 'G', 'R', 'A' ), /* 32 bit BGRA */ 3474 QT_PIXEL_FORMAT_TYPE_32ABGR = LSMASH_4CC( 'A', 'B', 'G', 'R' ), /* 32 bit ABGR */ 3475 QT_PIXEL_FORMAT_TYPE_32RGBA = LSMASH_4CC( 'R', 'G', 'B', 'A' ), /* 32 bit RGBA */ 3476 QT_PIXEL_FORMAT_TYPE_64ARGB = LSMASH_4CC( 'b', '6', '4', 'a' ), /* 64 bit ARGB, 16-bit big-endian samples */ 3477 QT_PIXEL_FORMAT_TYPE_48RGB = LSMASH_4CC( 'b', '4', '8', 'r' ), /* 48 bit RGB, 16-bit big-endian samples */ 3478 QT_PIXEL_FORMAT_TYPE_32_ALPHA_GRAY = LSMASH_4CC( 'b', '3', '2', 'a' ), /* 32 bit AlphaGray, 16-bit big-endian samples, black is zero */ 3479 QT_PIXEL_FORMAT_TYPE_16_GRAY = LSMASH_4CC( 'b', '1', '6', 'g' ), /* 16 bit Grayscale, 16-bit big-endian samples, black is zero */ 3480 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) */ 3481 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 */ 3482 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 */ 3483 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 */ 3484 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 */ 3485 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 */ 3486 QT_PIXEL_FORMAT_TYPE_444YpCbCr8 = LSMASH_4CC( 'v', '3', '0', '8' ), /* Component Y'CbCr 8-bit 4:4:4 */ 3487 QT_PIXEL_FORMAT_TYPE_422YpCbCr16 = LSMASH_4CC( 'v', '2', '1', '6' ), /* Component Y'CbCr 10,12,14,16-bit 4:2:2 */ 3488 QT_PIXEL_FORMAT_TYPE_422YpCbCr10 = LSMASH_4CC( 'v', '2', '1', '0' ), /* Component Y'CbCr 10-bit 4:2:2 */ 3489 QT_PIXEL_FORMAT_TYPE_444YpCbCr10 = LSMASH_4CC( 'v', '4', '1', '0' ), /* Component Y'CbCr 10-bit 4:4:4 */ 3490 QT_PIXEL_FORMAT_TYPE_420YpCbCr8_PLANAR = LSMASH_4CC( 'y', '4', '2', '0' ), /* Planar Component Y'CbCr 8-bit 4:2:0 */ 3491 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 */ 3492 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 */ 3493 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]) */ 3494 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]) */ 3495 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 */ 3496 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 */ 3497 3498 /* Developer specific FourCCs (from dispatch 20) */ 3499 QT_PIXEL_FORMAT_TYPE_SOFTVOUT_SOFTCODEC = LSMASH_4CC( 's', 'o', 'f', 't' ), /* Intermediary pixel format used by SoftVout and SoftCodec */ 3500 QT_PIXEL_FORMAT_TYPE_VIEW_GRAPHICS = LSMASH_4CC( 'v', 'w', 'g', 'r' ), /* Intermediary pixel format used by View Graphics */ 3501 QT_PIXEL_FORMAT_TYPE_SGI = LSMASH_4CC( 'S', 'G', 'V', 'C' ), /* Intermediary pixel format used by SGI */ 3502 } lsmash_qt_pixel_format; 3503 3504 typedef struct 3505 { 3506 lsmash_qt_pixel_format pixel_format; /* the native pixel format of an image */ 3507 } lsmash_qt_pixel_format_t; 3508 3509 /* Significant Bits Extension 3510 * mandatory extension for 'v216' (Uncompressed Y'CbCr, 10, 12, 14, or 16-bit-per-component 4:2:2) */ 3511 typedef struct 3512 { 3513 uint8_t significantBits; /* the number of significant bits per component */ 3514 } lsmash_qt_significant_bits_t; 3515 3516 /* QuickTime Audio CODEC tools */ 3517 typedef enum 3518 { 3519 QT_AUDIO_COMPRESSION_ID_NOT_COMPRESSED = 0, 3520 QT_AUDIO_COMPRESSION_ID_FIXED_COMPRESSION = -1, 3521 QT_AUDIO_COMPRESSION_ID_VARIABLE_COMPRESSION = -2, 3522 QT_AUDIO_COMPRESSION_ID_TWO_TO_ONE = 1, 3523 QT_AUDIO_COMPRESSION_ID_EIGHT_TO_THREE = 2, 3524 QT_AUDIO_COMPRESSION_ID_THREE_TO_ONE = 3, 3525 QT_AUDIO_COMPRESSION_ID_SIX_TO_ONE = 4, 3526 QT_AUDIO_COMPRESSION_ID_SIX_TO_ONE_PACKET_SIZE = 8, 3527 QT_AUDIO_COMPRESSION_ID_THREE_TO_ONE_PACKET_SIZE = 16, 3528 } lsmash_qt_audio_compression_id; 3529 3530 typedef struct 3531 { 3532 int16_t revision_level; /* version of the CODEC */ 3533 int32_t vendor; /* whose CODEC */ 3534 lsmash_qt_audio_compression_id compression_ID; 3535 } lsmash_qt_audio_common_t; 3536 3537 /* Audio Channel Layout 3538 * This CODEC specific extension is for 3539 * QuickTime Audio inside QuickTime file format 3540 * and 3541 * Apple Lossless Audio inside ISO Base Media file format. 3542 * When audio stream has 3 or more number of channels, this extension shall be present. */ 3543 typedef enum 3544 { 3545 QT_CHANNEL_LABEL_UNKNOWN = (signed)0xffffffff, /* unknown or unspecified other use */ 3546 QT_CHANNEL_LABEL_UNUSED = 0, /* channel is present, but has no intended use or destination */ 3547 QT_CHANNEL_LABEL_USE_COORDINATES = 100, /* channel is described by the coordinates fields. */ 3548 3549 QT_CHANNEL_LABEL_LEFT = 1, 3550 QT_CHANNEL_LABEL_RIGHT = 2, 3551 QT_CHANNEL_LABEL_CENTER = 3, 3552 QT_CHANNEL_LABEL_LFE_SCREEN = 4, 3553 QT_CHANNEL_LABEL_LEFT_SURROUND = 5, /* WAVE: "Back Left" */ 3554 QT_CHANNEL_LABEL_RIGHT_SUROUND = 6, /* WAVE: "Back Right" */ 3555 QT_CHANNEL_LABEL_LEFT_CENTER = 7, 3556 QT_CHANNEL_LABEL_RIGHT_CENTER = 8, 3557 QT_CHANNEL_LABEL_CENTER_SURROUND = 9, /* WAVE: "Back Center" or plain "Rear Surround" */ 3558 QT_CHANNEL_LABEL_LEFT_SURROUND_DIRECT = 10, /* WAVE: "Side Left" */ 3559 QT_CHANNEL_LABEL_RIGHT_SURROUND_DIRECT = 11, /* WAVE: "Side Right" */ 3560 QT_CHANNEL_LABEL_TOP_CENTER_SURROUND = 12, 3561 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_LEFT = 13, /* WAVE: "Top Front Left" */ 3562 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_CENTER = 14, /* WAVE: "Top Front Center" */ 3563 QT_CHANNEL_LABEL_VERTICAL_HEIGHT_RIGHT = 15, /* WAVE: "Top Front Right" */ 3564 3565 QT_CHANNEL_LABEL_TOP_BACK_LEFT = 16, 3566 QT_CHANNEL_LABEL_TOP_BACK_CENTER = 17, 3567 QT_CHANNEL_LABEL_TOP_BACK_RIGHT = 18, 3568 3569 QT_CHANNEL_LABEL_REAR_SURROUND_LEFT = 33, 3570 QT_CHANNEL_LABEL_REAR_SURROUND_RIGHT = 34, 3571 QT_CHANNEL_LABEL_LEFT_WIDE = 35, 3572 QT_CHANNEL_LABEL_RIGHT_WIDE = 36, 3573 QT_CHANNEL_LABEL_LFE2 = 37, 3574 QT_CHANNEL_LABEL_LEFT_TOTAL = 38, /* matrix encoded 4 channels */ 3575 QT_CHANNEL_LABEL_RIGHT_TOTAL = 39, /* matrix encoded 4 channels */ 3576 QT_CHANNEL_LABEL_HEARING_IMPAIRED = 40, 3577 QT_CHANNEL_LABEL_NARRATION = 41, 3578 QT_CHANNEL_LABEL_MONO = 42, 3579 QT_CHANNEL_LABEL_DIALOG_CENTRIC_MIX = 43, 3580 3581 QT_CHANNEL_LABEL_CENTER_SURROUND_DIRECT = 44, /* back center, non diffuse */ 3582 3583 QT_CHANNEL_LABEL_HAPTIC = 45, 3584 3585 /* first order ambisonic channels */ 3586 QT_CHANNEL_LABEL_AMBISONIC_W = 200, 3587 QT_CHANNEL_LABEL_AMBISONIC_X = 201, 3588 QT_CHANNEL_LABEL_AMBISONIC_Y = 202, 3589 QT_CHANNEL_LABEL_AMBISONIC_Z = 203, 3590 3591 /* Mid/Side Recording */ 3592 QT_CHANNEL_LABEL_MS_MID = 204, 3593 QT_CHANNEL_LABEL_MS_SIDE = 205, 3594 3595 /* X-Y Recording */ 3596 QT_CHANNEL_LABEL_XY_X = 206, 3597 QT_CHANNEL_LABEL_XY_Y = 207, 3598 3599 /* other */ 3600 QT_CHANNEL_LABEL_HEADPHONES_LEFT = 301, 3601 QT_CHANNEL_LABEL_HEADPHONES_RIGHT = 302, 3602 QT_CHANNEL_LABEL_CLICK_TRACK = 304, 3603 QT_CHANNEL_LABEL_FOREIGN_LANGUAGE = 305, 3604 3605 /* generic discrete channel */ 3606 QT_CHANNEL_LABEL_DISCRETE = 400, 3607 3608 /* numbered discrete channel */ 3609 QT_CHANNEL_LABEL_DISCRETE_0 = (1<<16), 3610 QT_CHANNEL_LABEL_DISCRETE_1 = (1<<16) | 1, 3611 QT_CHANNEL_LABEL_DISCRETE_2 = (1<<16) | 2, 3612 QT_CHANNEL_LABEL_DISCRETE_3 = (1<<16) | 3, 3613 QT_CHANNEL_LABEL_DISCRETE_4 = (1<<16) | 4, 3614 QT_CHANNEL_LABEL_DISCRETE_5 = (1<<16) | 5, 3615 QT_CHANNEL_LABEL_DISCRETE_6 = (1<<16) | 6, 3616 QT_CHANNEL_LABEL_DISCRETE_7 = (1<<16) | 7, 3617 QT_CHANNEL_LABEL_DISCRETE_8 = (1<<16) | 8, 3618 QT_CHANNEL_LABEL_DISCRETE_9 = (1<<16) | 9, 3619 QT_CHANNEL_LABEL_DISCRETE_10 = (1<<16) | 10, 3620 QT_CHANNEL_LABEL_DISCRETE_11 = (1<<16) | 11, 3621 QT_CHANNEL_LABEL_DISCRETE_12 = (1<<16) | 12, 3622 QT_CHANNEL_LABEL_DISCRETE_13 = (1<<16) | 13, 3623 QT_CHANNEL_LABEL_DISCRETE_14 = (1<<16) | 14, 3624 QT_CHANNEL_LABEL_DISCRETE_15 = (1<<16) | 15, 3625 QT_CHANNEL_LABEL_DISCRETE_65535 = (1<<16) | 65535, 3626 } lsmash_channel_label; 3627 3628 typedef enum 3629 { 3630 QT_CHANNEL_BIT_LEFT = 1, 3631 QT_CHANNEL_BIT_RIGHT = 1<<1, 3632 QT_CHANNEL_BIT_CENTER = 1<<2, 3633 QT_CHANNEL_BIT_LFE_SCREEN = 1<<3, 3634 QT_CHANNEL_BIT_LEFT_SURROUND = 1<<4, /* WAVE: "Back Left" */ 3635 QT_CHANNEL_BIT_RIGHT_SURROUND = 1<<5, /* WAVE: "Back Right" */ 3636 QT_CHANNEL_BIT_LEFT_CENTER = 1<<6, 3637 QT_CHANNEL_BIT_RIGHT_CENTER = 1<<7, 3638 QT_CHANNEL_BIT_CENTER_SURROUND = 1<<8, /* WAVE: "Back Center" */ 3639 QT_CHANNEL_BIT_LEFT_SURROUND_DIRECT = 1<<9, /* WAVE: "Side Left" */ 3640 QT_CHANNEL_BIT_RIGHT_SURROUND_DIRECT = 1<<10, /* WAVE: "Side Right" */ 3641 QT_CHANNEL_BIT_TOP_CENTER_SURROUND = 1<<11, 3642 QT_CHANNEL_BIT_VERTICAL_HEIGHT_LEFT = 1<<12, /* WAVE: "Top Front Left" */ 3643 QT_CHANNEL_BIT_VERTICAL_HEIGHT_CENTER = 1<<13, /* WAVE: "Top Front Center" */ 3644 QT_CHANNEL_BIT_VERTICAL_HEIGHT_RIGHT = 1<<14, /* WAVE: "Top Front Right" */ 3645 QT_CHANNEL_BIT_TOP_BACK_LEFT = 1<<15, 3646 QT_CHANNEL_BIT_TOP_BACK_CENTER = 1<<16, 3647 QT_CHANNEL_BIT_TOP_BACK_RIGHT = 1<<17, 3648 QT_CHANNEL_BIT_FULL = 0x3ffff, 3649 } lsmash_channel_bitmap; 3650 3651 typedef enum 3652 { 3653 QT_CHANNEL_FLAGS_ALL_OFF = 0, 3654 QT_CHANNEL_FLAGS_RECTANGULAR_COORDINATES = 1, 3655 QT_CHANNEL_FLAGS_SPHERICAL_COORDINATES = 1<<1, 3656 QT_CHANNEL_FLAGS_METERS = 1<<2, 3657 } lsmash_channel_flags; 3658 3659 typedef enum 3660 { 3661 /* indices for accessing the coordinates array in Channel Descriptions */ 3662 /* for rectangulare coordinates */ 3663 QT_CHANNEL_COORDINATES_LEFT_RIGHT = 0, /* Negative is left and positive is right. */ 3664 QT_CHANNEL_COORDINATES_BACK_FRONT = 1, /* Negative is back and positive is front. */ 3665 QT_CHANNEL_COORDINATES_DOWN_UP = 2, /* Negative is below ground level, 0 is ground level, and positive is above ground level. */ 3666 /* for spherical coordinates */ 3667 QT_CHANNEL_COORDINATES_AZIMUTH = 0, /* 0 is front center, positive is right, negative is left. This is measured in degrees. */ 3668 QT_CHANNEL_COORDINATES_ELEVATION = 1, /* +90 is zenith, 0 is horizontal, -90 is nadir. This is measured in degrees. */ 3669 QT_CHANNEL_COORDINATES_DISTANCE = 2, /* The units are described by flags. */ 3670 } lsmash_channel_coordinates_index; 3671 3672 typedef enum 3673 { 3674 /* channel abbreviations: 3675 * L - left 3676 * R - right 3677 * C - center 3678 * Ls - left surround 3679 * Rs - right surround 3680 * Cs - center surround 3681 * Rls - rear left surround 3682 * Rrs - rear right surround 3683 * Lw - left wide 3684 * Rw - right wide 3685 * Lsd - left surround direct 3686 * Rsd - right surround direct 3687 * Lc - left center 3688 * Rc - right center 3689 * Ts - top surround 3690 * Vhl - vertical height left 3691 * Vhc - vertical height center 3692 * Vhr - vertical height right 3693 * Lt - left matrix total. for matrix encoded stereo. 3694 * Rt - right matrix total. for matrix encoded stereo. */ 3695 3696 /* General layouts */ 3697 QT_CHANNEL_LAYOUT_USE_CHANNEL_DESCRIPTIONS = 0, /* use the array of Channel Descriptions to define the mapping. */ 3698 QT_CHANNEL_LAYOUT_USE_CHANNEL_BITMAP = 1<<16, /* use the bitmap to define the mapping. */ 3699 3700 QT_CHANNEL_LAYOUT_MONO = (100<<16) | 1, /* a standard mono stream */ 3701 QT_CHANNEL_LAYOUT_STEREO = (101<<16) | 2, /* a standard stereo stream (L R) - implied playback */ 3702 QT_CHANNEL_LAYOUT_STEREO_HEADPHONES = (102<<16) | 2, /* a standard stereo stream (L R) - implied headphone playback */ 3703 QT_CHANNEL_LAYOUT_MATRIX_STEREO = (103<<16) | 2, /* a matrix encoded stereo stream (Lt, Rt) */ 3704 QT_CHANNEL_LAYOUT_MID_SIDE = (104<<16) | 2, /* mid/side recording */ 3705 QT_CHANNEL_LAYOUT_XY = (105<<16) | 2, /* coincident mic pair (often 2 figure 8's) */ 3706 QT_CHANNEL_LAYOUT_BINAURAL = (106<<16) | 2, /* binaural stereo (left, right) */ 3707 QT_CHANNEL_LAYOUT_AMBISONIC_B_FORMAT = (107<<16) | 4, /* W, X, Y, Z */ 3708 3709 QT_CHANNEL_LAYOUT_QUADRAPHONIC = (108<<16) | 4, /* front left, front right, back left, back right */ 3710 3711 QT_CHANNEL_LAYOUT_PENTAGONAL = (109<<16) | 5, /* left, right, rear left, rear right, center */ 3712 3713 QT_CHANNEL_LAYOUT_HEXAGONAL = (110<<16) | 6, /* left, right, rear left, rear right, center, rear */ 3714 3715 QT_CHANNEL_LAYOUT_OCTAGONAL = (111<<16) | 8, /* front left, front right, rear left, rear right, 3716 * front center, rear center, side left, side right */ 3717 3718 QT_CHANNEL_LAYOUT_CUBE = (112<<16) | 8, /* left, right, rear left, rear right, 3719 * top left, top right, top rear left, top rear right */ 3720 3721 /* MPEG defined layouts */ 3722 QT_CHANNEL_LAYOUT_MPEG_1_0 = QT_CHANNEL_LAYOUT_MONO, /* C */ 3723 QT_CHANNEL_LAYOUT_MPEG_2_0 = QT_CHANNEL_LAYOUT_STEREO, /* L R */ 3724 QT_CHANNEL_LAYOUT_MPEG_3_0_A = (113<<16) | 3, /* L R C */ 3725 QT_CHANNEL_LAYOUT_MPEG_3_0_B = (114<<16) | 3, /* C L R */ 3726 QT_CHANNEL_LAYOUT_MPEG_4_0_A = (115<<16) | 4, /* L R C Cs */ 3727 QT_CHANNEL_LAYOUT_MPEG_4_0_B = (116<<16) | 4, /* C L R Cs */ 3728 QT_CHANNEL_LAYOUT_MPEG_5_0_A = (117<<16) | 5, /* L R C Ls Rs */ 3729 QT_CHANNEL_LAYOUT_MPEG_5_0_B = (118<<16) | 5, /* L R Ls Rs C */ 3730 QT_CHANNEL_LAYOUT_MPEG_5_0_C = (119<<16) | 5, /* L C R Ls Rs */ 3731 QT_CHANNEL_LAYOUT_MPEG_5_0_D = (120<<16) | 5, /* C L R Ls Rs */ 3732 QT_CHANNEL_LAYOUT_MPEG_5_1_A = (121<<16) | 6, /* L R C LFE Ls Rs */ 3733 QT_CHANNEL_LAYOUT_MPEG_5_1_B = (122<<16) | 6, /* L R Ls Rs C LFE */ 3734 QT_CHANNEL_LAYOUT_MPEG_5_1_C = (123<<16) | 6, /* L C R Ls Rs LFE */ 3735 QT_CHANNEL_LAYOUT_MPEG_5_1_D = (124<<16) | 6, /* C L R Ls Rs LFE */ 3736 QT_CHANNEL_LAYOUT_MPEG_6_1_A = (125<<16) | 7, /* L R C LFE Ls Rs Cs */ 3737 QT_CHANNEL_LAYOUT_MPEG_7_1_A = (126<<16) | 8, /* L R C LFE Ls Rs Lc Rc */ 3738 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) */ 3739 QT_CHANNEL_LAYOUT_MPEG_7_1_C = (128<<16) | 8, /* L R C LFE Ls Rs Rls Rrs */ 3740 QT_CHANNEL_LAYOUT_EMAGIC_DEFAULT_7_1 = (129<<16) | 8, /* L R Ls Rs C LFE Lc Rc */ 3741 QT_CHANNEL_LAYOUT_SMPTE_DTV = (130<<16) | 8, /* L R C LFE Ls Rs Lt Rt */ 3742 3743 /* ITU defined layouts */ 3744 QT_CHANNEL_LAYOUT_ITU_1_0 = QT_CHANNEL_LAYOUT_MONO, /* C */ 3745 QT_CHANNEL_LAYOUT_ITU_2_0 = QT_CHANNEL_LAYOUT_STEREO, /* L R */ 3746 3747 QT_CHANNEL_LAYOUT_ITU_2_1 = (131<<16) | 3, /* L R Cs */ 3748 QT_CHANNEL_LAYOUT_ITU_2_2 = (132<<16) | 4, /* L R Ls Rs */ 3749 QT_CHANNEL_LAYOUT_ITU_3_0 = QT_CHANNEL_LAYOUT_MPEG_3_0_A, /* L R C */ 3750 QT_CHANNEL_LAYOUT_ITU_3_1 = QT_CHANNEL_LAYOUT_MPEG_4_0_A, /* L R C Cs */ 3751 3752 QT_CHANNEL_LAYOUT_ITU_3_2 = QT_CHANNEL_LAYOUT_MPEG_5_0_A, /* L R C Ls Rs */ 3753 QT_CHANNEL_LAYOUT_ITU_3_2_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_A, /* L R C LFE Ls Rs */ 3754 QT_CHANNEL_LAYOUT_ITU_3_4_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_C, /* L R C LFE Ls Rs Rls Rrs */ 3755 3756 /* DVD defined layouts */ 3757 QT_CHANNEL_LAYOUT_DVD_0 = QT_CHANNEL_LAYOUT_MONO, /* C (mono) */ 3758 QT_CHANNEL_LAYOUT_DVD_1 = QT_CHANNEL_LAYOUT_STEREO, /* L R */ 3759 QT_CHANNEL_LAYOUT_DVD_2 = QT_CHANNEL_LAYOUT_ITU_2_1, /* L R Cs */ 3760 QT_CHANNEL_LAYOUT_DVD_3 = QT_CHANNEL_LAYOUT_ITU_2_2, /* L R Ls Rs */ 3761 QT_CHANNEL_LAYOUT_DVD_4 = (133<<16) | 3, /* L R LFE */ 3762 QT_CHANNEL_LAYOUT_DVD_5 = (134<<16) | 4, /* L R LFE Cs */ 3763 QT_CHANNEL_LAYOUT_DVD_6 = (135<<16) | 5, /* L R LFE Ls Rs */ 3764 QT_CHANNEL_LAYOUT_DVD_7 = QT_CHANNEL_LAYOUT_MPEG_3_0_A, /* L R C */ 3765 QT_CHANNEL_LAYOUT_DVD_8 = QT_CHANNEL_LAYOUT_MPEG_4_0_A, /* L R C Cs */ 3766 QT_CHANNEL_LAYOUT_DVD_9 = QT_CHANNEL_LAYOUT_MPEG_5_0_A, /* L R C Ls Rs */ 3767 QT_CHANNEL_LAYOUT_DVD_10 = (136<<16) | 4, /* L R C LFE */ 3768 QT_CHANNEL_LAYOUT_DVD_11 = (137<<16) | 5, /* L R C LFE Cs */ 3769 QT_CHANNEL_LAYOUT_DVD_12 = QT_CHANNEL_LAYOUT_MPEG_5_1_A, /* L R C LFE Ls Rs */ 3770 /* 13 through 17 are duplicates of 8 through 12. */ 3771 QT_CHANNEL_LAYOUT_DVD_13 = QT_CHANNEL_LAYOUT_DVD_8, /* L R C Cs */ 3772 QT_CHANNEL_LAYOUT_DVD_14 = QT_CHANNEL_LAYOUT_DVD_9, /* L R C Ls Rs */ 3773 QT_CHANNEL_LAYOUT_DVD_15 = QT_CHANNEL_LAYOUT_DVD_10, /* L R C LFE */ 3774 QT_CHANNEL_LAYOUT_DVD_16 = QT_CHANNEL_LAYOUT_DVD_11, /* L R C LFE Cs */ 3775 QT_CHANNEL_LAYOUT_DVD_17 = QT_CHANNEL_LAYOUT_DVD_12, /* L R C LFE Ls Rs */ 3776 QT_CHANNEL_LAYOUT_DVD_18 = (138<<16) | 5, /* L R Ls Rs LFE */ 3777 QT_CHANNEL_LAYOUT_DVD_19 = QT_CHANNEL_LAYOUT_MPEG_5_0_B, /* L R Ls Rs C */ 3778 QT_CHANNEL_LAYOUT_DVD_20 = QT_CHANNEL_LAYOUT_MPEG_5_1_B, /* L R Ls Rs C LFE */ 3779 3780 /* These are the symmetrical layouts. */ 3781 QT_CHANNEL_LAYOUT_AUDIO_UNIT_4 = QT_CHANNEL_LAYOUT_QUADRAPHONIC, 3782 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5 = QT_CHANNEL_LAYOUT_PENTAGONAL, 3783 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6 = QT_CHANNEL_LAYOUT_HEXAGONAL, 3784 QT_CHANNEL_LAYOUT_AUDIO_UNIT_8 = QT_CHANNEL_LAYOUT_OCTAGONAL, 3785 /* These are the surround-based layouts. */ 3786 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5_0 = QT_CHANNEL_LAYOUT_MPEG_5_0_B, /* L R Ls Rs C */ 3787 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6_0 = (139<<16) | 6, /* L R Ls Rs C Cs */ 3788 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_0 = (140<<16) | 7, /* L R Ls Rs C Rls Rrs */ 3789 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_0_FRONT = (148<<16) | 7, /* L R Ls Rs C Lc Rc */ 3790 QT_CHANNEL_LAYOUT_AUDIO_UNIT_5_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_A, /* L R C LFE Ls Rs */ 3791 QT_CHANNEL_LAYOUT_AUDIO_UNIT_6_1 = QT_CHANNEL_LAYOUT_MPEG_6_1_A, /* L R C LFE Ls Rs Cs */ 3792 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_C, /* L R C LFE Ls Rs Rls Rrs */ 3793 QT_CHANNEL_LAYOUT_AUDIO_UNIT_7_1_FRONT = QT_CHANNEL_LAYOUT_MPEG_7_1_A, /* L R C LFE Ls Rs Lc Rc */ 3794 3795 QT_CHANNEL_LAYOUT_AAC_3_0 = QT_CHANNEL_LAYOUT_MPEG_3_0_B, /* C L R */ 3796 QT_CHANNEL_LAYOUT_AAC_QUADRAPHONIC = QT_CHANNEL_LAYOUT_QUADRAPHONIC, /* L R Ls Rs */ 3797 QT_CHANNEL_LAYOUT_AAC_4_0 = QT_CHANNEL_LAYOUT_MPEG_4_0_B, /* C L R Cs */ 3798 QT_CHANNEL_LAYOUT_AAC_5_0 = QT_CHANNEL_LAYOUT_MPEG_5_0_D, /* C L R Ls Rs */ 3799 QT_CHANNEL_LAYOUT_AAC_5_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_D, /* C L R Ls Rs LFE */ 3800 QT_CHANNEL_LAYOUT_AAC_6_0 = (141<<16) | 6, /* C L R Ls Rs Cs */ 3801 QT_CHANNEL_LAYOUT_AAC_6_1 = (142<<16) | 7, /* C L R Ls Rs Cs LFE */ 3802 QT_CHANNEL_LAYOUT_AAC_7_0 = (143<<16) | 7, /* C L R Ls Rs Rls Rrs */ 3803 QT_CHANNEL_LAYOUT_AAC_7_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_B, /* C Lc Rc L R Ls Rs LFE */ 3804 QT_CHANNEL_LAYOUT_AAC_OCTAGONAL = (144<<16) | 8, /* C L R Ls Rs Rls Rrs Cs */ 3805 3806 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 */ 3807 QT_CHANNEL_LAYOUT_TMH_10_2_FULL = (146<<16) | 21, /* TMH_10_2_std plus: Lc Rc HI VI Haptic */ 3808 3809 QT_CHANNEL_LAYOUT_AC3_1_0_1 = (149<<16) | 2, /* C LFE */ 3810 QT_CHANNEL_LAYOUT_AC3_3_0 = (150<<16) | 3, /* L C R */ 3811 QT_CHANNEL_LAYOUT_AC3_3_1 = (151<<16) | 4, /* L C R Cs */ 3812 QT_CHANNEL_LAYOUT_AC3_3_0_1 = (152<<16) | 4, /* L C R LFE */ 3813 QT_CHANNEL_LAYOUT_AC3_2_1_1 = (153<<16) | 4, /* L R Cs LFE */ 3814 QT_CHANNEL_LAYOUT_AC3_3_1_1 = (154<<16) | 5, /* L C R Cs LFE */ 3815 3816 QT_CHANNEL_LAYOUT_EAC_6_0_A = (155<<16) | 6, /* L C R Ls Rs Cs */ 3817 QT_CHANNEL_LAYOUT_EAC_7_0_A = (156<<16) | 7, /* L C R Ls Rs Rls Rrs */ 3818 3819 QT_CHANNEL_LAYOUT_EAC3_6_1_A = (157<<16) | 7, /* L C R Ls Rs LFE Cs */ 3820 QT_CHANNEL_LAYOUT_EAC3_6_1_B = (158<<16) | 7, /* L C R Ls Rs LFE Ts */ 3821 QT_CHANNEL_LAYOUT_EAC3_6_1_C = (159<<16) | 7, /* L C R Ls Rs LFE Vhc */ 3822 QT_CHANNEL_LAYOUT_EAC3_7_1_A = (160<<16) | 8, /* L C R Ls Rs LFE Rls Rrs */ 3823 QT_CHANNEL_LAYOUT_EAC3_7_1_B = (161<<16) | 8, /* L C R Ls Rs LFE Lc Rc */ 3824 QT_CHANNEL_LAYOUT_EAC3_7_1_C = (162<<16) | 8, /* L C R Ls Rs LFE Lsd Rsd */ 3825 QT_CHANNEL_LAYOUT_EAC3_7_1_D = (163<<16) | 8, /* L C R Ls Rs LFE Lw Rw */ 3826 QT_CHANNEL_LAYOUT_EAC3_7_1_E = (164<<16) | 8, /* L C R Ls Rs LFE Vhl Vhr */ 3827 3828 QT_CHANNEL_LAYOUT_EAC3_7_1_F = (165<<16) | 8, /* L C R Ls Rs LFE Cs Ts */ 3829 QT_CHANNEL_LAYOUT_EAC3_7_1_G = (166<<16) | 8, /* L C R Ls Rs LFE Cs Vhc */ 3830 QT_CHANNEL_LAYOUT_EAC3_7_1_H = (167<<16) | 8, /* L C R Ls Rs LFE Ts Vhc */ 3831 3832 QT_CHANNEL_LAYOUT_DTS_3_1 = (168<<16) | 4, /* C L R LFE */ 3833 QT_CHANNEL_LAYOUT_DTS_4_1 = (169<<16) | 5, /* C L R Cs LFE */ 3834 QT_CHANNEL_LAYOUT_DTS_6_0_A = (170<<16) | 6, /* Lc Rc L R Ls Rs */ 3835 QT_CHANNEL_LAYOUT_DTS_6_0_B = (171<<16) | 6, /* C L R Rls Rrs Ts */ 3836 QT_CHANNEL_LAYOUT_DTS_6_0_C = (172<<16) | 6, /* C Cs L R Rls Rrs */ 3837 QT_CHANNEL_LAYOUT_DTS_6_1_A = (173<<16) | 7, /* Lc Rc L R Ls Rs LFE */ 3838 QT_CHANNEL_LAYOUT_DTS_6_1_B = (174<<16) | 7, /* C L R Rls Rrs Ts LFE */ 3839 QT_CHANNEL_LAYOUT_DTS_6_1_C = (175<<16) | 7, /* C Cs L R Rls Rrs LFE */ 3840 QT_CHANNEL_LAYOUT_DTS_7_0 = (176<<16) | 7, /* Lc C Rc L R Ls Rs */ 3841 QT_CHANNEL_LAYOUT_DTS_7_1 = (177<<16) | 8, /* Lc C Rc L R Ls Rs LFE */ 3842 QT_CHANNEL_LAYOUT_DTS_8_0_A = (178<<16) | 8, /* Lc Rc L R Ls Rs Rls Rrs */ 3843 QT_CHANNEL_LAYOUT_DTS_8_0_B = (179<<16) | 8, /* Lc C Rc L R Ls Cs Rs */ 3844 QT_CHANNEL_LAYOUT_DTS_8_1_A = (180<<16) | 9, /* Lc Rc L R Ls Rs Rls Rrs LFE */ 3845 QT_CHANNEL_LAYOUT_DTS_8_1_B = (181<<16) | 9, /* Lc C Rc L R Ls Cs Rs LFE */ 3846 QT_CHANNEL_LAYOUT_DTS_6_1_D = (182<<16) | 7, /* C L R Ls Rs LFE Cs */ 3847 3848 QT_CHANNEL_LAYOUT_ALAC_MONO = QT_CHANNEL_LAYOUT_MONO, /* C */ 3849 QT_CHANNEL_LAYOUT_ALAC_STEREO = QT_CHANNEL_LAYOUT_STEREO, /* L R */ 3850 QT_CHANNEL_LAYOUT_ALAC_3_0 = QT_CHANNEL_LAYOUT_MPEG_3_0_B, /* C L R */ 3851 QT_CHANNEL_LAYOUT_ALAC_4_0 = QT_CHANNEL_LAYOUT_MPEG_4_0_B, /* C L R Cs */ 3852 QT_CHANNEL_LAYOUT_ALAC_5_0 = QT_CHANNEL_LAYOUT_MPEG_5_0_D, /* C L R Ls Rs */ 3853 QT_CHANNEL_LAYOUT_ALAC_5_1 = QT_CHANNEL_LAYOUT_MPEG_5_1_D, /* C L R Ls Rs LFE */ 3854 QT_CHANNEL_LAYOUT_ALAC_6_1 = QT_CHANNEL_LAYOUT_AAC_6_1, /* C L R Ls Rs Cs LFE */ 3855 QT_CHANNEL_LAYOUT_ALAC_7_1 = QT_CHANNEL_LAYOUT_MPEG_7_1_B, /* C Lc Rc L R Ls Rs LFE */ 3856 3857 QT_CHANNEL_LAYOUT_DISCRETE_IN_ORDER = 147<<16, /* needs to be ORed with the actual number of channels */ 3858 QT_CHANNEL_LAYOUT_UNKNOWN = (signed)0xffff0000, /* needs to be ORed with the actual number of channels */ 3859 } lsmash_channel_layout_tag; 3860 3861 typedef struct 3862 { 3863 lsmash_channel_layout_tag channelLayoutTag; /* channel layout */ 3864 lsmash_channel_bitmap channelBitmap; /* Only available when layout_tag is set to QT_CHANNEL_LAYOUT_USE_CHANNEL_BITMAP. */ 3865 } lsmash_qt_audio_channel_layout_t; 3866 3867 /* QuickTime Audio Format Specific Flags 3868 * Some values are ignored i.e. as if treated as unspecified when you specify certain CODECs. 3869 * For instance, you specify QT_CODEC_TYPE_SOWT_AUDIO, then all these values are ignored. 3870 * These values are basically used for QT_CODEC_TYPE_LPCM_AUDIO. 3871 * 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. */ 3872 typedef enum 3873 { 3874 QT_AUDIO_FORMAT_FLAG_FLOAT = 1, /* Set for floating point, clear for integer. */ 3875 QT_AUDIO_FORMAT_FLAG_BIG_ENDIAN = 1<<1, /* Set for big endian, clear for little endian. */ 3876 QT_AUDIO_FORMAT_FLAG_SIGNED_INTEGER = 1<<2, /* Set for signed integer, clear for unsigned integer. 3877 * This is only valid if QT_AUDIO_FORMAT_FLAG_FLOAT is clear. */ 3878 QT_AUDIO_FORMAT_FLAG_PACKED = 1<<3, /* Set if the sample bits occupy the entire available bits for the channel, 3879 * clear if they are high or low aligned within the channel. */ 3880 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. 3881 * This is only valid if QT_AUDIO_FORMAT_FLAG_PACKED is clear. */ 3882 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, 3883 * clear if the samples for each frame are layed out contiguously and the frames layed out end to end. */ 3884 QT_AUDIO_FORMAT_FLAG_NON_MIXABLE = 1<<6, /* Set to indicate when a format is non-mixable. 3885 * Note that this flag is only used when interacting with the HAL's stream format information. 3886 * It is not a valid flag for any other uses. */ 3887 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. */ 3888 3889 QT_LPCM_FORMAT_FLAG_FLOAT = QT_AUDIO_FORMAT_FLAG_FLOAT, 3890 QT_LPCM_FORMAT_FLAG_BIG_ENDIAN = QT_AUDIO_FORMAT_FLAG_BIG_ENDIAN, 3891 QT_LPCM_FORMAT_FLAG_SIGNED_INTEGER = QT_AUDIO_FORMAT_FLAG_SIGNED_INTEGER, 3892 QT_LPCM_FORMAT_FLAG_PACKED = QT_AUDIO_FORMAT_FLAG_PACKED, 3893 QT_LPCM_FORMAT_FLAG_ALIGNED_HIGH = QT_AUDIO_FORMAT_FLAG_ALIGNED_HIGH, 3894 QT_LPCM_FORMAT_FLAG_NON_INTERLEAVED = QT_AUDIO_FORMAT_FLAG_NON_INTERLEAVED, 3895 QT_LPCM_FORMAT_FLAG_NON_MIXABLE = QT_AUDIO_FORMAT_FLAG_NON_MIXABLE, 3896 QT_LPCM_FORMAT_FLAG_ALL_CLEAR = QT_AUDIO_FORMAT_FLAG_ALL_CLEAR, 3897 3898 /* These flags are set for Apple Lossless data that was sourced from N bit native endian signed integer data. */ 3899 QT_ALAC_FORMAT_FLAG_16BIT_SOURCE_DATA = 1, 3900 QT_ALAC_FORMAT_FLAG_20BIT_SOURCE_DATA = 2, 3901 QT_ALAC_FORMAT_FLAG_24BIT_SOURCE_DATA = 3, 3902 QT_ALAC_FORMAT_FLAG_32BIT_SOURCE_DATA = 4, 3903 } lsmash_qt_audio_format_specific_flag; 3904 3905 typedef struct 3906 { 3907 lsmash_qt_audio_format_specific_flag format_flags; 3908 } lsmash_qt_audio_format_specific_flags_t; 3909 3910 /* Global Header 3911 * Ut Video inside QuickTime file format requires this extension for storing CODEC specific information. */ 3912 typedef struct 3913 { 3914 uint32_t header_size; 3915 uint8_t *header_data; 3916 } lsmash_codec_global_header_t; 3917 3918 /**************************************************************************** 3919 * iTunes Metadata 3920 ****************************************************************************/ 3921 typedef enum 3922 { 3923 /* UTF String type */ 3924 ITUNES_METADATA_ITEM_ALBUM_NAME = (int)LSMASH_4CC( 0xA9u, 'a', 'l', 'b' ), /* Album Name */ 3925 ITUNES_METADATA_ITEM_ARTIST = (int)LSMASH_4CC( 0xA9u, 'A', 'R', 'T' ), /* Artist */ 3926 ITUNES_METADATA_ITEM_USER_COMMENT = (int)LSMASH_4CC( 0xA9u, 'c', 'm', 't' ), /* User Comment */ 3927 ITUNES_METADATA_ITEM_RELEASE_DATE = (int)LSMASH_4CC( 0xA9u, 'd', 'a', 'y' ), /* YYYY-MM-DD format string (may be incomplete, i.e. only year) */ 3928 ITUNES_METADATA_ITEM_ENCODED_BY = (int)LSMASH_4CC( 0xA9u, 'e', 'n', 'c' ), /* Person or company that encoded the recording */ 3929 ITUNES_METADATA_ITEM_USER_GENRE = (int)LSMASH_4CC( 0xA9u, 'g', 'e', 'n' ), /* User Genre user-specified string */ 3930 ITUNES_METADATA_ITEM_GROUPING = (int)LSMASH_4CC( 0xA9u, 'g', 'r', 'p' ), /* Grouping */ 3931 ITUNES_METADATA_ITEM_LYRICS = (int)LSMASH_4CC( 0xA9u, 'l', 'y', 'r' ), /* Lyrics */ 3932 ITUNES_METADATA_ITEM_TITLE = (int)LSMASH_4CC( 0xA9u, 'n', 'a', 'm' ), /* Title / Song Name */ 3933 ITUNES_METADATA_ITEM_TRACK_SUBTITLE = (int)LSMASH_4CC( 0xA9u, 's', 't', '3' ), /* Track Sub-Title */ 3934 ITUNES_METADATA_ITEM_ENCODING_TOOL = (int)LSMASH_4CC( 0xA9u, 't', 'o', 'o' ), /* Software which encoded the recording */ 3935 ITUNES_METADATA_ITEM_COMPOSER = (int)LSMASH_4CC( 0xA9u, 'w', 'r', 't' ), /* Composer */ 3936 ITUNES_METADATA_ITEM_ALBUM_ARTIST = LSMASH_4CC( 'a', 'A', 'R', 'T' ), /* Artist for the whole album (if different than the individual tracks) */ 3937 ITUNES_METADATA_ITEM_PODCAST_CATEGORY = LSMASH_4CC( 'c', 'a', 't', 'g' ), /* Podcast Category */ 3938 ITUNES_METADATA_ITEM_COPYRIGHT = LSMASH_4CC( 'c', 'p', 'r', 't' ), /* Copyright */ 3939 ITUNES_METADATA_ITEM_DESCRIPTION = LSMASH_4CC( 'd', 'e', 's', 'c' ), /* Description (limited to 255 bytes) */ 3940 ITUNES_METADATA_ITEM_GROUPING_DRAFT = LSMASH_4CC( 'g', 'r', 'u', 'p' ), /* Grouping 3941 * Note: This identifier is defined in 3942 * iTunes Metadata Format Specification (Preliminary draft), 3943 * but not used by iTunes actually it seems. 3944 * We recommend you use ITUNES_METADATA_ITEM_GROUPING instead of this. */ 3945 ITUNES_METADATA_ITEM_PODCAST_KEYWORD = LSMASH_4CC( 'k', 'e', 'y', 'w' ), /* Podcast Keywords */ 3946 ITUNES_METADATA_ITEM_LONG_DESCRIPTION = LSMASH_4CC( 'l', 'd', 'e', 's' ), /* Long Description */ 3947 ITUNES_METADATA_ITEM_PURCHASE_DATE = LSMASH_4CC( 'p', 'u', 'r', 'd' ), /* Purchase Date */ 3948 ITUNES_METADATA_ITEM_TV_EPISODE_ID = LSMASH_4CC( 't', 'v', 'e', 'n' ), /* TV Episode ID */ 3949 ITUNES_METADATA_ITEM_TV_NETWORK = LSMASH_4CC( 't', 'v', 'n', 'n' ), /* TV Network Name */ 3950 ITUNES_METADATA_ITEM_TV_SHOW_NAME = LSMASH_4CC( 't', 'v', 's', 'h' ), /* TV Show Name */ 3951 ITUNES_METADATA_ITEM_ITUNES_PURCHASE_ACCOUNT_ID = LSMASH_4CC( 'a', 'p', 'I', 'D' ), /* iTunes Account Used for Purchase */ 3952 ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM = LSMASH_4CC( 's', 'o', 'a', 'l' ), /* Sort Album */ 3953 ITUNES_METADATA_ITEM_ITUNES_SORT_ARTIST = LSMASH_4CC( 's', 'o', 'a', 'r' ), /* Sort Artist */ 3954 ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM_ARTIST = LSMASH_4CC( 's', 'o', 'a', 'a' ), /* Sort Album Artist */ 3955 ITUNES_METADATA_ITEM_ITUNES_SORT_COMPOSER = LSMASH_4CC( 's', 'o', 'c', 'o' ), /* Sort Composer */ 3956 ITUNES_METADATA_ITEM_ITUNES_SORT_NAME = LSMASH_4CC( 's', 'o', 'n', 'm' ), /* Sort Name */ 3957 ITUNES_METADATA_ITEM_ITUNES_SORT_SHOW = LSMASH_4CC( 's', 'o', 's', 'n' ), /* Sort Show */ 3958 3959 /* Integer type 3960 * (X): X means length of bytes */ 3961 ITUNES_METADATA_ITEM_EPISODE_GLOBAL_ID = LSMASH_4CC( 'e', 'g', 'i', 'd' ), /* (1) Episode Global Unique ID */ 3962 ITUNES_METADATA_ITEM_PREDEFINED_GENRE = LSMASH_4CC( 'g', 'n', 'r', 'e' ), /* (2) Pre-defined Genre / Enumerated value from ID3 tag set, plus 1 */ 3963 ITUNES_METADATA_ITEM_PODCAST_URL = LSMASH_4CC( 'p', 'u', 'r', 'l' ), /* (?) Podcast URL */ 3964 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 */ 3965 ITUNES_METADATA_ITEM_MEDIA_TYPE = LSMASH_4CC( 's', 't', 'i', 'k' ), /* (1) Media Type */ 3966 ITUNES_METADATA_ITEM_BEATS_PER_MINUTE = LSMASH_4CC( 't', 'm', 'p', 'o' ), /* (2) Beats Per Minute */ 3967 ITUNES_METADATA_ITEM_TV_EPISODE = LSMASH_4CC( 't', 'v', 'e', 's' ), /* (4) TV Episode */ 3968 ITUNES_METADATA_ITEM_TV_SEASON = LSMASH_4CC( 't', 'v', 's', 'n' ), /* (4) TV Season */ 3969 ITUNES_METADATA_ITEM_ITUNES_ACCOUNT_TYPE = LSMASH_4CC( 'a', 'k', 'I', 'D' ), /* (1) iTunes Account Type / 0: iTunes, 1: AOL */ 3970 ITUNES_METADATA_ITEM_ITUNES_ARTIST_ID = LSMASH_4CC( 'a', 't', 'I', 'D' ), /* (4) iTunes Artist ID */ 3971 ITUNES_METADATA_ITEM_ITUNES_COMPOSER_ID = LSMASH_4CC( 'c', 'm', 'I', 'D' ), /* (4) iTunes Composer ID */ 3972 ITUNES_METADATA_ITEM_ITUNES_CATALOG_ID = LSMASH_4CC( 'c', 'n', 'I', 'D' ), /* (4) iTunes Catalog ID */ 3973 ITUNES_METADATA_ITEM_ITUNES_TV_GENRE_ID = LSMASH_4CC( 'g', 'e', 'I', 'D' ), /* (4) iTunes TV Genre ID */ 3974 ITUNES_METADATA_ITEM_ITUNES_PLAYLIST_ID = LSMASH_4CC( 'p', 'l', 'I', 'D' ), /* (8) iTunes Playlist ID */ 3975 ITUNES_METADATA_ITEM_ITUNES_COUNTRY_CODE = LSMASH_4CC( 's', 'f', 'I', 'D' ), /* (4) iTunes Country Code */ 3976 3977 /* Boolean type */ 3978 ITUNES_METADATA_ITEM_DISC_COMPILATION = LSMASH_4CC( 'c', 'p', 'i', 'l' ), /* Disc Compilation / Is disc part of a compilation? 0: No, 1: Yes */ 3979 ITUNES_METADATA_ITEM_HIGH_DEFINITION_VIDEO = LSMASH_4CC( 'h', 'd', 'v', 'd' ), /* High Definition Video / 0: No, 1: Yes */ 3980 ITUNES_METADATA_ITEM_PODCAST = LSMASH_4CC( 'p', 'c', 's', 't' ), /* Podcast / 0: No, 1: Yes */ 3981 ITUNES_METADATA_ITEM_GAPLESS_PLAYBACK = LSMASH_4CC( 'p', 'g', 'a', 'p' ), /* Gapless Playback / 0: insert gap, 1: no gap */ 3982 3983 /* Binary type */ 3984 ITUNES_METADATA_ITEM_COVER_ART = LSMASH_4CC( 'c', 'o', 'v', 'r' ), /* One or more cover art images (JPEG/PNG/BMP data) */ 3985 ITUNES_METADATA_ITEM_DISC_NUMBER = LSMASH_4CC( 'd', 'i', 's', 'k' ), /* Disc Number */ 3986 ITUNES_METADATA_ITEM_TRACK_NUMBER = LSMASH_4CC( 't', 'r', 'k', 'n' ), /* Track Number */ 3987 3988 /* Custom type */ 3989 ITUNES_METADATA_ITEM_CUSTOM = LSMASH_4CC( '-', '-', '-', '-' ), /* Custom */ 3990 } lsmash_itunes_metadata_item; 3991 3992 typedef enum 3993 { 3994 ITUNES_METADATA_TYPE_NONE = 0, 3995 ITUNES_METADATA_TYPE_STRING = 1, 3996 ITUNES_METADATA_TYPE_INTEGER = 2, 3997 ITUNES_METADATA_TYPE_BOOLEAN = 3, 3998 ITUNES_METADATA_TYPE_BINARY = 4, 3999 } lsmash_itunes_metadata_type; 4000 4001 typedef enum 4002 { 4003 ITUNES_METADATA_SUBTYPE_IMPLICIT = 0, /* for use with tags for which no type needs to be indicated because only one type is allowed */ 4004 ITUNES_METADATA_SUBTYPE_UTF8 = 1, /* without any count or null terminator */ 4005 ITUNES_METADATA_SUBTYPE_UTF16 = 2, /* also known as UTF-16BE */ 4006 ITUNES_METADATA_SUBTYPE_SJIS = 3, /* deprecated unless it is needed for special Japanese characters */ 4007 ITUNES_METADATA_SUBTYPE_HTML = 6, /* the HTML file header specifies which HTML version */ 4008 ITUNES_METADATA_SUBTYPE_XML = 7, /* the XML header must identify the DTD or schemas */ 4009 ITUNES_METADATA_SUBTYPE_UUID = 8, /* also known as GUID; stored as 16 bytes in binary (valid as an ID) */ 4010 ITUNES_METADATA_SUBTYPE_ISRC = 9, /* stored as UTF-8 text (valid as an ID) */ 4011 ITUNES_METADATA_SUBTYPE_MI3P = 10, /* stored as UTF-8 text (valid as an ID) */ 4012 ITUNES_METADATA_SUBTYPE_GIF = 12, /* (deprecated) a GIF image */ 4013 ITUNES_METADATA_SUBTYPE_JPEG = 13, /* in a JFIF wrapper */ 4014 ITUNES_METADATA_SUBTYPE_PNG = 14, /* in a PNG wrapper */ 4015 ITUNES_METADATA_SUBTYPE_URL = 15, /* absolute, in UTF-8 characters */ 4016 ITUNES_METADATA_SUBTYPE_DURATION = 16, /* in milliseconds, a 32-bit integer */ 4017 ITUNES_METADATA_SUBTYPE_TIME = 17, /* in UTC, counting seconds since midnight on 1 January, 1904; 32 or 64 bits */ 4018 ITUNES_METADATA_SUBTYPE_GENRES = 18, /* a list of values from the enumerated set */ 4019 ITUNES_METADATA_SUBTYPE_INTEGER = 21, /* A signed big-endian integer in 1,2,3,4 or 8 bytes */ 4020 ITUNES_METADATA_SUBTYPE_RIAAPA = 24, /* RIAA Parental advisory; -1=no, 1=yes, 0=unspecified. 8-bit integer */ 4021 ITUNES_METADATA_SUBTYPE_UPC = 25, /* Universal Product Code, in text UTF-8 format (valid as an ID) */ 4022 ITUNES_METADATA_SUBTYPE_BMP = 27, /* Windows bitmap format graphics */ 4023 } lsmash_itunes_metadata_subtype; 4024 4025 typedef union 4026 { 4027 char *string; /* for ITUNES_METADATA_TYPE_STRING (UTF-8 string) */ 4028 uint64_t integer; /* for ITUNES_METADATA_TYPE_INTEGER */ 4029 lsmash_boolean_t boolean; /* for ITUNES_METADATA_TYPE_BOOLEAN */ 4030 /* for ITUNES_METADATA_TYPE_BINARY */ 4031 struct 4032 { 4033 lsmash_itunes_metadata_subtype subtype; 4034 uint32_t size; 4035 uint8_t *data; 4036 } binary; 4037 } lsmash_itunes_metadata_value_t; 4038 4039 typedef struct 4040 { 4041 /* When 'item' is specified as ITUNES_METADATA_ITEM_CUSTOM, 'type' and 'meaning' is mandatory while 'name' is optionally valid. 4042 * Otherwise 'type', 'meaning' and 'name' are just ignored. 'value' is always mandatory. */ 4043 lsmash_itunes_metadata_item item; 4044 lsmash_itunes_metadata_type type; 4045 lsmash_itunes_metadata_value_t value; 4046 char *meaning; 4047 char *name; 4048 } lsmash_itunes_metadata_t; 4049 4050 /* Append an iTunes metadata to a movie. 4051 * 4052 * Return 0 if successful. 4053 * Return a negative value otherwise. */ 4054 int lsmash_set_itunes_metadata 4055 ( 4056 lsmash_root_t *root, 4057 lsmash_itunes_metadata_t metadata 4058 ); 4059 4060 /* Count the number of iTunes metadata in a movie. 4061 * 4062 * Return the number of iTunes metadata in a movie if successful. 4063 * Return 0 otherwise. */ 4064 uint32_t lsmash_count_itunes_metadata 4065 ( 4066 lsmash_root_t *root 4067 ); 4068 4069 /* Get an iTunes metadata in a movie. 4070 * String and/or binary fields in 'metadata' are allocated if successful. 4071 * You can deallocate the allocated fields by lsmash_free(). 4072 * Also you can deallocate all of the allocated fields by lsmash_cleanup_itunes_metadata() at a time. 4073 * 4074 * Return 0 if successful. 4075 * Return a negative value otherwise. */ 4076 int lsmash_get_itunes_metadata 4077 ( 4078 lsmash_root_t *root, 4079 uint32_t metadata_number, 4080 lsmash_itunes_metadata_t *metadata 4081 ); 4082 4083 /* Deallocate all of allocated fields in a given iTunes metadata at a time. 4084 * The deallocated fields are set to NULL. 4085 * Note: the given iTunes metadata itself is NOT deallocated by this function. */ 4086 void lsmash_cleanup_itunes_metadata 4087 ( 4088 lsmash_itunes_metadata_t *metadata 4089 ); 4090 4091 /**************************************************************************** 4092 * Others 4093 ****************************************************************************/ 4094 /* Set a copyright declaration to a track. 4095 * track_ID == 0 means copyright declaration applies to the entire presentation, not an entire track. 4096 * 4097 * Return 0 if successful. 4098 * Return a negative value otherwise. */ 4099 int lsmash_set_copyright 4100 ( 4101 lsmash_root_t *root, 4102 uint32_t track_ID, 4103 uint16_t ISO_language, 4104 char *notice 4105 ); 4106 4107 int lsmash_create_object_descriptor 4108 ( 4109 lsmash_root_t *root 4110 ); 4111 4112 #ifdef _WIN32 4113 /* Convert string encoded by ACP (ANSI CODE PAGE) to UTF-8. 4114 * 4115 * Return the size of converted string (bytes) if successful. 4116 * Return 0 otherwise. */ 4117 int lsmash_convert_ansi_to_utf8 4118 ( 4119 const char *string_ansi, /* string encoded by ACP */ 4120 char *string_utf8, /* buffer for converted string from ACP */ 4121 int max_length /* size of 'string_utf8' */ 4122 ); 4123 #endif 4124 4125 #undef PRIVATE 4126 4127 #ifdef __cplusplus 4128 } 4129 #endif 4130 4131 #endif 4132