list: Decide the entry eliminator of list at its initialization.
[L-SMASH.git] / core / box_default.c
blobbcf1335b4dfb020517c2bd5a9e4ac9eed4b1b63c
1 /*****************************************************************************
2 * box_default.c
3 *****************************************************************************
4 * Copyright (C) 2017 L-SMASH project
6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *****************************************************************************/
21 /* This file is available under an ISC license. */
23 #include "common/internal.h" /* must be placed first */
25 #include "box.h"
26 #include "box_default.h"
28 #define INITIALIZE_BASEBOX_COMMON( box_name ) \
29 .class = &isom_box_default_class, \
30 .root = (isom_root_abstract_t *)&isom_root_abstract_box_default, \
31 .file = (isom_file_abstract_t *)&isom_file_abstract_box_default, \
32 .parent = (isom_box_t *)&isom_opaque_box_default, \
33 .nonexist_ptr = (void *)&isom_##box_name##_box_default, \
34 .binary = NULL, \
35 .destruct = NULL, \
36 .write = NULL, \
37 .manager = LSMASH_NON_EXISTING_BOX, \
38 .precedence = 0, \
39 .pos = 0, \
40 .extensions = { .head = NULL }, \
41 .size = 0, \
42 .type = LSMASH_BOX_TYPE_INITIALIZER
44 #define DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( box_name ) \
45 const isom_##box_name##_t isom_##box_name##_box_default = \
46 { \
47 INITIALIZE_BASEBOX_COMMON( box_name ) \
50 static const lsmash_class_t isom_box_default_class =
52 "box_default"
55 typedef isom_box_t isom_opaque_t;
56 static const isom_box_t isom_opaque_box_default =
58 INITIALIZE_BASEBOX_COMMON( opaque )
61 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( dummy );
62 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( unknown );
63 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( ftyp );
64 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( ctab );
65 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( tkhd );
66 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( clef );
67 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( prof );
68 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( enof );
69 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( elst );
70 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( tref_type );
71 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( tref );
72 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mdhd );
73 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( hdlr );
74 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( vmhd );
75 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( smhd );
76 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( hmhd );
77 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( nmhd );
78 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( gmin );
79 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( text );
80 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( dref_entry );
81 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( dref );
82 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( esds );
83 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( btrt );
84 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( glbl );
85 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( clap );
86 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( pasp );
87 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( colr );
88 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( gama );
89 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( fiel );
90 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( cspc );
91 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( sgbt );
92 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stsl );
93 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( sample_entry );
94 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mp4s_entry );
95 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( visual_entry );
96 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( frma );
97 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( enda );
98 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mp4a );
99 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( terminator );
100 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( chan );
101 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( srat );
102 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( audio_entry );
103 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( hint_entry );
104 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( metadata_entry );
105 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( qt_text_entry );
106 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( ftab );
107 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stsd );
108 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stts );
109 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( ctts );
110 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( cslg );
111 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stsz );
112 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stz2 );
113 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stss );
114 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stps );
115 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( sdtp );
116 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stsc );
117 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( stco );
118 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( sgpd );
119 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( sbgp );
120 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mvhd );
121 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( iods );
122 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mdat );
123 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( skip );
124 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( chpl );
125 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( keys );
126 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mean );
127 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( name );
128 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( data );
129 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( ilst );
130 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( WLOC );
131 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( LOOP );
132 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( SelO );
133 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( AllF );
134 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( cprt );
135 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mehd );
136 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( trex );
137 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mfhd );
138 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( tfhd );
139 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( tfdt );
140 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( trun );
141 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( tfra );
142 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( mfro );
143 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( styp );
144 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( sidx );
145 DEFINE_SIMPLE_BOX_DEFAULT_CONSTANT( root_abstract );
147 #define INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( child_name ) \
148 .child_name = (isom_##child_name##_t *)&isom_##child_name##_box_default
150 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( ... ) \
151 CALL_FUNC_DEFAULT_ARGS( DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT, __VA_ARGS__ )
152 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, expanded_initializations ) \
153 const isom_##box_name##_t isom_##box_name##_box_default = \
155 INITIALIZE_BASEBOX_COMMON( box_name ), \
156 expanded_initializations \
158 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_12( box_name, \
159 _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10 ) \
160 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
161 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
162 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
163 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ), \
164 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _3 ), \
165 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _4 ), \
166 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _5 ), \
167 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _6 ), \
168 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _7 ), \
169 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _8 ), \
170 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _9 ), \
171 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _10 ) ) )
172 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_9( box_name, _0, _1, _2, _3, _4, _5, _6, _7 ) \
173 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
174 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
175 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
176 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ), \
177 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _3 ), \
178 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _4 ), \
179 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _5 ), \
180 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _6 ), \
181 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _7 ) ) )
182 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_8( box_name, _0, _1, _2, _3, _4, _5, _6 ) \
183 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
184 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
185 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
186 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ), \
187 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _3 ), \
188 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _4 ), \
189 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _5 ), \
190 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _6 ) ) )
191 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_7( box_name, _0, _1, _2, _3, _4, _5 ) \
192 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
193 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
194 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
195 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ), \
196 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _3 ), \
197 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _4 ), \
198 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _5 ) ) )
199 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_6( box_name, _0, _1, _2, _3, _4 ) \
200 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
201 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
202 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
203 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ), \
204 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _3 ), \
205 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _4 ) ) )
206 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_5( box_name, _0, _1, _2, _3 ) \
207 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
208 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
209 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
210 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ), \
211 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _3 ) ) )
212 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_4( box_name, _0, _1, _2 ) \
213 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
214 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
215 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ), \
216 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _2 ) ) )
217 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_3( box_name, _0, _1 ) \
218 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
219 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ), \
220 INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _1 ) ) )
221 #define DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_2( box_name, _0 ) \
222 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT_TEMPLATE( box_name, \
223 EXPAND_VA_ARGS( INITIALIZE_PREDEFINED_CHILD_BY_DEFAULT_CONSTANT_PTR( _0 ) ) )
225 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( tapt, clef, enof, prof );
226 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( edts, elst );
227 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( gmhd, gmin, text );
228 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( dinf, dref );
229 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( wave, frma, enda, mp4a );
230 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( tx3g_entry, ftab );
231 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( stbl, stsd, stts, ctts, cslg, stss, stps, sdtp, stsc, stsz, stz2, stco );
232 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( minf, vmhd, smhd, hmhd, nmhd, gmhd, hdlr, dinf, stbl );
233 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( mdia, mdhd, hdlr, minf );
234 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( metaitem, mean, name, data );
235 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( meta, hdlr, dinf, keys, ilst );
236 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( udta, chpl, meta, WLOC, LOOP, SelO, AllF );
237 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( mvex, mehd );
238 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( traf, tfhd, tfdt, sdtp );
239 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( moof, mfhd );
240 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( mfra, mfro );
241 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( trak, tkhd, tapt, edts, tref, mdia, udta, meta );
242 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( moov, mvhd, iods, udta, ctab, meta, mvex );
243 DEFINE_SIMPLE_CONTAINER_BOX_DEFAULT_CONSTANT( file_abstract, ftyp, moov, mdat, meta, mfra );
245 /* Box-lists predefined in the parent box definitions are initialized by 0s, thus the entry eliminator
246 * of each list also be set to NULL (0). This must not be an issue since all box are deallocated through
247 * the 'extensions' list of the parent box. Only 'entry' which holds the actual box data is deallocated
248 * when the box is deallocated by the isom_remove_box_in_predefined_list() function. Because of that,
249 * here, there are no explicit default constant definitions of indivisual predefined box-lists. */
252 /* Allocate box by default settings.
254 * Use this function to allocate boxes as much as possible, it covers forgetful settings. */
255 void *allocate_box_by_default
257 const void *nonexist_ptr,
258 const size_t data_type_size
261 assert( data_type_size >= offsetof( isom_box_t, manager ) + sizeof(((isom_box_t *)0)->manager) );
262 isom_box_t *box = (isom_box_t *)lsmash_memdup( nonexist_ptr, data_type_size );
263 if( !box )
264 return (void *)nonexist_ptr;
265 box->manager &= ~LSMASH_NON_EXISTING_BOX;
266 lsmash_list_init( &box->extensions, isom_remove_extension_box );
267 return (void *)box;