7 /* atom handling routines */
8 int quicktime_atom_write_header(quicktime_t
*file
, quicktime_atom_t
*atom
, char *text
);
9 int quicktime_atom_write_header64(quicktime_t
*file
, quicktime_atom_t
*atom
, char *text
);
10 int64_t quicktime_byte_position(quicktime_t
*file
);
11 // Used internally to replace ftello values
12 int64_t quicktime_ftell(quicktime_t
*file
);
14 quicktime_trak_t
* quicktime_add_track(quicktime_t
*file
);
18 int quicktime_file_open(quicktime_t
*file
, char *path
, int rd
, int wr
);
19 int quicktime_file_close(quicktime_t
*file
);
20 int64_t quicktime_get_file_length(char *path
);
22 /* Initialize audio_map_t and video_map_t objects after loading headers */
23 /* Called by quicktime_read_info */
24 void quicktime_init_maps(quicktime_t
*file
);
26 int quicktime_read_char(quicktime_t
*file
);
27 float quicktime_read_fixed32(quicktime_t
*file
);
28 float quicktime_read_fixed16(quicktime_t
*file
);
29 int64_t quicktime_read_int64(quicktime_t
*file
);
30 int64_t quicktime_read_int64_le(quicktime_t
*file
);
31 unsigned long quicktime_read_uint32(quicktime_t
*file
);
32 long quicktime_read_int32(quicktime_t
*file
);
33 long quicktime_read_int32_le(quicktime_t
*file
);
34 long quicktime_read_int24(quicktime_t
*file
);
35 int64_t quicktime_position(quicktime_t
*file
);
36 int quicktime_set_position(quicktime_t
*file
, int64_t position
);
37 int quicktime_write_fixed32(quicktime_t
*file
, float number
);
38 int quicktime_write_char(quicktime_t
*file
, char x
);
39 int quicktime_write_int16(quicktime_t
*file
, int number
);
40 int quicktime_write_int16_le(quicktime_t
*file
, int number
);
41 int quicktime_write_int24(quicktime_t
*file
, long number
);
42 int quicktime_write_int32(quicktime_t
*file
, long value
);
43 int quicktime_write_int32_le(quicktime_t
*file
, long value
);
44 int quicktime_write_int64(quicktime_t
*file
, int64_t value
);
45 int quicktime_write_int64_le(quicktime_t
*file
, int64_t value
);
46 int quicktime_write_char32(quicktime_t
*file
, char *string
);
47 int quicktime_write_fixed16(quicktime_t
*file
, float number
);
49 /* Returns number of bytes written */
50 int quicktime_write_data(quicktime_t
*file
, char *data
, int size
);
51 /* Enable or disable presave */
52 void quicktime_set_presave(quicktime_t
*file
, int value
);
53 /* Returns 1 if equal or 0 if different */
54 int quicktime_match_32(char *input
, char *output
);
55 int quicktime_match_24(char *input
, char *output
);
56 void quicktime_write_pascal(quicktime_t
*file
, char *data
);
57 int quicktime_read_data(quicktime_t
*file
, char *data
, int64_t size
);
59 /* Most codecs don't specify the actual number of bits on disk in the stbl. */
60 /* Convert the samples to the number of bytes for reading depending on the codec. */
61 int64_t quicktime_samples_to_bytes(quicktime_trak_t
*track
, long samples
);
63 /* Convert Microsoft audio id to codec */
64 void quicktime_id_to_codec(char *result
, int id
);
66 int quicktime_find_vcodec(quicktime_video_map_t
*vtrack
);
67 int quicktime_find_acodec(quicktime_audio_map_t
*atrack
);
76 quicktime_scaletable_t
* quicktime_new_scaletable(int input_w
, int input_h
, int output_w
, int output_h
);
79 /* chunks always start on 1 */
80 /* samples start on 0 */
82 /* update the position pointers in all the tracks after a set_position */
83 int quicktime_update_positions(quicktime_t
*file
);
92 void quicktime_read_strh(quicktime_t
*file
, quicktime_atom_t
*parent_atom
);
93 void quicktime_write_strh(quicktime_t
*file
, int track
);
98 /* Create new strl object for reading or writing */
99 quicktime_strl_t
* quicktime_new_strl();
100 /* Initialize new strl object for writing */
101 void quicktime_init_strl(quicktime_t
*file
,
102 quicktime_audio_map_t
*atrack
,
103 quicktime_video_map_t
*vtrack
,
104 quicktime_trak_t
*trak
,
105 quicktime_strl_t
*strl
);
106 void quicktime_delete_strl(quicktime_strl_t
*strl
);
107 /* Read strl object */
108 void quicktime_read_strl(quicktime_t
*file
,
109 quicktime_strl_t
*strl
,
110 quicktime_atom_t
*parent_atom
);
113 void quicktime_delete_indx(quicktime_indx_t
*indx
);
114 void quicktime_init_indx(quicktime_t
*file
,
115 quicktime_indx_t
*indx
,
116 quicktime_strl_t
*strl
);
117 void quicktime_update_indx(quicktime_t
*file
,
118 quicktime_indx_t
*indx
,
120 void quicktime_finalize_indx(quicktime_t
*file
);
121 /* Called by quicktime_read_strl */
122 void quicktime_read_indx(quicktime_t
*file
,
123 quicktime_strl_t
*strl
,
124 quicktime_atom_t
*parent_atom
);
128 void quicktime_delete_hdrl(quicktime_t
*file
, quicktime_hdrl_t
*hdrl
);
129 void quicktime_read_hdrl(quicktime_t
*file
,
130 quicktime_hdrl_t
*hdrl
,
131 quicktime_atom_t
*parent_atom
);
132 void quicktime_init_hdrl(quicktime_t
*file
, quicktime_hdrl_t
*hdrl
);
133 void quicktime_finalize_hdrl(quicktime_t
*file
, quicktime_hdrl_t
*hdrl
);
134 void quicktime_read_esds(quicktime_t
*file
,
135 quicktime_atom_t
*parent_atom
,
136 quicktime_stsd_table_t
*table
);
137 void quicktime_write_esds(quicktime_t
*file
,
138 quicktime_stsd_table_t
*table
,
141 // Set esds header to a copy of the argument
142 void quicktime_set_mpeg4_header(quicktime_stsd_table_t
*table
,
151 /* Read movi and create objects */
152 void quicktime_delete_movi(quicktime_t
*file
, quicktime_movi_t
*movi
);
153 void quicktime_read_movi(quicktime_t
*file
,
154 quicktime_atom_t
*parent_atom
,
155 quicktime_movi_t
*movi
);
156 /* Write preliminary movi data and create objects */
157 void quicktime_init_movi(quicktime_t
*file
, quicktime_riff_t
*riff
);
158 void quicktime_finalize_movi(quicktime_t
*file
, quicktime_movi_t
*movi
);
165 void quicktime_delete_idx1(quicktime_idx1_t
*idx1
);
166 void quicktime_read_idx1(quicktime_t
*file
,
167 quicktime_riff_t
*riff
,
168 quicktime_atom_t
*parent_atom
);
169 void quicktime_write_idx1(quicktime_t
*file
,
170 quicktime_idx1_t
*idx1
);
171 /* Set the keyframe flag in the right IDX1 entry. new_keyframes starts on 0 */
172 /* Used by quicktime_insert_keyframe */
173 void quicktime_set_idx1_keyframe(quicktime_t
*file
,
174 quicktime_trak_t
*trak
,
176 /* Create new IDX1 entry. Used by quicktime_write_chunk_footer */
177 void quicktime_update_idx1table(quicktime_t
*file
,
178 quicktime_trak_t
*trak
,
185 void quicktime_read_odml(quicktime_t
*file
, quicktime_atom_t
*parent_atom
);
186 void quicktime_finalize_odml(quicktime_t
*file
, quicktime_hdrl_t
*hdrl
);
187 void quicktime_init_odml(quicktime_t
*file
, quicktime_hdrl_t
*hdrl
);
196 /* Create new riff and put on riff table */
197 quicktime_riff_t
* quicktime_new_riff(quicktime_t
*file
);
198 void quicktime_delete_riff(quicktime_t
*file
, quicktime_riff_t
*riff
);
199 void quicktime_read_riff(quicktime_t
*file
, quicktime_atom_t
*parent_atom
);
201 /* Write riff header and initialize structures */
202 /* Only the first riff has a hdrl object */
203 void quicktime_init_riff(quicktime_t
*file
);
204 void quicktime_finalize_riff(quicktime_t
*file
, quicktime_riff_t
*riff
);
207 /* Create ix object for writing only */
208 quicktime_ix_t
* quicktime_new_ix(quicktime_t
*file
,
209 quicktime_trak_t
*trak
,
210 quicktime_strl_t
*strl
);
211 void quicktime_delete_ix(quicktime_ix_t
*ix
);
212 void quicktime_update_ixtable(quicktime_t
*file
,
213 quicktime_trak_t
*trak
,
216 void quicktime_write_ix(quicktime_t
*file
,
219 /* Read entire ix atom from current position in file */
220 /* Called by quicktime_read_indx. */
221 void quicktime_read_ix(quicktime_t
*file
,
226 /* compression_id is for AVI reading */
227 int quicktime_trak_init_audio(quicktime_t
*file
,
228 quicktime_trak_t
*trak
,
233 int quicktime_trak_init_video(quicktime_t
*file
,
234 quicktime_trak_t
*trak
,
239 int quicktime_trak_delete(quicktime_trak_t
*trak
);
240 int quicktime_trak_dump(quicktime_trak_t
*trak
);
241 int quicktime_delete_trak(quicktime_moov_t
*moov
);
242 int quicktime_read_trak(quicktime_t
*file
, quicktime_trak_t
*trak
, quicktime_atom_t
*trak_atom
);
243 int quicktime_write_trak(quicktime_t
*file
, quicktime_trak_t
*trak
, long moov_time_scale
);
244 int64_t quicktime_track_end(quicktime_trak_t
*trak
);
247 /* the total number of samples in the track depending on the access mode */
248 long quicktime_track_samples(quicktime_t
*file
, quicktime_trak_t
*trak
);
251 /* queries for every atom */
252 /* the starting sample in the given chunk */
253 long quicktime_sample_of_chunk(quicktime_trak_t
*trak
, long chunk
);
256 /* the byte offset from mdat start of the chunk. Chunk is numbered from 1 */
257 int64_t quicktime_chunk_to_offset(quicktime_t
*file
, quicktime_trak_t
*trak
, long chunk
);
260 /* the chunk of any offset from mdat start */
261 long quicktime_offset_to_chunk(int64_t *chunk_offset
,
262 quicktime_trak_t
*trak
,
265 /* Bytes in the chunk. Chunk is numbered from 1 */
266 /* Only available in AVI. */
267 /* Reads the chunk header to get the size. */
268 /* Stores the chunk offset in chunk_offset. */
269 /* Returns the bytes in the chunk less the 8 byte header size */
270 int quicktime_chunk_bytes(quicktime_t
*file
,
271 int64_t *chunk_offset
,
273 quicktime_trak_t
*trak
);
276 /* total bytes between the two samples */
277 int64_t quicktime_sample_range_size(quicktime_trak_t
*trak
, long chunk_sample
, long sample
);
280 int quicktime_chunk_of_sample(int64_t *chunk_sample
,
282 quicktime_trak_t
*trak
,
287 /* converting between mdat offsets to samples */
288 int64_t quicktime_sample_to_offset(quicktime_t
*file
, quicktime_trak_t
*trak
, long sample
);
289 long quicktime_offset_to_sample(quicktime_trak_t
*trak
, int64_t offset
);
290 quicktime_trak_t
* quicktime_add_trak(quicktime_t
*file
);
293 int quicktime_time_to_sample(quicktime_stts_t
*stts
,
294 int64_t *start_time
);
297 void quicktime_write_chunk_header(quicktime_t
*file
,
298 quicktime_trak_t
*trak
,
299 quicktime_atom_t
*chunk
);
300 void quicktime_write_chunk_footer(quicktime_t
*file
,
301 quicktime_trak_t
*trak
,
303 quicktime_atom_t
*chunk
,
305 /* update all the tables after writing a buffer */
306 /* set sample_size to 0 if no sample size should be set */
308 * int quicktime_update_tables(quicktime_t *file,
309 * quicktime_trak_t *trak,
314 * int64_t sample_size);
316 void quicktime_update_stco(quicktime_stco_t
*stco
, long chunk
, int64_t offset
);
317 void quicktime_update_stsz(quicktime_stsz_t
*stsz
, long sample
, long sample_size
);
318 int quicktime_update_stsc(quicktime_stsc_t
*stsc
, long chunk
, long samples
);
319 int quicktime_trak_duration(quicktime_trak_t
*trak
, long *duration
, long *timescale
);
320 int quicktime_trak_fix_counts(quicktime_t
*file
, quicktime_trak_t
*trak
);
321 int quicktime_sample_size(quicktime_trak_t
*trak
, int sample
);
323 /* number of samples in the chunk */
324 long quicktime_chunk_samples(quicktime_trak_t
*trak
, long chunk
);
325 int quicktime_trak_shift_offsets(quicktime_trak_t
*trak
, int64_t offset
);
326 void quicktime_mhvd_init_video(quicktime_t
*file
,
327 quicktime_mvhd_t
*mvhd
,
331 void quicktime_stsd_init_video(quicktime_t
*file
,
332 quicktime_stsd_t
*stsd
,
337 void quicktime_stsd_init_audio(quicktime_t
*file
,
338 quicktime_stsd_t
*stsd
,
343 void quicktime_stts_init_video(quicktime_t
*file
,
344 quicktime_stts_t
*stts
,
347 void quicktime_stbl_init_video(quicktime_t
*file
,
348 quicktime_stbl_t
*stbl
,
354 void quicktime_stbl_init_audio(quicktime_t
*file
,
355 quicktime_stbl_t
*stbl
,
360 void quicktime_minf_init_video(quicktime_t
*file
,
361 quicktime_minf_t
*minf
,
367 void quicktime_mdhd_init_video(quicktime_t
*file
,
368 quicktime_mdhd_t
*mdhd
,
372 void quicktime_mdhd_init_audio(quicktime_mdhd_t
*mdhd
,
374 void quicktime_minf_init_audio(quicktime_t
*file
,
375 quicktime_minf_t
*minf
,
380 void quicktime_mdia_init_video(quicktime_t
*file
,
381 quicktime_mdia_t
*mdia
,
386 void quicktime_mdia_init_audio(quicktime_t
*file
,
387 quicktime_mdia_t
*mdia
,
392 void quicktime_tkhd_init_video(quicktime_t
*file
,
393 quicktime_tkhd_t
*tkhd
,
396 int quicktime_get_timescale(double frame_rate
);
398 unsigned long quicktime_current_time(void);
404 // Utility functions for vbr audio codecs
406 // Delete buffers from the vbr structure when finished
407 void quicktime_clear_vbr(quicktime_vbr_t
*ptr
);
408 void quicktime_vbr_set_channels(quicktime_vbr_t
*ptr
, int channels
);
409 void quicktime_init_vbr(quicktime_vbr_t
*ptr
, int channels
);
411 // Shift the output buffer and fix pointers for the given range.
412 // Return 1 if not possible to handle the sample count.
413 int quicktime_align_vbr(quicktime_audio_map_t
*atrack
,
415 // The current endpoint of the buffer
416 int64_t quicktime_vbr_end(quicktime_vbr_t
*ptr
);
417 unsigned char* quicktime_vbr_input(quicktime_vbr_t
*ptr
);
418 int quicktime_vbr_input_size(quicktime_vbr_t
*ptr
);
419 // Read the next sample/frame of compressed data and advance the counters.
420 int quicktime_read_vbr(quicktime_t
*file
,
421 quicktime_audio_map_t
*atrack
);
422 // Put the next sample/frame of uncompressed data in the buffer and advance the
424 void quicktime_store_vbr_float(quicktime_audio_map_t
*atrack
,
428 void quicktime_copy_vbr_float(quicktime_vbr_t
*vbr
,
429 int64_t start_position
,