yading@11: /* yading@11: * MOV, 3GP, MP4 muxer yading@11: * Copyright (c) 2003 Thomas Raivio yading@11: * Copyright (c) 2004 Gildas Bazin yading@11: * Copyright (c) 2009 Baptiste Coudurier yading@11: * yading@11: * This file is part of FFmpeg. yading@11: * yading@11: * FFmpeg is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public yading@11: * License as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * FFmpeg is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: * Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public yading@11: * License along with FFmpeg; if not, write to the Free Software yading@11: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: #ifndef AVFORMAT_MOVENC_H yading@11: #define AVFORMAT_MOVENC_H yading@11: yading@11: #include "avformat.h" yading@11: yading@11: #define MOV_INDEX_CLUSTER_SIZE 16384 yading@11: #define MOV_TIMESCALE 1000 yading@11: yading@11: #define RTP_MAX_PACKET_SIZE 1450 yading@11: yading@11: #define MODE_MP4 0x01 yading@11: #define MODE_MOV 0x02 yading@11: #define MODE_3GP 0x04 yading@11: #define MODE_PSP 0x08 // example working PSP command line: yading@11: // ffmpeg -i testinput.avi -f psp -r 14.985 -s 320x240 -b 768 -ar 24000 -ab 32 M4V00001.MP4 yading@11: #define MODE_3G2 0x10 yading@11: #define MODE_IPOD 0x20 yading@11: #define MODE_ISM 0x40 yading@11: #define MODE_F4V 0x80 yading@11: yading@11: typedef struct MOVIentry { yading@11: uint64_t pos; yading@11: int64_t dts; yading@11: unsigned int size; yading@11: unsigned int samples_in_chunk; yading@11: unsigned int chunkNum; ///< Chunk number if the current entry is a chunk start otherwise 0 yading@11: unsigned int entries; yading@11: int cts; yading@11: #define MOV_SYNC_SAMPLE 0x0001 yading@11: #define MOV_PARTIAL_SYNC_SAMPLE 0x0002 yading@11: uint32_t flags; yading@11: } MOVIentry; yading@11: yading@11: typedef struct HintSample { yading@11: uint8_t *data; yading@11: int size; yading@11: int sample_number; yading@11: int offset; yading@11: int own_data; yading@11: } HintSample; yading@11: yading@11: typedef struct HintSampleQueue { yading@11: int size; yading@11: int len; yading@11: HintSample *samples; yading@11: } HintSampleQueue; yading@11: yading@11: typedef struct MOVFragmentInfo { yading@11: int64_t offset; yading@11: int64_t time; yading@11: int64_t duration; yading@11: int64_t tfrf_offset; yading@11: } MOVFragmentInfo; yading@11: yading@11: typedef struct MOVIndex { yading@11: int mode; yading@11: int entry; yading@11: unsigned timescale; yading@11: uint64_t time; yading@11: int64_t track_duration; yading@11: int last_sample_is_subtitle_end; yading@11: long sample_count; yading@11: long sample_size; yading@11: long chunkCount; yading@11: int has_keyframes; yading@11: #define MOV_TRACK_CTTS 0x0001 yading@11: #define MOV_TRACK_STPS 0x0002 yading@11: uint32_t flags; yading@11: #define MOV_TIMECODE_FLAG_DROPFRAME 0x0001 yading@11: #define MOV_TIMECODE_FLAG_24HOURSMAX 0x0002 yading@11: #define MOV_TIMECODE_FLAG_ALLOWNEGATIVE 0x0004 yading@11: uint32_t timecode_flags; yading@11: int language; yading@11: int secondary; yading@11: int track_id; yading@11: int tag; ///< stsd fourcc yading@11: AVCodecContext *enc; yading@11: yading@11: int vos_len; yading@11: uint8_t *vos_data; yading@11: MOVIentry *cluster; yading@11: int audio_vbr; yading@11: int height; ///< active picture (w/o VBI) height for D-10/IMX yading@11: uint32_t tref_tag; yading@11: int tref_id; ///< trackID of the referenced track yading@11: int64_t start_dts; yading@11: yading@11: int hint_track; ///< the track that hints this track, -1 if no hint track is set yading@11: int src_track; ///< the track that this hint (or tmcd) track describes yading@11: AVFormatContext *rtp_ctx; ///< the format context for the hinting rtp muxer yading@11: uint32_t prev_rtp_ts; yading@11: int64_t cur_rtp_ts_unwrapped; yading@11: uint32_t max_packet_size; yading@11: yading@11: int64_t default_duration; yading@11: uint32_t default_sample_flags; yading@11: uint32_t default_size; yading@11: yading@11: HintSampleQueue sample_queue; yading@11: yading@11: AVIOContext *mdat_buf; yading@11: int64_t moof_size_offset; yading@11: int64_t data_offset; yading@11: int64_t frag_start; yading@11: int64_t tfrf_offset; yading@11: yading@11: int nb_frag_info; yading@11: MOVFragmentInfo *frag_info; yading@11: yading@11: struct { yading@11: int64_t struct_offset; yading@11: int first_packet_seq; yading@11: int first_packet_entry; yading@11: int packet_seq; yading@11: int packet_entry; yading@11: int slices; yading@11: } vc1_info; yading@11: } MOVTrack; yading@11: yading@11: typedef struct MOVMuxContext { yading@11: const AVClass *av_class; yading@11: int mode; yading@11: int64_t time; yading@11: int nb_streams; yading@11: int nb_meta_tmcd; ///< number of new created tmcd track based on metadata (aka not data copy) yading@11: int chapter_track; ///< qt chapter track number yading@11: int64_t mdat_pos; yading@11: uint64_t mdat_size; yading@11: MOVTrack *tracks; yading@11: yading@11: int flags; yading@11: int rtp_flags; yading@11: int reserved_moov_size; ///< 0 for disabled, -1 for automatic, size otherwise yading@11: int64_t reserved_moov_pos; yading@11: yading@11: int iods_skip; yading@11: int iods_video_profile; yading@11: int iods_audio_profile; yading@11: yading@11: int fragments; yading@11: int max_fragment_duration; yading@11: int min_fragment_duration; yading@11: int max_fragment_size; yading@11: int ism_lookahead; yading@11: AVIOContext *mdat_buf; yading@11: yading@11: int use_editlist; yading@11: } MOVMuxContext; yading@11: yading@11: #define FF_MOV_FLAG_RTP_HINT 1 yading@11: #define FF_MOV_FLAG_FRAGMENT 2 yading@11: #define FF_MOV_FLAG_EMPTY_MOOV 4 yading@11: #define FF_MOV_FLAG_FRAG_KEYFRAME 8 yading@11: #define FF_MOV_FLAG_SEPARATE_MOOF 16 yading@11: #define FF_MOV_FLAG_FRAG_CUSTOM 32 yading@11: #define FF_MOV_FLAG_ISML 64 yading@11: #define FF_MOV_FLAG_FASTSTART 128 yading@11: yading@11: int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt); yading@11: yading@11: int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index); yading@11: int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt, yading@11: int track_index, int sample, yading@11: uint8_t *sample_data, int sample_size); yading@11: void ff_mov_close_hinting(MOVTrack *track); yading@11: yading@11: #endif /* AVFORMAT_MOVENC_H */