1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2010-2014 L-SMASH project
6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *****************************************************************************/
21 /* This file is available under an ISC license. */
23 #ifdef LSMASH_DEMUXER_ENABLED
25 #include "common/internal.h" /* must be placed first */
30 #include <stdarg.h> /* for isom_iprintf */
35 typedef int (*isom_print_box_t
)( FILE *, lsmash_file_t
*, isom_box_t
*, int );
41 isom_print_box_t func
;
44 static void isom_ifprintf_duration( FILE *fp
, int indent
, char *field_name
, uint64_t duration
, uint32_t timescale
)
48 lsmash_ifprintf( fp
, indent
, "duration = %"PRIu64
"\n", duration
);
51 int dur
= duration
/ timescale
;
52 int hour
= (dur
/ 3600) % 24;
53 int min
= (dur
/ 60) % 60;
55 int ms
= ((double)duration
/ timescale
- (hour
* 3600 + min
* 60 + sec
)) * 1e3
+ 0.5;
57 sprintf( str
, "%02d:%02d:%02d.%03d", hour
, min
, sec
, ms
);
58 lsmash_ifprintf( fp
, indent
, "%s = %"PRIu64
" (%s)\n", field_name
, duration
, str
);
61 static char *isom_mp4time2utc( uint64_t mp4time
)
63 int year_offset
= mp4time
/ 31536000;
64 int leap_years
= year_offset
/ 4 + ((mp4time
/ 86400) > 366); /* 1904 itself is leap year */
65 int day
= (mp4time
/ 86400) - (year_offset
* 365) - leap_years
+ 1;
69 leap_years
= year_offset
/ 4 + ((mp4time
/ 86400) > 366);
70 day
= (mp4time
/ 86400) - (year_offset
* 365) - leap_years
+ 1;
72 int year
= 1904 + year_offset
;
73 int is_leap
= (!(year
% 4) && (year
% 100)) || !(year
% 400);
74 static const int month_days
[13] = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
76 for( month
= 1; month
<= 12; month
++ )
78 int i
= (month
== 2 && is_leap
) ? 0 : month
;
79 if( day
<= month_days
[i
] )
83 int hour
= (mp4time
/ 3600) % 24;
84 int min
= (mp4time
/ 60) % 60;
85 int sec
= mp4time
% 60;
87 sprintf( utc
, "UTC %d/%02d/%02d, %02d:%02d:%02d\n", year
, month
, day
, hour
, min
, sec
);
91 static void isom_ifprintf_matrix( FILE *fp
, int indent
, int32_t *matrix
)
93 lsmash_ifprintf( fp
, indent
, "| a, b, u | | %f, %f, %f |\n", lsmash_fixed2double( matrix
[0], 16 ),
94 lsmash_fixed2double( matrix
[1], 16 ),
95 lsmash_fixed2double( matrix
[2], 30 ) );
96 lsmash_ifprintf( fp
, indent
, "| c, d, v | = | %f, %f, %f |\n", lsmash_fixed2double( matrix
[3], 16 ),
97 lsmash_fixed2double( matrix
[4], 16 ),
98 lsmash_fixed2double( matrix
[5], 30 ) );
99 lsmash_ifprintf( fp
, indent
, "| x, y, w | | %f, %f, %f |\n", lsmash_fixed2double( matrix
[6], 16 ),
100 lsmash_fixed2double( matrix
[7], 16 ),
101 lsmash_fixed2double( matrix
[8], 30 ) );
104 static void isom_ifprintf_rgb_color( FILE *fp
, int indent
, uint16_t *color
)
106 lsmash_ifprintf( fp
, indent
, "{ R, G, B } = { %"PRIu16
", %"PRIu16
", %"PRIu16
" }\n", color
[0], color
[1], color
[2] );
109 static void isom_ifprintf_rgba_color( FILE *fp
, int indent
, uint8_t *color
)
111 lsmash_ifprintf( fp
, indent
, "{ R, G, B, A } = { %"PRIu8
", %"PRIu8
", %"PRIu8
", %"PRIu8
" }\n", color
[0], color
[1], color
[2], color
[3] );
114 static char *isom_unpack_iso_language( uint16_t language
)
116 static char unpacked
[4];
117 unpacked
[0] = ((language
>> 10) & 0x1f) + 0x60;
118 unpacked
[1] = ((language
>> 5) & 0x1f) + 0x60;
119 unpacked
[2] = ( language
& 0x1f) + 0x60;
124 static void isom_ifprintf_sample_description_common_reserved( FILE *fp
, int indent
, uint8_t *reserved
)
126 uint64_t temp
= ((uint64_t)reserved
[0] << 40)
127 | ((uint64_t)reserved
[1] << 32)
128 | ((uint64_t)reserved
[2] << 24)
129 | ((uint64_t)reserved
[3] << 16)
130 | ((uint64_t)reserved
[4] << 8)
131 | (uint64_t)reserved
[5];
132 lsmash_ifprintf( fp
, indent
, "reserved = 0x%012"PRIx64
"\n", temp
);
135 static void isom_ifprintf_sample_flags( FILE *fp
, int indent
, char *field_name
, isom_sample_flags_t
*flags
)
137 uint32_t temp
= (flags
->reserved
<< 28)
138 | (flags
->is_leading
<< 26)
139 | (flags
->sample_depends_on
<< 24)
140 | (flags
->sample_is_depended_on
<< 22)
141 | (flags
->sample_has_redundancy
<< 20)
142 | (flags
->sample_padding_value
<< 17)
143 | (flags
->sample_is_non_sync_sample
<< 16)
144 | flags
->sample_degradation_priority
;
145 lsmash_ifprintf( fp
, indent
++, "%s = 0x%08"PRIx32
"\n", field_name
, temp
);
146 if( flags
->is_leading
& ISOM_SAMPLE_IS_UNDECODABLE_LEADING
) lsmash_ifprintf( fp
, indent
, "undecodable leading\n" );
147 else if( flags
->is_leading
& ISOM_SAMPLE_IS_NOT_LEADING
) lsmash_ifprintf( fp
, indent
, "non-leading\n" );
148 else if( flags
->is_leading
& ISOM_SAMPLE_IS_DECODABLE_LEADING
) lsmash_ifprintf( fp
, indent
, "decodable leading\n" );
149 if( flags
->sample_depends_on
& ISOM_SAMPLE_IS_INDEPENDENT
) lsmash_ifprintf( fp
, indent
, "independent\n" );
150 else if( flags
->sample_depends_on
& ISOM_SAMPLE_IS_NOT_INDEPENDENT
) lsmash_ifprintf( fp
, indent
, "dependent\n" );
151 if( flags
->sample_is_depended_on
& ISOM_SAMPLE_IS_NOT_DISPOSABLE
) lsmash_ifprintf( fp
, indent
, "non-disposable\n" );
152 else if( flags
->sample_is_depended_on
& ISOM_SAMPLE_IS_DISPOSABLE
) lsmash_ifprintf( fp
, indent
, "disposable\n" );
153 if( flags
->sample_has_redundancy
& ISOM_SAMPLE_HAS_REDUNDANCY
) lsmash_ifprintf( fp
, indent
, "redundant\n" );
154 else if( flags
->sample_has_redundancy
& ISOM_SAMPLE_HAS_NO_REDUNDANCY
) lsmash_ifprintf( fp
, indent
, "non-redundant\n" );
155 if( flags
->sample_padding_value
)
156 lsmash_ifprintf( fp
, indent
, "padding_bits = %"PRIu8
"\n", flags
->sample_padding_value
);
157 lsmash_ifprintf( fp
, indent
, flags
->sample_is_non_sync_sample
? "non-sync sample\n" : "sync sample\n" );
158 lsmash_ifprintf( fp
, indent
, "degradation_priority = %"PRIu16
"\n", flags
->sample_degradation_priority
);
161 static inline int isom_print_simple( FILE *fp
, isom_box_t
*box
, int level
, char *name
)
164 if( box
->type
.fourcc
!= ISOM_BOX_TYPE_UUID
.fourcc
)
166 lsmash_ifprintf( fp
, indent
++, "[%s: %s]\n", isom_4cc2str( box
->type
.fourcc
), name
);
167 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", box
->pos
);
168 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", box
->size
);
172 lsmash_ifprintf( fp
, indent
++, "[uuid: UUID Box]\n" );
173 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", box
->pos
);
174 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", box
->size
);
175 lsmash_ifprintf( fp
, indent
++, "usertype\n" );
176 lsmash_ifprintf( fp
, indent
, "type = %s\n", isom_4cc2str( box
->type
.user
.fourcc
) );
177 lsmash_ifprintf( fp
, indent
, "name = %s\n", name
);
178 lsmash_ifprintf( fp
, indent
, "uuid = 0x%08"PRIx32
"-%04"PRIx16
"-%04"PRIx16
"-%04"PRIx16
"-%04"PRIx16
"0x%08"PRIx32
"\n",
179 box
->type
.user
.fourcc
,
180 (box
->type
.user
.id
[0] << 8) | box
->type
.user
.id
[1], (box
->type
.user
.id
[2] << 8) | box
->type
.user
.id
[3],
181 (box
->type
.user
.id
[4] << 8) | box
->type
.user
.id
[5], (box
->type
.user
.id
[6] << 8) | box
->type
.user
.id
[7],
182 (box
->type
.user
.id
[8] << 24) | (box
->type
.user
.id
[9] << 16) | (box
->type
.user
.id
[10] << 8) | box
->type
.user
.id
[11] );
187 static void isom_print_basebox_common( FILE *fp
, int indent
, isom_box_t
*box
, char *name
)
189 isom_print_simple( fp
, box
, indent
, name
);
192 static void isom_print_fullbox_common( FILE *fp
, int indent
, isom_box_t
*box
, char *name
)
194 isom_print_simple( fp
, box
, indent
++, name
);
195 lsmash_ifprintf( fp
, indent
, "version = %"PRIu8
"\n", box
->version
);
196 lsmash_ifprintf( fp
, indent
, "flags = 0x%06"PRIx32
"\n", box
->flags
& 0x00ffffff );
199 static void isom_print_box_common( FILE *fp
, int indent
, isom_box_t
*box
, char *name
)
201 isom_box_t
*parent
= box
->parent
;
202 if( parent
&& lsmash_check_box_type_identical( parent
->type
, ISOM_BOX_TYPE_STSD
) )
204 isom_print_basebox_common( fp
, indent
, box
, name
);
207 if( isom_is_fullbox( box
) )
208 isom_print_fullbox_common( fp
, indent
, box
, name
);
210 isom_print_basebox_common( fp
, indent
, box
, name
);
213 static int isom_print_unknown( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
216 if( box
->type
.fourcc
!= ISOM_BOX_TYPE_UUID
.fourcc
)
218 lsmash_ifprintf( fp
, indent
++, "[%s]\n", isom_4cc2str( box
->type
.fourcc
) );
219 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", box
->pos
);
220 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", box
->size
);
224 lsmash_ifprintf( fp
, indent
++, "[uuid: UUID Box]\n" );
225 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", box
->pos
);
226 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", box
->size
);
227 lsmash_ifprintf( fp
, indent
++, "usertype\n" );
228 lsmash_ifprintf( fp
, indent
, "type = %s\n", isom_4cc2str( box
->type
.user
.fourcc
) );
229 lsmash_ifprintf( fp
, indent
, "uuid = 0x%08"PRIx32
"-%04"PRIx16
"-%04"PRIx16
"-%04"PRIx16
"-%04"PRIx16
"%08"PRIx32
"\n",
230 box
->type
.user
.fourcc
,
231 (box
->type
.user
.id
[0] << 8) | box
->type
.user
.id
[1], (box
->type
.user
.id
[2] << 8) | box
->type
.user
.id
[3],
232 (box
->type
.user
.id
[4] << 8) | box
->type
.user
.id
[5], (box
->type
.user
.id
[6] << 8) | box
->type
.user
.id
[7],
233 (box
->type
.user
.id
[8] << 24) | (box
->type
.user
.id
[9] << 16) | (box
->type
.user
.id
[10] << 8) | box
->type
.user
.id
[11] );
238 static void isom_print_brand_description( FILE *fp
, lsmash_brand_type brand
)
244 lsmash_brand_type brand
;
246 } brand_description_table
[] =
248 { ISOM_BRAND_TYPE_3G2A
, "3GPP2" },
249 { ISOM_BRAND_TYPE_3GE6
, "3GPP Release 6 Extended Presentation Profile" },
250 { ISOM_BRAND_TYPE_3GE9
, "3GPP Release 9 Extended Presentation Profile" },
251 { ISOM_BRAND_TYPE_3GF9
, "3GPP Release 9 File-delivery Server Profile" },
252 { ISOM_BRAND_TYPE_3GG6
, "3GPP Release 6 General Profile" },
253 { ISOM_BRAND_TYPE_3GG9
, "3GPP Release 9 General Profile" },
254 { ISOM_BRAND_TYPE_3GH9
, "3GPP Release 9 Adaptive Streaming Profile" },
255 { ISOM_BRAND_TYPE_3GM9
, "3GPP Release 9 Media Segment Profile" },
256 { ISOM_BRAND_TYPE_3GP4
, "3GPP Release 4" },
257 { ISOM_BRAND_TYPE_3GP5
, "3GPP Release 5" },
258 { ISOM_BRAND_TYPE_3GP6
, "3GPP Release 6 Basic Profile" },
259 { ISOM_BRAND_TYPE_3GP7
, "3GPP Release 7" },
260 { ISOM_BRAND_TYPE_3GP8
, "3GPP Release 8" },
261 { ISOM_BRAND_TYPE_3GP9
, "3GPP Release 9 Basic Profile" },
262 { ISOM_BRAND_TYPE_3GR6
, "3GPP Release 6 Progressive Download Profile" },
263 { ISOM_BRAND_TYPE_3GR9
, "3GPP Release 9 Progressive Download Profile" },
264 { ISOM_BRAND_TYPE_3GS6
, "3GPP Release 6 Streaming Server Profile" },
265 { ISOM_BRAND_TYPE_3GS9
, "3GPP Release 9 Streaming Server Profile" },
266 { ISOM_BRAND_TYPE_3GT9
, "3GPP Release 9 Media Stream Recording Profile" },
267 { ISOM_BRAND_TYPE_ARRI
, "ARRI Digital Camera" },
268 { ISOM_BRAND_TYPE_CAEP
, "Canon Digital Camera" },
269 { ISOM_BRAND_TYPE_CDES
, "Convergent Designs" },
270 { ISOM_BRAND_TYPE_LCAG
, "Leica digital camera" },
271 { ISOM_BRAND_TYPE_M4A
, "iTunes MPEG-4 audio protected or not" },
272 { ISOM_BRAND_TYPE_M4B
, "iTunes AudioBook protected or not" },
273 { ISOM_BRAND_TYPE_M4P
, "MPEG-4 protected audio" },
274 { ISOM_BRAND_TYPE_M4V
, "MPEG-4 protected audio+video" },
275 { ISOM_BRAND_TYPE_MFSM
, "Media File for Samsung video Metadata" },
276 { ISOM_BRAND_TYPE_MPPI
, "Photo Player Multimedia Application Format" },
277 { ISOM_BRAND_TYPE_ROSS
, "Ross Video" },
278 { ISOM_BRAND_TYPE_AVC1
, "Advanced Video Coding extensions" },
279 { ISOM_BRAND_TYPE_BBXM
, "Blinkbox Master File" },
280 { ISOM_BRAND_TYPE_CAQV
, "Casio Digital Camera" },
281 { ISOM_BRAND_TYPE_CCFF
, "Common container file format" },
282 { ISOM_BRAND_TYPE_DA0A
, "DMB AF" },
283 { ISOM_BRAND_TYPE_DA0B
, "DMB AF" },
284 { ISOM_BRAND_TYPE_DA1A
, "DMB AF" },
285 { ISOM_BRAND_TYPE_DA1B
, "DMB AF" },
286 { ISOM_BRAND_TYPE_DA2A
, "DMB AF" },
287 { ISOM_BRAND_TYPE_DA2B
, "DMB AF" },
288 { ISOM_BRAND_TYPE_DA3A
, "DMB AF" },
289 { ISOM_BRAND_TYPE_DA3B
, "DMB AF" },
290 { ISOM_BRAND_TYPE_DASH
, "Indexed self-initializing Media Segment" },
291 { ISOM_BRAND_TYPE_DBY1
, "MP4 files with Dolby content" },
292 { ISOM_BRAND_TYPE_DMB1
, "DMB AF" },
293 { ISOM_BRAND_TYPE_DSMS
, "Self-initializing Media Segment" },
294 { ISOM_BRAND_TYPE_DV1A
, "DMB AF" },
295 { ISOM_BRAND_TYPE_DV1B
, "DMB AF" },
296 { ISOM_BRAND_TYPE_DV2A
, "DMB AF" },
297 { ISOM_BRAND_TYPE_DV2B
, "DMB AF" },
298 { ISOM_BRAND_TYPE_DV3A
, "DMB AF" },
299 { ISOM_BRAND_TYPE_DV3B
, "DMB AF" },
300 { ISOM_BRAND_TYPE_DVR1
, "DVB RTP" },
301 { ISOM_BRAND_TYPE_DVT1
, "DVB Transport Stream" },
302 { ISOM_BRAND_TYPE_IFRM
, "Apple iFrame" },
303 { ISOM_BRAND_TYPE_ISC2
, "Files encrypted according to ISMACryp 2.0" },
304 { ISOM_BRAND_TYPE_ISO2
, "ISO Base Media file format version 2" },
305 { ISOM_BRAND_TYPE_ISO3
, "ISO Base Media file format version 3" },
306 { ISOM_BRAND_TYPE_ISO4
, "ISO Base Media file format version 4" },
307 { ISOM_BRAND_TYPE_ISO5
, "ISO Base Media file format version 5" },
308 { ISOM_BRAND_TYPE_ISO6
, "ISO Base Media file format version 6" },
309 { ISOM_BRAND_TYPE_ISO7
, "ISO Base Media file format version 7" },
310 { ISOM_BRAND_TYPE_ISOM
, "ISO Base Media file format version 1" },
311 { ISOM_BRAND_TYPE_JPSI
, "The JPSearch data interchange format" },
312 { ISOM_BRAND_TYPE_LMSG
, "last Media Segment indicator" },
313 { ISOM_BRAND_TYPE_MJ2S
, "Motion JPEG 2000 simple profile" },
314 { ISOM_BRAND_TYPE_MJP2
, "Motion JPEG 2000, general profile" },
315 { ISOM_BRAND_TYPE_MP21
, "MPEG-21" },
316 { ISOM_BRAND_TYPE_MP41
, "MP4 version 1" },
317 { ISOM_BRAND_TYPE_MP42
, "MP4 version 2" },
318 { ISOM_BRAND_TYPE_MP71
, "MPEG-7 file-level metadata" },
319 { ISOM_BRAND_TYPE_MSDH
, "Media Segment" },
320 { ISOM_BRAND_TYPE_MSIX
, "Indexed Media Segment" },
321 { ISOM_BRAND_TYPE_NIKO
, "Nikon Digital Camera" },
322 { ISOM_BRAND_TYPE_ODCF
, "OMA DCF" },
323 { ISOM_BRAND_TYPE_OPF2
, "OMA PDCF" },
324 { ISOM_BRAND_TYPE_OPX2
, "OMA Adapted PDCF" },
325 { ISOM_BRAND_TYPE_PANA
, "Panasonic Digital Camera" },
326 { ISOM_BRAND_TYPE_PIFF
, "Protected Interoperable File Format" },
327 { ISOM_BRAND_TYPE_PNVI
, "Panasonic Video Intercom" },
328 { ISOM_BRAND_TYPE_QT
, "QuickTime file format" },
329 { ISOM_BRAND_TYPE_RISX
, "Representation Index Segment" },
330 { ISOM_BRAND_TYPE_SDV
, "SD Video" },
331 { ISOM_BRAND_TYPE_SIMS
, "Sub-Indexed Media Segment" },
332 { ISOM_BRAND_TYPE_SISX
, "Single Index Segment" },
333 { ISOM_BRAND_TYPE_SSSS
, "Subsegment Index Segment" },
336 for( int i
= 0; brand_description_table
[i
].description
; i
++ )
337 if( brand
== brand_description_table
[i
].brand
)
339 fprintf( fp
, " : %s\n", brand_description_table
[i
].description
);
345 static void isom_print_file_type
349 uint32_t major_brand
,
350 uint32_t minor_version
,
351 uint32_t brand_count
,
352 uint32_t *compatible_brands
355 lsmash_ifprintf( fp
, indent
, "major_brand = %s", isom_4cc2str( major_brand
) );
356 isom_print_brand_description( fp
, major_brand
);
357 lsmash_ifprintf( fp
, indent
, "minor_version = %"PRIu32
"\n", minor_version
);
358 lsmash_ifprintf( fp
, indent
++, "compatible_brands\n" );
359 for( uint32_t i
= 0; i
< brand_count
; i
++ )
361 if( compatible_brands
[i
] )
363 lsmash_ifprintf( fp
, indent
, "brand[%"PRIu32
"] = %s", i
, isom_4cc2str( compatible_brands
[i
] ) );
364 isom_print_brand_description( fp
, compatible_brands
[i
] );
367 lsmash_ifprintf( fp
, indent
, "brand[%"PRIu32
"] = (void)\n", i
);
371 static int isom_print_ftyp( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
373 isom_ftyp_t
*ftyp
= (isom_ftyp_t
*)box
;
375 isom_print_box_common( fp
, indent
++, box
, "File Type Box" );
376 isom_print_file_type( fp
, indent
, ftyp
->major_brand
, ftyp
->minor_version
, ftyp
->brand_count
, ftyp
->compatible_brands
);
380 static int isom_print_styp( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
382 /* Print 'valid' if this box is the first box in a file. */
387 && file
->print
->head
->data
)
388 valid
= (box
== ((isom_print_entry_t
*)file
->print
->head
->data
)->box
);
391 char *name
= valid
? "Segment Type Box (valid)" : "Segment Type Box";
392 isom_styp_t
*styp
= (isom_styp_t
*)box
;
394 isom_print_box_common( fp
, indent
++, box
, name
);
395 isom_print_file_type( fp
, indent
, styp
->major_brand
, styp
->minor_version
, styp
->brand_count
, styp
->compatible_brands
);
399 static int isom_print_sidx( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
401 if( !((isom_sidx_t
*)box
)->list
)
403 isom_sidx_t
*sidx
= (isom_sidx_t
*)box
;
405 isom_print_box_common( fp
, indent
++, box
, "Segment Index Box" );
406 lsmash_ifprintf( fp
, indent
, "reference_ID = %"PRIu32
"\n", sidx
->reference_ID
);
407 lsmash_ifprintf( fp
, indent
, "timescale = %"PRIu32
"\n", sidx
->timescale
);
408 lsmash_ifprintf( fp
, indent
, "earliest_presentation_time = %"PRIu64
"\n", sidx
->earliest_presentation_time
);
409 lsmash_ifprintf( fp
, indent
, "first_offset = %"PRIu64
"\n", sidx
->first_offset
);
410 lsmash_ifprintf( fp
, indent
, "reserved = %"PRIu16
"\n", sidx
->reserved
);
411 lsmash_ifprintf( fp
, indent
, "reference_count = %"PRIu16
"\n", sidx
->reference_count
);
413 for( lsmash_entry_t
*entry
= sidx
->list
->head
; entry
; entry
= entry
->next
)
415 isom_sidx_referenced_item_t
*data
= (isom_sidx_referenced_item_t
*)entry
->data
;
416 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
417 lsmash_ifprintf( fp
, indent
, "reference_type = %"PRIu8
" (%s)\n", data
->reference_type
, data
->reference_type
? "index" : "media" );
418 lsmash_ifprintf( fp
, indent
, "reference_size = %"PRIu32
"\n", data
->reference_size
);
419 lsmash_ifprintf( fp
, indent
, "subsegment_duration = %"PRIu32
"\n", data
->subsegment_duration
);
420 lsmash_ifprintf( fp
, indent
, "starts_with_SAP = %"PRIu8
"%s\n", data
->starts_with_SAP
, data
->starts_with_SAP
? " (yes)" : "" );
421 lsmash_ifprintf( fp
, indent
, "SAP_type = %"PRIu8
"%s\n", data
->SAP_type
, data
->SAP_type
== 0 ? " (unknown)" : "" );
422 lsmash_ifprintf( fp
, indent
--, "SAP_delta_time = %"PRIu32
"\n", data
->SAP_delta_time
);
427 static int isom_print_moov( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
429 return isom_print_simple( fp
, box
, level
, "Movie Box" );
432 static int isom_print_mvhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
434 isom_mvhd_t
*mvhd
= (isom_mvhd_t
*)box
;
436 isom_print_box_common( fp
, indent
++, box
, "Movie Header Box" );
437 lsmash_ifprintf( fp
, indent
, "creation_time = %s", isom_mp4time2utc( mvhd
->creation_time
) );
438 lsmash_ifprintf( fp
, indent
, "modification_time = %s", isom_mp4time2utc( mvhd
->modification_time
) );
439 lsmash_ifprintf( fp
, indent
, "timescale = %"PRIu32
"\n", mvhd
->timescale
);
440 isom_ifprintf_duration( fp
, indent
, "duration", mvhd
->duration
, mvhd
->timescale
);
441 lsmash_ifprintf( fp
, indent
, "rate = %f\n", lsmash_fixed2double( mvhd
->rate
, 16 ) );
442 lsmash_ifprintf( fp
, indent
, "volume = %f\n", lsmash_fixed2double( mvhd
->volume
, 8 ) );
443 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", mvhd
->reserved
);
444 if( file
->qt_compatible
)
446 lsmash_ifprintf( fp
, indent
, "preferredLong1 = 0x%08"PRIx32
"\n", mvhd
->preferredLong
[0] );
447 lsmash_ifprintf( fp
, indent
, "preferredLong2 = 0x%08"PRIx32
"\n", mvhd
->preferredLong
[1] );
448 lsmash_ifprintf( fp
, indent
, "transformation matrix\n" );
449 isom_ifprintf_matrix( fp
, indent
+ 1, mvhd
->matrix
);
450 lsmash_ifprintf( fp
, indent
, "previewTime = %"PRId32
"\n", mvhd
->previewTime
);
451 lsmash_ifprintf( fp
, indent
, "previewDuration = %"PRId32
"\n", mvhd
->previewDuration
);
452 lsmash_ifprintf( fp
, indent
, "posterTime = %"PRId32
"\n", mvhd
->posterTime
);
453 lsmash_ifprintf( fp
, indent
, "selectionTime = %"PRId32
"\n", mvhd
->selectionTime
);
454 lsmash_ifprintf( fp
, indent
, "selectionDuration = %"PRId32
"\n", mvhd
->selectionDuration
);
455 lsmash_ifprintf( fp
, indent
, "currentTime = %"PRId32
"\n", mvhd
->currentTime
);
459 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", mvhd
->preferredLong
[0] );
460 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", mvhd
->preferredLong
[1] );
461 lsmash_ifprintf( fp
, indent
, "transformation matrix\n" );
462 isom_ifprintf_matrix( fp
, indent
+ 1, mvhd
->matrix
);
463 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", mvhd
->previewTime
);
464 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", mvhd
->previewDuration
);
465 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", mvhd
->posterTime
);
466 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", mvhd
->selectionTime
);
467 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", mvhd
->selectionDuration
);
468 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", mvhd
->currentTime
);
470 lsmash_ifprintf( fp
, indent
, "next_track_ID = %"PRIu32
"\n", mvhd
->next_track_ID
);
474 static void isom_pring_qt_color_table( FILE *fp
, int indent
, isom_qt_color_table_t
*color_table
)
476 isom_qt_color_array_t
*array
= color_table
->array
;
479 lsmash_ifprintf( fp
, indent
, "ctSeed = %"PRIu32
"\n", color_table
->seed
);
480 lsmash_ifprintf( fp
, indent
, "ctFlags = 0x%04"PRIx16
"\n", color_table
->flags
);
481 lsmash_ifprintf( fp
, indent
, "ctSize = %"PRIu16
"\n", color_table
->size
);
482 lsmash_ifprintf( fp
, indent
++, "ctTable\n" );
483 for( uint16_t i
= 0; i
<= color_table
->size
; i
++ )
484 lsmash_ifprintf( fp
, indent
,
485 "color[%"PRIu16
"] = { 0x%04"PRIx16
", 0x%04"PRIx16
", 0x%04"PRIx16
", 0x%04"PRIx16
" }\n",
486 i
, array
[i
].value
, array
[i
].r
, array
[i
].g
, array
[i
].b
);
489 static int isom_print_ctab( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
491 isom_ctab_t
*ctab
= (isom_ctab_t
*)box
;
493 isom_print_box_common( fp
, indent
, box
, "Color Table Box" );
494 isom_pring_qt_color_table( fp
, indent
+ 1, &ctab
->color_table
);
498 static int isom_print_iods( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
500 extern void mp4sys_print_descriptor( FILE *, void *, int );
501 isom_iods_t
*iods
= (isom_iods_t
*)box
;
503 isom_print_box_common( fp
, indent
, box
, "Object Descriptor Box" );
504 mp4sys_print_descriptor( fp
, iods
->OD
, indent
+ 1 );
508 static int isom_print_trak( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
510 return isom_print_simple( fp
, box
, level
, "Track Box" );
513 static int isom_print_tkhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
515 isom_tkhd_t
*tkhd
= (isom_tkhd_t
*)box
;
517 isom_print_box_common( fp
, indent
++, box
, "Track Header Box" );
519 if( tkhd
->flags
& ISOM_TRACK_ENABLED
)
520 lsmash_ifprintf( fp
, indent
, "Track enabled\n" );
522 lsmash_ifprintf( fp
, indent
, "Track disabled\n" );
523 if( tkhd
->flags
& ISOM_TRACK_IN_MOVIE
)
524 lsmash_ifprintf( fp
, indent
, "Track in movie\n" );
525 if( tkhd
->flags
& ISOM_TRACK_IN_PREVIEW
)
526 lsmash_ifprintf( fp
, indent
, "Track in preview\n" );
527 if( file
->qt_compatible
&& (tkhd
->flags
& QT_TRACK_IN_POSTER
) )
528 lsmash_ifprintf( fp
, indent
, "Track in poster\n" );
529 lsmash_ifprintf( fp
, --indent
, "creation_time = %s", isom_mp4time2utc( tkhd
->creation_time
) );
530 lsmash_ifprintf( fp
, indent
, "modification_time = %s", isom_mp4time2utc( tkhd
->modification_time
) );
531 lsmash_ifprintf( fp
, indent
, "track_ID = %"PRIu32
"\n", tkhd
->track_ID
);
532 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", tkhd
->reserved1
);
533 if( file
&& file
->moov
&& file
->moov
->mvhd
)
534 isom_ifprintf_duration( fp
, indent
, "duration", tkhd
->duration
, file
->moov
->mvhd
->timescale
);
536 isom_ifprintf_duration( fp
, indent
, "duration", tkhd
->duration
, 0 );
537 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", tkhd
->reserved2
[0] );
538 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", tkhd
->reserved2
[1] );
539 lsmash_ifprintf( fp
, indent
, "layer = %"PRId16
"\n", tkhd
->layer
);
540 lsmash_ifprintf( fp
, indent
, "alternate_group = %"PRId16
"\n", tkhd
->alternate_group
);
541 lsmash_ifprintf( fp
, indent
, "volume = %f\n", lsmash_fixed2double( tkhd
->volume
, 8 ) );
542 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", tkhd
->reserved3
);
543 lsmash_ifprintf( fp
, indent
, "transformation matrix\n" );
544 isom_ifprintf_matrix( fp
, indent
+ 1, tkhd
->matrix
);
545 lsmash_ifprintf( fp
, indent
, "width = %f\n", lsmash_fixed2double( tkhd
->width
, 16 ) );
546 lsmash_ifprintf( fp
, indent
, "height = %f\n", lsmash_fixed2double( tkhd
->height
, 16 ) );
550 static int isom_print_tapt( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
552 return isom_print_simple( fp
, box
, level
, "Track Aperture Mode Dimensions Box" );
555 static int isom_print_clef( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
557 isom_clef_t
*clef
= (isom_clef_t
*)box
;
559 isom_print_box_common( fp
, indent
++, box
, "Track Clean Aperture Dimensions Box" );
560 lsmash_ifprintf( fp
, indent
, "width = %f\n", lsmash_fixed2double( clef
->width
, 16 ) );
561 lsmash_ifprintf( fp
, indent
, "height = %f\n", lsmash_fixed2double( clef
->height
, 16 ) );
565 static int isom_print_prof( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
567 isom_prof_t
*prof
= (isom_prof_t
*)box
;
569 isom_print_box_common( fp
, indent
++, box
, "Track Production Aperture Dimensions Box" );
570 lsmash_ifprintf( fp
, indent
, "width = %f\n", lsmash_fixed2double( prof
->width
, 16 ) );
571 lsmash_ifprintf( fp
, indent
, "height = %f\n", lsmash_fixed2double( prof
->height
, 16 ) );
575 static int isom_print_enof( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
577 isom_enof_t
*enof
= (isom_enof_t
*)box
;
579 isom_print_box_common( fp
, indent
++, box
, "Track Encoded Pixels Dimensions Box" );
580 lsmash_ifprintf( fp
, indent
, "width = %f\n", lsmash_fixed2double( enof
->width
, 16 ) );
581 lsmash_ifprintf( fp
, indent
, "height = %f\n", lsmash_fixed2double( enof
->height
, 16 ) );
585 static int isom_print_edts( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
587 return isom_print_simple( fp
, box
, level
, "Edit Box" );
590 static int isom_print_elst( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
592 isom_elst_t
*elst
= (isom_elst_t
*)box
;
595 isom_print_box_common( fp
, indent
++, box
, "Edit List Box" );
596 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", elst
->list
->entry_count
);
597 for( lsmash_entry_t
*entry
= elst
->list
->head
; entry
; entry
= entry
->next
)
599 isom_elst_entry_t
*data
= (isom_elst_entry_t
*)entry
->data
;
600 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
601 lsmash_ifprintf( fp
, indent
, "segment_duration = %"PRIu64
"\n", data
->segment_duration
);
602 lsmash_ifprintf( fp
, indent
, "media_time = %"PRId64
"\n", data
->media_time
);
603 lsmash_ifprintf( fp
, indent
--, "media_rate = %f\n", lsmash_fixed2double( data
->media_rate
, 16 ) );
608 static int isom_print_tref( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
610 return isom_print_simple( fp
, box
, level
, "Track Reference Box" );
613 static int isom_print_track_reference_type( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
615 isom_tref_type_t
*ref
= (isom_tref_type_t
*)box
;
617 isom_print_box_common( fp
, indent
++, box
, "Track Reference Type Box" );
618 for( uint32_t i
= 0; i
< ref
->ref_count
; i
++ )
619 lsmash_ifprintf( fp
, indent
, "track_ID[%"PRIu32
"] = %"PRIu32
"\n", i
, ref
->track_ID
[i
] );
623 static int isom_print_mdia( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
625 return isom_print_simple( fp
, box
, level
, "Media Box" );
628 static int isom_print_mdhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
630 isom_mdhd_t
*mdhd
= (isom_mdhd_t
*)box
;
632 isom_print_box_common( fp
, indent
++, box
, "Media Header Box" );
633 lsmash_ifprintf( fp
, indent
, "creation_time = %s", isom_mp4time2utc( mdhd
->creation_time
) );
634 lsmash_ifprintf( fp
, indent
, "modification_time = %s", isom_mp4time2utc( mdhd
->modification_time
) );
635 lsmash_ifprintf( fp
, indent
, "timescale = %"PRIu32
"\n", mdhd
->timescale
);
636 isom_ifprintf_duration( fp
, indent
, "duration", mdhd
->duration
, mdhd
->timescale
);
637 if( mdhd
->language
>= 0x800 )
638 lsmash_ifprintf( fp
, indent
, "language = %s\n", isom_unpack_iso_language( mdhd
->language
) );
640 lsmash_ifprintf( fp
, indent
, "language = %"PRIu16
"\n", mdhd
->language
);
641 if( file
->qt_compatible
)
642 lsmash_ifprintf( fp
, indent
, "quality = %"PRId16
"\n", mdhd
->quality
);
644 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%04"PRIx16
"\n", mdhd
->quality
);
648 static int isom_print_hdlr( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
650 isom_hdlr_t
*hdlr
= (isom_hdlr_t
*)box
;
652 char str
[hdlr
->componentName_length
+ 1];
653 memcpy( str
, hdlr
->componentName
, hdlr
->componentName_length
);
654 str
[hdlr
->componentName_length
] = 0;
655 isom_print_box_common( fp
, indent
++, box
, "Handler Reference Box" );
656 if( file
->qt_compatible
)
658 lsmash_ifprintf( fp
, indent
, "componentType = %s\n", isom_4cc2str( hdlr
->componentType
) );
659 lsmash_ifprintf( fp
, indent
, "componentSubtype = %s\n", isom_4cc2str( hdlr
->componentSubtype
) );
660 lsmash_ifprintf( fp
, indent
, "componentManufacturer = %s\n", isom_4cc2str( hdlr
->componentManufacturer
) );
661 lsmash_ifprintf( fp
, indent
, "componentFlags = 0x%08"PRIx32
"\n", hdlr
->componentFlags
);
662 lsmash_ifprintf( fp
, indent
, "componentFlagsMask = 0x%08"PRIx32
"\n", hdlr
->componentFlagsMask
);
663 if( hdlr
->componentName_length
)
664 lsmash_ifprintf( fp
, indent
, "componentName = %s\n", &str
[1] );
666 lsmash_ifprintf( fp
, indent
, "componentName = \n" );
670 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", hdlr
->componentType
);
671 lsmash_ifprintf( fp
, indent
, "handler_type = %s\n", isom_4cc2str( hdlr
->componentSubtype
) );
672 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", hdlr
->componentManufacturer
);
673 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", hdlr
->componentFlags
);
674 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", hdlr
->componentFlagsMask
);
675 lsmash_ifprintf( fp
, indent
, "name = %s\n", str
);
680 static int isom_print_minf( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
682 return isom_print_simple( fp
, box
, level
, "Media Information Box" );
685 static int isom_print_vmhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
687 isom_vmhd_t
*vmhd
= (isom_vmhd_t
*)box
;
689 isom_print_box_common( fp
, indent
++, box
, "Video Media Header Box" );
690 lsmash_ifprintf( fp
, indent
, "graphicsmode = %"PRIu16
"\n", vmhd
->graphicsmode
);
691 lsmash_ifprintf( fp
, indent
, "opcolor\n" );
692 isom_ifprintf_rgb_color( fp
, indent
+ 1, vmhd
->opcolor
);
696 static int isom_print_smhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
698 isom_smhd_t
*smhd
= (isom_smhd_t
*)box
;
700 isom_print_box_common( fp
, indent
++, box
, "Sound Media Header Box" );
701 lsmash_ifprintf( fp
, indent
, "balance = %f\n", lsmash_fixed2double( smhd
->balance
, 8 ) );
702 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", smhd
->reserved
);
706 static int isom_print_hmhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
708 isom_hmhd_t
*hmhd
= (isom_hmhd_t
*)box
;
710 isom_print_box_common( fp
, indent
++, box
, "Hint Media Header Box" );
711 lsmash_ifprintf( fp
, indent
, "maxPDUsize = %"PRIu16
"\n", hmhd
->maxPDUsize
);
712 lsmash_ifprintf( fp
, indent
, "avgPDUsize = %"PRIu16
"\n", hmhd
->avgPDUsize
);
713 lsmash_ifprintf( fp
, indent
, "maxbitrate = %"PRIu32
"\n", hmhd
->maxbitrate
);
714 lsmash_ifprintf( fp
, indent
, "avgbitrate = %"PRIu32
"\n", hmhd
->avgbitrate
);
715 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", hmhd
->reserved
);
719 static int isom_print_nmhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
721 isom_print_box_common( fp
, level
, box
, "Null Media Header Box" );
725 static int isom_print_gmhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
727 return isom_print_simple( fp
, box
, level
, "Generic Media Information Header Box" );
730 static int isom_print_gmin( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
732 isom_gmin_t
*gmin
= (isom_gmin_t
*)box
;
734 isom_print_box_common( fp
, indent
++, box
, "Generic Media Information Box" );
735 lsmash_ifprintf( fp
, indent
, "graphicsmode = %"PRIu16
"\n", gmin
->graphicsmode
);
736 lsmash_ifprintf( fp
, indent
, "opcolor\n" );
737 isom_ifprintf_rgb_color( fp
, indent
+ 1, gmin
->opcolor
);
738 lsmash_ifprintf( fp
, indent
, "balance = %f\n", lsmash_fixed2double( gmin
->balance
, 8 ) );
739 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", gmin
->reserved
);
743 static int isom_print_text( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
745 isom_text_t
*text
= (isom_text_t
*)box
;
747 isom_print_box_common( fp
, indent
++, box
, "Text Media Information Box" );
748 lsmash_ifprintf( fp
, indent
, "Unknown matrix\n" );
749 isom_ifprintf_matrix( fp
, indent
+ 1, text
->matrix
);
753 static int isom_print_dinf( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
755 return isom_print_simple( fp
, box
, level
, "Data Information Box" );
758 static int isom_print_dref( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
760 isom_dref_t
*dref
= (isom_dref_t
*)box
;
762 isom_print_box_common( fp
, indent
++, box
, "Data Reference Box" );
763 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu16
"\n", dref
->list
.entry_count
);
767 static int isom_print_url( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
769 isom_dref_entry_t
*url
= (isom_dref_entry_t
*)box
;
771 isom_print_box_common( fp
, indent
++, box
, "Data Entry Url Box" );
772 if( url
->flags
& 0x000001 )
773 lsmash_ifprintf( fp
, indent
, "location = in the same file\n" );
775 lsmash_ifprintf( fp
, indent
, "location = %s\n", url
->location
);
779 static int isom_print_stbl( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
781 return isom_print_simple( fp
, box
, level
, "Sample Table Box" );
784 static int isom_print_stsd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
786 isom_stsd_t
*stsd
= (isom_stsd_t
*)box
;
788 isom_print_box_common( fp
, indent
++, box
, "Sample Description Box" );
789 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", stsd
->entry_count
);
793 static int isom_print_visual_description( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
795 isom_visual_entry_t
*visual
= (isom_visual_entry_t
*)box
;
797 lsmash_ifprintf( fp
, indent
++, "[%s: Visual Description]\n", isom_4cc2str( visual
->type
.fourcc
) );
798 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", visual
->pos
);
799 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", visual
->size
);
800 isom_ifprintf_sample_description_common_reserved( fp
, indent
, visual
->reserved
);
801 lsmash_ifprintf( fp
, indent
, "data_reference_index = %"PRIu16
"\n", visual
->data_reference_index
);
802 if( file
->qt_compatible
)
804 lsmash_ifprintf( fp
, indent
, "version = %"PRId16
"\n", visual
->version
);
805 lsmash_ifprintf( fp
, indent
, "revision_level = %"PRId16
"\n", visual
->revision_level
);
806 lsmash_ifprintf( fp
, indent
, "vendor = %s\n", isom_4cc2str( visual
->vendor
) );
807 lsmash_ifprintf( fp
, indent
, "temporalQuality = %"PRIu32
"\n", visual
->temporalQuality
);
808 lsmash_ifprintf( fp
, indent
, "spatialQuality = %"PRIu32
"\n", visual
->spatialQuality
);
809 lsmash_ifprintf( fp
, indent
, "width = %"PRIu16
"\n", visual
->width
);
810 lsmash_ifprintf( fp
, indent
, "height = %"PRIu16
"\n", visual
->height
);
811 lsmash_ifprintf( fp
, indent
, "horizresolution = %f\n", lsmash_fixed2double( visual
->horizresolution
, 16 ) );
812 lsmash_ifprintf( fp
, indent
, "vertresolution = %f\n", lsmash_fixed2double( visual
->vertresolution
, 16 ) );
813 lsmash_ifprintf( fp
, indent
, "dataSize = %"PRIu32
"\n", visual
->dataSize
);
814 lsmash_ifprintf( fp
, indent
, "frame_count = %"PRIu16
"\n", visual
->frame_count
);
815 lsmash_ifprintf( fp
, indent
, "compressorname_length = %"PRIu8
"\n", visual
->compressorname
[0] );
816 lsmash_ifprintf( fp
, indent
, "compressorname = %s\n", visual
->compressorname
+ 1 );
817 lsmash_ifprintf( fp
, indent
, "depth = 0x%04"PRIx16
, visual
->depth
);
818 if( visual
->depth
== 32 )
819 fprintf( fp
, " (colour with alpha)\n" );
820 else if( visual
->depth
>= 33 && visual
->depth
<= 40 )
821 fprintf( fp
, " (grayscale with no alpha)\n" );
824 lsmash_ifprintf( fp
, indent
, "color_table_ID = %"PRId16
"\n", visual
->color_table_ID
);
825 if( visual
->color_table_ID
== 0 )
826 isom_pring_qt_color_table( fp
, indent
, &visual
->color_table
);
830 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%04"PRIx16
"\n", visual
->version
);
831 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", visual
->revision_level
);
832 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", visual
->vendor
);
833 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", visual
->temporalQuality
);
834 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%08"PRIx32
"\n", visual
->spatialQuality
);
835 lsmash_ifprintf( fp
, indent
, "width = %"PRIu16
"\n", visual
->width
);
836 lsmash_ifprintf( fp
, indent
, "height = %"PRIu16
"\n", visual
->height
);
837 lsmash_ifprintf( fp
, indent
, "horizresolution = %f\n", lsmash_fixed2double( visual
->horizresolution
, 16 ) );
838 lsmash_ifprintf( fp
, indent
, "vertresolution = %f\n", lsmash_fixed2double( visual
->vertresolution
, 16 ) );
839 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", visual
->dataSize
);
840 lsmash_ifprintf( fp
, indent
, "frame_count = %"PRIu16
"\n", visual
->frame_count
);
841 lsmash_ifprintf( fp
, indent
, "compressorname_length = %"PRIu8
"\n", visual
->compressorname
[0] );
842 lsmash_ifprintf( fp
, indent
, "compressorname = %s\n", visual
->compressorname
+ 1 );
843 lsmash_ifprintf( fp
, indent
, "depth = 0x%04"PRIx16
, visual
->depth
);
844 if( visual
->depth
== 0x0018 )
845 fprintf( fp
, " (colour with no alpha)\n" );
846 else if( visual
->depth
== 0x0028 )
847 fprintf( fp
, " (grayscale with no alpha)\n" );
848 else if( visual
->depth
== 0x0020 )
849 fprintf( fp
, " (gray or colour with alpha)\n" );
852 lsmash_ifprintf( fp
, indent
, "pre_defined = 0x%04"PRIx16
"\n", visual
->color_table_ID
);
857 static int isom_print_glbl( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
859 isom_glbl_t
*glbl
= (isom_glbl_t
*)box
;
861 isom_print_box_common( fp
, indent
++, box
, "Global Header Box" );
862 if( glbl
->header_data
)
864 lsmash_ifprintf( fp
, indent
, "global_header[]\n" );
865 for( uint32_t i
= 0; i
< glbl
->header_size
; i
+= 8 )
867 lsmash_ifprintf( fp
, indent
+ 1, "" );
868 for( uint32_t j
= 0; ; j
++ )
869 if( j
== 7 || (i
+ j
== glbl
->header_size
- 1) )
871 fprintf( fp
, "0x%02"PRIx8
"\n", glbl
->header_data
[i
+ j
] );
875 fprintf( fp
, "0x%02"PRIx8
" ", glbl
->header_data
[i
+ j
] );
881 static int isom_print_clap( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
883 isom_clap_t
*clap
= (isom_clap_t
*)box
;
885 isom_print_box_common( fp
, indent
++, box
, "Clean Aperture Box" );
886 lsmash_ifprintf( fp
, indent
, "cleanApertureWidthN = %"PRIu32
"\n", clap
->cleanApertureWidthN
);
887 lsmash_ifprintf( fp
, indent
, "cleanApertureWidthD = %"PRIu32
"\n", clap
->cleanApertureWidthD
);
888 lsmash_ifprintf( fp
, indent
, "cleanApertureHeightN = %"PRIu32
"\n", clap
->cleanApertureHeightN
);
889 lsmash_ifprintf( fp
, indent
, "cleanApertureHeightD = %"PRIu32
"\n", clap
->cleanApertureHeightD
);
890 lsmash_ifprintf( fp
, indent
, "horizOffN = %"PRId32
"\n", clap
->horizOffN
);
891 lsmash_ifprintf( fp
, indent
, "horizOffD = %"PRIu32
"\n", clap
->horizOffD
);
892 lsmash_ifprintf( fp
, indent
, "vertOffN = %"PRId32
"\n", clap
->vertOffN
);
893 lsmash_ifprintf( fp
, indent
, "vertOffD = %"PRIu32
"\n", clap
->vertOffD
);
897 static int isom_print_pasp( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
899 isom_pasp_t
*pasp
= (isom_pasp_t
*)box
;
901 isom_print_box_common( fp
, indent
++, box
, "Pixel Aspect Ratio Box" );
902 lsmash_ifprintf( fp
, indent
, "hSpacing = %"PRIu32
"\n", pasp
->hSpacing
);
903 lsmash_ifprintf( fp
, indent
, "vSpacing = %"PRIu32
"\n", pasp
->vSpacing
);
907 static int isom_print_colr( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
909 isom_colr_t
*colr
= (isom_colr_t
*)box
;
911 isom_print_box_common( fp
, indent
++, box
, colr
->manager
& LSMASH_QTFF_BASE
? "Color Parameter Box" : "Colour Information Box" );
912 lsmash_ifprintf( fp
, indent
, "color_parameter_type = %s\n", isom_4cc2str( colr
->color_parameter_type
) );
913 if( colr
->color_parameter_type
== QT_COLOR_PARAMETER_TYPE_NCLC
914 || colr
->color_parameter_type
== ISOM_COLOR_PARAMETER_TYPE_NCLX
)
916 lsmash_ifprintf( fp
, indent
, "primaries_index = %"PRIu16
"\n", colr
->primaries_index
);
917 lsmash_ifprintf( fp
, indent
, "transfer_function_index = %"PRIu16
"\n", colr
->transfer_function_index
);
918 lsmash_ifprintf( fp
, indent
, "matrix_index = %"PRIu16
"\n", colr
->matrix_index
);
919 if( colr
->color_parameter_type
== ISOM_COLOR_PARAMETER_TYPE_NCLX
)
921 if( colr
->manager
& LSMASH_INCOMPLETE_BOX
)
923 lsmash_ifprintf( fp
, indent
, "full_range_flag = N/A\n" );
924 lsmash_ifprintf( fp
, indent
, "reserved = N/A\n" );
928 lsmash_ifprintf( fp
, indent
, "full_range_flag = %"PRIu8
"\n", colr
->full_range_flag
);
929 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx8
"\n", colr
->reserved
);
936 static int isom_print_gama( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
938 isom_gama_t
*gama
= (isom_gama_t
*)box
;
940 isom_print_box_common( fp
, indent
++, box
, "Gamma Level Box" );
941 if( gama
->level
== 0x00023333 )
942 lsmash_ifprintf( fp
, indent
, "level = 2.2 (standard television video gamma)\n" );
945 lsmash_ifprintf( fp
, indent
, "level = %f", lsmash_fixed2double( gama
->level
, 16 ) );
946 if( gama
->level
== 0 )
947 fprintf( fp
, " (platform's standard gamma)" );
948 else if( gama
->level
== 0xffffffff )
949 fprintf( fp
, " (no gamma-correction)" );
955 static int isom_print_fiel( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
957 isom_fiel_t
*fiel
= (isom_fiel_t
*)box
;
959 isom_print_box_common( fp
, indent
++, box
, "Field/Frame Information Box" );
960 lsmash_ifprintf( fp
, indent
, "fields = %"PRIu8
" (%s)\n", fiel
->fields
, fiel
->fields
> 1 ? "interlaced" : "progressive scan" );
961 lsmash_ifprintf( fp
, indent
, "detail = %"PRIu8
, fiel
->detail
);
962 if( fiel
->fields
> 1 )
964 static const char *field_orderings
[5] =
965 { "unknown", "temporal top first", "temporal bottom first", "spatial first line early", "spatial first line late" };
967 if( fiel
->fields
== 2 )
969 if( fiel
->detail
== QT_FIELD_ORDERINGS_TEMPORAL_TOP_FIRST
)
971 else if( fiel
->detail
== QT_FIELD_ORDERINGS_TEMPORAL_BOTTOM_FIRST
)
973 else if( fiel
->detail
== QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_EARLY
)
975 else if( fiel
->detail
== QT_FIELD_ORDERINGS_SPATIAL_FIRST_LINE_LATE
)
978 fprintf( fp
, " (%s)\n", field_orderings
[ordering
] );
985 static int isom_print_cspc( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
987 isom_cspc_t
*cspc
= (isom_cspc_t
*)box
;
989 isom_print_box_common( fp
, indent
++, box
, "Colorspace Box" );
992 lsmash_qt_pixel_format pixel_format
;
994 } unprintable_pixel_format_table
[] =
996 { QT_PIXEL_FORMAT_TYPE_1_MONOCHROME
, "1 bit indexed" },
997 { QT_PIXEL_FORMAT_TYPE_2_INDEXED
, "2 bit indexed" },
998 { QT_PIXEL_FORMAT_TYPE_4_INDEXED
, "4 bit indexed" },
999 { QT_PIXEL_FORMAT_TYPE_8_INDEXED
, "8 bit indexed" },
1000 { QT_PIXEL_FORMAT_TYPE_1_INDEXED_GRAY_WHITE_IS_ZERO
, "1 bit indexed gray, white is zero" },
1001 { QT_PIXEL_FORMAT_TYPE_2_INDEXED_GRAY_WHITE_IS_ZERO
, "2 bit indexed gray, white is zero" },
1002 { QT_PIXEL_FORMAT_TYPE_4_INDEXED_GRAY_WHITE_IS_ZERO
, "4 bit indexed gray, white is zero" },
1003 { QT_PIXEL_FORMAT_TYPE_8_INDEXED_GRAY_WHITE_IS_ZERO
, "8 bit indexed gray, white is zero" },
1004 { QT_PIXEL_FORMAT_TYPE_16BE555
, "16 bit BE RGB 555" },
1005 { QT_PIXEL_FORMAT_TYPE_24RGB
, "24 bit RGB" },
1006 { QT_PIXEL_FORMAT_TYPE_32ARGB
, "32 bit ARGB" },
1009 for( int i
= 0; unprintable_pixel_format_table
[i
].pixel_format
; i
++ )
1010 if( cspc
->pixel_format
== unprintable_pixel_format_table
[i
].pixel_format
)
1012 lsmash_ifprintf( fp
, indent
, "pixel_format = 0x%08"PRIx32
" (%s)\n", cspc
->pixel_format
, unprintable_pixel_format_table
[i
].description
);
1015 lsmash_ifprintf( fp
, indent
, "pixel_format = %s\n", isom_4cc2str( cspc
->pixel_format
) );
1019 static int isom_print_sgbt( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1021 isom_sgbt_t
*sgbt
= (isom_sgbt_t
*)box
;
1023 isom_print_box_common( fp
, indent
++, box
, "Significant Bits Box" );
1024 lsmash_ifprintf( fp
, indent
, "significantBits = %"PRIu8
"\n", sgbt
->significantBits
);
1028 static int isom_print_stsl( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1030 isom_stsl_t
*stsl
= (isom_stsl_t
*)box
;
1032 isom_print_box_common( fp
, indent
++, box
, "Sample Scale Box" );
1033 lsmash_ifprintf( fp
, indent
, "constraint_flag = %s\n", (stsl
->constraint_flag
& 0x01) ? "on" : "off" );
1034 lsmash_ifprintf( fp
, indent
, "scale_method = " );
1035 if( stsl
->scale_method
== ISOM_SCALE_METHOD_FILL
)
1036 fprintf( fp
, "'fill'\n" );
1037 else if( stsl
->scale_method
== ISOM_SCALE_METHOD_HIDDEN
)
1038 fprintf( fp
, "'hidden'\n" );
1039 else if( stsl
->scale_method
== ISOM_SCALE_METHOD_MEET
)
1040 fprintf( fp
, "'meet'\n" );
1041 else if( stsl
->scale_method
== ISOM_SCALE_METHOD_SLICE_X
)
1042 fprintf( fp
, "'slice' in the x-coodinate\n" );
1043 else if( stsl
->scale_method
== ISOM_SCALE_METHOD_SLICE_Y
)
1044 fprintf( fp
, "'slice' in the y-coodinate\n" );
1045 lsmash_ifprintf( fp
, indent
, "display_center_x = %"PRIu16
"\n", stsl
->display_center_x
);
1046 lsmash_ifprintf( fp
, indent
, "display_center_y = %"PRIu16
"\n", stsl
->display_center_y
);
1050 static int isom_print_audio_description( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1052 isom_audio_entry_t
*audio
= (isom_audio_entry_t
*)box
;
1054 lsmash_ifprintf( fp
, indent
++, "[%s: Audio Description]\n", isom_4cc2str( audio
->type
.fourcc
) );
1055 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", audio
->pos
);
1056 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", audio
->size
);
1057 isom_ifprintf_sample_description_common_reserved( fp
, indent
, audio
->reserved
);
1058 lsmash_ifprintf( fp
, indent
, "data_reference_index = %"PRIu16
"\n", audio
->data_reference_index
);
1059 if( file
->qt_compatible
)
1061 lsmash_ifprintf( fp
, indent
, "version = %"PRId16
"\n", audio
->version
);
1062 lsmash_ifprintf( fp
, indent
, "revision_level = %"PRId16
"\n", audio
->revision_level
);
1063 lsmash_ifprintf( fp
, indent
, "vendor = %s\n", isom_4cc2str( audio
->vendor
) );
1064 lsmash_ifprintf( fp
, indent
, "channelcount = %"PRIu16
"\n", audio
->channelcount
);
1065 lsmash_ifprintf( fp
, indent
, "samplesize = %"PRIu16
"\n", audio
->samplesize
);
1066 lsmash_ifprintf( fp
, indent
, "compression_ID = %"PRId16
"\n", audio
->compression_ID
);
1067 lsmash_ifprintf( fp
, indent
, "packet_size = %"PRIu16
"\n", audio
->packet_size
);
1071 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", audio
->version
);
1072 lsmash_ifprintf( fp
, indent
, "reserved = 0x%04"PRIx16
"\n", audio
->revision_level
);
1073 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", audio
->vendor
);
1074 lsmash_ifprintf( fp
, indent
, "channelcount = %"PRIu16
"\n", audio
->channelcount
);
1075 lsmash_ifprintf( fp
, indent
, "samplesize = %"PRIu16
"\n", audio
->samplesize
);
1076 lsmash_ifprintf( fp
, indent
, "pre_defined = %"PRId16
"\n", audio
->compression_ID
);
1077 lsmash_ifprintf( fp
, indent
, "reserved = %"PRIu16
"\n", audio
->packet_size
);
1079 lsmash_ifprintf( fp
, indent
, "samplerate = %f\n", lsmash_fixed2double( audio
->samplerate
, 16 ) );
1080 if( audio
->version
== 1 && (audio
->manager
& LSMASH_QTFF_BASE
) )
1082 lsmash_ifprintf( fp
, indent
, "samplesPerPacket = %"PRIu32
"\n", audio
->samplesPerPacket
);
1083 lsmash_ifprintf( fp
, indent
, "bytesPerPacket = %"PRIu32
"\n", audio
->bytesPerPacket
);
1084 lsmash_ifprintf( fp
, indent
, "bytesPerFrame = %"PRIu32
"\n", audio
->bytesPerFrame
);
1085 lsmash_ifprintf( fp
, indent
, "bytesPerSample = %"PRIu32
"\n", audio
->bytesPerSample
);
1087 else if( audio
->version
== 2 )
1089 lsmash_ifprintf( fp
, indent
, "sizeOfStructOnly = %"PRIu32
"\n", audio
->sizeOfStructOnly
);
1090 lsmash_ifprintf( fp
, indent
, "audioSampleRate = %lf\n", lsmash_int2float64( audio
->audioSampleRate
) );
1091 lsmash_ifprintf( fp
, indent
, "numAudioChannels = %"PRIu32
"\n", audio
->numAudioChannels
);
1092 lsmash_ifprintf( fp
, indent
, "always7F000000 = 0x%08"PRIx32
"\n", audio
->always7F000000
);
1093 lsmash_ifprintf( fp
, indent
, "constBitsPerChannel = %"PRIu32
"\n", audio
->constBitsPerChannel
);
1094 lsmash_ifprintf( fp
, indent
++, "formatSpecificFlags = 0x%08"PRIx32
"\n", audio
->formatSpecificFlags
);
1095 if( isom_is_lpcm_audio( audio
) )
1097 lsmash_ifprintf( fp
, indent
, "sample format: " );
1098 if( audio
->formatSpecificFlags
& QT_LPCM_FORMAT_FLAG_FLOAT
)
1099 fprintf( fp
, "floating point\n" );
1102 fprintf( fp
, "integer\n" );
1103 lsmash_ifprintf( fp
, indent
, "signedness: " );
1104 fprintf( fp
, audio
->formatSpecificFlags
& QT_LPCM_FORMAT_FLAG_SIGNED_INTEGER
? "signed\n" : "unsigned\n" );
1106 if( audio
->constBytesPerAudioPacket
!= 1 )
1108 lsmash_ifprintf( fp
, indent
, "endianness: " );
1109 fprintf( fp
, audio
->formatSpecificFlags
& QT_LPCM_FORMAT_FLAG_BIG_ENDIAN
? "big\n" : "little\n" );
1111 lsmash_ifprintf( fp
, indent
, "packed: " );
1112 if( audio
->formatSpecificFlags
& QT_LPCM_FORMAT_FLAG_PACKED
)
1113 fprintf( fp
, "yes\n" );
1116 fprintf( fp
, "no\n" );
1117 lsmash_ifprintf( fp
, indent
, "alignment: " );
1118 fprintf( fp
, audio
->formatSpecificFlags
& QT_LPCM_FORMAT_FLAG_ALIGNED_HIGH
? "high\n" : "low\n" );
1120 if( audio
->numAudioChannels
> 1 )
1122 lsmash_ifprintf( fp
, indent
, "interleved: " );
1123 fprintf( fp
, audio
->formatSpecificFlags
& QT_LPCM_FORMAT_FLAG_NON_INTERLEAVED
? "no\n" : "yes\n" );
1126 lsmash_ifprintf( fp
, --indent
, "constBytesPerAudioPacket = %"PRIu32
"\n", audio
->constBytesPerAudioPacket
);
1127 lsmash_ifprintf( fp
, indent
, "constLPCMFramesPerAudioPacket = %"PRIu32
"\n", audio
->constLPCMFramesPerAudioPacket
);
1132 static int isom_print_wave( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1134 return isom_print_simple( fp
, box
, level
, "Sound Information Decompression Parameters Box" );
1137 static int isom_print_frma( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1139 isom_frma_t
*frma
= (isom_frma_t
*)box
;
1141 isom_print_box_common( fp
, indent
++, box
, "Format Box" );
1142 lsmash_ifprintf( fp
, indent
, "data_format = %s\n", isom_4cc2str( frma
->data_format
) );
1146 static int isom_print_enda( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1148 isom_enda_t
*enda
= (isom_enda_t
*)box
;
1150 isom_print_box_common( fp
, indent
++, box
, "Audio Endian Box" );
1151 lsmash_ifprintf( fp
, indent
, "littleEndian = %s\n", enda
->littleEndian
? "yes" : "no" );
1155 static int isom_print_terminator( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1157 isom_terminator_t
*terminator
= (isom_terminator_t
*)box
;
1159 lsmash_ifprintf( fp
, indent
++, "[0x00000000: Terminator Box]\n" );
1160 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", terminator
->pos
);
1161 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", terminator
->size
);
1165 static int isom_print_chan( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1167 isom_chan_t
*chan
= (isom_chan_t
*)box
;
1169 isom_print_box_common( fp
, indent
++, box
, "Audio Channel Layout Box" );
1170 lsmash_ifprintf( fp
, indent
, "channelLayoutTag = 0x%08"PRIx32
"\n", chan
->channelLayoutTag
);
1171 lsmash_ifprintf( fp
, indent
, "channelBitmap = 0x%08"PRIx32
"\n", chan
->channelBitmap
);
1172 lsmash_ifprintf( fp
, indent
, "numberChannelDescriptions = %"PRIu32
"\n", chan
->numberChannelDescriptions
);
1173 if( chan
->numberChannelDescriptions
)
1175 isom_channel_description_t
*desc
= chan
->channelDescriptions
;
1176 for( uint32_t i
= 0; i
< chan
->numberChannelDescriptions
; i
++ )
1178 lsmash_ifprintf( fp
, indent
++, "ChannelDescriptions[%"PRIu32
"]\n", i
);
1179 lsmash_ifprintf( fp
, indent
, "channelLabel = 0x%08"PRIx32
"\n", desc
->channelLabel
);
1180 lsmash_ifprintf( fp
, indent
, "channelFlags = 0x%08"PRIx32
"\n", desc
->channelFlags
);
1181 for( int j
= 0; j
< 3; j
++ )
1182 lsmash_ifprintf( fp
, indent
, "coordinates[%d] = %f\n", j
, lsmash_int2float32( desc
->coordinates
[j
] ) );
1189 static int isom_print_srat( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1191 isom_srat_t
*srat
= (isom_srat_t
*)box
;
1193 isom_print_box_common( fp
, indent
++, box
, "Sampling Rate Box" );
1194 lsmash_ifprintf( fp
, indent
, "sampling_rate = %"PRIu32
"\n", srat
->sampling_rate
);
1198 static int isom_print_text_description( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1200 isom_qt_text_entry_t
*text
= (isom_qt_text_entry_t
*)box
;
1202 lsmash_ifprintf( fp
, indent
++, "[text: QuickTime Text Description]\n" );
1203 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", text
->pos
);
1204 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", text
->size
);
1205 isom_ifprintf_sample_description_common_reserved( fp
, indent
, text
->reserved
);
1206 lsmash_ifprintf( fp
, indent
, "data_reference_index = %"PRIu16
"\n", text
->data_reference_index
);
1207 lsmash_ifprintf( fp
, indent
, "displayFlags = 0x%08"PRId32
"\n", text
->displayFlags
);
1208 lsmash_ifprintf( fp
, indent
, "textJustification = %"PRId32
"\n", text
->textJustification
);
1209 lsmash_ifprintf( fp
, indent
, "bgColor\n" );
1210 isom_ifprintf_rgb_color( fp
, indent
+ 1, text
->bgColor
);
1211 lsmash_ifprintf( fp
, indent
, "top = %"PRId16
"\n", text
->top
);
1212 lsmash_ifprintf( fp
, indent
, "left = %"PRId16
"\n", text
->left
);
1213 lsmash_ifprintf( fp
, indent
, "bottom = %"PRId16
"\n", text
->bottom
);
1214 lsmash_ifprintf( fp
, indent
, "right = %"PRId16
"\n", text
->right
);
1215 lsmash_ifprintf( fp
, indent
, "scrpStartChar = %"PRId32
"\n", text
->scrpStartChar
);
1216 lsmash_ifprintf( fp
, indent
, "scrpHeight = %"PRId16
"\n", text
->scrpHeight
);
1217 lsmash_ifprintf( fp
, indent
, "scrpAscent = %"PRId16
"\n", text
->scrpAscent
);
1218 lsmash_ifprintf( fp
, indent
, "scrpFont = %"PRId16
"\n", text
->scrpFont
);
1219 lsmash_ifprintf( fp
, indent
, "scrpFace = %"PRIu16
"\n", text
->scrpFace
);
1220 lsmash_ifprintf( fp
, indent
, "scrpSize = %"PRId16
"\n", text
->scrpSize
);
1221 lsmash_ifprintf( fp
, indent
, "scrpColor\n" );
1222 isom_ifprintf_rgb_color( fp
, indent
+ 1, text
->scrpColor
);
1223 if( text
->font_name_length
)
1224 lsmash_ifprintf( fp
, indent
, "font_name = %s\n", text
->font_name
);
1228 static int isom_print_tx3g_description( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1230 isom_tx3g_entry_t
*tx3g
= (isom_tx3g_entry_t
*)box
;
1232 lsmash_ifprintf( fp
, indent
++, "[tx3g: Timed Text Description]\n" );
1233 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", tx3g
->pos
);
1234 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", tx3g
->size
);
1235 isom_ifprintf_sample_description_common_reserved( fp
, indent
, tx3g
->reserved
);
1236 lsmash_ifprintf( fp
, indent
, "data_reference_index = %"PRIu16
"\n", tx3g
->data_reference_index
);
1237 lsmash_ifprintf( fp
, indent
, "displayFlags = 0x%08"PRId32
"\n", tx3g
->displayFlags
);
1238 lsmash_ifprintf( fp
, indent
, "horizontal_justification = %"PRId8
"\n", tx3g
->horizontal_justification
);
1239 lsmash_ifprintf( fp
, indent
, "vertical_justification = %"PRId8
"\n", tx3g
->vertical_justification
);
1240 lsmash_ifprintf( fp
, indent
, "background_color_rgba\n" );
1241 isom_ifprintf_rgba_color( fp
, indent
+ 1, tx3g
->background_color_rgba
);
1242 lsmash_ifprintf( fp
, indent
, "top = %"PRId16
"\n", tx3g
->top
);
1243 lsmash_ifprintf( fp
, indent
, "left = %"PRId16
"\n", tx3g
->left
);
1244 lsmash_ifprintf( fp
, indent
, "bottom = %"PRId16
"\n", tx3g
->bottom
);
1245 lsmash_ifprintf( fp
, indent
, "right = %"PRId16
"\n", tx3g
->right
);
1246 lsmash_ifprintf( fp
, indent
, "startChar = %"PRIu16
"\n", tx3g
->startChar
);
1247 lsmash_ifprintf( fp
, indent
, "endChar = %"PRIu16
"\n", tx3g
->endChar
);
1248 lsmash_ifprintf( fp
, indent
, "font_ID = %"PRIu16
"\n", tx3g
->font_ID
);
1249 lsmash_ifprintf( fp
, indent
, "face_style_flags = %"PRIu8
"\n", tx3g
->face_style_flags
);
1250 lsmash_ifprintf( fp
, indent
, "font_size = %"PRIu8
"\n", tx3g
->font_size
);
1251 lsmash_ifprintf( fp
, indent
, "text_color_rgba\n" );
1252 isom_ifprintf_rgba_color( fp
, indent
+ 1, tx3g
->text_color_rgba
);
1256 static int isom_print_ftab( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1258 if( !((isom_ftab_t
*)box
)->list
)
1260 isom_ftab_t
*ftab
= (isom_ftab_t
*)box
;
1263 isom_print_box_common( fp
, indent
++, box
, "Font Table Box" );
1264 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu16
"\n", ftab
->list
->entry_count
);
1265 for( lsmash_entry_t
*entry
= ftab
->list
->head
; entry
; entry
= entry
->next
)
1267 isom_font_record_t
*data
= (isom_font_record_t
*)entry
->data
;
1268 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu16
"]\n", i
++ );
1269 lsmash_ifprintf( fp
, indent
, "font_ID = %"PRIu16
"\n", data
->font_ID
);
1270 if( data
->font_name_length
)
1271 lsmash_ifprintf( fp
, indent
, "font_name = %s\n", data
->font_name
);
1277 static int isom_print_mp4s_description( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1279 isom_mp4s_entry_t
*mp4s
= (isom_mp4s_entry_t
*)box
;
1281 lsmash_ifprintf( fp
, indent
++, "[%s: MPEG-4 Systems Description]\n", isom_4cc2str( mp4s
->type
.fourcc
) );
1282 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", mp4s
->pos
);
1283 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", mp4s
->size
);
1284 isom_ifprintf_sample_description_common_reserved( fp
, indent
, mp4s
->reserved
);
1285 lsmash_ifprintf( fp
, indent
, "data_reference_index = %"PRIu16
"\n", mp4s
->data_reference_index
);
1289 static int isom_print_sample_description_extesion( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1291 extern int mp4sys_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1292 extern int h264_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1293 extern int hevc_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1294 extern int h264_print_bitrate( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1295 extern int vc1_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1296 extern int ac3_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1297 extern int eac3_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1298 extern int dts_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1299 extern int alac_print_codec_specific( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1300 static struct print_description_extension_table_tag
1302 lsmash_box_type_t type
;
1303 int (*print_func
)( FILE *, lsmash_file_t
*, isom_box_t
*, int );
1304 } print_description_extension_table
[32] = { { LSMASH_BOX_TYPE_INITIALIZER
, NULL
} };
1305 if( !print_description_extension_table
[0].print_func
)
1307 /* Initialize the table. */
1309 #define ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( type, func ) \
1310 print_description_extension_table[i++] = (struct print_description_extension_table_tag){ type, func }
1311 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_CLAP
, isom_print_clap
);
1312 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_PASP
, isom_print_pasp
);
1313 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_STSL
, isom_print_stsl
);
1314 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_COLR
, isom_print_colr
);
1315 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_COLR
, isom_print_colr
);
1316 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_GAMA
, isom_print_gama
);
1317 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_FIEL
, isom_print_fiel
);
1318 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_CSPC
, isom_print_cspc
);
1319 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_SGBT
, isom_print_sgbt
);
1320 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_CTAB
, isom_print_ctab
);
1321 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_GLBL
, isom_print_glbl
);
1322 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_WAVE
, isom_print_wave
);
1323 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_CHAN
, isom_print_chan
);
1324 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_ESDS
, mp4sys_print_codec_specific
);
1325 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_AVCC
, h264_print_codec_specific
);
1326 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_BTRT
, h264_print_bitrate
);
1327 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_HVCC
, hevc_print_codec_specific
);
1328 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_DVC1
, vc1_print_codec_specific
);
1329 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_DAC3
, ac3_print_codec_specific
);
1330 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_DEC3
, eac3_print_codec_specific
);
1331 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_DDTS
, dts_print_codec_specific
);
1332 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_ALAC
, alac_print_codec_specific
);
1333 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( ISOM_BOX_TYPE_FTAB
, isom_print_ftab
);
1334 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_ESDS
, mp4sys_print_codec_specific
);
1335 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( QT_BOX_TYPE_ALAC
, alac_print_codec_specific
);
1336 ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT( LSMASH_BOX_TYPE_UNSPECIFIED
, NULL
);
1337 #undef ADD_PRINT_DESCRIPTION_EXTENSION_TABLE_ELEMENT
1339 for( int i
= 0; print_description_extension_table
[i
].print_func
; i
++ )
1340 if( lsmash_check_box_type_identical( box
->type
, print_description_extension_table
[i
].type
) )
1341 return print_description_extension_table
[i
].print_func( fp
, file
, box
, level
);
1342 return isom_print_unknown( fp
, file
, box
, level
);
1345 static int isom_print_stts( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1347 if( !((isom_stts_t
*)box
)->list
)
1349 isom_stts_t
*stts
= (isom_stts_t
*)box
;
1352 isom_print_box_common( fp
, indent
++, box
, "Decoding Time to Sample Box" );
1353 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", stts
->list
->entry_count
);
1354 for( lsmash_entry_t
*entry
= stts
->list
->head
; entry
; entry
= entry
->next
)
1356 isom_stts_entry_t
*data
= (isom_stts_entry_t
*)entry
->data
;
1357 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1358 lsmash_ifprintf( fp
, indent
, "sample_count = %"PRIu32
"\n", data
->sample_count
);
1359 lsmash_ifprintf( fp
, indent
--, "sample_delta = %"PRIu32
"\n", data
->sample_delta
);
1364 static int isom_print_ctts( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1366 if( !((isom_ctts_t
*)box
)->list
)
1368 isom_ctts_t
*ctts
= (isom_ctts_t
*)box
;
1371 isom_print_box_common( fp
, indent
++, box
, "Composition Time to Sample Box" );
1372 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", ctts
->list
->entry_count
);
1373 if( file
->qt_compatible
|| ctts
->version
== 1 )
1374 for( lsmash_entry_t
*entry
= ctts
->list
->head
; entry
; entry
= entry
->next
)
1376 isom_ctts_entry_t
*data
= (isom_ctts_entry_t
*)entry
->data
;
1377 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1378 lsmash_ifprintf( fp
, indent
, "sample_count = %"PRIu32
"\n", data
->sample_count
);
1379 lsmash_ifprintf( fp
, indent
--, "sample_offset = %"PRId32
"\n", (union {uint32_t ui
; int32_t si
;}){ data
->sample_offset
}.si
);
1382 for( lsmash_entry_t
*entry
= ctts
->list
->head
; entry
; entry
= entry
->next
)
1384 isom_ctts_entry_t
*data
= (isom_ctts_entry_t
*)entry
->data
;
1385 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1386 lsmash_ifprintf( fp
, indent
, "sample_count = %"PRIu32
"\n", data
->sample_count
);
1387 lsmash_ifprintf( fp
, indent
--, "sample_offset = %"PRIu32
"\n", data
->sample_offset
);
1392 static int isom_print_cslg( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1394 isom_cslg_t
*cslg
= (isom_cslg_t
*)box
;
1396 if( file
->qt_compatible
)
1398 isom_print_box_common( fp
, indent
++, box
, "Composition Shift Least Greatest Box" );
1399 lsmash_ifprintf( fp
, indent
, "compositionOffsetToDTDDeltaShift = %"PRId32
"\n", cslg
->compositionToDTSShift
);
1400 lsmash_ifprintf( fp
, indent
, "leastDecodeToDisplayDelta = %"PRId32
"\n", cslg
->leastDecodeToDisplayDelta
);
1401 lsmash_ifprintf( fp
, indent
, "greatestDecodeToDisplayDelta = %"PRId32
"\n", cslg
->greatestDecodeToDisplayDelta
);
1402 lsmash_ifprintf( fp
, indent
, "displayStartTime = %"PRId32
"\n", cslg
->compositionStartTime
);
1403 lsmash_ifprintf( fp
, indent
, "displayEndTime = %"PRId32
"\n", cslg
->compositionEndTime
);
1407 isom_print_box_common( fp
, indent
++, box
, "Composition to Decode Box" );
1408 lsmash_ifprintf( fp
, indent
, "compositionToDTSShift = %"PRId32
"\n", cslg
->compositionToDTSShift
);
1409 lsmash_ifprintf( fp
, indent
, "leastDecodeToDisplayDelta = %"PRId32
"\n", cslg
->leastDecodeToDisplayDelta
);
1410 lsmash_ifprintf( fp
, indent
, "greatestDecodeToDisplayDelta = %"PRId32
"\n", cslg
->greatestDecodeToDisplayDelta
);
1411 lsmash_ifprintf( fp
, indent
, "compositionStartTime = %"PRId32
"\n", cslg
->compositionStartTime
);
1412 lsmash_ifprintf( fp
, indent
, "compositionEndTime = %"PRId32
"\n", cslg
->compositionEndTime
);
1417 static int isom_print_stss( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1419 if( !((isom_stss_t
*)box
)->list
)
1421 isom_stss_t
*stss
= (isom_stss_t
*)box
;
1424 isom_print_box_common( fp
, indent
++, box
, "Sync Sample Box" );
1425 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", stss
->list
->entry_count
);
1426 for( lsmash_entry_t
*entry
= stss
->list
->head
; entry
; entry
= entry
->next
)
1427 lsmash_ifprintf( fp
, indent
, "sample_number[%"PRIu32
"] = %"PRIu32
"\n", i
++, ((isom_stss_entry_t
*)entry
->data
)->sample_number
);
1431 static int isom_print_stps( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1433 if( !((isom_stps_t
*)box
)->list
)
1435 isom_stps_t
*stps
= (isom_stps_t
*)box
;
1438 isom_print_box_common( fp
, indent
++, box
, "Partial Sync Sample Box" );
1439 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", stps
->list
->entry_count
);
1440 for( lsmash_entry_t
*entry
= stps
->list
->head
; entry
; entry
= entry
->next
)
1441 lsmash_ifprintf( fp
, indent
, "sample_number[%"PRIu32
"] = %"PRIu32
"\n", i
++, ((isom_stps_entry_t
*)entry
->data
)->sample_number
);
1445 static int isom_print_sdtp( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1447 if( !((isom_sdtp_t
*)box
)->list
)
1449 isom_sdtp_t
*sdtp
= (isom_sdtp_t
*)box
;
1452 isom_print_box_common( fp
, indent
++, box
, "Independent and Disposable Samples Box" );
1453 for( lsmash_entry_t
*entry
= sdtp
->list
->head
; entry
; entry
= entry
->next
)
1455 isom_sdtp_entry_t
*data
= (isom_sdtp_entry_t
*)entry
->data
;
1456 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1457 if( data
->is_leading
|| data
->sample_depends_on
|| data
->sample_is_depended_on
|| data
->sample_has_redundancy
)
1459 if( file
->avc_extensions
)
1461 if( data
->is_leading
& ISOM_SAMPLE_IS_UNDECODABLE_LEADING
)
1462 lsmash_ifprintf( fp
, indent
, "undecodable leading\n" );
1463 else if( data
->is_leading
& ISOM_SAMPLE_IS_NOT_LEADING
)
1464 lsmash_ifprintf( fp
, indent
, "non-leading\n" );
1465 else if( data
->is_leading
& ISOM_SAMPLE_IS_DECODABLE_LEADING
)
1466 lsmash_ifprintf( fp
, indent
, "decodable leading\n" );
1468 else if( data
->is_leading
& QT_SAMPLE_EARLIER_PTS_ALLOWED
)
1469 lsmash_ifprintf( fp
, indent
, "early display times allowed\n" );
1470 if( data
->sample_depends_on
& ISOM_SAMPLE_IS_INDEPENDENT
)
1471 lsmash_ifprintf( fp
, indent
, "independent\n" );
1472 else if( data
->sample_depends_on
& ISOM_SAMPLE_IS_NOT_INDEPENDENT
)
1473 lsmash_ifprintf( fp
, indent
, "dependent\n" );
1474 if( data
->sample_is_depended_on
& ISOM_SAMPLE_IS_NOT_DISPOSABLE
)
1475 lsmash_ifprintf( fp
, indent
, "non-disposable\n" );
1476 else if( data
->sample_is_depended_on
& ISOM_SAMPLE_IS_DISPOSABLE
)
1477 lsmash_ifprintf( fp
, indent
, "disposable\n" );
1478 if( data
->sample_has_redundancy
& ISOM_SAMPLE_HAS_REDUNDANCY
)
1479 lsmash_ifprintf( fp
, indent
, "redundant\n" );
1480 else if( data
->sample_has_redundancy
& ISOM_SAMPLE_HAS_NO_REDUNDANCY
)
1481 lsmash_ifprintf( fp
, indent
, "non-redundant\n" );
1484 lsmash_ifprintf( fp
, indent
, "no description\n" );
1490 static int isom_print_stsc( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1492 if( !((isom_stsc_t
*)box
)->list
)
1494 isom_stsc_t
*stsc
= (isom_stsc_t
*)box
;
1497 isom_print_box_common( fp
, indent
++, box
, "Sample To Chunk Box" );
1498 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", stsc
->list
->entry_count
);
1499 for( lsmash_entry_t
*entry
= stsc
->list
->head
; entry
; entry
= entry
->next
)
1501 isom_stsc_entry_t
*data
= (isom_stsc_entry_t
*)entry
->data
;
1502 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1503 lsmash_ifprintf( fp
, indent
, "first_chunk = %"PRIu32
"\n", data
->first_chunk
);
1504 lsmash_ifprintf( fp
, indent
, "samples_per_chunk = %"PRIu32
"\n", data
->samples_per_chunk
);
1505 lsmash_ifprintf( fp
, indent
--, "sample_description_index = %"PRIu32
"\n", data
->sample_description_index
);
1510 static int isom_print_stsz( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1512 isom_stsz_t
*stsz
= (isom_stsz_t
*)box
;
1515 isom_print_box_common( fp
, indent
++, box
, "Sample Size Box" );
1516 if( !stsz
->sample_size
)
1517 lsmash_ifprintf( fp
, indent
, "sample_size = 0 (variable)\n" );
1519 lsmash_ifprintf( fp
, indent
, "sample_size = %"PRIu32
" (constant)\n", stsz
->sample_size
);
1520 lsmash_ifprintf( fp
, indent
, "sample_count = %"PRIu32
"\n", stsz
->sample_count
);
1521 if( !stsz
->sample_size
&& stsz
->list
)
1522 for( lsmash_entry_t
*entry
= stsz
->list
->head
; entry
; entry
= entry
->next
)
1524 isom_stsz_entry_t
*data
= (isom_stsz_entry_t
*)entry
->data
;
1525 lsmash_ifprintf( fp
, indent
, "entry_size[%"PRIu32
"] = %"PRIu32
"\n", i
++, data
->entry_size
);
1530 static int isom_print_stco( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1532 if( !((isom_stco_t
*)box
)->list
)
1534 isom_stco_t
*stco
= (isom_stco_t
*)box
;
1537 isom_print_box_common( fp
, indent
++, box
, "Chunk Offset Box" );
1538 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", stco
->list
->entry_count
);
1539 if( lsmash_check_box_type_identical( stco
->type
, ISOM_BOX_TYPE_STCO
) )
1541 for( lsmash_entry_t
*entry
= stco
->list
->head
; entry
; entry
= entry
->next
)
1542 lsmash_ifprintf( fp
, indent
, "chunk_offset[%"PRIu32
"] = %"PRIu32
"\n", i
++, ((isom_stco_entry_t
*)entry
->data
)->chunk_offset
);
1546 for( lsmash_entry_t
*entry
= stco
->list
->head
; entry
; entry
= entry
->next
)
1547 lsmash_ifprintf( fp
, indent
, "chunk_offset[%"PRIu32
"] = %"PRIu64
"\n", i
++, ((isom_co64_entry_t
*)entry
->data
)->chunk_offset
);
1552 static int isom_print_sgpd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1554 if( !((isom_sgpd_t
*)box
)->list
)
1556 isom_sgpd_t
*sgpd
= (isom_sgpd_t
*)box
;
1559 isom_print_box_common( fp
, indent
++, box
, "Sample Group Description Box" );
1560 lsmash_ifprintf( fp
, indent
, "grouping_type = %s\n", isom_4cc2str( sgpd
->grouping_type
) );
1561 if( sgpd
->version
== 1 )
1563 lsmash_ifprintf( fp
, indent
, "default_length = %"PRIu32
, sgpd
->default_length
);
1564 fprintf( fp
, " %s\n", sgpd
->default_length
? "(constant)" : "(variable)" );
1566 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", sgpd
->list
->entry_count
);
1567 switch( sgpd
->grouping_type
)
1569 case ISOM_GROUP_TYPE_RAP
:
1570 for( lsmash_entry_t
*entry
= sgpd
->list
->head
; entry
; entry
= entry
->next
)
1572 if( sgpd
->version
== 1 && !sgpd
->default_length
)
1573 lsmash_ifprintf( fp
, indent
, "description_length[%"PRIu32
"] = %"PRIu32
"\n", i
++, ((isom_rap_entry_t
*)entry
->data
)->description_length
);
1576 isom_rap_entry_t
*rap
= (isom_rap_entry_t
*)entry
->data
;
1577 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1578 lsmash_ifprintf( fp
, indent
, "num_leading_samples_known = %"PRIu8
"\n", rap
->num_leading_samples_known
);
1579 lsmash_ifprintf( fp
, indent
--, "num_leading_samples = %"PRIu8
"\n", rap
->num_leading_samples
);
1583 case ISOM_GROUP_TYPE_ROLL
:
1584 case ISOM_GROUP_TYPE_PROL
:
1585 for( lsmash_entry_t
*entry
= sgpd
->list
->head
; entry
; entry
= entry
->next
)
1587 if( sgpd
->version
== 1 && !sgpd
->default_length
)
1588 lsmash_ifprintf( fp
, indent
, "description_length[%"PRIu32
"] = %"PRIu32
"\n", i
++, ((isom_roll_entry_t
*)entry
->data
)->description_length
);
1590 lsmash_ifprintf( fp
, indent
, "roll_distance[%"PRIu32
"] = %"PRId16
"\n", i
++, ((isom_roll_entry_t
*)entry
->data
)->roll_distance
);
1599 static int isom_print_sbgp( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1601 if( !((isom_sbgp_t
*)box
)->list
)
1603 isom_sbgp_t
*sbgp
= (isom_sbgp_t
*)box
;
1605 int is_fragment
= sbgp
->parent
&& lsmash_check_box_type_identical( sbgp
->parent
->type
, ISOM_BOX_TYPE_TRAF
);
1607 isom_print_box_common( fp
, indent
++, box
, "Sample to Group Box" );
1608 lsmash_ifprintf( fp
, indent
, "grouping_type = %s\n", isom_4cc2str( sbgp
->grouping_type
) );
1609 if( sbgp
->version
== 1 )
1610 lsmash_ifprintf( fp
, indent
, "grouping_type_parameter = %s\n", isom_4cc2str( sbgp
->grouping_type_parameter
) );
1611 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", sbgp
->list
->entry_count
);
1612 for( lsmash_entry_t
*entry
= sbgp
->list
->head
; entry
; entry
= entry
->next
)
1614 isom_group_assignment_entry_t
*data
= (isom_group_assignment_entry_t
*)entry
->data
;
1615 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
1616 lsmash_ifprintf( fp
, indent
, "sample_count = %"PRIu32
"\n", data
->sample_count
);
1617 lsmash_ifprintf( fp
, indent
--, "group_description_index = %"PRIu32
, data
->group_description_index
);
1618 if( is_fragment
&& data
->group_description_index
>= 0x10000 )
1619 fprintf( fp
, " (i.e. %"PRIu32
" for this fragment-local group)", data
->group_description_index
- 0x10000 );
1620 if( !data
->group_description_index
)
1621 fprintf( fp
, " (not in this grouping type)\n" );
1623 fprintf( fp
, "\n" );
1628 static int isom_print_udta( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1630 return isom_print_simple( fp
, box
, level
, "User Data Box" );
1633 static int isom_print_chpl( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1635 isom_chpl_t
*chpl
= (isom_chpl_t
*)box
;
1637 if( !chpl
->version
)
1639 if( !file
|| !file
->moov
|| !file
->moov
->mvhd
)
1641 timescale
= file
->moov
->mvhd
->timescale
;
1644 timescale
= 10000000;
1647 isom_print_box_common( fp
, indent
++, box
, "Chapter List Box" );
1648 if( chpl
->version
== 1 )
1650 lsmash_ifprintf( fp
, indent
, "unknown = 0x%02"PRIx8
"\n", chpl
->unknown
);
1651 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", chpl
->list
->entry_count
);
1654 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu8
"\n", (uint8_t)chpl
->list
->entry_count
);
1655 for( lsmash_entry_t
*entry
= chpl
->list
->head
; entry
; entry
= entry
->next
)
1657 isom_chpl_entry_t
*data
= (isom_chpl_entry_t
*)entry
->data
;
1658 int64_t start_time
= data
->start_time
/ timescale
;
1659 int hh
= start_time
/ 3600;
1660 int mm
= (start_time
/ 60) % 60;
1661 int ss
= start_time
% 60;
1662 int ms
= ((data
->start_time
/ (double)timescale
) - hh
* 3600 - mm
* 60 - ss
) * 1e3
+ 0.5;
1664 if( !memcmp( data
->chapter_name
, "\xEF\xBB\xBF", 3 ) ) /* detect BOM */
1666 data
->chapter_name
+= 3;
1669 lsmash_ifprintf( fp
, indent
++, "chapter[%"PRIu32
"]\n", i
++ );
1670 lsmash_ifprintf( fp
, indent
, "start_time = %02d:%02d:%02d.%03d\n", hh
, mm
, ss
, ms
);
1671 lsmash_ifprintf( fp
, indent
--, with_bom
? "chapter_name = %s ( it has BOM in it )\n" : "chapter_name = %s\n", data
->chapter_name
);
1676 static int isom_print_meta( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1679 if( !(box
->manager
& LSMASH_QTFF_BASE
) )
1681 isom_print_basebox_common( fp
, indent
++, box
, "Meta Box" );
1682 lsmash_ifprintf( fp
, indent
, "version = %"PRIu8
"\n", box
->version
);
1683 lsmash_ifprintf( fp
, indent
, "flags = 0x%06"PRIx32
"\n", box
->flags
& 0x00ffffff );
1686 isom_print_basebox_common( fp
, indent
, box
, "Metadata Box" );
1690 static int isom_print_keys( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1692 if( !((isom_keys_t
*)box
)->list
)
1694 isom_keys_t
*keys
= (isom_keys_t
*)box
;
1697 isom_print_box_common( fp
, indent
++, box
, "Metadata Item Keys Box" );
1698 lsmash_ifprintf( fp
, indent
, "entry_count = %"PRIu32
"\n", keys
->list
->entry_count
);
1699 for( lsmash_entry_t
*entry
= keys
->list
->head
; entry
; entry
= entry
->next
)
1701 isom_keys_entry_t
*data
= (isom_keys_entry_t
*)entry
->data
;
1702 lsmash_ifprintf( fp
, indent
++, "[key %"PRIu32
"]\n", i
++ );
1703 lsmash_ifprintf( fp
, indent
, "key_size = %"PRIu32
"\n", data
->key_size
);
1704 lsmash_ifprintf( fp
, indent
, "key_namespace = %s\n", isom_4cc2str( data
->key_namespace
) );
1705 uint32_t value_length
= data
->key_size
- 8;
1706 char str
[value_length
+ 1];
1707 memcpy( str
, data
->key_value
, value_length
);
1708 str
[value_length
] = 0;
1709 lsmash_ifprintf( fp
, indent
--, "key_value = %s\n", str
);
1714 static int isom_print_ilst( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1716 return isom_print_simple( fp
, box
, level
, "Metadata Item List Box" );
1719 static int isom_print_metaitem( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1721 isom_metaitem_t
*metaitem
= (isom_metaitem_t
*)box
;
1722 if( box
->parent
&& box
->parent
->parent
&& (box
->parent
->parent
->manager
& LSMASH_QTFF_BASE
) )
1725 lsmash_ifprintf( fp
, indent
++, "[key_index %"PRIu32
": Metadata Item Box]\n", box
->type
.fourcc
);
1726 lsmash_ifprintf( fp
, indent
, "position = %"PRIu64
"\n", box
->pos
);
1727 lsmash_ifprintf( fp
, indent
, "size = %"PRIu64
"\n", box
->size
);
1732 lsmash_itunes_metadata_item item
;
1734 } metaitem_table
[] =
1736 { ITUNES_METADATA_ITEM_ALBUM_NAME
, "Album Name" },
1737 { ITUNES_METADATA_ITEM_ARTIST
, "Artist" },
1738 { ITUNES_METADATA_ITEM_USER_COMMENT
, "User Comment" },
1739 { ITUNES_METADATA_ITEM_RELEASE_DATE
, "Release Date" },
1740 { ITUNES_METADATA_ITEM_ENCODED_BY
, "Encoded By" },
1741 { ITUNES_METADATA_ITEM_USER_GENRE
, "User Genre" },
1742 { ITUNES_METADATA_ITEM_GROUPING
, "Grouping" },
1743 { ITUNES_METADATA_ITEM_LYRICS
, "Lyrics" },
1744 { ITUNES_METADATA_ITEM_TITLE
, "Title" },
1745 { ITUNES_METADATA_ITEM_ENCODING_TOOL
, "Encoding Tool" },
1746 { ITUNES_METADATA_ITEM_COMPOSER
, "Composer" },
1747 { ITUNES_METADATA_ITEM_ALBUM_ARTIST
, "Album Artist" },
1748 { ITUNES_METADATA_ITEM_PODCAST_CATEGORY
, "Podcast Category" },
1749 { ITUNES_METADATA_ITEM_COVER_ART
, "Cover Art" },
1750 { ITUNES_METADATA_ITEM_DISC_COMPILATION
, "Disc Compilation" },
1751 { ITUNES_METADATA_ITEM_COPYRIGHT
, "Copyright" },
1752 { ITUNES_METADATA_ITEM_DESCRIPTION
, "Description" },
1753 { ITUNES_METADATA_ITEM_DISC_NUMBER
, "Disc Number" },
1754 { ITUNES_METADATA_ITEM_EPISODE_GLOBAL_ID
, "Episode Global Unique ID" },
1755 { ITUNES_METADATA_ITEM_PREDEFINED_GENRE
, "Pre-defined Genre" },
1756 { ITUNES_METADATA_ITEM_GROUPING_DRAFT
, "Grouping (Overall work like TIT1 in ID3)" },
1757 { ITUNES_METADATA_ITEM_HIGH_DEFINITION_VIDEO
, "High Definition Video" },
1758 { ITUNES_METADATA_ITEM_PODCAST_KEYWORD
, "Podcast Keyword" },
1759 { ITUNES_METADATA_ITEM_LONG_DESCRIPTION
, "Long Description" },
1760 { ITUNES_METADATA_ITEM_PODCAST
, "Podcast" },
1761 { ITUNES_METADATA_ITEM_GAPLESS_PLAYBACK
, "Gapless Playback" },
1762 { ITUNES_METADATA_ITEM_PURCHASE_DATE
, "Purchase Date" },
1763 { ITUNES_METADATA_ITEM_PODCAST_URL
, "Podcast URL" },
1764 { ITUNES_METADATA_ITEM_CONTENT_RATING
, "Content Rating" },
1765 { ITUNES_METADATA_ITEM_MEDIA_TYPE
, "Media Type" },
1766 { ITUNES_METADATA_ITEM_BEATS_PER_MINUTE
, "Beats Per Minute" },
1767 { ITUNES_METADATA_ITEM_TRACK_NUMBER
, "Track Number" },
1768 { ITUNES_METADATA_ITEM_TV_EPISODE_ID
, "TV Episode ID" },
1769 { ITUNES_METADATA_ITEM_TV_EPISODE
, "TV Episode" },
1770 { ITUNES_METADATA_ITEM_TV_NETWORK
, "TV Network" },
1771 { ITUNES_METADATA_ITEM_TV_SHOW_NAME
, "TV Show Name" },
1772 { ITUNES_METADATA_ITEM_TV_SEASON
, "TV Season" },
1773 { ITUNES_METADATA_ITEM_ITUNES_PURCHASE_ACCOUNT_ID
, "iTunes Account Used for Purchase" },
1774 { ITUNES_METADATA_ITEM_ITUNES_ACCOUNT_TYPE
, "iTunes Account Type" },
1775 { ITUNES_METADATA_ITEM_ITUNES_ARTIST_ID
, "iTunes Artist ID" },
1776 { ITUNES_METADATA_ITEM_ITUNES_COMPOSER_ID
, "iTunes Composer ID" },
1777 { ITUNES_METADATA_ITEM_ITUNES_CATALOG_ID
, "iTunes Catalog ID" },
1778 { ITUNES_METADATA_ITEM_ITUNES_TV_GENRE_ID
, "iTunes TV Genre ID" },
1779 { ITUNES_METADATA_ITEM_ITUNES_PLAYLIST_ID
, "iTunes Playlist ID" },
1780 { ITUNES_METADATA_ITEM_ITUNES_COUNTRY_CODE
, "iTunes Country Code" },
1781 { ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM
, "Sort Album" },
1782 { ITUNES_METADATA_ITEM_ITUNES_SORT_ARTIST
, "Sort Artist" },
1783 { ITUNES_METADATA_ITEM_ITUNES_SORT_ALBUM_ARTIST
, "Sort Album Artist" },
1784 { ITUNES_METADATA_ITEM_ITUNES_SORT_COMPOSER
, "Sort Composer" },
1785 { ITUNES_METADATA_ITEM_ITUNES_SORT_NAME
, "Sort Name" },
1786 { ITUNES_METADATA_ITEM_ITUNES_SORT_SHOW
, "Sort Show" },
1787 { ITUNES_METADATA_ITEM_CUSTOM
, "Custom Metadata Item" },
1792 for( i
= 0; metaitem_table
[i
].name
; i
++ )
1793 if( metaitem
->type
.fourcc
== metaitem_table
[i
].item
)
1795 name
= metaitem_table
[i
].name
;
1800 uint32_t name_length
= strlen( name
);
1801 uint32_t display_name_length
= name_length
+ 20;
1802 char display_name
[display_name_length
+ 1];
1803 memcpy( display_name
, "Metadata Item Box (", 19 );
1804 memcpy( display_name
+ 19, name
, name_length
);
1805 display_name
[display_name_length
- 1] = ')';
1806 display_name
[display_name_length
] = 0;
1807 return isom_print_simple( fp
, box
, level
, display_name
);
1810 static int isom_print_name( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1812 isom_name_t
*name
= (isom_name_t
*)box
;
1814 isom_print_box_common( fp
, indent
++, box
, "Name Box" );
1815 char str
[name
->name_length
+ 1];
1816 memcpy( str
, name
->name
, name
->name_length
);
1817 str
[name
->name_length
] = 0;
1818 lsmash_ifprintf( fp
, indent
, "name = %s\n", str
);
1822 static int isom_print_mean( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1824 isom_mean_t
*mean
= (isom_mean_t
*)box
;
1826 isom_print_box_common( fp
, indent
++, box
, "Mean Box" );
1827 char str
[mean
->meaning_string_length
+ 1];
1828 memcpy( str
, mean
->meaning_string
, mean
->meaning_string_length
);
1829 str
[mean
->meaning_string_length
] = 0;
1830 lsmash_ifprintf( fp
, indent
, "meaning_string = %s\n", str
);
1834 static int isom_print_data( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
1836 isom_data_t
*data
= (isom_data_t
*)box
;
1838 isom_print_box_common( fp
, indent
++, box
, "Data Box" );
1839 if( box
->parent
&& box
->parent
->parent
&& box
->parent
->parent
->parent
1840 && (box
->parent
->parent
->parent
->manager
& LSMASH_QTFF_BASE
) )
1842 uint32_t type_set_indicator
= data
->reserved
>> 8;
1843 uint32_t well_known_type
= ((data
->reserved
<< 16) | (data
->type_set_identifier
<< 8) | data
->type_code
) & 0xffffff;
1844 char *well_known_type_name
;
1849 } well_known_type_table
[] =
1855 { 4, "UTF-8 sort" },
1856 { 5, "UTF-16 sort" },
1857 { 13, "JPEG in a JFIF wrapper" },
1858 { 14, "PNG in a PNG wrapper" },
1859 { 21, "BE Signed Integer" },
1860 { 22, "BE Unsigned Integer" },
1861 { 23, "BE Float32" },
1862 { 24, "BE Float64" },
1863 { 27, "BMP (Windows bitmap format graphics)" },
1864 { 28, "QuickTime Metadata box" },
1868 for( table_index
= 0; well_known_type_table
[table_index
].type
!= UINT32_MAX
; table_index
++ )
1869 if( well_known_type
== well_known_type_table
[table_index
].type
)
1871 well_known_type_name
= well_known_type_table
[table_index
].name
;
1874 if( well_known_type_table
[table_index
].type
== UINT32_MAX
)
1875 well_known_type_name
= "Unknown";
1876 lsmash_ifprintf( fp
, indent
, "type_set_indicator = %"PRIu8
"\n", type_set_indicator
);
1877 lsmash_ifprintf( fp
, indent
, "well_known_type = %"PRIu32
" (%s)\n", well_known_type
, well_known_type_name
);
1878 lsmash_ifprintf( fp
, indent
, "locale_indicator = %"PRIu32
"\n", data
->the_locale
);
1879 if( data
->value_length
== 0 )
1881 lsmash_ifprintf( fp
, indent
, "value = (null)\n" );
1884 if( well_known_type
== 1 )
1886 /* UTF-8 without any count or null terminator */
1887 char str
[data
->value_length
+ 1];
1888 memcpy( str
, data
->value
, data
->value_length
);
1889 str
[data
->value_length
] = 0;
1890 lsmash_ifprintf( fp
, indent
, "value = %s\n", str
);
1892 else if( well_known_type
== 13 || well_known_type
== 14 || well_known_type
== 27 )
1893 lsmash_ifprintf( fp
, indent
, "value = (binary data)\n" );
1894 else if( well_known_type
== 21 && data
->value_length
<= 4 )
1895 /* a big-endian signed integer in 1,2,3 or 4 bytes */
1896 goto show_in_signed_integer
;
1897 else if( well_known_type
== 22 && data
->value_length
<= 4 )
1899 /* a big-endian unsigned integer in 1,2,3 or 4 bytes */
1900 uint32_t integer
= data
->value
[0];
1901 for( uint32_t i
= 1; i
< data
->value_length
; i
++ )
1902 integer
= (integer
<< 8) | data
->value
[i
];
1903 lsmash_ifprintf( fp
, indent
, "value = %"PRIu32
"\n", integer
);
1905 else if( well_known_type
== 23 && data
->value_length
== 4 )
1907 /* a big-endian 32-bit floating point value (IEEE754) */
1908 uint32_t float32
= LSMASH_GET_BE32( data
->value
);
1909 lsmash_ifprintf( fp
, indent
, "value = %f\n", lsmash_int2float32( float32
) );
1911 else if( well_known_type
== 24 && data
->value_length
== 8 )
1913 /* a big-endian 64-bit floating point value (IEEE754) */
1914 uint64_t float64
= LSMASH_GET_BE64( data
->value
);
1915 lsmash_ifprintf( fp
, indent
, "value = %lf\n", lsmash_int2float64( float64
) );
1918 goto show_in_binary
;
1922 char *basic_data_type_name
;
1927 } basic_data_type_table
[] =
1939 { 13, "JPEG in a JFIF wrapper" },
1940 { 14, "PNG in a PNG wrapper" },
1943 { 17, "date/time" },
1945 { 21, "BE Signed Integer" },
1946 { 24, "RIAA-PA (RIAA Parental advisory)" },
1947 { 25, "UPC (Universal Product Code)" },
1948 { 27, "BMP (Windows bitmap format graphics)" },
1952 for( table_index
= 0; basic_data_type_table
[table_index
].type
!= UINT32_MAX
; table_index
++ )
1953 if( data
->type_code
== basic_data_type_table
[table_index
].type
)
1955 basic_data_type_name
= basic_data_type_table
[table_index
].name
;
1958 if( basic_data_type_table
[table_index
].type
== UINT32_MAX
)
1959 basic_data_type_name
= "Unknown";
1960 lsmash_ifprintf( fp
, indent
, "reserved = %"PRIu16
"\n", data
->reserved
);
1961 lsmash_ifprintf( fp
, indent
, "type_set_identifier = %"PRIu8
"%s\n",
1962 data
->type_set_identifier
,
1963 data
->type_set_identifier
? "" : " (basic type set)" );
1964 lsmash_ifprintf( fp
, indent
, "type_code = %"PRIu8
" (%s)\n", data
->type_code
, basic_data_type_name
);
1965 lsmash_ifprintf( fp
, indent
, "the_locale = %"PRIu32
"\n", data
->the_locale
);
1966 if( data
->value_length
== 0 )
1968 lsmash_ifprintf( fp
, indent
, "value = (null)\n" );
1971 if( data
->type_code
== 6 || data
->type_code
== 7
1972 || data
->type_code
== 12 || data
->type_code
== 13
1973 || data
->type_code
== 14 || data
->type_code
== 27 )
1974 lsmash_ifprintf( fp
, indent
, "value = (binary data)\n" );
1975 else if( data
->type_code
== 8 && data
->value_length
== 16 )
1977 lsmash_ifprintf( fp
, indent
, "value = 0x%08"PRIx32
"-%04"PRIx16
"-%04"PRIx16
"-%04"PRIx16
"-%04"PRIx16
"0x%08"PRIx32
"\n",
1978 LSMASH_GET_BE32( &data
->value
[ 0] ),
1979 LSMASH_GET_BE16( &data
->value
[ 4] ),
1980 LSMASH_GET_BE16( &data
->value
[ 6] ),
1981 LSMASH_GET_BE16( &data
->value
[ 8] ),
1982 LSMASH_GET_BE16( &data
->value
[10] ),
1983 LSMASH_GET_BE32( &data
->value
[12] ) );
1984 else if( data
->type_code
== 16 && data
->value_length
== 4 )
1986 /* duration in milliseconds */
1987 uint32_t duration
= LSMASH_GET_BE32( data
->value
);
1988 lsmash_ifprintf( fp
, indent
, "value = %"PRIu32
" milliseconds\n", duration
);
1990 else if( data
->type_code
== 17 && (data
->value_length
== 4 || data
->value_length
== 8) )
1992 /* UTC, counting seconds since midnight on 1 January, 1904 */
1993 uint64_t mp4time
= data
->value_length
== 8
1994 ? LSMASH_GET_BE64( data
->value
)
1995 : LSMASH_GET_BE32( data
->value
);
1996 isom_mp4time2utc( mp4time
);
1998 else if( data
->type_code
== 21 && data
->value_length
<= 8 )
1999 /* a big-endian signed integer in 1,2,3,4 or 8 bytes */
2000 goto show_in_signed_integer
;
2001 else if( data
->type_code
== 24 )
2003 /* RIAA-PA (RIAA Parental advisory) 8-bit integer */
2004 lsmash_ifprintf( fp
, indent
, "value = %"PRIu8
, data
->value
[0] );
2005 if( (signed)data
->value
[0] == -1 )
2006 fprintf( fp
, " (no)" );
2007 else if( data
->value
[0] == 1 )
2008 fprintf( fp
, " (yes)" );
2009 else if( data
->value
[0] == 0 )
2010 fprintf( fp
, " (unspecified)" );
2011 fprintf( fp
, "\n" );
2013 else if( data
->type_code
== 1 || data
->type_code
== 2 || data
->type_code
== 3
2014 || data
->type_code
== 9 || data
->type_code
== 10 || data
->type_code
== 15
2015 || data
->type_code
== 25 )
2018 char str
[data
->value_length
+ 1];
2019 memcpy( str
, data
->value
, data
->value_length
);
2020 str
[data
->value_length
] = 0;
2021 lsmash_ifprintf( fp
, indent
, "value = %s\n", str
);
2024 goto show_in_binary
;
2027 show_in_signed_integer
:;
2028 uint64_t integer
= data
->value
[0];
2029 uint64_t max_value
= 0xff;
2030 for( uint32_t i
= 1; i
< data
->value_length
; i
++ )
2032 integer
= (integer
<< 8) | data
->value
[i
];
2033 max_value
= (max_value
<< 8) | 0xff;
2035 lsmash_ifprintf( fp
, indent
, "value = %"PRId64
"\n", (int64_t)(integer
| (integer
> (max_value
>> 1) ? ~max_value
: 0)) );
2038 lsmash_ifprintf( fp
, indent
, "value = " );
2039 if( data
->value_length
)
2041 fprintf( fp
, "0x" );
2042 for( uint32_t i
= 0; i
< data
->value_length
; i
++ )
2043 fprintf( fp
, "%02"PRIx8
, data
->value
[i
] );
2045 fprintf( fp
, "\n" );
2049 static int isom_print_WLOC( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2051 isom_WLOC_t
*WLOC
= (isom_WLOC_t
*)box
;
2053 isom_print_box_common( fp
, indent
++, box
, "Window Location Box" );
2054 lsmash_ifprintf( fp
, indent
, "x = %"PRIu16
"\n", WLOC
->x
);
2055 lsmash_ifprintf( fp
, indent
, "y = %"PRIu16
"\n", WLOC
->y
);
2059 static int isom_print_LOOP( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2061 isom_LOOP_t
*LOOP
= (isom_LOOP_t
*)box
;
2063 isom_print_box_common( fp
, indent
++, box
, "Looping Box" );
2064 lsmash_ifprintf( fp
, indent
, "looping_mode = %"PRIu32
, LOOP
->looping_mode
);
2065 switch( LOOP
->looping_mode
)
2068 fprintf( fp
, " (none)\n" );
2071 fprintf( fp
, " (looping)\n" );
2074 fprintf( fp
, " (palindromic looping)\n" );
2077 fprintf( fp
, "\n" );
2083 static int isom_print_SelO( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2085 isom_SelO_t
*SelO
= (isom_SelO_t
*)box
;
2087 isom_print_box_common( fp
, indent
++, box
, "Play Selection Only Box" );
2088 lsmash_ifprintf( fp
, indent
, "selection_only = %"PRIu8
"\n", SelO
->selection_only
);
2092 static int isom_print_AllF( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2094 isom_AllF_t
*AllF
= (isom_AllF_t
*)box
;
2096 isom_print_box_common( fp
, indent
++, box
, "Play All Frames Box" );
2097 lsmash_ifprintf( fp
, indent
, "play_all_frames = %"PRIu8
"\n", AllF
->play_all_frames
);
2101 static int isom_print_cprt( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2103 isom_cprt_t
*cprt
= (isom_cprt_t
*)box
;
2105 char str
[cprt
->notice_length
+ 1];
2106 memcpy( str
, cprt
->notice
, cprt
->notice_length
);
2107 str
[cprt
->notice_length
] = 0;
2108 isom_print_box_common( fp
, indent
++, box
, "Copyright Box" );
2109 lsmash_ifprintf( fp
, indent
, "language = %s\n", isom_unpack_iso_language( cprt
->language
) );
2110 lsmash_ifprintf( fp
, indent
, "notice = %s\n", str
);
2114 static int isom_print_mvex( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2116 return isom_print_simple( fp
, box
, level
, "Movie Extends Box" );
2119 static int isom_print_mehd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2121 isom_mehd_t
*mehd
= (isom_mehd_t
*)box
;
2123 isom_print_box_common( fp
, indent
++, box
, "Movie Extends Header Box" );
2124 if( file
&& file
->moov
&& file
->moov
->mvhd
)
2125 isom_ifprintf_duration( fp
, indent
, "fragment_duration", mehd
->fragment_duration
, file
->moov
->mvhd
->timescale
);
2127 isom_ifprintf_duration( fp
, indent
, "fragment_duration", mehd
->fragment_duration
, 0 );
2131 static int isom_print_trex( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2133 isom_trex_t
*trex
= (isom_trex_t
*)box
;
2135 isom_print_box_common( fp
, indent
++, box
, "Track Extends Box" );
2136 lsmash_ifprintf( fp
, indent
, "track_ID = %"PRIu32
"\n", trex
->track_ID
);
2137 lsmash_ifprintf( fp
, indent
, "default_sample_description_index = %"PRIu32
"\n", trex
->default_sample_description_index
);
2138 lsmash_ifprintf( fp
, indent
, "default_sample_duration = %"PRIu32
"\n", trex
->default_sample_duration
);
2139 lsmash_ifprintf( fp
, indent
, "default_sample_size = %"PRIu32
"\n", trex
->default_sample_size
);
2140 isom_ifprintf_sample_flags( fp
, indent
, "default_sample_flags", &trex
->default_sample_flags
);
2144 static int isom_print_moof( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2146 return isom_print_simple( fp
, box
, level
, "Movie Fragment Box" );
2149 static int isom_print_mfhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2151 isom_mfhd_t
*mfhd
= (isom_mfhd_t
*)box
;
2153 isom_print_box_common( fp
, indent
++, box
, "Movie Fragment Header Box" );
2154 lsmash_ifprintf( fp
, indent
, "sequence_number = %"PRIu32
"\n", mfhd
->sequence_number
);
2158 static int isom_print_traf( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2160 return isom_print_simple( fp
, box
, level
, "Track Fragment Box" );
2163 static int isom_print_tfhd( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2165 isom_tfhd_t
*tfhd
= (isom_tfhd_t
*)box
;
2167 isom_print_box_common( fp
, indent
++, box
, "Track Fragment Header Box" );
2169 if( tfhd
->flags
& ISOM_TF_FLAGS_BASE_DATA_OFFSET_PRESENT
) lsmash_ifprintf( fp
, indent
, "base-data-offset-present\n" );
2170 if( tfhd
->flags
& ISOM_TF_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT
) lsmash_ifprintf( fp
, indent
, "sample-description-index-present\n" );
2171 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT
) lsmash_ifprintf( fp
, indent
, "default-sample-duration-present\n" );
2172 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT
) lsmash_ifprintf( fp
, indent
, "default-sample-size-present\n" );
2173 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT
) lsmash_ifprintf( fp
, indent
, "default-sample-flags-present\n" );
2174 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_BASE_IS_MOOF
) lsmash_ifprintf( fp
, indent
, "default-base-is-moof\n" );
2175 lsmash_ifprintf( fp
, --indent
, "track_ID = %"PRIu32
"\n", tfhd
->track_ID
);
2176 if( tfhd
->flags
& ISOM_TF_FLAGS_BASE_DATA_OFFSET_PRESENT
)
2177 lsmash_ifprintf( fp
, indent
, "base_data_offset = %"PRIu64
"\n", tfhd
->base_data_offset
);
2178 if( tfhd
->flags
& ISOM_TF_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT
)
2179 lsmash_ifprintf( fp
, indent
, "sample_description_index = %"PRIu32
"\n", tfhd
->sample_description_index
);
2180 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT
)
2181 lsmash_ifprintf( fp
, indent
, "default_sample_duration = %"PRIu32
"\n", tfhd
->default_sample_duration
);
2182 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT
)
2183 lsmash_ifprintf( fp
, indent
, "default_sample_size = %"PRIu32
"\n", tfhd
->default_sample_size
);
2184 if( tfhd
->flags
& ISOM_TF_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT
)
2185 isom_ifprintf_sample_flags( fp
, indent
, "default_sample_flags", &tfhd
->default_sample_flags
);
2189 static int isom_print_tfdt( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2191 isom_tfdt_t
*tfdt
= (isom_tfdt_t
*)box
;
2193 isom_print_box_common( fp
, indent
++, box
, "Track Fragment Base Media Decode Time Box" );
2194 lsmash_ifprintf( fp
, indent
, "baseMediaDecodeTime = %"PRIu64
"\n", tfdt
->baseMediaDecodeTime
);
2198 static int isom_print_trun( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2200 isom_trun_t
*trun
= (isom_trun_t
*)box
;
2202 isom_print_box_common( fp
, indent
++, box
, "Track Fragment Run Box" );
2204 if( trun
->flags
& ISOM_TR_FLAGS_DATA_OFFSET_PRESENT
) lsmash_ifprintf( fp
, indent
, "data-offset-present\n" );
2205 if( trun
->flags
& ISOM_TR_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT
) lsmash_ifprintf( fp
, indent
, "first-sample-flags-present\n" );
2206 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_DURATION_PRESENT
) lsmash_ifprintf( fp
, indent
, "sample-duration-present\n" );
2207 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_SIZE_PRESENT
) lsmash_ifprintf( fp
, indent
, "sample-size-present\n" );
2208 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_FLAGS_PRESENT
) lsmash_ifprintf( fp
, indent
, "sample-flags-present\n" );
2209 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT
) lsmash_ifprintf( fp
, indent
, "sample-composition-time-offsets-present\n" );
2210 lsmash_ifprintf( fp
, --indent
, "sample_count = %"PRIu32
"\n", trun
->sample_count
);
2211 if( trun
->flags
& ISOM_TR_FLAGS_DATA_OFFSET_PRESENT
)
2212 lsmash_ifprintf( fp
, indent
, "data_offset = %"PRId32
"\n", trun
->data_offset
);
2213 if( trun
->flags
& ISOM_TR_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT
)
2214 isom_ifprintf_sample_flags( fp
, indent
, "first_sample_flags", &trun
->first_sample_flags
);
2215 if( trun
->optional
)
2218 for( lsmash_entry_t
*entry
= trun
->optional
->head
; entry
; entry
= entry
->next
)
2220 isom_trun_optional_row_t
*row
= (isom_trun_optional_row_t
*)entry
->data
;
2221 lsmash_ifprintf( fp
, indent
++, "sample[%"PRIu32
"]\n", i
++ );
2222 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_DURATION_PRESENT
)
2223 lsmash_ifprintf( fp
, indent
, "sample_duration = %"PRIu32
"\n", row
->sample_duration
);
2224 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_SIZE_PRESENT
)
2225 lsmash_ifprintf( fp
, indent
, "sample_size = %"PRIu32
"\n", row
->sample_size
);
2226 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_FLAGS_PRESENT
)
2227 isom_ifprintf_sample_flags( fp
, indent
, "sample_flags", &row
->sample_flags
);
2228 if( trun
->flags
& ISOM_TR_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT
)
2230 if( trun
->version
== 0 )
2231 lsmash_ifprintf( fp
, indent
, "sample_composition_time_offset = %"PRIu32
"\n",
2232 row
->sample_composition_time_offset
);
2234 lsmash_ifprintf( fp
, indent
, "sample_composition_time_offset = %"PRId32
"\n",
2235 (union {uint32_t ui
; int32_t si
;}){ row
->sample_composition_time_offset
}.si
);
2243 static int isom_print_free( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2245 return isom_print_simple( fp
, box
, level
, "Free Space Box" );
2248 static int isom_print_mdat( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2250 return isom_print_simple( fp
, box
, level
, "Media Data Box" );
2253 static int isom_print_mfra( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2255 return isom_print_simple( fp
, box
, level
, "Movie Fragment Random Access Box" );
2258 static int isom_print_tfra( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2260 isom_tfra_t
*tfra
= (isom_tfra_t
*)box
;
2262 isom_print_box_common( fp
, indent
++, box
, "Track Fragment Random Access Box" );
2263 lsmash_ifprintf( fp
, indent
, "track_ID = %"PRIu32
"\n", tfra
->track_ID
);
2264 lsmash_ifprintf( fp
, indent
, "reserved = 0x%08"PRIx32
"\n", tfra
->reserved
);
2265 lsmash_ifprintf( fp
, indent
, "length_size_of_traf_num = %"PRIu8
"\n", tfra
->length_size_of_traf_num
);
2266 lsmash_ifprintf( fp
, indent
, "length_size_of_trun_num = %"PRIu8
"\n", tfra
->length_size_of_trun_num
);
2267 lsmash_ifprintf( fp
, indent
, "length_size_of_sample_num = %"PRIu8
"\n", tfra
->length_size_of_sample_num
);
2268 lsmash_ifprintf( fp
, indent
, "number_of_entry = %"PRIu32
"\n", tfra
->number_of_entry
);
2272 for( lsmash_entry_t
*entry
= tfra
->list
->head
; entry
; entry
= entry
->next
)
2274 isom_tfra_location_time_entry_t
*data
= (isom_tfra_location_time_entry_t
*)entry
->data
;
2275 lsmash_ifprintf( fp
, indent
++, "entry[%"PRIu32
"]\n", i
++ );
2276 lsmash_ifprintf( fp
, indent
, "time = %"PRIu64
"\n", data
->time
);
2277 lsmash_ifprintf( fp
, indent
, "moof_offset = %"PRIu64
"\n", data
->moof_offset
);
2278 lsmash_ifprintf( fp
, indent
, "traf_number = %"PRIu32
"\n", data
->traf_number
);
2279 lsmash_ifprintf( fp
, indent
, "trun_number = %"PRIu32
"\n", data
->trun_number
);
2280 lsmash_ifprintf( fp
, indent
, "sample_number = %"PRIu32
"\n", data
->sample_number
);
2287 static int isom_print_mfro( FILE *fp
, lsmash_file_t
*file
, isom_box_t
*box
, int level
)
2289 isom_mfro_t
*mfro
= (isom_mfro_t
*)box
;
2291 isom_print_box_common( fp
, indent
++, box
, "Movie Fragment Random Access Offset Box" );
2292 lsmash_ifprintf( fp
, indent
, "size = %"PRIu32
"\n", mfro
->length
);
2296 int lsmash_print_movie( lsmash_root_t
*root
, const char *filename
)
2300 lsmash_file_t
*file
= root
->file
;
2303 || !(file
->flags
& LSMASH_FILE_MODE_DUMP
) )
2306 if( !strcmp( filename
, "-" ) )
2307 destination
= stdout
;
2309 destination
= lsmash_fopen( filename
, "wb" );
2310 fprintf( destination
, "[File]\n" );
2311 fprintf( destination
, " size = %"PRIu64
"\n", file
->size
);
2312 for( lsmash_entry_t
*entry
= file
->print
->head
; entry
; entry
= entry
->next
)
2314 isom_print_entry_t
*data
= (isom_print_entry_t
*)entry
->data
;
2315 if( !data
|| !data
->box
|| data
->func( destination
, file
, data
->box
, data
->level
) )
2317 fclose( destination
);
2321 fclose( destination
);
2325 static isom_print_box_t
isom_select_print_func( isom_box_t
*box
)
2327 if( box
->manager
& LSMASH_UNKNOWN_BOX
)
2328 return isom_print_unknown
;
2331 isom_box_t
*parent
= box
->parent
;
2332 if( lsmash_check_box_type_identical( parent
->type
, ISOM_BOX_TYPE_STSD
) )
2334 lsmash_codec_type_t sample_type
= box
->type
;
2335 if( lsmash_check_codec_type_identical( sample_type
, LSMASH_CODEC_TYPE_RAW
) )
2337 if( box
->manager
& LSMASH_VIDEO_DESCRIPTION
)
2338 return isom_print_visual_description
;
2339 else if( box
->manager
& LSMASH_AUDIO_DESCRIPTION
)
2340 return isom_print_audio_description
;
2342 static struct print_description_table_tag
2344 lsmash_codec_type_t type
;
2345 isom_print_box_t func
;
2346 } print_description_table
[160] = { { LSMASH_CODEC_TYPE_INITIALIZER
, NULL
} };
2347 if( !print_description_table
[0].func
)
2349 /* Initialize the table. */
2351 #define ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( type, func ) print_description_table[i++] = (struct print_description_table_tag){ type, func }
2352 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC1_VIDEO
, isom_print_visual_description
);
2353 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC2_VIDEO
, isom_print_visual_description
);
2354 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC3_VIDEO
, isom_print_visual_description
);
2355 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC4_VIDEO
, isom_print_visual_description
);
2356 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVCP_VIDEO
, isom_print_visual_description
);
2357 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_DRAC_VIDEO
, isom_print_visual_description
);
2358 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_ENCV_VIDEO
, isom_print_visual_description
);
2359 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_HVC1_VIDEO
, isom_print_visual_description
);
2360 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_HEV1_VIDEO
, isom_print_visual_description
);
2361 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MJP2_VIDEO
, isom_print_visual_description
);
2362 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4V_VIDEO
, isom_print_visual_description
);
2363 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MVC1_VIDEO
, isom_print_visual_description
);
2364 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MVC2_VIDEO
, isom_print_visual_description
);
2365 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_S263_VIDEO
, isom_print_visual_description
);
2366 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SVC1_VIDEO
, isom_print_visual_description
);
2367 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_VC_1_VIDEO
, isom_print_visual_description
);
2368 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_2VUY_VIDEO
, isom_print_visual_description
);
2369 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_CFHD_VIDEO
, isom_print_visual_description
);
2370 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DV10_VIDEO
, isom_print_visual_description
);
2371 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVOO_VIDEO
, isom_print_visual_description
);
2372 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVOR_VIDEO
, isom_print_visual_description
);
2373 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVTV_VIDEO
, isom_print_visual_description
);
2374 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVVT_VIDEO
, isom_print_visual_description
);
2375 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_HD10_VIDEO
, isom_print_visual_description
);
2376 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_M105_VIDEO
, isom_print_visual_description
);
2377 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_PNTG_VIDEO
, isom_print_visual_description
);
2378 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SVQ1_VIDEO
, isom_print_visual_description
);
2379 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SVQ3_VIDEO
, isom_print_visual_description
);
2380 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SHR0_VIDEO
, isom_print_visual_description
);
2381 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SHR1_VIDEO
, isom_print_visual_description
);
2382 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SHR2_VIDEO
, isom_print_visual_description
);
2383 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SHR3_VIDEO
, isom_print_visual_description
);
2384 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SHR4_VIDEO
, isom_print_visual_description
);
2385 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_WRLE_VIDEO
, isom_print_visual_description
);
2386 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_APCH_VIDEO
, isom_print_visual_description
);
2387 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_APCN_VIDEO
, isom_print_visual_description
);
2388 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_APCS_VIDEO
, isom_print_visual_description
);
2389 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_APCO_VIDEO
, isom_print_visual_description
);
2390 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_AP4H_VIDEO
, isom_print_visual_description
);
2391 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_CIVD_VIDEO
, isom_print_visual_description
);
2392 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DRAC_VIDEO
, isom_print_visual_description
);
2393 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVC_VIDEO
, isom_print_visual_description
);
2394 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVCP_VIDEO
, isom_print_visual_description
);
2395 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVPP_VIDEO
, isom_print_visual_description
);
2396 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DV5N_VIDEO
, isom_print_visual_description
);
2397 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DV5P_VIDEO
, isom_print_visual_description
);
2398 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVH2_VIDEO
, isom_print_visual_description
);
2399 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVH3_VIDEO
, isom_print_visual_description
);
2400 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVH5_VIDEO
, isom_print_visual_description
);
2401 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVH6_VIDEO
, isom_print_visual_description
);
2402 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVHP_VIDEO
, isom_print_visual_description
);
2403 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVHQ_VIDEO
, isom_print_visual_description
);
2404 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_FLIC_VIDEO
, isom_print_visual_description
);
2405 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_GIF_VIDEO
, isom_print_visual_description
);
2406 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_H261_VIDEO
, isom_print_visual_description
);
2407 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_H263_VIDEO
, isom_print_visual_description
);
2408 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_JPEG_VIDEO
, isom_print_visual_description
);
2409 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_MJPA_VIDEO
, isom_print_visual_description
);
2410 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_MJPB_VIDEO
, isom_print_visual_description
);
2411 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_PNG_VIDEO
, isom_print_visual_description
);
2412 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_RLE_VIDEO
, isom_print_visual_description
);
2413 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_RPZA_VIDEO
, isom_print_visual_description
);
2414 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_TGA_VIDEO
, isom_print_visual_description
);
2415 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_TIFF_VIDEO
, isom_print_visual_description
);
2416 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULRA_VIDEO
, isom_print_visual_description
);
2417 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULRG_VIDEO
, isom_print_visual_description
);
2418 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULY2_VIDEO
, isom_print_visual_description
);
2419 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULY0_VIDEO
, isom_print_visual_description
);
2420 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULH2_VIDEO
, isom_print_visual_description
);
2421 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULH0_VIDEO
, isom_print_visual_description
);
2422 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_V210_VIDEO
, isom_print_visual_description
);
2423 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_V216_VIDEO
, isom_print_visual_description
);
2424 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_V308_VIDEO
, isom_print_visual_description
);
2425 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_V408_VIDEO
, isom_print_visual_description
);
2426 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_V410_VIDEO
, isom_print_visual_description
);
2427 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_YUV2_VIDEO
, isom_print_visual_description
);
2428 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_AC_3_AUDIO
, isom_print_audio_description
);
2429 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_ALAC_AUDIO
, isom_print_audio_description
);
2430 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_DRA1_AUDIO
, isom_print_audio_description
);
2431 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSC_AUDIO
, isom_print_audio_description
);
2432 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSE_AUDIO
, isom_print_audio_description
);
2433 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSH_AUDIO
, isom_print_audio_description
);
2434 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSL_AUDIO
, isom_print_audio_description
);
2435 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_EC_3_AUDIO
, isom_print_audio_description
);
2436 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_ENCA_AUDIO
, isom_print_audio_description
);
2437 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_G719_AUDIO
, isom_print_audio_description
);
2438 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_G726_AUDIO
, isom_print_audio_description
);
2439 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_M4AE_AUDIO
, isom_print_audio_description
);
2440 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MLPA_AUDIO
, isom_print_audio_description
);
2441 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4A_AUDIO
, isom_print_audio_description
);
2442 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAMR_AUDIO
, isom_print_audio_description
);
2443 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAWB_AUDIO
, isom_print_audio_description
);
2444 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAWP_AUDIO
, isom_print_audio_description
);
2445 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SEVC_AUDIO
, isom_print_audio_description
);
2446 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SQCP_AUDIO
, isom_print_audio_description
);
2447 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_SSMV_AUDIO
, isom_print_audio_description
);
2448 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_TWOS_AUDIO
, isom_print_audio_description
);
2449 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_MP4A_AUDIO
, isom_print_audio_description
);
2450 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_23NI_AUDIO
, isom_print_audio_description
);
2451 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_MAC3_AUDIO
, isom_print_audio_description
);
2452 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_MAC6_AUDIO
, isom_print_audio_description
);
2453 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_NONE_AUDIO
, isom_print_audio_description
);
2454 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_QDM2_AUDIO
, isom_print_audio_description
);
2455 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_QDMC_AUDIO
, isom_print_audio_description
);
2456 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_QCLP_AUDIO
, isom_print_audio_description
);
2457 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_AGSM_AUDIO
, isom_print_audio_description
);
2458 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ALAW_AUDIO
, isom_print_audio_description
);
2459 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_CDX2_AUDIO
, isom_print_audio_description
);
2460 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_CDX4_AUDIO
, isom_print_audio_description
);
2461 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVCA_AUDIO
, isom_print_audio_description
);
2462 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_DVI_AUDIO
, isom_print_audio_description
);
2463 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_FL32_AUDIO
, isom_print_audio_description
);
2464 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_FL64_AUDIO
, isom_print_audio_description
);
2465 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_IMA4_AUDIO
, isom_print_audio_description
);
2466 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_IN24_AUDIO
, isom_print_audio_description
);
2467 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_IN32_AUDIO
, isom_print_audio_description
);
2468 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_LPCM_AUDIO
, isom_print_audio_description
);
2469 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_SOWT_AUDIO
, isom_print_audio_description
);
2470 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_TWOS_AUDIO
, isom_print_audio_description
);
2471 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ULAW_AUDIO
, isom_print_audio_description
);
2472 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_VDVA_AUDIO
, isom_print_audio_description
);
2473 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_FULLMP3_AUDIO
, isom_print_audio_description
);
2474 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_MP3_AUDIO
, isom_print_audio_description
);
2475 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ADPCM2_AUDIO
, isom_print_audio_description
);
2476 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_ADPCM17_AUDIO
, isom_print_audio_description
);
2477 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_GSM49_AUDIO
, isom_print_audio_description
);
2478 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_NOT_SPECIFIED
, isom_print_audio_description
);
2479 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( QT_CODEC_TYPE_TEXT_TEXT
, isom_print_text_description
);
2480 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_TX3G_TEXT
, isom_print_tx3g_description
);
2481 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4S_SYSTEM
, isom_print_mp4s_description
);
2482 ADD_PRINT_DESCRIPTION_TABLE_ELEMENT( LSMASH_CODEC_TYPE_UNSPECIFIED
, NULL
);
2483 #undef ADD_PRINT_DESCRIPTION_TABLE_ELEMENT
2485 for( int i
= 0; print_description_table
[i
].func
; i
++ )
2486 if( lsmash_check_codec_type_identical( sample_type
, print_description_table
[i
].type
) )
2487 return print_description_table
[i
].func
;
2488 return isom_print_unknown
;
2490 if( lsmash_check_box_type_identical( parent
->type
, QT_BOX_TYPE_WAVE
) )
2492 if( lsmash_check_box_type_identical( box
->type
, QT_BOX_TYPE_FRMA
) )
2493 return isom_print_frma
;
2494 else if( lsmash_check_box_type_identical( box
->type
, QT_BOX_TYPE_ENDA
) )
2495 return isom_print_enda
;
2496 else if( lsmash_check_box_type_identical( box
->type
, QT_BOX_TYPE_TERMINATOR
) )
2497 return isom_print_terminator
;
2499 return isom_print_sample_description_extesion
;
2501 if( lsmash_check_box_type_identical( parent
->type
, ISOM_BOX_TYPE_TREF
) )
2502 return isom_print_track_reference_type
;
2503 if( parent
->parent
)
2505 if( lsmash_check_box_type_identical( parent
->parent
->type
, ISOM_BOX_TYPE_STSD
) )
2506 return isom_print_sample_description_extesion
;
2507 else if( lsmash_check_box_type_identical( parent
->parent
->type
, ISOM_BOX_TYPE_ILST
)
2508 || lsmash_check_box_type_identical( parent
->parent
->type
, QT_BOX_TYPE_ILST
) )
2510 if( parent
->type
.fourcc
== LSMASH_4CC( '-', '-', '-', '-' ) )
2512 if( lsmash_check_box_type_identical( box
->type
, ISOM_BOX_TYPE_MEAN
) )
2513 return isom_print_mean
;
2514 if( lsmash_check_box_type_identical( box
->type
, ISOM_BOX_TYPE_NAME
) )
2515 return isom_print_name
;
2517 if( lsmash_check_box_type_identical( box
->type
, ISOM_BOX_TYPE_DATA
) )
2518 return isom_print_data
;
2521 if( lsmash_check_box_type_identical( parent
->type
, ISOM_BOX_TYPE_ILST
)
2522 || lsmash_check_box_type_identical( parent
->type
, QT_BOX_TYPE_ILST
) )
2523 return isom_print_metaitem
;
2525 static struct print_box_table_tag
2527 lsmash_box_type_t type
;
2528 isom_print_box_t func
;
2529 } print_box_table
[128] = { { LSMASH_BOX_TYPE_INITIALIZER
, NULL
} };
2530 if( !print_box_table
[0].func
)
2532 /* Initialize the table. */
2534 #define ADD_PRINT_BOX_TABLE_ELEMENT( type, func ) print_box_table[i++] = (struct print_box_table_tag){ type, func }
2535 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_FTYP
, isom_print_ftyp
);
2536 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STYP
, isom_print_styp
);
2537 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SIDX
, isom_print_sidx
);
2538 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MOOV
, isom_print_moov
);
2539 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MVHD
, isom_print_mvhd
);
2540 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_IODS
, isom_print_iods
);
2541 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_CTAB
, isom_print_ctab
);
2542 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TRAK
, isom_print_trak
);
2543 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TKHD
, isom_print_tkhd
);
2544 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_TAPT
, isom_print_tapt
);
2545 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_CLEF
, isom_print_clef
);
2546 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_PROF
, isom_print_prof
);
2547 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_ENOF
, isom_print_enof
);
2548 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_EDTS
, isom_print_edts
);
2549 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_ELST
, isom_print_elst
);
2550 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TREF
, isom_print_tref
);
2551 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MDIA
, isom_print_mdia
);
2552 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MDHD
, isom_print_mdhd
);
2553 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_HDLR
, isom_print_hdlr
);
2554 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MINF
, isom_print_minf
);
2555 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_VMHD
, isom_print_vmhd
);
2556 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SMHD
, isom_print_smhd
);
2557 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_HMHD
, isom_print_hmhd
);
2558 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_NMHD
, isom_print_nmhd
);
2559 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_GMHD
, isom_print_gmhd
);
2560 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_GMIN
, isom_print_gmin
);
2561 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_TEXT
, isom_print_text
);
2562 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_DINF
, isom_print_dinf
);
2563 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_DREF
, isom_print_dref
);
2564 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_URL
, isom_print_url
);
2565 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STBL
, isom_print_stbl
);
2566 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STSD
, isom_print_stsd
);
2567 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_CLAP
, isom_print_clap
);
2568 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_PASP
, isom_print_pasp
);
2569 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_COLR
, isom_print_colr
);
2570 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_COLR
, isom_print_colr
);
2571 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_GLBL
, isom_print_glbl
);
2572 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_GAMA
, isom_print_gama
);
2573 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_FIEL
, isom_print_fiel
);
2574 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_CSPC
, isom_print_cspc
);
2575 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_SGBT
, isom_print_sgbt
);
2576 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STSL
, isom_print_stsl
);
2577 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_WAVE
, isom_print_wave
);
2578 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_CHAN
, isom_print_chan
);
2579 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SRAT
, isom_print_srat
);
2580 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_FTAB
, isom_print_ftab
);
2581 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STTS
, isom_print_stts
);
2582 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_CTTS
, isom_print_ctts
);
2583 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_CSLG
, isom_print_cslg
);
2584 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STSS
, isom_print_stss
);
2585 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_STPS
, isom_print_stps
);
2586 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SDTP
, isom_print_sdtp
);
2587 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STSC
, isom_print_stsc
);
2588 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STSZ
, isom_print_stsz
);
2589 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_STCO
, isom_print_stco
);
2590 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_CO64
, isom_print_stco
);
2591 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SGPD
, isom_print_sgpd
);
2592 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SBGP
, isom_print_sbgp
);
2593 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_UDTA
, isom_print_udta
);
2594 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_CHPL
, isom_print_chpl
);
2595 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_WLOC
, isom_print_WLOC
);
2596 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_LOOP
, isom_print_LOOP
);
2597 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_SELO
, isom_print_SelO
);
2598 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_ALLF
, isom_print_AllF
);
2599 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_CPRT
, isom_print_cprt
);
2600 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MVEX
, isom_print_mvex
);
2601 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MEHD
, isom_print_mehd
);
2602 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TREX
, isom_print_trex
);
2603 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MOOF
, isom_print_moof
);
2604 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MFHD
, isom_print_mfhd
);
2605 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TRAF
, isom_print_traf
);
2606 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TFHD
, isom_print_tfhd
);
2607 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TFDT
, isom_print_tfdt
);
2608 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TRUN
, isom_print_trun
);
2609 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_FREE
, isom_print_free
);
2610 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_SKIP
, isom_print_free
);
2611 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MDAT
, isom_print_mdat
);
2612 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_KEYS
, isom_print_keys
);
2613 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_META
, isom_print_meta
);
2614 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_ILST
, isom_print_ilst
);
2615 ADD_PRINT_BOX_TABLE_ELEMENT( QT_BOX_TYPE_ILST
, isom_print_ilst
);
2616 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MFRA
, isom_print_mfra
);
2617 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_TFRA
, isom_print_tfra
);
2618 ADD_PRINT_BOX_TABLE_ELEMENT( ISOM_BOX_TYPE_MFRO
, isom_print_mfro
);
2619 ADD_PRINT_BOX_TABLE_ELEMENT( LSMASH_BOX_TYPE_UNSPECIFIED
, NULL
);
2620 #undef ADD_PRINT_BOX_TABLE_ELEMENT
2622 for( int i
= 0; print_box_table
[i
].func
; i
++ )
2623 if( lsmash_check_box_type_identical( box
->type
, print_box_table
[i
].type
) )
2624 return print_box_table
[i
].func
;
2625 return isom_print_unknown
;
2628 static inline void isom_print_remove_plastic_box( isom_box_t
*box
)
2630 if( box
->manager
& LSMASH_ABSENT_IN_ROOT
)
2631 /* free flagged box */
2632 isom_remove_box_by_itself( box
);
2635 int isom_add_print_func( lsmash_file_t
*file
, void *box
, int level
)
2637 if( !(file
->flags
& LSMASH_FILE_MODE_DUMP
) )
2639 isom_print_remove_plastic_box( box
);
2642 isom_print_entry_t
*data
= lsmash_malloc( sizeof(isom_print_entry_t
) );
2645 isom_print_remove_plastic_box( box
);
2648 data
->level
= level
;
2649 data
->box
= (isom_box_t
*)box
;
2650 data
->func
= isom_select_print_func( (isom_box_t
*)box
);
2651 if( !data
->func
|| lsmash_add_entry( file
->print
, data
) < 0 )
2653 isom_print_remove_plastic_box( data
->box
);
2654 lsmash_free( data
);
2660 static void isom_remove_print_func( isom_print_entry_t
*data
)
2662 if( !data
|| !data
->box
)
2664 isom_print_remove_plastic_box( data
->box
);
2665 lsmash_free( data
);
2668 void isom_remove_print_funcs( lsmash_file_t
*file
)
2670 lsmash_remove_list( file
->print
, isom_remove_print_func
);
2674 #endif /* LSMASH_DEMUXER_ENABLED */