1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2010-2017 L-SMASH project
6 * Authors: Takashi Hirata <silverfilain@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 #include "common/internal.h" /* must be placed first */
30 #include "codecs/mp4a.h"
31 #include "codecs/mp4sys.h"
32 #include "codecs/description.h"
34 /***************************************************************************
35 summary and AudioSpecificConfig relative tools
36 ***************************************************************************/
38 /* create AudioSpecificConfig as memory block from summary, and set it into that summary itself */
39 int lsmash_setup_AudioSpecificConfig( lsmash_audio_summary_t
*summary
)
41 if( !summary
|| !summary
->opaque
)
42 return LSMASH_ERR_FUNCTION_PARAM
;
43 /* Remove an old one. */
44 for( lsmash_entry_t
*entry
= summary
->opaque
->list
.head
; entry
; )
46 lsmash_entry_t
*old_entry
= entry
;
48 lsmash_codec_specific_t
*cs
= (lsmash_codec_specific_t
*)old_entry
->data
;
49 if( !cs
|| cs
->type
!= LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG
)
51 lsmash_list_remove_entry_direct( &summary
->opaque
->list
, old_entry
);
53 /* Create and add a new one. */
55 uint8_t *data
= mp4a_export_AudioSpecificConfig( summary
->aot
,
63 return LSMASH_ERR_NAMELESS
;
64 lsmash_codec_specific_t
*cs
= lsmash_create_codec_specific_data( LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG
,
65 LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED
);
69 return LSMASH_ERR_MEMORY_ALLOC
;
71 lsmash_mp4sys_decoder_parameters_t
*param
= (lsmash_mp4sys_decoder_parameters_t
*)cs
->data
.structured
;
72 param
->objectTypeIndication
= MP4SYS_OBJECT_TYPE_Audio_ISO_14496_3
;
73 param
->streamType
= MP4SYS_STREAM_TYPE_AudioStream
;
74 int err
= lsmash_set_mp4sys_decoder_specific_info( param
, data
, data_length
);
76 if( err
< 0 || (err
= lsmash_list_add_entry( &summary
->opaque
->list
, cs
)) < 0 )
78 lsmash_destroy_codec_specific_data( cs
);
84 static lsmash_codec_specific_list_t
*summary_allocate_opaque( void )
86 lsmash_codec_specific_list_t
*opaque
= (lsmash_codec_specific_list_t
*)lsmash_malloc_zero( sizeof(lsmash_codec_specific_list_t
) );
88 lsmash_list_init( &opaque
->list
, lsmash_destroy_codec_specific_data
);
92 static void summary_deallocate_opaque
94 lsmash_codec_specific_list_t
*opaque
99 lsmash_list_remove_entries( &opaque
->list
);
100 lsmash_free( opaque
);
103 lsmash_summary_t
*lsmash_create_summary( lsmash_summary_type summary_type
)
106 switch( summary_type
)
108 case LSMASH_SUMMARY_TYPE_VIDEO
:
109 summary_size
= sizeof(lsmash_video_summary_t
);
111 case LSMASH_SUMMARY_TYPE_AUDIO
:
112 summary_size
= sizeof(lsmash_audio_summary_t
);
114 case LSMASH_SUMMARY_TYPE_HINT
:
115 summary_size
= sizeof(lsmash_hint_summary_t
);
118 /* 'summary_size = sizeof(lsmash_summary_t);' is a dead assignment here. */
121 lsmash_summary_t
*summary
= (lsmash_summary_t
*)lsmash_malloc_zero( summary_size
);
124 summary
->opaque
= summary_allocate_opaque();
125 if( !summary
->opaque
)
127 lsmash_free( summary
);
130 summary
->summary_type
= summary_type
;
131 summary
->data_ref_index
= 1;
135 void lsmash_cleanup_summary( lsmash_summary_t
*summary
)
139 summary_deallocate_opaque( summary
->opaque
);
140 lsmash_free( summary
);
143 int lsmash_add_codec_specific_data( lsmash_summary_t
*summary
, lsmash_codec_specific_t
*specific
)
145 if( !summary
|| !summary
->opaque
|| !specific
)
146 return LSMASH_ERR_FUNCTION_PARAM
;
147 lsmash_codec_specific_t
*dup
= isom_duplicate_codec_specific_data( specific
);
149 return LSMASH_ERR_NAMELESS
;
150 if( lsmash_list_add_entry( &summary
->opaque
->list
, dup
) < 0 )
152 lsmash_destroy_codec_specific_data( dup
);
153 return LSMASH_ERR_MEMORY_ALLOC
;
158 uint32_t lsmash_count_summary( lsmash_root_t
*root
, uint32_t track_ID
)
160 if( isom_check_initializer_present( root
) < 0 || track_ID
== 0 )
162 isom_trak_t
*trak
= isom_get_trak( root
->file
->initializer
, track_ID
);
163 if( LSMASH_IS_NON_EXISTING_BOX( trak
)
164 || LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->mdhd
)
165 || LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->hdlr
) )
167 return trak
->mdia
->minf
->stbl
->stsd
->list
.entry_count
;
170 lsmash_summary_t
*lsmash_get_summary( lsmash_root_t
*root
, uint32_t track_ID
, uint32_t description_number
)
172 if( isom_check_initializer_present( root
) < 0 || track_ID
== 0 || description_number
== 0 )
174 isom_trak_t
*trak
= isom_get_trak( root
->file
->initializer
, track_ID
);
175 if( LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->mdhd
)
176 || LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->hdlr
) )
178 isom_minf_t
*minf
= trak
->mdia
->minf
;
179 isom_stsd_t
*stsd
= minf
->stbl
->stsd
;
181 for( lsmash_entry_t
*entry
= stsd
->list
.head
; entry
; entry
= entry
->next
)
183 if( i
!= description_number
)
188 isom_sample_entry_t
*sample_entry
= entry
->data
;
189 if( LSMASH_IS_NON_EXISTING_BOX( sample_entry
) )
191 if( LSMASH_IS_EXISTING_BOX( minf
->vmhd
) )
192 return isom_create_video_summary_from_description( sample_entry
);
193 else if( LSMASH_IS_EXISTING_BOX( minf
->smhd
) )
194 return isom_create_audio_summary_from_description( sample_entry
);
201 int lsmash_compare_summary( lsmash_summary_t
*a
, lsmash_summary_t
*b
)
204 return LSMASH_ERR_FUNCTION_PARAM
;
205 if( a
->summary_type
!= b
->summary_type
206 || !lsmash_check_box_type_identical( a
->sample_type
, b
->sample_type
) )
208 if( a
->summary_type
== LSMASH_SUMMARY_TYPE_VIDEO
)
210 lsmash_video_summary_t
*in_video
= (lsmash_video_summary_t
*)a
;
211 lsmash_video_summary_t
*out_video
= (lsmash_video_summary_t
*)b
;
212 if( in_video
->width
!= out_video
->width
213 || in_video
->height
!= out_video
->height
214 || in_video
->depth
!= out_video
->depth
215 || in_video
->par_h
!= out_video
->par_h
216 || in_video
->par_v
!= out_video
->par_v
217 || memcmp( in_video
->compressorname
, out_video
->compressorname
, strlen( in_video
->compressorname
) )
218 || in_video
->clap
.width
.n
!= out_video
->clap
.width
.n
219 || in_video
->clap
.width
.d
!= out_video
->clap
.width
.d
220 || in_video
->clap
.height
.n
!= out_video
->clap
.height
.n
221 || in_video
->clap
.height
.d
!= out_video
->clap
.height
.d
222 || in_video
->clap
.horizontal_offset
.n
!= out_video
->clap
.horizontal_offset
.n
223 || in_video
->clap
.horizontal_offset
.d
!= out_video
->clap
.horizontal_offset
.d
224 || in_video
->clap
.vertical_offset
.n
!= out_video
->clap
.vertical_offset
.n
225 || in_video
->clap
.vertical_offset
.d
!= out_video
->clap
.vertical_offset
.d
226 || in_video
->color
.primaries_index
!= out_video
->color
.primaries_index
227 || in_video
->color
.transfer_index
!= out_video
->color
.transfer_index
228 || in_video
->color
.matrix_index
!= out_video
->color
.matrix_index
229 || in_video
->color
.full_range
!= out_video
->color
.full_range
)
232 else if( a
->summary_type
== LSMASH_SUMMARY_TYPE_AUDIO
)
234 lsmash_audio_summary_t
*in_audio
= (lsmash_audio_summary_t
*)a
;
235 lsmash_audio_summary_t
*out_audio
= (lsmash_audio_summary_t
*)b
;
236 if( in_audio
->frequency
!= out_audio
->frequency
237 || in_audio
->channels
!= out_audio
->channels
238 || in_audio
->sample_size
!= out_audio
->sample_size
239 || in_audio
->samples_in_frame
!= out_audio
->samples_in_frame
)
242 else if( a
->summary_type
== LSMASH_SUMMARY_TYPE_HINT
)
244 lsmash_hint_summary_t
*in_hint
= (lsmash_hint_summary_t
*)a
;
245 lsmash_hint_summary_t
*out_hint
= (lsmash_hint_summary_t
*)b
;
246 if( in_hint
->version
!= out_hint
->version
247 || in_hint
->highestcompatibleversion
!= out_hint
->highestcompatibleversion
248 || in_hint
->maxpacketsize
!= out_hint
->maxpacketsize
)
251 return isom_compare_opaque_extensions( a
, b
);
254 lsmash_codec_support_flag
lsmash_check_codec_support( lsmash_codec_type_t sample_type
)
256 static struct codec_support_table_tag
258 lsmash_codec_type_t type
;
259 lsmash_codec_support_flag flags
;
260 } codec_support_table
[160] = { { LSMASH_CODEC_TYPE_INITIALIZER
, LSMASH_CODEC_SUPPORT_FLAG_NONE
} };
261 if( lsmash_check_codec_type_identical( codec_support_table
[0].type
, LSMASH_CODEC_TYPE_UNSPECIFIED
) )
263 /* Initialize the table. */
265 #define ADD_CODEC_SUPPORT_TABLE_ELEMENT( type, flags ) \
266 codec_support_table[i++] = (struct codec_support_table_tag){ type, flags }
267 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_AC_3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
268 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_ALAC_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
269 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSC_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
270 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSE_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
271 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSH_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
272 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSL_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
273 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSX_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
274 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_EC_3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
275 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4A_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
276 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAMR_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
277 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAWB_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
278 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_23NI_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
279 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MAC3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
280 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MAC6_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
281 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_NONE_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
282 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_QCLP_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_DEMUX
);
283 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_AGSM_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
284 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ALAC_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
285 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ALAW_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
286 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FL32_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
287 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FL64_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
288 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_IN24_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
289 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_IN32_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
290 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_LPCM_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
291 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MP4A_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
292 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RAW_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
293 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_SOWT_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
294 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_TWOS_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
295 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULAW_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
296 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FULLMP3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
297 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ADPCM2_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
298 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ADPCM17_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
299 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_GSM49_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
300 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_NOT_SPECIFIED
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
301 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
302 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC3_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
303 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_HVC1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
304 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_HEV1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
305 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4V_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_MUX
);
306 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_VC_1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
307 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_2VUY_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
308 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DV10_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
309 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVOO_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
310 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCH_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
311 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCN_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
312 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCS_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
313 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCO_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
314 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_AP4H_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
315 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_AP4X_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
316 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVC_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
317 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVCP_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
318 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVPP_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
319 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DV5N_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
320 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DV5P_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
321 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
322 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH3_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
323 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH5_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
324 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH6_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
325 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVHP_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
326 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVHQ_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
327 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FLIC_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
328 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_H261_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
329 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_H263_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
330 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_JPEG_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
331 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MJPA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
332 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MJPB_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
333 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_PNG_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
334 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RAW_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
335 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RLE_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
336 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RPZA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
337 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_TGA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
338 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_TIFF_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
339 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULRA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
340 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULRG_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
341 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULY0_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
342 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULY2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
343 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULH0_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
344 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULH2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
345 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_UQY2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
346 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V210_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
347 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V216_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
348 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V308_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
349 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V408_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
350 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V410_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
351 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_YUV2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
352 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_RRTP_HINT
, LSMASH_CODEC_SUPPORT_FLAG_MUX
);
353 ADD_CODEC_SUPPORT_TABLE_ELEMENT( LSMASH_CODEC_TYPE_UNSPECIFIED
, LSMASH_CODEC_SUPPORT_FLAG_NONE
);
355 for( int i
= 0; !lsmash_check_codec_type_identical( codec_support_table
[i
].type
, LSMASH_CODEC_TYPE_UNSPECIFIED
); i
++ )
356 if( lsmash_check_codec_type_identical( sample_type
, codec_support_table
[i
].type
) )
357 return codec_support_table
[i
].flags
;
358 return LSMASH_CODEC_SUPPORT_FLAG_NONE
;