1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * ISO Media common code
3cabdff1aSopenharmony_ci * copyright (c) 2001 Fabrice Bellard
4cabdff1aSopenharmony_ci * copyright (c) 2002 Francois Revol <revol@free.fr>
5cabdff1aSopenharmony_ci * copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * This file is part of FFmpeg.
8cabdff1aSopenharmony_ci *
9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
13cabdff1aSopenharmony_ci *
14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17cabdff1aSopenharmony_ci * Lesser General Public License for more details.
18cabdff1aSopenharmony_ci *
19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22cabdff1aSopenharmony_ci */
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci#ifndef AVFORMAT_ISOM_H
25cabdff1aSopenharmony_ci#define AVFORMAT_ISOM_H
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include <stddef.h>
28cabdff1aSopenharmony_ci#include <stdint.h>
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#include "libavutil/encryption_info.h"
31cabdff1aSopenharmony_ci#include "libavutil/mastering_display_metadata.h"
32cabdff1aSopenharmony_ci#include "libavutil/spherical.h"
33cabdff1aSopenharmony_ci#include "libavutil/stereo3d.h"
34cabdff1aSopenharmony_ci
35cabdff1aSopenharmony_ci#include "avio.h"
36cabdff1aSopenharmony_ci#include "internal.h"
37cabdff1aSopenharmony_ci#include "dv.h"
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_ci/* isom.c */
40cabdff1aSopenharmony_ciextern const AVCodecTag ff_mp4_obj_type[];
41cabdff1aSopenharmony_ciextern const AVCodecTag ff_codec_movvideo_tags[];
42cabdff1aSopenharmony_ciextern const AVCodecTag ff_codec_movaudio_tags[];
43cabdff1aSopenharmony_ciextern const AVCodecTag ff_codec_movsubtitle_tags[];
44cabdff1aSopenharmony_ciextern const AVCodecTag ff_codec_movdata_tags[];
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_ciint ff_mov_iso639_to_lang(const char lang[4], int mp4);
47cabdff1aSopenharmony_ciint ff_mov_lang_to_iso639(unsigned code, char to[4]);
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_cistruct AVAESCTR;
50cabdff1aSopenharmony_ci
51cabdff1aSopenharmony_ci/* the QuickTime file format is quite convoluted...
52cabdff1aSopenharmony_ci * it has lots of index tables, each indexing something in another one...
53cabdff1aSopenharmony_ci * Here we just use what is needed to read the chunks
54cabdff1aSopenharmony_ci */
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_citypedef struct MOVStts {
57cabdff1aSopenharmony_ci    unsigned int count;
58cabdff1aSopenharmony_ci    unsigned int duration;
59cabdff1aSopenharmony_ci} MOVStts;
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_citypedef struct MOVCtts {
62cabdff1aSopenharmony_ci    unsigned int count;
63cabdff1aSopenharmony_ci    int duration;
64cabdff1aSopenharmony_ci} MOVCtts;
65cabdff1aSopenharmony_ci
66cabdff1aSopenharmony_citypedef struct MOVStsc {
67cabdff1aSopenharmony_ci    int first;
68cabdff1aSopenharmony_ci    int count;
69cabdff1aSopenharmony_ci    int id;
70cabdff1aSopenharmony_ci} MOVStsc;
71cabdff1aSopenharmony_ci
72cabdff1aSopenharmony_citypedef struct MOVElst {
73cabdff1aSopenharmony_ci    int64_t duration;
74cabdff1aSopenharmony_ci    int64_t time;
75cabdff1aSopenharmony_ci    float rate;
76cabdff1aSopenharmony_ci} MOVElst;
77cabdff1aSopenharmony_ci
78cabdff1aSopenharmony_citypedef struct MOVDref {
79cabdff1aSopenharmony_ci    uint32_t type;
80cabdff1aSopenharmony_ci    char *path;
81cabdff1aSopenharmony_ci    char *dir;
82cabdff1aSopenharmony_ci    char volume[28];
83cabdff1aSopenharmony_ci    char filename[64];
84cabdff1aSopenharmony_ci    int16_t nlvl_to, nlvl_from;
85cabdff1aSopenharmony_ci} MOVDref;
86cabdff1aSopenharmony_ci
87cabdff1aSopenharmony_citypedef struct MOVAtom {
88cabdff1aSopenharmony_ci    uint32_t type;
89cabdff1aSopenharmony_ci    int64_t size; /* total size (excluding the size and type fields) */
90cabdff1aSopenharmony_ci} MOVAtom;
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_cistruct MOVParseTableEntry;
93cabdff1aSopenharmony_ci
94cabdff1aSopenharmony_citypedef struct MOVFragment {
95cabdff1aSopenharmony_ci    int found_tfhd;
96cabdff1aSopenharmony_ci    unsigned track_id;
97cabdff1aSopenharmony_ci    uint64_t base_data_offset;
98cabdff1aSopenharmony_ci    uint64_t moof_offset;
99cabdff1aSopenharmony_ci    uint64_t implicit_offset;
100cabdff1aSopenharmony_ci    unsigned stsd_id;
101cabdff1aSopenharmony_ci    unsigned duration;
102cabdff1aSopenharmony_ci    unsigned size;
103cabdff1aSopenharmony_ci    unsigned flags;
104cabdff1aSopenharmony_ci} MOVFragment;
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_citypedef struct MOVTrackExt {
107cabdff1aSopenharmony_ci    unsigned track_id;
108cabdff1aSopenharmony_ci    unsigned stsd_id;
109cabdff1aSopenharmony_ci    unsigned duration;
110cabdff1aSopenharmony_ci    unsigned size;
111cabdff1aSopenharmony_ci    unsigned flags;
112cabdff1aSopenharmony_ci} MOVTrackExt;
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_citypedef struct MOVSbgp {
115cabdff1aSopenharmony_ci    unsigned int count;
116cabdff1aSopenharmony_ci    unsigned int index;
117cabdff1aSopenharmony_ci} MOVSbgp;
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_citypedef struct MOVEncryptionIndex {
120cabdff1aSopenharmony_ci    // Individual encrypted samples.  If there are no elements, then the default
121cabdff1aSopenharmony_ci    // settings will be used.
122cabdff1aSopenharmony_ci    unsigned int nb_encrypted_samples;
123cabdff1aSopenharmony_ci    AVEncryptionInfo **encrypted_samples;
124cabdff1aSopenharmony_ci
125cabdff1aSopenharmony_ci    uint8_t* auxiliary_info_sizes;
126cabdff1aSopenharmony_ci    size_t auxiliary_info_sample_count;
127cabdff1aSopenharmony_ci    uint8_t auxiliary_info_default_size;
128cabdff1aSopenharmony_ci    uint64_t* auxiliary_offsets;  ///< Absolute seek position
129cabdff1aSopenharmony_ci    size_t auxiliary_offsets_count;
130cabdff1aSopenharmony_ci} MOVEncryptionIndex;
131cabdff1aSopenharmony_ci
132cabdff1aSopenharmony_citypedef struct MOVFragmentStreamInfo {
133cabdff1aSopenharmony_ci    int id;
134cabdff1aSopenharmony_ci    int64_t sidx_pts;
135cabdff1aSopenharmony_ci    int64_t first_tfra_pts;
136cabdff1aSopenharmony_ci    int64_t tfdt_dts;
137cabdff1aSopenharmony_ci    int64_t next_trun_dts;
138cabdff1aSopenharmony_ci    int index_entry;
139cabdff1aSopenharmony_ci    MOVEncryptionIndex *encryption_index;
140cabdff1aSopenharmony_ci} MOVFragmentStreamInfo;
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_citypedef struct MOVFragmentIndexItem {
143cabdff1aSopenharmony_ci    int64_t moof_offset;
144cabdff1aSopenharmony_ci    int headers_read;
145cabdff1aSopenharmony_ci    int current;
146cabdff1aSopenharmony_ci    int nb_stream_info;
147cabdff1aSopenharmony_ci    MOVFragmentStreamInfo * stream_info;
148cabdff1aSopenharmony_ci} MOVFragmentIndexItem;
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_citypedef struct MOVFragmentIndex {
151cabdff1aSopenharmony_ci    int allocated_size;
152cabdff1aSopenharmony_ci    int complete;
153cabdff1aSopenharmony_ci    int current;
154cabdff1aSopenharmony_ci    int nb_items;
155cabdff1aSopenharmony_ci    MOVFragmentIndexItem * item;
156cabdff1aSopenharmony_ci} MOVFragmentIndex;
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_citypedef struct MOVIndexRange {
159cabdff1aSopenharmony_ci    int64_t start;
160cabdff1aSopenharmony_ci    int64_t end;
161cabdff1aSopenharmony_ci} MOVIndexRange;
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_citypedef struct MOVStreamContext {
164cabdff1aSopenharmony_ci    AVIOContext *pb;
165cabdff1aSopenharmony_ci    int pb_is_copied;
166cabdff1aSopenharmony_ci    int ffindex;          ///< AVStream index
167cabdff1aSopenharmony_ci    int next_chunk;
168cabdff1aSopenharmony_ci    unsigned int chunk_count;
169cabdff1aSopenharmony_ci    int64_t *chunk_offsets;
170cabdff1aSopenharmony_ci    unsigned int stts_count;
171cabdff1aSopenharmony_ci    MOVStts *stts_data;
172cabdff1aSopenharmony_ci    unsigned int sdtp_count;
173cabdff1aSopenharmony_ci    uint8_t *sdtp_data;
174cabdff1aSopenharmony_ci    unsigned int ctts_count;
175cabdff1aSopenharmony_ci    unsigned int ctts_allocated_size;
176cabdff1aSopenharmony_ci    MOVCtts *ctts_data;
177cabdff1aSopenharmony_ci    unsigned int stsc_count;
178cabdff1aSopenharmony_ci    MOVStsc *stsc_data;
179cabdff1aSopenharmony_ci    unsigned int stsc_index;
180cabdff1aSopenharmony_ci    int stsc_sample;
181cabdff1aSopenharmony_ci    unsigned int stps_count;
182cabdff1aSopenharmony_ci    unsigned *stps_data;  ///< partial sync sample for mpeg-2 open gop
183cabdff1aSopenharmony_ci    MOVElst *elst_data;
184cabdff1aSopenharmony_ci    unsigned int elst_count;
185cabdff1aSopenharmony_ci    int ctts_index;
186cabdff1aSopenharmony_ci    int ctts_sample;
187cabdff1aSopenharmony_ci    unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom
188cabdff1aSopenharmony_ci    unsigned int stsz_sample_size; ///< always contains sample size from stsz atom
189cabdff1aSopenharmony_ci    unsigned int sample_count;
190cabdff1aSopenharmony_ci    int *sample_sizes;
191cabdff1aSopenharmony_ci    int keyframe_absent;
192cabdff1aSopenharmony_ci    unsigned int keyframe_count;
193cabdff1aSopenharmony_ci    int *keyframes;
194cabdff1aSopenharmony_ci    int time_scale;
195cabdff1aSopenharmony_ci    int64_t time_offset;  ///< time offset of the edit list entries
196cabdff1aSopenharmony_ci    int64_t min_corrected_pts;  ///< minimum Composition time shown by the edits excluding empty edits.
197cabdff1aSopenharmony_ci    int current_sample;
198cabdff1aSopenharmony_ci    int64_t current_index;
199cabdff1aSopenharmony_ci    MOVIndexRange* index_ranges;
200cabdff1aSopenharmony_ci    MOVIndexRange* current_index_range;
201cabdff1aSopenharmony_ci    unsigned int bytes_per_frame;
202cabdff1aSopenharmony_ci    unsigned int samples_per_frame;
203cabdff1aSopenharmony_ci    int dv_audio_container;
204cabdff1aSopenharmony_ci    int pseudo_stream_id; ///< -1 means demux all ids
205cabdff1aSopenharmony_ci    int16_t audio_cid;    ///< stsd audio compression id
206cabdff1aSopenharmony_ci    unsigned drefs_count;
207cabdff1aSopenharmony_ci    MOVDref *drefs;
208cabdff1aSopenharmony_ci    int dref_id;
209cabdff1aSopenharmony_ci    int timecode_track;
210cabdff1aSopenharmony_ci    int width;            ///< tkhd width
211cabdff1aSopenharmony_ci    int height;           ///< tkhd height
212cabdff1aSopenharmony_ci    int dts_shift;        ///< dts shift when ctts is negative
213cabdff1aSopenharmony_ci    uint32_t palette[256];
214cabdff1aSopenharmony_ci    int has_palette;
215cabdff1aSopenharmony_ci    int64_t data_size;
216cabdff1aSopenharmony_ci    uint32_t tmcd_flags;  ///< tmcd track flags
217cabdff1aSopenharmony_ci    uint8_t tmcd_nb_frames;  ///< tmcd number of frames per tick / second
218cabdff1aSopenharmony_ci    int64_t track_end;    ///< used for dts generation in fragmented movie files
219cabdff1aSopenharmony_ci    int start_pad;        ///< amount of samples to skip due to enc-dec delay
220cabdff1aSopenharmony_ci    unsigned int rap_group_count;
221cabdff1aSopenharmony_ci    MOVSbgp *rap_group;
222cabdff1aSopenharmony_ci    unsigned int sync_group_count;
223cabdff1aSopenharmony_ci    MOVSbgp *sync_group;
224cabdff1aSopenharmony_ci    uint8_t *sgpd_sync;
225cabdff1aSopenharmony_ci    uint32_t sgpd_sync_count;
226cabdff1aSopenharmony_ci    int32_t *sample_offsets;
227cabdff1aSopenharmony_ci    int sample_offsets_count;
228cabdff1aSopenharmony_ci    int *open_key_samples;
229cabdff1aSopenharmony_ci    int open_key_samples_count;
230cabdff1aSopenharmony_ci    uint32_t min_sample_duration;
231cabdff1aSopenharmony_ci
232cabdff1aSopenharmony_ci    int nb_frames_for_fps;
233cabdff1aSopenharmony_ci    int64_t duration_for_fps;
234cabdff1aSopenharmony_ci
235cabdff1aSopenharmony_ci    /** extradata array (and size) for multiple stsd */
236cabdff1aSopenharmony_ci    uint8_t **extradata;
237cabdff1aSopenharmony_ci    int *extradata_size;
238cabdff1aSopenharmony_ci    int last_stsd_index;
239cabdff1aSopenharmony_ci    int stsd_count;
240cabdff1aSopenharmony_ci    int stsd_version;
241cabdff1aSopenharmony_ci
242cabdff1aSopenharmony_ci    int32_t *display_matrix;
243cabdff1aSopenharmony_ci    AVStereo3D *stereo3d;
244cabdff1aSopenharmony_ci    AVSphericalMapping *spherical;
245cabdff1aSopenharmony_ci    size_t spherical_size;
246cabdff1aSopenharmony_ci    AVMasteringDisplayMetadata *mastering;
247cabdff1aSopenharmony_ci    AVContentLightMetadata *coll;
248cabdff1aSopenharmony_ci    size_t coll_size;
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci    uint32_t format;
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci    int has_sidx;  // If there is an sidx entry for this stream.
253cabdff1aSopenharmony_ci    struct {
254cabdff1aSopenharmony_ci        struct AVAESCTR* aes_ctr;
255cabdff1aSopenharmony_ci        struct AVAES *aes_ctx;
256cabdff1aSopenharmony_ci        unsigned int frag_index_entry_base;
257cabdff1aSopenharmony_ci        unsigned int per_sample_iv_size;  // Either 0, 8, or 16.
258cabdff1aSopenharmony_ci        AVEncryptionInfo *default_encrypted_sample;
259cabdff1aSopenharmony_ci        MOVEncryptionIndex *encryption_index;
260cabdff1aSopenharmony_ci    } cenc;
261cabdff1aSopenharmony_ci} MOVStreamContext;
262cabdff1aSopenharmony_ci
263cabdff1aSopenharmony_citypedef struct MOVContext {
264cabdff1aSopenharmony_ci    const AVClass *class; ///< class for private options
265cabdff1aSopenharmony_ci    AVFormatContext *fc;
266cabdff1aSopenharmony_ci    int time_scale;
267cabdff1aSopenharmony_ci    int64_t duration;     ///< duration of the longest track
268cabdff1aSopenharmony_ci    int found_moov;       ///< 'moov' atom has been found
269cabdff1aSopenharmony_ci    int found_mdat;       ///< 'mdat' atom has been found
270cabdff1aSopenharmony_ci    int found_hdlr_mdta;  ///< 'hdlr' atom with type 'mdta' has been found
271cabdff1aSopenharmony_ci    int trak_index;       ///< Index of the current 'trak'
272cabdff1aSopenharmony_ci    char **meta_keys;
273cabdff1aSopenharmony_ci    unsigned meta_keys_count;
274cabdff1aSopenharmony_ci    DVDemuxContext *dv_demux;
275cabdff1aSopenharmony_ci    AVFormatContext *dv_fctx;
276cabdff1aSopenharmony_ci    int isom;             ///< 1 if file is ISO Media (mp4/3gp)
277cabdff1aSopenharmony_ci    MOVFragment fragment; ///< current fragment in moof atom
278cabdff1aSopenharmony_ci    MOVTrackExt *trex_data;
279cabdff1aSopenharmony_ci    unsigned trex_count;
280cabdff1aSopenharmony_ci    int itunes_metadata;  ///< metadata are itunes style
281cabdff1aSopenharmony_ci    int handbrake_version;
282cabdff1aSopenharmony_ci    int *chapter_tracks;
283cabdff1aSopenharmony_ci    unsigned int nb_chapter_tracks;
284cabdff1aSopenharmony_ci    int use_absolute_path;
285cabdff1aSopenharmony_ci    int ignore_editlist;
286cabdff1aSopenharmony_ci    int advanced_editlist;
287cabdff1aSopenharmony_ci    int ignore_chapters;
288cabdff1aSopenharmony_ci    int seek_individually;
289cabdff1aSopenharmony_ci    int64_t next_root_atom; ///< offset of the next root atom
290cabdff1aSopenharmony_ci    int export_all;
291cabdff1aSopenharmony_ci    int export_xmp;
292cabdff1aSopenharmony_ci    int *bitrates;          ///< bitrates read before streams creation
293cabdff1aSopenharmony_ci    int bitrates_count;
294cabdff1aSopenharmony_ci    int moov_retry;
295cabdff1aSopenharmony_ci    int use_mfra_for;
296cabdff1aSopenharmony_ci    int has_looked_for_mfra;
297cabdff1aSopenharmony_ci    int use_tfdt;
298cabdff1aSopenharmony_ci    MOVFragmentIndex frag_index;
299cabdff1aSopenharmony_ci    int atom_depth;
300cabdff1aSopenharmony_ci    unsigned int aax_mode;  ///< 'aax' file has been detected
301cabdff1aSopenharmony_ci    uint8_t file_key[20];
302cabdff1aSopenharmony_ci    uint8_t file_iv[20];
303cabdff1aSopenharmony_ci    void *activation_bytes;
304cabdff1aSopenharmony_ci    int activation_bytes_size;
305cabdff1aSopenharmony_ci    void *audible_fixed_key;
306cabdff1aSopenharmony_ci    int audible_fixed_key_size;
307cabdff1aSopenharmony_ci    void *audible_key;
308cabdff1aSopenharmony_ci    int audible_key_size;
309cabdff1aSopenharmony_ci    void *audible_iv;
310cabdff1aSopenharmony_ci    int audible_iv_size;
311cabdff1aSopenharmony_ci    struct AVAES *aes_decrypt;
312cabdff1aSopenharmony_ci    uint8_t *decryption_key;
313cabdff1aSopenharmony_ci    int decryption_key_len;
314cabdff1aSopenharmony_ci    int enable_drefs;
315cabdff1aSopenharmony_ci    int32_t movie_display_matrix[3][3]; ///< display matrix from mvhd
316cabdff1aSopenharmony_ci    int have_read_mfra_size;
317cabdff1aSopenharmony_ci    uint32_t mfra_size;
318cabdff1aSopenharmony_ci    uint32_t max_stts_delta;
319cabdff1aSopenharmony_ci    int is_still_picture_avif;
320cabdff1aSopenharmony_ci    int primary_item_id;
321cabdff1aSopenharmony_ci} MOVContext;
322cabdff1aSopenharmony_ci
323cabdff1aSopenharmony_ciint ff_mp4_read_descr_len(AVIOContext *pb);
324cabdff1aSopenharmony_ciint ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag);
325cabdff1aSopenharmony_ciint ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb);
326cabdff1aSopenharmony_civoid ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id);
327cabdff1aSopenharmony_ci
328cabdff1aSopenharmony_ci#define MP4ODescrTag                    0x01
329cabdff1aSopenharmony_ci#define MP4IODescrTag                   0x02
330cabdff1aSopenharmony_ci#define MP4ESDescrTag                   0x03
331cabdff1aSopenharmony_ci#define MP4DecConfigDescrTag            0x04
332cabdff1aSopenharmony_ci#define MP4DecSpecificDescrTag          0x05
333cabdff1aSopenharmony_ci#define MP4SLDescrTag                   0x06
334cabdff1aSopenharmony_ci
335cabdff1aSopenharmony_ci#define MOV_TFHD_BASE_DATA_OFFSET       0x01
336cabdff1aSopenharmony_ci#define MOV_TFHD_STSD_ID                0x02
337cabdff1aSopenharmony_ci#define MOV_TFHD_DEFAULT_DURATION       0x08
338cabdff1aSopenharmony_ci#define MOV_TFHD_DEFAULT_SIZE           0x10
339cabdff1aSopenharmony_ci#define MOV_TFHD_DEFAULT_FLAGS          0x20
340cabdff1aSopenharmony_ci#define MOV_TFHD_DURATION_IS_EMPTY  0x010000
341cabdff1aSopenharmony_ci#define MOV_TFHD_DEFAULT_BASE_IS_MOOF 0x020000
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci#define MOV_TRUN_DATA_OFFSET            0x01
344cabdff1aSopenharmony_ci#define MOV_TRUN_FIRST_SAMPLE_FLAGS     0x04
345cabdff1aSopenharmony_ci#define MOV_TRUN_SAMPLE_DURATION       0x100
346cabdff1aSopenharmony_ci#define MOV_TRUN_SAMPLE_SIZE           0x200
347cabdff1aSopenharmony_ci#define MOV_TRUN_SAMPLE_FLAGS          0x400
348cabdff1aSopenharmony_ci#define MOV_TRUN_SAMPLE_CTS            0x800
349cabdff1aSopenharmony_ci
350cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_DEGRADATION_PRIORITY_MASK 0x0000ffff
351cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_IS_NON_SYNC               0x00010000
352cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_PADDING_MASK              0x000e0000
353cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_REDUNDANCY_MASK           0x00300000
354cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_DEPENDED_MASK             0x00c00000
355cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_DEPENDS_MASK              0x03000000
356cabdff1aSopenharmony_ci
357cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_DEPENDS_NO                0x02000000
358cabdff1aSopenharmony_ci#define MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES               0x01000000
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci#define MOV_TKHD_FLAG_ENABLED       0x0001
361cabdff1aSopenharmony_ci#define MOV_TKHD_FLAG_IN_MOVIE      0x0002
362cabdff1aSopenharmony_ci#define MOV_TKHD_FLAG_IN_PREVIEW    0x0004
363cabdff1aSopenharmony_ci#define MOV_TKHD_FLAG_IN_POSTER     0x0008
364cabdff1aSopenharmony_ci
365cabdff1aSopenharmony_ci#define MOV_SAMPLE_DEPENDENCY_UNKNOWN 0x0
366cabdff1aSopenharmony_ci#define MOV_SAMPLE_DEPENDENCY_YES     0x1
367cabdff1aSopenharmony_ci#define MOV_SAMPLE_DEPENDENCY_NO      0x2
368cabdff1aSopenharmony_ci#define MOV_SAMPLE_DEPENDENCY_EXT     0x3
369cabdff1aSopenharmony_ci
370cabdff1aSopenharmony_ci
371cabdff1aSopenharmony_ci#define TAG_IS_AVCI(tag)                    \
372cabdff1aSopenharmony_ci    ((tag) == MKTAG('a', 'i', '5', 'p') ||  \
373cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '5', 'q') ||  \
374cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '5', '2') ||  \
375cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '5', '3') ||  \
376cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '5', '5') ||  \
377cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '5', '6') ||  \
378cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '1', 'p') ||  \
379cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '1', 'q') ||  \
380cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '1', '2') ||  \
381cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '1', '3') ||  \
382cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '1', '5') ||  \
383cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', '1', '6') ||  \
384cabdff1aSopenharmony_ci     (tag) == MKTAG('a', 'i', 'v', 'x') ||  \
385cabdff1aSopenharmony_ci     (tag) == MKTAG('A', 'V', 'i', 'n'))
386cabdff1aSopenharmony_ci
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_ciint ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb);
389cabdff1aSopenharmony_ci
390cabdff1aSopenharmony_ciint ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries);
391cabdff1aSopenharmony_civoid ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout);
392cabdff1aSopenharmony_ci
393cabdff1aSopenharmony_ci#define FF_MOV_FLAG_MFRA_AUTO -1
394cabdff1aSopenharmony_ci#define FF_MOV_FLAG_MFRA_DTS 1
395cabdff1aSopenharmony_ci#define FF_MOV_FLAG_MFRA_PTS 2
396cabdff1aSopenharmony_ci
397cabdff1aSopenharmony_ci/**
398cabdff1aSopenharmony_ci * Compute codec id for 'lpcm' tag.
399cabdff1aSopenharmony_ci * See CoreAudioTypes and AudioStreamBasicDescription at Apple.
400cabdff1aSopenharmony_ci */
401cabdff1aSopenharmony_cistatic inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags)
402cabdff1aSopenharmony_ci{
403cabdff1aSopenharmony_ci    /* lpcm flags:
404cabdff1aSopenharmony_ci     * 0x1 = float
405cabdff1aSopenharmony_ci     * 0x2 = big-endian
406cabdff1aSopenharmony_ci     * 0x4 = signed
407cabdff1aSopenharmony_ci     */
408cabdff1aSopenharmony_ci    return ff_get_pcm_codec_id(bps, flags & 1, flags & 2, flags & 4 ? -1 : 0);
409cabdff1aSopenharmony_ci}
410cabdff1aSopenharmony_ci
411cabdff1aSopenharmony_ci#define MOV_ISMV_TTML_TAG MKTAG('d', 'f', 'x', 'p')
412cabdff1aSopenharmony_ci#define MOV_MP4_TTML_TAG  MKTAG('s', 't', 'p', 'p')
413cabdff1aSopenharmony_ci
414cabdff1aSopenharmony_cistruct MP4TrackKindValueMapping {
415cabdff1aSopenharmony_ci    int         disposition;
416cabdff1aSopenharmony_ci    const char *value;
417cabdff1aSopenharmony_ci};
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_cistruct MP4TrackKindMapping {
420cabdff1aSopenharmony_ci    const char   *scheme_uri;
421cabdff1aSopenharmony_ci    const struct  MP4TrackKindValueMapping *value_maps;
422cabdff1aSopenharmony_ci};
423cabdff1aSopenharmony_ci
424cabdff1aSopenharmony_ciextern const struct MP4TrackKindMapping ff_mov_track_kind_table[];
425cabdff1aSopenharmony_ci
426cabdff1aSopenharmony_ci#endif /* AVFORMAT_ISOM_H */
427