Imported Debian version 2.4.3~trusty1
[deb_ffmpeg.git] / ffmpeg / libavformat / movenc.h
CommitLineData
2ba45a60
DM
1/*
2 * MOV, 3GP, MP4 muxer
3 * Copyright (c) 2003 Thomas Raivio
4 * Copyright (c) 2004 Gildas Bazin <gbazin at videolan dot org>
5 * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
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
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
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 */
23
24#ifndef AVFORMAT_MOVENC_H
25#define AVFORMAT_MOVENC_H
26
27#include "avformat.h"
28
29#define MOV_FRAG_INFO_ALLOC_INCREMENT 64
30#define MOV_INDEX_CLUSTER_SIZE 1024
31#define MOV_TIMESCALE 1000
32
33#define RTP_MAX_PACKET_SIZE 1450
34
35#define MODE_MP4 0x01
36#define MODE_MOV 0x02
37#define MODE_3GP 0x04
38#define MODE_PSP 0x08 // example working PSP command line:
39// ffmpeg -i testinput.avi -f psp -r 14.985 -s 320x240 -b 768 -ar 24000 -ab 32 M4V00001.MP4
40#define MODE_3G2 0x10
41#define MODE_IPOD 0x20
42#define MODE_ISM 0x40
43#define MODE_F4V 0x80
44
45typedef struct MOVIentry {
46 uint64_t pos;
47 int64_t dts;
48 unsigned int size;
49 unsigned int samples_in_chunk;
50 unsigned int chunkNum; ///< Chunk number if the current entry is a chunk start otherwise 0
51 unsigned int entries;
52 int cts;
53#define MOV_SYNC_SAMPLE 0x0001
54#define MOV_PARTIAL_SYNC_SAMPLE 0x0002
55 uint32_t flags;
56} MOVIentry;
57
58typedef struct HintSample {
59 uint8_t *data;
60 int size;
61 int sample_number;
62 int offset;
63 int own_data;
64} HintSample;
65
66typedef struct HintSampleQueue {
67 int size;
68 int len;
69 HintSample *samples;
70} HintSampleQueue;
71
72typedef struct MOVFragmentInfo {
73 int64_t offset;
74 int64_t time;
75 int64_t duration;
76 int64_t tfrf_offset;
77} MOVFragmentInfo;
78
79typedef struct MOVTrack {
80 int mode;
81 int entry;
82 unsigned timescale;
83 uint64_t time;
84 int64_t track_duration;
85 int last_sample_is_subtitle_end;
86 long sample_count;
87 long sample_size;
88 long chunkCount;
89 int has_keyframes;
90#define MOV_TRACK_CTTS 0x0001
91#define MOV_TRACK_STPS 0x0002
92#define MOV_TRACK_ENABLED 0x0004
93 uint32_t flags;
94#define MOV_TIMECODE_FLAG_DROPFRAME 0x0001
95#define MOV_TIMECODE_FLAG_24HOURSMAX 0x0002
96#define MOV_TIMECODE_FLAG_ALLOWNEGATIVE 0x0004
97 uint32_t timecode_flags;
98 int language;
99 int track_id;
100 int tag; ///< stsd fourcc
101 AVStream *st;
102 AVCodecContext *enc;
103 int multichannel_as_mono;
104
105 int vos_len;
106 uint8_t *vos_data;
107 MOVIentry *cluster;
108 unsigned cluster_capacity;
109 int audio_vbr;
110 int height; ///< active picture (w/o VBI) height for D-10/IMX
111 uint32_t tref_tag;
112 int tref_id; ///< trackID of the referenced track
113 int64_t start_dts;
114
115 int hint_track; ///< the track that hints this track, -1 if no hint track is set
116 int src_track; ///< the track that this hint (or tmcd) track describes
117 AVFormatContext *rtp_ctx; ///< the format context for the hinting rtp muxer
118 uint32_t prev_rtp_ts;
119 int64_t cur_rtp_ts_unwrapped;
120 uint32_t max_packet_size;
121
122 int64_t default_duration;
123 uint32_t default_sample_flags;
124 uint32_t default_size;
125
126 HintSampleQueue sample_queue;
127
128 AVIOContext *mdat_buf;
129 int64_t data_offset;
130 int64_t frag_start;
131 int64_t tfrf_offset;
132
133 int nb_frag_info;
134 MOVFragmentInfo *frag_info;
135 unsigned frag_info_capacity;
136
137 struct {
138 int64_t struct_offset;
139 int first_packet_seq;
140 int first_packet_entry;
141 int packet_seq;
142 int packet_entry;
143 int slices;
144 } vc1_info;
145} MOVTrack;
146
147typedef struct MOVMuxContext {
148 const AVClass *av_class;
149 int mode;
150 int64_t time;
151 int nb_streams;
152 int nb_meta_tmcd; ///< number of new created tmcd track based on metadata (aka not data copy)
153 int chapter_track; ///< qt chapter track number
154 int64_t mdat_pos;
155 uint64_t mdat_size;
156 MOVTrack *tracks;
157
158 int flags;
159 int rtp_flags;
160 int exact;
161
162 int iods_skip;
163 int iods_video_profile;
164 int iods_audio_profile;
165
166 int fragments;
167 int max_fragment_duration;
168 int min_fragment_duration;
169 int max_fragment_size;
170 int ism_lookahead;
171 AVIOContext *mdat_buf;
172
173 int use_editlist;
174 int video_track_timescale;
175
176 int reserved_moov_size; ///< 0 for disabled, -1 for automatic, size otherwise
177 int64_t reserved_moov_pos;
178
179 char *major_brand;
180
181 int per_stream_grouping;
182 AVFormatContext *fc;
183} MOVMuxContext;
184
185#define FF_MOV_FLAG_RTP_HINT 1
186#define FF_MOV_FLAG_FRAGMENT 2
187#define FF_MOV_FLAG_EMPTY_MOOV 4
188#define FF_MOV_FLAG_FRAG_KEYFRAME 8
189#define FF_MOV_FLAG_SEPARATE_MOOF 16
190#define FF_MOV_FLAG_FRAG_CUSTOM 32
191#define FF_MOV_FLAG_ISML 64
192#define FF_MOV_FLAG_FASTSTART 128
193#define FF_MOV_FLAG_OMIT_TFHD_OFFSET 256
194#define FF_MOV_FLAG_DISABLE_CHPL 512
195
196int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt);
197
198int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index);
199int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt,
200 int track_index, int sample,
201 uint8_t *sample_data, int sample_size);
202void ff_mov_close_hinting(MOVTrack *track);
203
204#endif /* AVFORMAT_MOVENC_H */