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 Libav. 8 * 9 * Libav 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 * Libav 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 Libav; 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_INDEX_CLUSTER_SIZE 16384 30#define MOV_TIMESCALE 1000 31 32#define RTP_MAX_PACKET_SIZE 1450 33 34#define MODE_MP4 0x01 35#define MODE_MOV 0x02 36#define MODE_3GP 0x04 37#define MODE_PSP 0x08 // example working PSP command line: 38// avconv -i testinput.avi -f psp -r 14.985 -s 320x240 -b 768 -ar 24000 -ab 32 M4V00001.MP4 39#define MODE_3G2 0x10 40#define MODE_IPOD 0x20 41 42typedef struct MOVIentry { 43 uint64_t pos; 44 int64_t dts; 45 unsigned int size; 46 unsigned int samplesInChunk; 47 unsigned int entries; 48 int cts; 49#define MOV_SYNC_SAMPLE 0x0001 50#define MOV_PARTIAL_SYNC_SAMPLE 0x0002 51 uint32_t flags; 52} MOVIentry; 53 54typedef struct HintSample { 55 uint8_t *data; 56 int size; 57 int sample_number; 58 int offset; 59 int own_data; 60} HintSample; 61 62typedef struct { 63 int size; 64 int len; 65 HintSample *samples; 66} HintSampleQueue; 67 68typedef struct MOVIndex { 69 int mode; 70 int entry; 71 unsigned timescale; 72 uint64_t time; 73 int64_t trackDuration; 74 long sampleCount; 75 long sampleSize; 76 int hasKeyframes; 77#define MOV_TRACK_CTTS 0x0001 78#define MOV_TRACK_STPS 0x0002 79 uint32_t flags; 80 int language; 81 int trackID; 82 int tag; ///< stsd fourcc 83 AVCodecContext *enc; 84 85 int vosLen; 86 uint8_t *vosData; 87 MOVIentry *cluster; 88 int audio_vbr; 89 int height; ///< active picture (w/o VBI) height for D-10/IMX 90 uint32_t tref_tag; 91 int tref_id; ///< trackID of the referenced track 92 93 int hint_track; ///< the track that hints this track, -1 if no hint track is set 94 int src_track; ///< the track that this hint track describes 95 AVFormatContext *rtp_ctx; ///< the format context for the hinting rtp muxer 96 uint32_t prev_rtp_ts; 97 int64_t cur_rtp_ts_unwrapped; 98 uint32_t max_packet_size; 99 100 HintSampleQueue sample_queue; 101} MOVTrack; 102 103typedef struct MOVMuxContext { 104 const AVClass *av_class; 105 int mode; 106 int64_t time; 107 int nb_streams; 108 int chapter_track; ///< qt chapter track number 109 int64_t mdat_pos; 110 uint64_t mdat_size; 111 MOVTrack *tracks; 112 113 int flags; 114 int rtp_flags; 115 int iods_skip; 116 int iods_video_profile; 117 int iods_audio_profile; 118} MOVMuxContext; 119 120#define FF_MOV_FLAG_RTP_HINT 1 121 122int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt); 123 124int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index); 125int ff_mov_add_hinted_packet(AVFormatContext *s, AVPacket *pkt, 126 int track_index, int sample, 127 uint8_t *sample_data, int sample_size); 128void ff_mov_close_hinting(MOVTrack *track); 129 130#endif /* AVFORMAT_MOVENC_H */ 131