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;
132  int64_t next_trun_dts;
137 typedef struct MOVFragmentIndexItem {
138  int64_t moof_offset;
140  int current;
145 typedef struct MOVFragmentIndex {
147  int complete;
148  int current;
149  int nb_items;
153 typedef struct MOVIndexRange {
154  int64_t start;
155  int64_t end;
156 } MOVIndexRange;
158 typedef struct MOVStreamContext {
161  int ffindex; ///< AVStream index
163  unsigned int chunk_count;
164  int64_t *chunk_offsets;
165  unsigned int stts_count;
167  unsigned int sdtp_count;
169  unsigned int ctts_count;
170  unsigned int ctts_allocated_size;
172  unsigned int stsc_count;
174  unsigned int stsc_index;
176  unsigned int stps_count;
177  unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop
179  unsigned int elst_count;
182  unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom
183  unsigned int stsz_sample_size; ///< always contains sample size from stsz atom
184  unsigned int sample_count;
187  unsigned int keyframe_count;
188  int *keyframes;
190  int64_t time_offset; ///< time offset of the edit list entries
191  int64_t min_corrected_pts; ///< minimum Composition time shown by the edits excluding empty edits.
193  int64_t current_index;
196  unsigned int bytes_per_frame;
197  unsigned int samples_per_frame;
199  int pseudo_stream_id; ///< -1 means demux all ids
200  int16_t audio_cid; ///< stsd audio compression id
201  unsigned drefs_count;
203  int dref_id;
205  int width; ///< tkhd width
206  int height; ///< tkhd height
207  int dts_shift; ///< dts shift when ctts is negative
208  uint32_t palette[256];
210  int64_t data_size;
211  uint32_t tmcd_flags; ///< tmcd track flags
212  int64_t track_end; ///< used for dts generation in fragmented movie files
213  int start_pad; ///< amount of samples to skip due to enc-dec delay
214  unsigned int rap_group_count;
220  /** extradata array (and size) for multiple stsd */
233  size_t coll_size;
235  uint32_t format;
237  int has_sidx; // If there is an sidx entry for this stream.
238  struct {
239  struct AVAESCTR* aes_ctr;
240  unsigned int per_sample_iv_size; // Either 0, 8, or 16.
243  } cenc;
246 typedef struct MOVContext {
247  const AVClass *class; ///< class for private options
250  int64_t duration; ///< duration of the longest track
251  int found_moov; ///< 'moov' atom has been found
252  int found_mdat; ///< 'mdat' atom has been found
253  int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found
254  int trak_index; ///< Index of the current 'trak'
255  char **meta_keys;
256  unsigned meta_keys_count;
259  int isom; ///< 1 if file is ISO Media (mp4/3gp)
260  MOVFragment fragment; ///< current fragment in moof atom
262  unsigned trex_count;
263  int itunes_metadata; ///< metadata are itunes style
266  unsigned int nb_chapter_tracks;
272  int64_t next_root_atom; ///< offset of the next root atom
275  int *bitrates; ///< bitrates read before streams creation
282  unsigned int aax_mode; ///< 'aax' file has been detected
283  uint8_t file_key[20];
284  uint8_t file_iv[20];
289  void *audible_key;
291  void *audible_iv;
297  int32_t movie_display_matrix[3][3]; ///< display matrix from mvhd
299  uint32_t mfra_size;
300 } MOVContext;
305 void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id);
307 #define MP4ODescrTag 0x01
308 #define MP4IODescrTag 0x02
309 #define MP4ESDescrTag 0x03
310 #define MP4DecConfigDescrTag 0x04
311 #define MP4DecSpecificDescrTag 0x05
312 #define MP4SLDescrTag 0x06
314 #define MOV_TFHD_BASE_DATA_OFFSET 0x01
315 #define MOV_TFHD_STSD_ID 0x02
317 #define MOV_TFHD_DEFAULT_SIZE 0x10
318 #define MOV_TFHD_DEFAULT_FLAGS 0x20
319 #define MOV_TFHD_DURATION_IS_EMPTY 0x010000
320 #define MOV_TFHD_DEFAULT_BASE_IS_MOOF 0x020000
322 #define MOV_TRUN_DATA_OFFSET 0x01
324 #define MOV_TRUN_SAMPLE_DURATION 0x100
325 #define MOV_TRUN_SAMPLE_SIZE 0x200
326 #define MOV_TRUN_SAMPLE_FLAGS 0x400
327 #define MOV_TRUN_SAMPLE_CTS 0x800
330 #define MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC 0x00010000
331 #define MOV_FRAG_SAMPLE_FLAG_PADDING_MASK 0x000e0000
334 #define MOV_FRAG_SAMPLE_FLAG_DEPENDS_MASK 0x03000000
336 #define MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO 0x02000000
337 #define MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES 0x01000000
339 #define MOV_TKHD_FLAG_ENABLED 0x0001
340 #define MOV_TKHD_FLAG_IN_MOVIE 0x0002
341 #define MOV_TKHD_FLAG_IN_PREVIEW 0x0004
342 #define MOV_TKHD_FLAG_IN_POSTER 0x0008
349 #define TAG_IS_AVCI(tag) \
350  ((tag) == MKTAG('a', 'i', '5', 'p') || \
351  (tag) == MKTAG('a', 'i', '5', 'q') || \
352  (tag) == MKTAG('a', 'i', '5', '2') || \
353  (tag) == MKTAG('a', 'i', '5', '3') || \
354  (tag) == MKTAG('a', 'i', '5', '5') || \
355  (tag) == MKTAG('a', 'i', '5', '6') || \
356  (tag) == MKTAG('a', 'i', '1', 'p') || \
357  (tag) == MKTAG('a', 'i', '1', 'q') || \
358  (tag) == MKTAG('a', 'i', '1', '2') || \
359  (tag) == MKTAG('a', 'i', '1', '3') || \
360  (tag) == MKTAG('a', 'i', '1', '5') || \
361  (tag) == MKTAG('a', 'i', '1', '6') || \
362  (tag) == MKTAG('a', 'i', 'v', 'x') || \
363  (tag) == MKTAG('A', 'V', 'i', 'n'))
368 int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries);
369 void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout);
371 #define FF_MOV_FLAG_MFRA_AUTO -1
372 #define FF_MOV_FLAG_MFRA_DTS 1
373 #define FF_MOV_FLAG_MFRA_PTS 2
375 /**
376  * Compute codec id for 'lpcm' tag.
377  * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
378  */
379 static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
380 {
381  /* lpcm flags:
382  * 0x1 = float
383  * 0x2 = big-endian
384  * 0x4 = signed
385  */
386  return ff_get_pcm_codec_id(bps, flags & 1, flags & 2, flags & 4 ? -1 : 0);
387 }
389 #endif /* AVFORMAT_ISOM_H */
int itunes_metadata
metadata are itunes style
Definition: isom.h:263
int * bitrates
bitrates read before streams creation
Definition: isom.h:275
int64_t current_index
Definition: isom.h:193
int64_t moof_offset
Definition: isom.h:138
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:211
const AVCodecTag ff_mp4_obj_type[]
Definition: isom.c:34
unsigned int rap_group_count
Definition: isom.h:214
int found_tfhd
Definition: isom.h:90
unsigned int elst_count
Definition: isom.h:179
MOVTrackExt * trex_data
Definition: isom.h:261
int export_all
Definition: isom.h:273
int64_t end
Definition: isom.h:155
unsigned track_id
Definition: isom.h:91
uint32_t format
Definition: isom.h:235
unsigned int samples_per_frame
Definition: isom.h:197
int dv_audio_container
Definition: isom.h:198
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:230
unsigned int ctts_allocated_size
Definition: isom.h:170
unsigned int stsc_count
Definition: isom.h:172
int has_palette
Definition: isom.h:209
AVEncryptionInfo * default_encrypted_sample
Definition: isom.h:241
int allocated_size
Definition: isom.h:146
AVMasteringDisplayMetadata * mastering
Definition: isom.h:231
int have_read_mfra_size
Definition: isom.h:298
uint8_t * decryption_key
Definition: isom.h:294
This describes encryption info for a packet.
int ignore_chapters
Definition: isom.h:270
void * activation_bytes
Definition: isom.h:285
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:329
int16_t audio_cid
stsd audio compression id
Definition: isom.h:200
char ** meta_keys
Definition: isom.h:255
int height
tkhd height
Definition: isom.h:206
uint32_t type
Definition: isom.h:83
MOVElst * elst_data
Definition: isom.h:178
MOVStsc * stsc_data
Definition: isom.h:173
int nb_items
Definition: isom.h:149
int ctts_index
Definition: isom.h:180
int complete
Definition: isom.h:147
unsigned stsd_id
Definition: isom.h:103
AVSphericalMapping * spherical
Definition: isom.h:229
int found_moov
&#39;moov&#39; atom has been found
Definition: isom.h:251
unsigned flags
Definition: isom.h:106
int isom
1 if file is ISO Media (mp4/3gp)
Definition: isom.h:259
int found_mdat
&#39;mdat&#39; atom has been found
Definition: isom.h:252
int width
tkhd width
Definition: isom.h:205
unsigned drefs_count
Definition: isom.h:201
Format I/O context.
Definition: avformat.h:1247
const AVCodecTag ff_codec_movvideo_tags[]
Definition: isom_tags.c:29
int audible_key_size
Definition: isom.h:290
MOVDref * drefs
Definition: isom.h:202
const AVCodecTag ff_codec_movaudio_tags[]
Definition: isom_tags.c:278
int first
Definition: isom.h:62
size_t coll_size
Definition: isom.h:233
int ff_mp4_read_descr_len(AVIOContext *pb)
Definition: isom.c:282
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:184
int count
Definition: isom.h:63
int dts_shift
dts shift when ctts is negative
Definition: isom.h:207
int stsd_version
Definition: isom.h:225
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:224
int activation_bytes_size
Definition: isom.h:286
uint32_t tag
Definition: movenc.c:1611
int nb_frames_for_fps
Definition: isom.h:217
int64_t next_trun_dts
Definition: isom.h:132
struct AVAESCTR * aes_ctr
Definition: isom.h:239
const AVCodecTag ff_codec_movsubtitle_tags[]
Definition: isom.c:75
int current_sample
Definition: isom.h:192
void * audible_iv
Definition: isom.h:291
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:190
unsigned int keyframe_count
Definition: isom.h:187
MOVIndexRange * index_ranges
Definition: isom.h:194
int64_t first_tfra_pts
Definition: isom.h:130
uint8_t * auxiliary_info_sizes
Definition: isom.h:120
int * extradata_size
Definition: isom.h:222
#define fc(width, name, range_min, range_max)
Definition: cbs_av1.c:551
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:46
unsigned int ctts_count
Definition: isom.h:169
int64_t tfdt_dts
Definition: isom.h:131
int stsc_sample
Definition: isom.h:175
int atom_depth
Definition: isom.h:281
MOVIndexRange * current_index_range
Definition: isom.h:195
int audible_iv_size
Definition: isom.h:292
int * keyframes
Definition: isom.h:188
AVFormatContext * fc
Definition: isom.h:248
int handbrake_version
Definition: isom.h:264
int ctts_sample
Definition: isom.h:181
int keyframe_absent
Definition: isom.h:186
void * audible_fixed_key
Definition: isom.h:287
int64_t min_corrected_pts
minimum Composition time shown by the edits excluding empty edits.
Definition: isom.h:191
unsigned int sdtp_count
Definition: isom.h:167
AVContentLightMetadata * coll
Definition: isom.h:232
struct AVAES * aes_decrypt
Definition: isom.h:293
Spherical video.
MOVFragmentStreamInfo * stream_info
Definition: isom.h:142
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:295
uint8_t * sdtp_data
Definition: isom.h:168
int audible_fixed_key_size
Definition: isom.h:288
int advanced_editlist
Definition: isom.h:269
char * path
Definition: isom.h:75
int time_scale
Definition: isom.h:189
Definition: isom.h:109
uint64_t moof_offset
Definition: isom.h:93
MOVStts * ctts_data
Definition: isom.h:171
unsigned size
Definition: isom.h:105
void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout)
Definition: isom.c:422
int ignore_editlist
Definition: isom.h:268
MOVFragmentIndexItem * item
Definition: isom.h:150
int64_t * chunk_offsets
Definition: isom.h:164
unsigned int index
Definition: isom.h:111
MOVFragmentIndex frag_index
Definition: isom.h:280
const AVCodecTag ff_codec_movdata_tags[]
Definition: isom.c:82
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:250
Stream structure.
Definition: avformat.h:884
unsigned duration
Definition: isom.h:104
DVDemuxContext * dv_demux
Definition: isom.h:257
int timecode_track
Definition: isom.h:204
int * sample_sizes
Definition: isom.h:185
unsigned duration
Definition: isom.h:96
MOVSbgp * rap_group
Definition: isom.h:215
int duration
Definition: isom.h:58
int * chapter_tracks
Definition: isom.h:265
uint32_t mfra_size
Definition: isom.h:299
unsigned int stsz_sample_size
always contains sample size from stsz atom
Definition: isom.h:183
unsigned trex_count
Definition: isom.h:262
int enable_drefs
Definition: isom.h:296
int64_t data_size
Definition: isom.h:210
int has_looked_for_mfra
Definition: isom.h:279
uint32_t type
Definition: isom.h:74
unsigned int count
Definition: isom.h:57
MOVStts * stts_data
Definition: isom.h:166
MOVEncryptionIndex * encryption_index
Definition: isom.h:134
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:3197
unsigned int aax_mode
&#39;aax&#39; file has been detected
Definition: isom.h:282
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:260
int64_t track_end
used for dts generation in fragmented movie files
Definition: isom.h:212
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:379
int use_mfra_for
Definition: isom.h:278
int64_t time
Definition: isom.h:69
int pb_is_copied
Definition: isom.h:160
int ff_mov_lang_to_iso639(unsigned code, char to[4])
Definition: isom.c:260
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:2483
int next_chunk
Definition: isom.h:162
AVFormatContext * dv_fctx
Definition: isom.h:258
unsigned int stsc_index
Definition: isom.h:174
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
Definition: isom.c:295
uint64_t implicit_offset
Definition: isom.h:94
#define flags(name, subs,...)
Definition: cbs_av1.c:561
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:228
unsigned int per_sample_iv_size
Definition: isom.h:240
unsigned * stps_data
partial sync sample for mpeg-2 open gop
Definition: isom.h:177
int ff_mov_iso639_to_lang(const char lang[4], int mp4)
Definition: isom.c:233
int64_t sidx_pts
Definition: isom.h:129
int start_pad
amount of samples to skip due to enc-dec delay
Definition: isom.h:213
int trak_index
Index of the current &#39;trak&#39;.
Definition: isom.h:254
int32_t * display_matrix
Definition: isom.h:227
AVIOContext * pb
Definition: isom.h:159
unsigned int bytes_per_frame
Definition: isom.h:196
void * audible_key
Definition: isom.h:289
unsigned flags
Definition: isom.h:98
int bitrates_count
Definition: isom.h:276
int64_t size
Definition: isom.h:84
int export_xmp
Definition: isom.h:274
int seek_individually
Definition: isom.h:271
unsigned int stps_count
Definition: isom.h:176
unsigned int chunk_count
Definition: isom.h:163
Stereoscopic video.
unsigned bps
Definition: movenc.c:1612
int64_t start
Definition: isom.h:154
unsigned meta_keys_count
Definition: isom.h:256
unsigned stsd_id
Definition: isom.h:95
MOVEncryptionIndex * encryption_index
Definition: isom.h:242
unsigned int stts_count
Definition: isom.h:165
unsigned int sample_size
may contain value calculated from stsd or value from stsz atom
Definition: isom.h:182
int64_t next_root_atom
offset of the next root atom
Definition: isom.h:272
int last_stsd_index
Definition: isom.h:223
unsigned int nb_encrypted_samples
Definition: isom.h:117
unsigned int nb_chapter_tracks
Definition: isom.h:266
int time_scale
Definition: isom.h:249
void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
Definition: isom.c:304
Definition: isom.h:67
int pseudo_stream_id
-1 means demux all ids
Definition: isom.h:199
int ffindex
AVStream index.
Definition: isom.h:161
uint8_t ** extradata
extradata array (and size) for multiple stsd
Definition: isom.h:221
int use_absolute_path
Definition: isom.h:267
unsigned size
Definition: isom.h:97
int64_t duration_for_fps
Definition: isom.h:218
int moov_retry
Definition: isom.h:277
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:253
Definition: isom.h:61
int has_sidx
Definition: isom.h:237
Definition: isom.h:73