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
; entry
= entry
->next
)
46 lsmash_codec_specific_t
*cs
= (lsmash_codec_specific_t
*)entry
->data
;
47 if( !cs
|| cs
->type
!= LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG
)
49 lsmash_remove_entry_direct( &summary
->opaque
->list
, entry
, lsmash_destroy_codec_specific_data
);
51 /* Create and add a new one. */
53 uint8_t *data
= mp4a_export_AudioSpecificConfig( summary
->aot
,
61 return LSMASH_ERR_NAMELESS
;
62 lsmash_codec_specific_t
*cs
= lsmash_create_codec_specific_data( LSMASH_CODEC_SPECIFIC_DATA_TYPE_MP4SYS_DECODER_CONFIG
,
63 LSMASH_CODEC_SPECIFIC_FORMAT_STRUCTURED
);
67 return LSMASH_ERR_MEMORY_ALLOC
;
69 lsmash_mp4sys_decoder_parameters_t
*param
= (lsmash_mp4sys_decoder_parameters_t
*)cs
->data
.structured
;
70 param
->objectTypeIndication
= MP4SYS_OBJECT_TYPE_Audio_ISO_14496_3
;
71 param
->streamType
= MP4SYS_STREAM_TYPE_AudioStream
;
72 int err
= lsmash_set_mp4sys_decoder_specific_info( param
, data
, data_length
);
74 if( err
< 0 || (err
= lsmash_add_entry( &summary
->opaque
->list
, cs
)) < 0 )
76 lsmash_destroy_codec_specific_data( cs
);
82 lsmash_summary_t
*lsmash_create_summary( lsmash_summary_type summary_type
)
85 switch( summary_type
)
87 case LSMASH_SUMMARY_TYPE_VIDEO
:
88 summary_size
= sizeof(lsmash_video_summary_t
);
90 case LSMASH_SUMMARY_TYPE_AUDIO
:
91 summary_size
= sizeof(lsmash_audio_summary_t
);
94 summary_size
= sizeof(lsmash_summary_t
);
97 lsmash_summary_t
*summary
= (lsmash_summary_t
*)lsmash_malloc_zero( summary_size
);
100 summary
->opaque
= (lsmash_codec_specific_list_t
*)lsmash_malloc_zero( sizeof(lsmash_codec_specific_list_t
) );
101 if( !summary
->opaque
)
103 lsmash_free( summary
);
106 summary
->summary_type
= summary_type
;
107 summary
->data_ref_index
= 1;
111 void lsmash_cleanup_summary( lsmash_summary_t
*summary
)
115 if( summary
->opaque
)
117 for( lsmash_entry_t
*entry
= summary
->opaque
->list
.head
; entry
; )
119 lsmash_entry_t
*next
= entry
->next
;
120 lsmash_destroy_codec_specific_data( (lsmash_codec_specific_t
*)entry
->data
);
121 lsmash_free( entry
);
124 lsmash_free( summary
->opaque
);
126 lsmash_free( summary
);
129 int lsmash_add_codec_specific_data( lsmash_summary_t
*summary
, lsmash_codec_specific_t
*specific
)
131 if( !summary
|| !summary
->opaque
|| !specific
)
132 return LSMASH_ERR_FUNCTION_PARAM
;
133 lsmash_codec_specific_t
*dup
= isom_duplicate_codec_specific_data( specific
);
135 return LSMASH_ERR_NAMELESS
;
136 if( lsmash_add_entry( &summary
->opaque
->list
, dup
) < 0 )
138 lsmash_destroy_codec_specific_data( dup
);
139 return LSMASH_ERR_MEMORY_ALLOC
;
144 uint32_t lsmash_count_summary( lsmash_root_t
*root
, uint32_t track_ID
)
146 if( isom_check_initializer_present( root
) < 0 || track_ID
== 0 )
148 isom_trak_t
*trak
= isom_get_trak( root
->file
->initializer
, track_ID
);
149 if( LSMASH_IS_NON_EXISTING_BOX( trak
)
150 || LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->mdhd
)
151 || LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->hdlr
) )
153 return trak
->mdia
->minf
->stbl
->stsd
->list
.entry_count
;
156 lsmash_summary_t
*lsmash_get_summary( lsmash_root_t
*root
, uint32_t track_ID
, uint32_t description_number
)
158 if( isom_check_initializer_present( root
) < 0 || track_ID
== 0 || description_number
== 0 )
160 isom_trak_t
*trak
= isom_get_trak( root
->file
->initializer
, track_ID
);
161 if( LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->mdhd
)
162 || LSMASH_IS_NON_EXISTING_BOX( trak
->mdia
->hdlr
) )
164 isom_minf_t
*minf
= trak
->mdia
->minf
;
165 isom_stsd_t
*stsd
= minf
->stbl
->stsd
;
167 for( lsmash_entry_t
*entry
= stsd
->list
.head
; entry
; entry
= entry
->next
)
169 if( i
!= description_number
)
174 isom_sample_entry_t
*sample_entry
= entry
->data
;
175 if( LSMASH_IS_NON_EXISTING_BOX( sample_entry
) )
177 if( LSMASH_IS_EXISTING_BOX( minf
->vmhd
) )
178 return isom_create_video_summary_from_description( sample_entry
);
179 else if( LSMASH_IS_EXISTING_BOX( minf
->smhd
) )
180 return isom_create_audio_summary_from_description( sample_entry
);
187 int lsmash_compare_summary( lsmash_summary_t
*a
, lsmash_summary_t
*b
)
190 return LSMASH_ERR_FUNCTION_PARAM
;
191 if( a
->summary_type
!= b
->summary_type
192 || !lsmash_check_box_type_identical( a
->sample_type
, b
->sample_type
) )
194 if( a
->summary_type
== LSMASH_SUMMARY_TYPE_VIDEO
)
196 lsmash_video_summary_t
*in_video
= (lsmash_video_summary_t
*)a
;
197 lsmash_video_summary_t
*out_video
= (lsmash_video_summary_t
*)b
;
198 if( in_video
->width
!= out_video
->width
199 || in_video
->height
!= out_video
->height
200 || in_video
->depth
!= out_video
->depth
201 || in_video
->par_h
!= out_video
->par_h
202 || in_video
->par_v
!= out_video
->par_v
203 || memcmp( in_video
->compressorname
, out_video
->compressorname
, strlen( in_video
->compressorname
) )
204 || in_video
->clap
.width
.n
!= out_video
->clap
.width
.n
205 || in_video
->clap
.width
.d
!= out_video
->clap
.width
.d
206 || in_video
->clap
.height
.n
!= out_video
->clap
.height
.n
207 || in_video
->clap
.height
.d
!= out_video
->clap
.height
.d
208 || in_video
->clap
.horizontal_offset
.n
!= out_video
->clap
.horizontal_offset
.n
209 || in_video
->clap
.horizontal_offset
.d
!= out_video
->clap
.horizontal_offset
.d
210 || in_video
->clap
.vertical_offset
.n
!= out_video
->clap
.vertical_offset
.n
211 || in_video
->clap
.vertical_offset
.d
!= out_video
->clap
.vertical_offset
.d
212 || in_video
->color
.primaries_index
!= out_video
->color
.primaries_index
213 || in_video
->color
.transfer_index
!= out_video
->color
.transfer_index
214 || in_video
->color
.matrix_index
!= out_video
->color
.matrix_index
215 || in_video
->color
.full_range
!= out_video
->color
.full_range
)
218 else if( a
->summary_type
== LSMASH_SUMMARY_TYPE_AUDIO
)
220 lsmash_audio_summary_t
*in_audio
= (lsmash_audio_summary_t
*)a
;
221 lsmash_audio_summary_t
*out_audio
= (lsmash_audio_summary_t
*)b
;
222 if( in_audio
->frequency
!= out_audio
->frequency
223 || in_audio
->channels
!= out_audio
->channels
224 || in_audio
->sample_size
!= out_audio
->sample_size
225 || in_audio
->samples_in_frame
!= out_audio
->samples_in_frame
)
228 return isom_compare_opaque_extensions( a
, b
);
231 lsmash_codec_support_flag
lsmash_check_codec_support( lsmash_codec_type_t sample_type
)
233 static struct codec_support_table_tag
235 lsmash_codec_type_t type
;
236 lsmash_codec_support_flag flags
;
237 } codec_support_table
[160] = { { LSMASH_CODEC_TYPE_INITIALIZER
, LSMASH_CODEC_SUPPORT_FLAG_NONE
} };
238 if( lsmash_check_codec_type_identical( codec_support_table
[0].type
, LSMASH_CODEC_TYPE_UNSPECIFIED
) )
240 /* Initialize the table. */
242 #define ADD_CODEC_SUPPORT_TABLE_ELEMENT( type, flags ) \
243 codec_support_table[i++] = (struct codec_support_table_tag){ type, flags }
244 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_AC_3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
245 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_ALAC_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
246 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSC_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
247 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSE_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
248 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSH_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
249 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSL_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
250 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_DTSX_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
251 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_EC_3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
252 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4A_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
253 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAMR_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
254 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_SAWB_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
255 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_23NI_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
256 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MAC3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
257 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MAC6_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
258 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_NONE_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
259 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_QCLP_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_DEMUX
);
260 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_AGSM_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
261 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ALAC_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
262 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ALAW_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
263 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FL32_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
264 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FL64_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
265 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_IN24_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
266 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_IN32_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
267 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_LPCM_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
268 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MP4A_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
269 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RAW_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
270 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_SOWT_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
271 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_TWOS_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
272 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULAW_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
273 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FULLMP3_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
274 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ADPCM2_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
275 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ADPCM17_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
276 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_GSM49_AUDIO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
277 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_NOT_SPECIFIED
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
278 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
279 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_AVC3_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
280 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_HVC1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
281 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_HEV1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
282 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_MP4V_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_MUX
);
283 ADD_CODEC_SUPPORT_TABLE_ELEMENT( ISOM_CODEC_TYPE_VC_1_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
284 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_2VUY_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
285 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DV10_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
286 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVOO_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
287 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCH_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
288 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCN_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
289 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCS_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
290 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_APCO_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
291 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_AP4H_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
292 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_AP4X_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
293 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVC_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
294 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVCP_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
295 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVPP_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
296 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DV5N_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
297 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DV5P_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
298 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
299 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH3_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
300 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH5_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
301 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVH6_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
302 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVHP_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
303 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_DVHQ_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
304 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_FLIC_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
305 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_H261_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
306 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_H263_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
307 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_JPEG_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
308 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MJPA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
309 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_MJPB_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
310 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_PNG_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
311 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RAW_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
312 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RLE_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
313 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_RPZA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
314 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_TGA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
315 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_TIFF_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
316 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULRA_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
317 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULRG_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
318 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULY0_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
319 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULY2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
320 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULH0_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
321 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_ULH2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
322 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_UQY2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
323 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V210_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
324 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V216_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
325 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V308_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
326 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V408_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
327 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_V410_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
328 ADD_CODEC_SUPPORT_TABLE_ELEMENT( QT_CODEC_TYPE_YUV2_VIDEO
, LSMASH_CODEC_SUPPORT_FLAG_REMUX
);
329 ADD_CODEC_SUPPORT_TABLE_ELEMENT( LSMASH_CODEC_TYPE_UNSPECIFIED
, LSMASH_CODEC_SUPPORT_FLAG_NONE
);
331 for( int i
= 0; !lsmash_check_codec_type_identical( codec_support_table
[i
].type
, LSMASH_CODEC_TYPE_UNSPECIFIED
); i
++ )
332 if( lsmash_check_codec_type_identical( sample_type
, codec_support_table
[i
].type
) )
333 return codec_support_table
[i
].flags
;
334 return LSMASH_CODEC_SUPPORT_FLAG_NONE
;