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