Go to the documentation of this file.
1 /*
2  * ISO Media common code
3  * copyright (c) 2001 Fabrice Bellard
4  * copyright (c) 2002 Francois Revol <revol@free.fr>
5  * copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
24 #ifndef AVFORMAT_ISOM_H
25 #define AVFORMAT_ISOM_H
27 #include <stddef.h>
28 #include <stdint.h>
32 #include "libavutil/spherical.h"
33 #include "libavutil/stereo3d.h"
35 #include "avio.h"
36 #include "internal.h"
37 #include "dv.h"
39 /* isom.c */
40 extern const AVCodecTag ff_mp4_obj_type[];
41 extern const AVCodecTag ff_codec_movvideo_tags[];
42 extern const AVCodecTag ff_codec_movaudio_tags[];
44 extern const AVCodecTag ff_codec_movdata_tags[];
46 int ff_mov_iso639_to_lang(const char lang[4], int mp4);
47 int ff_mov_lang_to_iso639(unsigned code, char to[4]);
49 struct AVAESCTR;
51 /* the QuickTime file format is quite convoluted...
52  * it has lots of index tables, each indexing something in another one...
53  * Here we just use what is needed to read the chunks
54  */
56 typedef struct MOVStts {
57  unsigned int count;
58  int duration;
59 } MOVStts;
61 typedef struct MOVStsc {
62  int first;
63  int count;
64  int id;
65 } MOVStsc;
67 typedef struct MOVElst {
68  int64_t duration;
69  int64_t time;
70  float rate;
71 } MOVElst;
73 typedef struct MOVDref {
74  uint32_t type;
75  char *path;
76  char *dir;
77  char volume[28];
78  char filename[64];
79  int16_t nlvl_to, nlvl_from;
80 } MOVDref;
82 typedef struct MOVAtom {
83  uint32_t type;
84  int64_t size; /* total size (excluding the size and type fields) */
85 } MOVAtom;
87 struct MOVParseTableEntry;
89 typedef struct MOVFragment {
91  unsigned track_id;
92  uint64_t base_data_offset;
93  uint64_t moof_offset;
94  uint64_t implicit_offset;
95  unsigned stsd_id;
96  unsigned duration;
97  unsigned size;
98  unsigned flags;
99 } MOVFragment;
101 typedef struct MOVTrackExt {
102  unsigned track_id;
103  unsigned stsd_id;
104  unsigned duration;
105  unsigned size;
106  unsigned flags;
107 } MOVTrackExt;
109 typedef struct MOVSbgp {
110  unsigned int count;
111  unsigned int index;
112 } MOVSbgp;
114 typedef struct MOVEncryptionIndex {
115  // Individual encrypted samples. If there are no elements, then the default
116  // settings will be used.
117  unsigned int nb_encrypted_samples;
123  uint64_t* auxiliary_offsets; ///< Absolute seek position
127 typedef struct MOVFragmentStreamInfo {
128  int id;
129  int64_t sidx_pts;
130  int64_t first_tfra_pts;
131  int64_t tfdt_dts;
136 typedef struct MOVFragmentIndexItem {
137  int64_t moof_offset;
139  int current;
144 typedef struct MOVFragmentIndex {
146  int complete;
147  int current;
148  int nb_items;
152 typedef struct MOVIndexRange {
153  int64_t start;
154  int64_t end;
155 } MOVIndexRange;
157 typedef struct MOVStreamContext {
160  int ffindex; ///< AVStream index
162  unsigned int chunk_count;
163  int64_t *chunk_offsets;
164  unsigned int stts_count;
166  unsigned int sdtp_count;
168  unsigned int ctts_count;
169  unsigned int ctts_allocated_size;
171  unsigned int stsc_count;
173  unsigned int stsc_index;
175  unsigned int stps_count;
176  unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop
178  unsigned int elst_count;
181  unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom
182  unsigned int stsz_sample_size; ///< always contains sample size from stsz atom
183  unsigned int sample_count;
186  unsigned int keyframe_count;
187  int *keyframes;
189  int64_t time_offset; ///< time offset of the edit list entries
190  int64_t min_corrected_pts; ///< minimum Composition time shown by the edits excluding empty edits.
192  int64_t current_index;
195  unsigned int bytes_per_frame;
196  unsigned int samples_per_frame;
198  int pseudo_stream_id; ///< -1 means demux all ids
199  int16_t audio_cid; ///< stsd audio compression id
200  unsigned drefs_count;
202  int dref_id;
204  int width; ///< tkhd width
205  int height; ///< tkhd height
206  int dts_shift; ///< dts shift when ctts is negative
207  uint32_t palette[256];
209  int64_t data_size;
210  uint32_t tmcd_flags; ///< tmcd track flags
211  int64_t track_end; ///< used for dts generation in fragmented movie files
212  int start_pad; ///< amount of samples to skip due to enc-dec delay
213  unsigned int rap_group_count;
219  /** extradata array (and size) for multiple stsd */
232  size_t coll_size;
234  uint32_t format;
236  int has_sidx; // If there is an sidx entry for this stream.
237  struct {
238  struct AVAESCTR* aes_ctr;
239  unsigned int per_sample_iv_size; // Either 0, 8, or 16.
242  } cenc;
245 typedef struct MOVContext {
246  const AVClass *class; ///< class for private options
249  int64_t duration; ///< duration of the longest track
250  int found_moov; ///< 'moov' atom has been found
251  int found_mdat; ///< 'mdat' atom has been found
252  int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found
253  int trak_index; ///< Index of the current 'trak'
254  char **meta_keys;
255  unsigned meta_keys_count;
258  int isom; ///< 1 if file is ISO Media (mp4/3gp)
259  MOVFragment fragment; ///< current fragment in moof atom
261  unsigned trex_count;
262  int itunes_metadata; ///< metadata are itunes style
265  unsigned int nb_chapter_tracks;
271  int64_t next_root_atom; ///< offset of the next root atom
274  int *bitrates; ///< bitrates read before streams creation
281  unsigned int aax_mode; ///< 'aax' file has been detected
282  uint8_t file_key[20];
283  uint8_t file_iv[20];
292  int32_t movie_display_matrix[3][3]; ///< display matrix from mvhd
293 } MOVContext;
298 void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id);
300 #define MP4ODescrTag 0x01
301 #define MP4IODescrTag 0x02
302 #define MP4ESDescrTag 0x03
303 #define MP4DecConfigDescrTag 0x04
304 #define MP4DecSpecificDescrTag 0x05
305 #define MP4SLDescrTag 0x06
307 #define MOV_TFHD_BASE_DATA_OFFSET 0x01
308 #define MOV_TFHD_STSD_ID 0x02
310 #define MOV_TFHD_DEFAULT_SIZE 0x10
311 #define MOV_TFHD_DEFAULT_FLAGS 0x20
312 #define MOV_TFHD_DURATION_IS_EMPTY 0x010000
313 #define MOV_TFHD_DEFAULT_BASE_IS_MOOF 0x020000
315 #define MOV_TRUN_DATA_OFFSET 0x01
317 #define MOV_TRUN_SAMPLE_DURATION 0x100
318 #define MOV_TRUN_SAMPLE_SIZE 0x200
319 #define MOV_TRUN_SAMPLE_FLAGS 0x400
320 #define MOV_TRUN_SAMPLE_CTS 0x800
323 #define MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC 0x00010000
324 #define MOV_FRAG_SAMPLE_FLAG_PADDING_MASK 0x000e0000
327 #define MOV_FRAG_SAMPLE_FLAG_DEPENDS_MASK 0x03000000
329 #define MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO 0x02000000
330 #define MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES 0x01000000
332 #define MOV_TKHD_FLAG_ENABLED 0x0001
333 #define MOV_TKHD_FLAG_IN_MOVIE 0x0002
334 #define MOV_TKHD_FLAG_IN_PREVIEW 0x0004
335 #define MOV_TKHD_FLAG_IN_POSTER 0x0008
342 #define TAG_IS_AVCI(tag) \
343  ((tag) == MKTAG('a', 'i', '5', 'p') || \
344  (tag) == MKTAG('a', 'i', '5', 'q') || \
345  (tag) == MKTAG('a', 'i', '5', '2') || \
346  (tag) == MKTAG('a', 'i', '5', '3') || \
347  (tag) == MKTAG('a', 'i', '5', '5') || \
348  (tag) == MKTAG('a', 'i', '5', '6') || \
349  (tag) == MKTAG('a', 'i', '1', 'p') || \
350  (tag) == MKTAG('a', 'i', '1', 'q') || \
351  (tag) == MKTAG('a', 'i', '1', '2') || \
352  (tag) == MKTAG('a', 'i', '1', '3') || \
353  (tag) == MKTAG('a', 'i', '1', '5') || \
354  (tag) == MKTAG('a', 'i', '1', '6') || \
355  (tag) == MKTAG('a', 'i', 'v', 'x') || \
356  (tag) == MKTAG('A', 'V', 'i', 'n'))
361 int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries);
362 void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout);
364 #define FF_MOV_FLAG_MFRA_AUTO -1
365 #define FF_MOV_FLAG_MFRA_DTS 1
366 #define FF_MOV_FLAG_MFRA_PTS 2
368 /**
369  * Compute codec id for 'lpcm' tag.
370  * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
371  */
372 static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
373 {
374  /* lpcm flags:
375  * 0x1 = float
376  * 0x2 = big-endian
377  * 0x4 = signed
378  */
379  return ff_get_pcm_codec_id(bps, flags & 1, flags & 2, flags & 4 ? -1 : 0);
380 }
382 #endif /* AVFORMAT_ISOM_H */
int itunes_metadata
metadata are itunes style
Definition: isom.h:262
int * bitrates
bitrates read before streams creation
Definition: isom.h:274
int64_t current_index
Definition: isom.h:192
int64_t moof_offset
Definition: isom.h:137
size_t auxiliary_offsets_count
Definition: isom.h:124
Bytestream IO Context.
Definition: avio.h:161
Buffered I/O operations.
uint32_t tmcd_flags
tmcd track flags
Definition: isom.h:210
const AVCodecTag ff_mp4_obj_type[]
Definition: isom.c:34
unsigned int rap_group_count
Definition: isom.h:213
int found_tfhd
Definition: isom.h:90
unsigned int elst_count
Definition: isom.h:178
MOVTrackExt * trex_data
Definition: isom.h:260
int export_all
Definition: isom.h:272
int64_t end
Definition: isom.h:154
unsigned track_id
Definition: isom.h:91
uint32_t format
Definition: isom.h:234
unsigned int samples_per_frame
Definition: isom.h:196
int dv_audio_container
Definition: isom.h:197
Definition: isom.h:56
float rate
Definition: isom.h:70
uint64_t base_data_offset
Definition: isom.h:92
int64_t duration
Definition: isom.h:68
size_t spherical_size
Definition: isom.h:229
unsigned int ctts_allocated_size
Definition: isom.h:169
unsigned int stsc_count
Definition: isom.h:171
int has_palette
Definition: isom.h:208
AVEncryptionInfo * default_encrypted_sample
Definition: isom.h:240
int allocated_size
Definition: isom.h:145
AVMasteringDisplayMetadata * mastering
Definition: isom.h:230
uint8_t * decryption_key
Definition: isom.h:289
This describes encryption info for a packet.
int ignore_chapters
Definition: isom.h:269
void * activation_bytes
Definition: isom.h:284
AVEncryptionInfo ** encrypted_samples
Definition: isom.h:118
uint64_t * auxiliary_offsets
Absolute seek position.
Definition: isom.h:123
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
Definition: isom.c:513
int16_t audio_cid
stsd audio compression id
Definition: isom.h:199
char ** meta_keys
Definition: isom.h:254
int height
tkhd height
Definition: isom.h:205
uint32_t type
Definition: isom.h:83
MOVElst * elst_data
Definition: isom.h:177
MOVStsc * stsc_data
Definition: isom.h:172
int nb_items
Definition: isom.h:148
int ctts_index
Definition: isom.h:179
int complete
Definition: isom.h:146
unsigned stsd_id
Definition: isom.h:103
AVSphericalMapping * spherical
Definition: isom.h:228
int found_moov
&#39;moov&#39; atom has been found
Definition: isom.h:250
unsigned flags
Definition: isom.h:106
int isom
1 if file is ISO Media (mp4/3gp)
Definition: isom.h:258
int found_mdat
&#39;mdat&#39; atom has been found
Definition: isom.h:251
int width
tkhd width
Definition: isom.h:204
unsigned drefs_count
Definition: isom.h:200
Format I/O context.
Definition: avformat.h:1352
const AVCodecTag ff_codec_movvideo_tags[]
Definition: isom.c:75
MOVDref * drefs
Definition: isom.h:201
const AVCodecTag ff_codec_movaudio_tags[]
Definition: isom.c:319
int first
Definition: isom.h:62
size_t coll_size
Definition: isom.h:232
int ff_mp4_read_descr_len(AVIOContext *pb)
Definition: isom.c:466
Stereo 3D type: this structure describes how two videos are packed within a single video surface...
Definition: stereo3d.h:176
unsigned int sample_count
Definition: isom.h:183
int count
Definition: isom.h:63
int dts_shift
dts shift when ctts is negative
Definition: isom.h:206
int stsd_version
Definition: isom.h:224
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
unsigned int count
Definition: isom.h:110
int16_t nlvl_to
Definition: isom.h:79
int stsd_count
Definition: isom.h:223
int activation_bytes_size
Definition: isom.h:285
uint32_t tag
Definition: movenc.c:1533
int nb_frames_for_fps
Definition: isom.h:216
struct AVAESCTR * aes_ctr
Definition: isom.h:238
const AVCodecTag ff_codec_movsubtitle_tags[]
Definition: isom.c:379
int current_sample
Definition: isom.h:191
unsigned track_id
Definition: isom.h:102
const char * to
Definition: webvttdec.c:34
int64_t time_offset
time offset of the edit list entries
Definition: isom.h:189
unsigned int keyframe_count
Definition: isom.h:186
MOVIndexRange * index_ranges
Definition: isom.h:193
int64_t first_tfra_pts
Definition: isom.h:130
uint8_t * auxiliary_info_sizes
Definition: isom.h:120
int * extradata_size
Definition: isom.h:221
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:554
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:217
unsigned int ctts_count
Definition: isom.h:168
int64_t tfdt_dts
Definition: isom.h:131
int stsc_sample
Definition: isom.h:174
int atom_depth
Definition: isom.h:280
MOVIndexRange * current_index_range
Definition: isom.h:194
int * keyframes
Definition: isom.h:187
AVFormatContext * fc
Definition: isom.h:247
int handbrake_version
Definition: isom.h:263
int ctts_sample
Definition: isom.h:180
int keyframe_absent
Definition: isom.h:185
void * audible_fixed_key
Definition: isom.h:286
int64_t min_corrected_pts
minimum Composition time shown by the edits excluding empty edits.
Definition: isom.h:190
unsigned int sdtp_count
Definition: isom.h:166
AVContentLightMetadata * coll
Definition: isom.h:231
struct AVAES * aes_decrypt
Definition: isom.h:288
Spherical video.
MOVFragmentStreamInfo * stream_info
Definition: isom.h:141
char * dir
Definition: isom.h:76
int id
Definition: isom.h:64
uint8_t auxiliary_info_default_size
Definition: isom.h:122
int decryption_key_len
Definition: isom.h:290
uint8_t * sdtp_data
Definition: isom.h:167
int audible_fixed_key_size
Definition: isom.h:287
int advanced_editlist
Definition: isom.h:268
char * path
Definition: isom.h:75
int time_scale
Definition: isom.h:188
Definition: isom.h:109
uint64_t moof_offset
Definition: isom.h:93
MOVStts * ctts_data
Definition: isom.h:170
unsigned size
Definition: isom.h:105
void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout)
Definition: isom.c:645
int ignore_editlist
Definition: isom.h:267
MOVFragmentIndexItem * item
Definition: isom.h:149
int64_t * chunk_offsets
Definition: isom.h:163
unsigned int index
Definition: isom.h:111
MOVFragmentIndex frag_index
Definition: isom.h:279
const AVCodecTag ff_codec_movdata_tags[]
Definition: isom.c:386
int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb)
Definition: mov_esds.c:23
int64_t duration
duration of the longest track
Definition: isom.h:249
Stream structure.
Definition: avformat.h:875
unsigned duration
Definition: isom.h:104
DVDemuxContext * dv_demux
Definition: isom.h:256
int timecode_track
Definition: isom.h:203
int * sample_sizes
Definition: isom.h:184
unsigned duration
Definition: isom.h:96
MOVSbgp * rap_group
Definition: isom.h:214
int duration
Definition: isom.h:58
int * chapter_tracks
Definition: isom.h:264
unsigned int stsz_sample_size
always contains sample size from stsz atom
Definition: isom.h:182
unsigned trex_count
Definition: isom.h:261
int enable_drefs
Definition: isom.h:291
int64_t data_size
Definition: isom.h:209
int has_looked_for_mfra
Definition: isom.h:278
uint32_t type
Definition: isom.h:74
unsigned int count
Definition: isom.h:57
MOVStts * stts_data
Definition: isom.h:165
MOVEncryptionIndex * encryption_index
Definition: isom.h:133
Describe the class of an AVClass context structure.
Definition: log.h:67
enum AVCodecID ff_get_pcm_codec_id(int bps, int flt, int be, int sflags)
Select a PCM codec based on the given parameters.
Definition: utils.c:3172
unsigned int aax_mode
&#39;aax&#39; file has been detected
Definition: isom.h:281
Mastering display metadata capable of representing the color volume of the display used to master the...
MOVFragment fragment
current fragment in moof atom
Definition: isom.h:259
int64_t track_end
used for dts generation in fragmented movie files
Definition: isom.h:211
Definition: isom.h:82
static enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
Compute codec id for &#39;lpcm&#39; tag.
Definition: isom.h:372
int use_mfra_for
Definition: isom.h:277
int64_t time
Definition: isom.h:69
int pb_is_copied
Definition: isom.h:159
int ff_mov_lang_to_iso639(unsigned code, char to[4])
Definition: isom.c:444
This structure describes how to handle spherical videos, outlining information about projection...
Definition: spherical.h:82
int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
Definition: mov.c:2472
int next_chunk
Definition: isom.h:161
AVFormatContext * dv_fctx
Definition: isom.h:257
unsigned int stsc_index
Definition: isom.h:173
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
Definition: isom.c:479
uint64_t implicit_offset
Definition: isom.h:94
#define flags(name, subs,...)
Definition: cbs_av1.c:564
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
AVStereo3D * stereo3d
Definition: isom.h:227
unsigned int per_sample_iv_size
Definition: isom.h:239
unsigned * stps_data
partial sync sample for mpeg-2 open gop
Definition: isom.h:176
int ff_mov_iso639_to_lang(const char lang[4], int mp4)
Definition: isom.c:417
int64_t sidx_pts
Definition: isom.h:129
int start_pad
amount of samples to skip due to enc-dec delay
Definition: isom.h:212
int trak_index
Index of the current &#39;trak&#39;.
Definition: isom.h:253
int32_t * display_matrix
Definition: isom.h:226
AVIOContext * pb
Definition: isom.h:158
unsigned int bytes_per_frame
Definition: isom.h:195
unsigned flags
Definition: isom.h:98
int bitrates_count
Definition: isom.h:275
int64_t size
Definition: isom.h:84
int export_xmp
Definition: isom.h:273
int seek_individually
Definition: isom.h:270
unsigned int stps_count
Definition: isom.h:175
unsigned int chunk_count
Definition: isom.h:162
Stereoscopic video.
unsigned bps
Definition: movenc.c:1534
int64_t start
Definition: isom.h:153
unsigned meta_keys_count
Definition: isom.h:255
unsigned stsd_id
Definition: isom.h:95
MOVEncryptionIndex * encryption_index
Definition: isom.h:241
unsigned int stts_count
Definition: isom.h:164
unsigned int sample_size
may contain value calculated from stsd or value from stsz atom
Definition: isom.h:181
int64_t next_root_atom
offset of the next root atom
Definition: isom.h:271
int last_stsd_index
Definition: isom.h:222
unsigned int nb_encrypted_samples
Definition: isom.h:117
unsigned int nb_chapter_tracks
Definition: isom.h:265
int time_scale
Definition: isom.h:248
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
Definition: isom.c:488
Definition: isom.h:67
int pseudo_stream_id
-1 means demux all ids
Definition: isom.h:198
int ffindex
AVStream index.
Definition: isom.h:160
uint8_t ** extradata
extradata array (and size) for multiple stsd
Definition: isom.h:220
int use_absolute_path
Definition: isom.h:266
unsigned size
Definition: isom.h:97
int64_t duration_for_fps
Definition: isom.h:217
int moov_retry
Definition: isom.h:276
size_t auxiliary_info_sample_count
Definition: isom.h:121
int found_hdlr_mdta
&#39;hdlr&#39; atom with type &#39;mdta&#39; has been found
Definition: isom.h:252
Definition: isom.h:61
int has_sidx
Definition: isom.h:236
Definition: isom.h:73