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} MOVMuxContext;
183
184#define FF_MOV_FLAG_RTP_HINT 1
185#define FF_MOV_FLAG_FRAGMENT 2
186#define FF_MOV_FLAG_EMPTY_MOOV 4
187#define FF_MOV_FLAG_FRAG_KEYFRAME 8
188#define FF_MOV_FLAG_SEPARATE_MOOF 16
189#define FF_MOV_FLAG_FRAG_CUSTOM 32
190#define FF_MOV_FLAG_ISML 64
191#define FF_MOV_FLAG_FASTSTART 128
192#define FF_MOV_FLAG_OMIT_TFHD_OFFSET 256
193
194int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt);
195
196int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index);
197int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt,
198                             int track_index, int sample,
199                             uint8_t *sample_data, int sample_size);
200void ff_mov_close_hinting(MOVTrack *track);
201
202#endif /* AVFORMAT_MOVENC_H */
203