diff options
Diffstat (limited to 'libavformat/isom.h')
-rw-r--r-- | libavformat/isom.h | 120 |
1 files changed, 111 insertions, 9 deletions
diff --git a/libavformat/isom.h b/libavformat/isom.h index 2a7486d7ba..ff08f5d090 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -4,20 +4,20 @@ * copyright (c) 2002 Francois Revol <revol@free.fr> * copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -27,6 +27,7 @@ #include <stddef.h> #include <stdint.h> +#include "libavutil/mastering_display_metadata.h" #include "libavutil/spherical.h" #include "libavutil/stereo3d.h" @@ -43,13 +44,15 @@ extern const AVCodecTag ff_codec_movsubtitle_tags[]; int ff_mov_iso639_to_lang(const char lang[4], int mp4); int ff_mov_lang_to_iso639(unsigned code, char to[4]); +struct AVAESCTR; + /* the QuickTime file format is quite convoluted... * it has lots of index tables, each indexing something in another one... * Here we just use what is needed to read the chunks */ typedef struct MOVStts { - int count; + unsigned int count; int duration; } MOVStts; @@ -59,6 +62,12 @@ typedef struct MOVStsc { int id; } MOVStsc; +typedef struct MOVElst { + int64_t duration; + int64_t time; + float rate; +} MOVElst; + typedef struct MOVDref { uint32_t type; char *path; @@ -99,8 +108,38 @@ typedef struct MOVSbgp { unsigned int index; } MOVSbgp; +typedef struct MOVFragmentStreamInfo { + int id; + int64_t sidx_pts; + int64_t first_tfra_pts; + int64_t tfdt_dts; + int index_entry; +} MOVFragmentStreamInfo; + +typedef struct MOVFragmentIndexItem { + int64_t moof_offset; + int headers_read; + int current; + int nb_stream_info; + MOVFragmentStreamInfo * stream_info; +} MOVFragmentIndexItem; + +typedef struct MOVFragmentIndex { + int allocated_size; + int complete; + int current; + int nb_items; + MOVFragmentIndexItem * item; +} MOVFragmentIndex; + +typedef struct MOVIndexRange { + int64_t start; + int64_t end; +} MOVIndexRange; + typedef struct MOVStreamContext { AVIOContext *pb; + int pb_is_copied; int ffindex; ///< AVStream index int next_chunk; unsigned int chunk_count; @@ -108,6 +147,7 @@ typedef struct MOVStreamContext { unsigned int stts_count; MOVStts *stts_data; unsigned int ctts_count; + unsigned int ctts_allocated_size; MOVStts *ctts_data; unsigned int stsc_count; MOVStsc *stsc_data; @@ -115,17 +155,23 @@ typedef struct MOVStreamContext { int stsc_sample; unsigned int stps_count; unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop + MOVElst *elst_data; + unsigned int elst_count; int ctts_index; int ctts_sample; - unsigned int sample_size; + unsigned int sample_size; ///< may contain value calculated from stsd or value from stsz atom + unsigned int stsz_sample_size; ///< always contains sample size from stsz atom unsigned int sample_count; int *sample_sizes; int keyframe_absent; unsigned int keyframe_count; int *keyframes; int time_scale; - int64_t time_offset; ///< time offset of the first edit list entry + int64_t time_offset; ///< time offset of the edit list entries int current_sample; + int64_t current_index; + MOVIndexRange* index_ranges; + MOVIndexRange* current_index_range; unsigned int bytes_per_frame; unsigned int samples_per_frame; int dv_audio_container; @@ -134,16 +180,22 @@ typedef struct MOVStreamContext { unsigned drefs_count; MOVDref *drefs; int dref_id; + int timecode_track; int width; ///< tkhd width int height; ///< tkhd height int dts_shift; ///< dts shift when ctts is negative uint32_t palette[256]; int has_palette; int64_t data_size; + uint32_t tmcd_flags; ///< tmcd track flags int64_t track_end; ///< used for dts generation in fragmented movie files + int start_pad; ///< amount of samples to skip due to enc-dec delay unsigned int rap_group_count; MOVSbgp *rap_group; + int nb_frames_for_fps; + int64_t duration_for_fps; + /** extradata array (and size) for multiple stsd */ uint8_t **extradata; int *extradata_size; @@ -154,6 +206,24 @@ typedef struct MOVStreamContext { AVStereo3D *stereo3d; AVSphericalMapping *spherical; size_t spherical_size; + AVMasteringDisplayMetadata *mastering; + AVContentLightMetadata *coll; + size_t coll_size; + + uint32_t format; + + int has_sidx; // If there is an sidx entry for this stream. + struct { + int use_subsamples; + uint8_t* auxiliary_info; + uint8_t* auxiliary_info_end; + uint8_t* auxiliary_info_pos; + uint8_t auxiliary_info_default_size; + uint8_t* auxiliary_info_sizes; + size_t auxiliary_info_sizes_count; + int64_t auxiliary_info_index; + struct AVAESCTR* aes_ctr; + } cenc; } MOVStreamContext; typedef struct MOVContext { @@ -163,6 +233,10 @@ typedef struct MOVContext { int64_t duration; ///< duration of the longest track int found_moov; ///< 'moov' atom has been found int found_mdat; ///< 'mdat' atom has been found + int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found + int trak_index; ///< Index of the current 'trak' + char **meta_keys; + unsigned meta_keys_count; DVDemuxContext *dv_demux; AVFormatContext *dv_fctx; int isom; ///< 1 if file is ISO Media (mp4/3gp) @@ -170,13 +244,35 @@ typedef struct MOVContext { MOVTrackExt *trex_data; unsigned trex_count; int itunes_metadata; ///< metadata are itunes style - int chapter_track; + int handbrake_version; + int *chapter_tracks; + unsigned int nb_chapter_tracks; + int use_absolute_path; + int ignore_editlist; + int advanced_editlist; + int ignore_chapters; int seek_individually; int64_t next_root_atom; ///< offset of the next root atom int export_all; int export_xmp; + int *bitrates; ///< bitrates read before streams creation + int bitrates_count; + int moov_retry; + int use_mfra_for; + int has_looked_for_mfra; + MOVFragmentIndex frag_index; + int atom_depth; + unsigned int aax_mode; ///< 'aax' file has been detected + uint8_t file_key[20]; + uint8_t file_iv[20]; + void *activation_bytes; + int activation_bytes_size; + void *audible_fixed_key; + int audible_fixed_key_size; + struct AVAES *aes_decrypt; + uint8_t *decryption_key; + int decryption_key_len; int enable_drefs; - int32_t movie_display_matrix[3][3]; ///< display matrix from mvhd } MOVContext; @@ -235,12 +331,18 @@ void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id); (tag) == MKTAG('a', 'i', '1', '3') || \ (tag) == MKTAG('a', 'i', '1', '5') || \ (tag) == MKTAG('a', 'i', '1', '6') || \ + (tag) == MKTAG('a', 'i', 'v', 'x') || \ (tag) == MKTAG('A', 'V', 'i', 'n')) int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb); int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries); +void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout); + +#define FF_MOV_FLAG_MFRA_AUTO -1 +#define FF_MOV_FLAG_MFRA_DTS 1 +#define FF_MOV_FLAG_MFRA_PTS 2 /** * Compute codec id for 'lpcm' tag. |