3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
74 #include <sys/ioctl.h>
84 #include "libavutil/avassert.h"
86 const char program_name[] = "FFmpeg";
87 const int program_birth_year = 2000;
89 /* select an input stream for an output stream */
90 typedef struct AVStreamMap {
94 int sync_stream_index;
98 * select an input file for an output file
100 typedef struct AVMetaDataMap {
101 int file; //< file index
102 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
103 int index; //< stream/chapter/program number
106 typedef struct AVChapterMap {
111 static const OptionDef options[];
113 #define MAX_FILES 100
114 #if !FF_API_MAX_STREAMS
115 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
118 static const char *last_asked_format = NULL;
119 static AVFormatContext *input_files[MAX_FILES];
120 static int64_t input_files_ts_offset[MAX_FILES];
121 static double *input_files_ts_scale[MAX_FILES] = {NULL};
122 static AVCodec **input_codecs = NULL;
123 static int nb_input_files = 0;
124 static int nb_input_codecs = 0;
125 static int nb_input_files_ts_scale[MAX_FILES] = {0};
127 static AVFormatContext *output_files[MAX_FILES];
128 static AVCodec **output_codecs = NULL;
129 static int nb_output_files = 0;
130 static int nb_output_codecs = 0;
132 static AVStreamMap *stream_maps = NULL;
133 static int nb_stream_maps;
135 /* first item specifies output metadata, second is input */
136 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
137 static int nb_meta_data_maps;
138 static int metadata_global_autocopy = 1;
139 static int metadata_streams_autocopy = 1;
140 static int metadata_chapters_autocopy = 1;
142 static AVChapterMap *chapter_maps = NULL;
143 static int nb_chapter_maps;
145 /* indexed by output file stream index */
146 static int *streamid_map = NULL;
147 static int nb_streamid_map = 0;
149 static int frame_width = 0;
150 static int frame_height = 0;
151 static float frame_aspect_ratio = 0;
152 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
153 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
154 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
155 static AVRational frame_rate;
156 static float video_qscale = 0;
157 static uint16_t *intra_matrix = NULL;
158 static uint16_t *inter_matrix = NULL;
159 static const char *video_rc_override_string=NULL;
160 static int video_disable = 0;
161 static int video_discard = 0;
162 static char *video_codec_name = NULL;
163 static unsigned int video_codec_tag = 0;
164 static char *video_language = NULL;
165 static int same_quality = 0;
166 static int do_deinterlace = 0;
167 static int top_field_first = -1;
168 static int me_threshold = 0;
169 static int intra_dc_precision = 8;
170 static int loop_input = 0;
171 static int loop_output = AVFMT_NOOUTPUTLOOP;
172 static int qp_hist = 0;
174 static char *vfilters = NULL;
177 static int intra_only = 0;
178 static int audio_sample_rate = 44100;
179 static int64_t channel_layout = 0;
180 #define QSCALE_NONE -99999
181 static float audio_qscale = QSCALE_NONE;
182 static int audio_disable = 0;
183 static int audio_channels = 1;
184 static char *audio_codec_name = NULL;
185 static unsigned int audio_codec_tag = 0;
186 static char *audio_language = NULL;
188 static int subtitle_disable = 0;
189 static char *subtitle_codec_name = NULL;
190 static char *subtitle_language = NULL;
191 static unsigned int subtitle_codec_tag = 0;
193 static float mux_preload= 0.5;
194 static float mux_max_delay= 0.7;
196 static int64_t recording_time = INT64_MAX;
197 static int64_t start_time = 0;
198 static int64_t recording_timestamp = 0;
199 static int64_t input_ts_offset = 0;
200 static int file_overwrite = 0;
201 static AVMetadata *metadata;
202 static int do_benchmark = 0;
203 static int do_hex_dump = 0;
204 static int do_pkt_dump = 0;
205 static int do_psnr = 0;
206 static int do_pass = 0;
207 static char *pass_logfilename_prefix = NULL;
208 static int audio_stream_copy = 0;
209 static int video_stream_copy = 0;
210 static int subtitle_stream_copy = 0;
211 static int video_sync_method= -1;
212 static int audio_sync_method= 0;
213 static float audio_drift_threshold= 0.1;
214 static int copy_ts= 0;
216 static int opt_shortest = 0;
217 static int video_global_header = 0;
218 static char *vstats_filename;
219 static FILE *vstats_file;
220 static int opt_programid = 0;
221 static int copy_initial_nonkeyframes = 0;
223 static int rate_emu = 0;
225 static int video_channel = 0;
226 static char *video_standard;
228 static int audio_volume = 256;
230 static int exit_on_error = 0;
231 static int using_stdin = 0;
232 static int verbose = 1;
233 static int thread_count= 1;
234 static int q_pressed = 0;
235 static int64_t video_size = 0;
236 static int64_t audio_size = 0;
237 static int64_t extra_size = 0;
238 static int nb_frames_dup = 0;
239 static int nb_frames_drop = 0;
240 static int input_sync;
241 static uint64_t limit_filesize = 0;
242 static int force_fps = 0;
243 static char *forced_key_frames = NULL;
245 static float dts_delta_threshold = 10;
247 static unsigned int sws_flags = SWS_BICUBIC;
249 static int64_t timer_start;
251 static uint8_t *audio_buf;
252 static uint8_t *audio_out;
253 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
255 static short *samples;
257 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
258 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
259 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
261 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
263 struct AVInputStream;
265 typedef struct AVOutputStream {
266 int file_index; /* file index */
267 int index; /* stream index in the output file */
268 int source_index; /* AVInputStream index */
269 AVStream *st; /* stream in the output file */
270 int encoding_needed; /* true if encoding needed for this stream */
272 /* input pts and corresponding output pts
274 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
275 struct AVInputStream *sync_ist; /* input stream to sync against */
276 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
277 AVBitStreamFilterContext *bitstream_filters;
280 AVFrame pict_tmp; /* temporary image for resampling */
281 struct SwsContext *img_resample_ctx; /* for image resampling */
284 int resample_pix_fmt;
286 /* full frame size of first frame */
290 /* forced key frames */
291 int64_t *forced_kf_pts;
297 ReSampleContext *resample; /* for audio resampling */
298 int resample_sample_fmt;
299 int resample_channels;
300 int resample_sample_rate;
302 AVAudioConvert *reformat_ctx;
303 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
307 AVFilterContext *output_video_filter;
308 AVFilterContext *input_video_filter;
309 AVFilterBufferRef *picref;
311 AVFilterGraph *graph;
315 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
316 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
318 typedef struct AVInputStream {
322 int discard; /* true if stream data should be discarded */
323 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
324 int64_t sample_index; /* current sample */
326 int64_t start; /* time when read started */
327 int64_t next_pts; /* synthetic pts for cases where pkt.pts
329 int64_t pts; /* current pts */
330 int is_start; /* is 1 at the start and after a discontinuity */
331 int showed_multi_packet_warning;
332 int is_past_recording_time;
334 AVFrame *filter_frame;
335 int has_filter_frame;
339 typedef struct AVInputFile {
340 int eof_reached; /* true if eof reached */
341 int ist_index; /* index of first stream in ist_table */
342 int buffer_size; /* current total buffer size */
343 int nb_streams; /* nb streams we are aware of */
348 /* init terminal so that we can grab keys */
349 static struct termios oldtty;
354 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
356 AVFilterContext *last_filter, *filter;
357 /** filter graph containing all filters including input & output */
358 AVCodecContext *codec = ost->st->codec;
359 AVCodecContext *icodec = ist->st->codec;
360 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
361 AVRational sample_aspect_ratio;
365 ost->graph = avfilter_graph_alloc();
367 if (ist->st->sample_aspect_ratio.num){
368 sample_aspect_ratio = ist->st->sample_aspect_ratio;
370 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
372 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
373 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
374 sample_aspect_ratio.num, sample_aspect_ratio.den);
376 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
377 "src", args, NULL, ost->graph);
380 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
381 "out", NULL, &ffsink_ctx, ost->graph);
384 last_filter = ost->input_video_filter;
386 if (codec->width != icodec->width || codec->height != icodec->height) {
387 snprintf(args, 255, "%d:%d:flags=0x%X",
390 (int)av_get_int(sws_opts, "sws_flags", NULL));
391 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
392 NULL, args, NULL, ost->graph)) < 0)
394 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
396 last_filter = filter;
399 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
400 ost->graph->scale_sws_opts = av_strdup(args);
403 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
404 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
406 outputs->name = av_strdup("in");
407 outputs->filter_ctx = last_filter;
408 outputs->pad_idx = 0;
409 outputs->next = NULL;
411 inputs->name = av_strdup("out");
412 inputs->filter_ctx = ost->output_video_filter;
416 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
418 av_freep(&ost->avfilter);
420 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
424 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
427 codec->width = ost->output_video_filter->inputs[0]->w;
428 codec->height = ost->output_video_filter->inputs[0]->h;
429 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
430 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
434 #endif /* CONFIG_AVFILTER */
436 static void term_exit(void)
438 av_log(NULL, AV_LOG_QUIET, "");
440 tcsetattr (0, TCSANOW, &oldtty);
444 static volatile int received_sigterm = 0;
447 sigterm_handler(int sig)
449 received_sigterm = sig;
453 static void term_init(void)
462 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
463 |INLCR|IGNCR|ICRNL|IXON);
464 tty.c_oflag |= OPOST;
465 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
466 tty.c_cflag &= ~(CSIZE|PARENB);
471 tcsetattr (0, TCSANOW, &tty);
472 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
475 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
476 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
478 signal(SIGXCPU, sigterm_handler);
482 /* read a key without blocking */
483 static int read_key(void)
495 n = select(1, &rfds, NULL, NULL, &tv);
510 static int decode_interrupt_cb(void)
512 q_pressed += read_key() == 'q';
513 return q_pressed > 1;
516 static int ffmpeg_exit(int ret)
521 for(i=0;i<nb_output_files;i++) {
522 AVFormatContext *s = output_files[i];
524 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
526 avformat_free_context(s);
527 av_free(output_streams_for_file[i]);
529 for(i=0;i<nb_input_files;i++) {
530 av_close_input_file(input_files[i]);
531 av_free(input_files_ts_scale[i]);
534 av_free(intra_matrix);
535 av_free(inter_matrix);
539 av_free(vstats_filename);
541 av_free(streamid_map);
542 av_free(input_codecs);
543 av_free(output_codecs);
544 av_free(stream_maps);
545 av_free(meta_data_maps);
547 av_free(video_codec_name);
548 av_free(audio_codec_name);
549 av_free(subtitle_codec_name);
551 av_free(video_standard);
556 allocated_audio_buf_size= allocated_audio_out_size= 0;
563 if (received_sigterm) {
565 "Received signal %d: terminating.\n",
566 (int) received_sigterm);
570 exit(ret); /* not all OS-es handle main() return value */
574 /* similar to ff_dynarray_add() and av_fast_realloc() */
575 static void *grow_array(void *array, int elem_size, int *size, int new_size)
577 if (new_size >= INT_MAX / elem_size) {
578 fprintf(stderr, "Array too big.\n");
581 if (*size < new_size) {
582 uint8_t *tmp = av_realloc(array, new_size*elem_size);
584 fprintf(stderr, "Could not alloc buffer.\n");
587 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
594 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
596 if(codec && codec->sample_fmts){
597 const enum AVSampleFormat *p= codec->sample_fmts;
599 if(*p == st->codec->sample_fmt)
603 av_log(NULL, AV_LOG_WARNING,
604 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
605 av_get_sample_fmt_name(st->codec->sample_fmt),
607 av_get_sample_fmt_name(codec->sample_fmts[0]));
608 st->codec->sample_fmt = codec->sample_fmts[0];
613 static void choose_sample_rate(AVStream *st, AVCodec *codec)
615 if(codec && codec->supported_samplerates){
616 const int *p= codec->supported_samplerates;
618 int best_dist=INT_MAX;
620 int dist= abs(st->codec->sample_rate - *p);
621 if(dist < best_dist){
627 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
629 st->codec->sample_rate= best;
633 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
635 if(codec && codec->pix_fmts){
636 const enum PixelFormat *p= codec->pix_fmts;
637 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
638 if(st->codec->codec_id==CODEC_ID_MJPEG){
639 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
640 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
641 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
645 if(*p == st->codec->pix_fmt)
649 st->codec->pix_fmt = codec->pix_fmts[0];
653 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
655 int idx = oc->nb_streams - 1;
658 output_streams_for_file[file_idx] =
659 grow_array(output_streams_for_file[file_idx],
660 sizeof(*output_streams_for_file[file_idx]),
661 &nb_output_streams_for_file[file_idx],
663 ost = output_streams_for_file[file_idx][idx] =
664 av_mallocz(sizeof(AVOutputStream));
666 fprintf(stderr, "Could not alloc output stream\n");
669 ost->file_index = file_idx;
674 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
680 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
683 /* copy stream format */
685 for(i=0;i<ic->nb_streams;i++) {
691 // FIXME: a more elegant solution is needed
692 st = av_mallocz(sizeof(AVStream));
693 memcpy(st, ic->streams[i], sizeof(AVStream));
694 st->codec = avcodec_alloc_context();
696 print_error(filename, AVERROR(ENOMEM));
699 avcodec_copy_context(st->codec, ic->streams[i]->codec);
702 codec = avcodec_find_encoder(st->codec->codec_id);
703 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
704 if (audio_stream_copy) {
707 choose_sample_fmt(st, codec);
708 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
709 if (video_stream_copy) {
712 choose_pixel_fmt(st, codec);
715 if(st->codec->flags & CODEC_FLAG_BITEXACT)
718 new_output_stream(s, nb_output_files);
722 s->timestamp = av_gettime();
724 av_close_input_file(ic);
729 get_sync_ipts(const AVOutputStream *ost)
731 const AVInputStream *ist = ost->sync_ist;
732 return (double)(ist->pts - start_time)/AV_TIME_BASE;
735 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
739 AVPacket new_pkt= *pkt;
740 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
741 &new_pkt.data, &new_pkt.size,
742 pkt->data, pkt->size,
743 pkt->flags & AV_PKT_FLAG_KEY);
746 new_pkt.destruct= av_destruct_packet;
748 fprintf(stderr, "%s failed for stream %d, codec %s",
749 bsfc->filter->name, pkt->stream_index,
750 avctx->codec ? avctx->codec->name : "copy");
760 ret= av_interleaved_write_frame(s, pkt);
762 print_error("av_interleaved_write_frame()", ret);
767 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
769 static void do_audio_out(AVFormatContext *s,
772 unsigned char *buf, int size)
775 int64_t audio_out_size, audio_buf_size;
776 int64_t allocated_for_size= size;
778 int size_out, frame_bytes, ret, resample_changed;
779 AVCodecContext *enc= ost->st->codec;
780 AVCodecContext *dec= ist->st->codec;
781 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
782 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
783 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
786 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
787 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
788 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
789 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
790 audio_buf_size*= osize*enc->channels;
792 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
793 if(coded_bps > 8*osize)
794 audio_out_size= audio_out_size * coded_bps / (8*osize);
795 audio_out_size += FF_MIN_BUFFER_SIZE;
797 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
798 fprintf(stderr, "Buffer sizes too large\n");
802 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
803 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
804 if (!audio_buf || !audio_out){
805 fprintf(stderr, "Out of memory in do_audio_out\n");
809 if (enc->channels != dec->channels)
810 ost->audio_resample = 1;
812 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
813 ost->resample_channels != dec->channels ||
814 ost->resample_sample_rate != dec->sample_rate;
816 if ((ost->audio_resample && !ost->resample) || resample_changed) {
817 if (resample_changed) {
818 av_log(NULL, AV_LOG_INFO, "Input stream #%d.%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
819 ist->file_index, ist->index,
820 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
821 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
822 ost->resample_sample_fmt = dec->sample_fmt;
823 ost->resample_channels = dec->channels;
824 ost->resample_sample_rate = dec->sample_rate;
826 audio_resample_close(ost->resample);
828 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
829 if (audio_sync_method <= 1 &&
830 ost->resample_sample_fmt == enc->sample_fmt &&
831 ost->resample_channels == enc->channels &&
832 ost->resample_sample_rate == enc->sample_rate) {
833 ost->resample = NULL;
834 ost->audio_resample = 0;
836 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
837 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
838 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
839 enc->sample_rate, dec->sample_rate,
840 enc->sample_fmt, dec->sample_fmt,
842 if (!ost->resample) {
843 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
844 dec->channels, dec->sample_rate,
845 enc->channels, enc->sample_rate);
851 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
852 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
853 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
854 if (ost->reformat_ctx)
855 av_audio_convert_free(ost->reformat_ctx);
856 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
857 dec->sample_fmt, 1, NULL, 0);
858 if (!ost->reformat_ctx) {
859 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
860 av_get_sample_fmt_name(dec->sample_fmt),
861 av_get_sample_fmt_name(enc->sample_fmt));
864 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
867 if(audio_sync_method){
868 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
869 - av_fifo_size(ost->fifo)/(enc->channels * 2);
870 double idelta= delta*dec->sample_rate / enc->sample_rate;
871 int byte_delta= ((int)idelta)*2*dec->channels;
873 //FIXME resample delay
874 if(fabs(delta) > 50){
875 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
877 byte_delta= FFMAX(byte_delta, -size);
881 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
886 static uint8_t *input_tmp= NULL;
887 input_tmp= av_realloc(input_tmp, byte_delta + size);
889 if(byte_delta > allocated_for_size - size){
890 allocated_for_size= byte_delta + (int64_t)size;
895 memset(input_tmp, 0, byte_delta);
896 memcpy(input_tmp + byte_delta, buf, size);
900 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
902 }else if(audio_sync_method>1){
903 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
904 av_assert0(ost->audio_resample);
906 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
907 // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
908 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
912 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
913 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
915 if (ost->audio_resample) {
917 size_out = audio_resample(ost->resample,
918 (short *)buftmp, (short *)buf,
919 size / (dec->channels * isize));
920 size_out = size_out * enc->channels * osize;
926 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
927 const void *ibuf[6]= {buftmp};
928 void *obuf[6]= {audio_buf};
929 int istride[6]= {isize};
930 int ostride[6]= {osize};
931 int len= size_out/istride[0];
932 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
933 printf("av_audio_convert() failed\n");
939 size_out = len*osize;
942 /* now encode as many frames as possible */
943 if (enc->frame_size > 1) {
944 /* output resampled raw samples */
945 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
946 fprintf(stderr, "av_fifo_realloc2() failed\n");
949 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
951 frame_bytes = enc->frame_size * osize * enc->channels;
953 while (av_fifo_size(ost->fifo) >= frame_bytes) {
955 av_init_packet(&pkt);
957 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
959 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
961 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
964 fprintf(stderr, "Audio encoding failed\n");
968 pkt.stream_index= ost->index;
971 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
972 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
973 pkt.flags |= AV_PKT_FLAG_KEY;
974 write_frame(s, &pkt, enc, ost->bitstream_filters);
976 ost->sync_opts += enc->frame_size;
980 av_init_packet(&pkt);
982 ost->sync_opts += size_out / (osize * enc->channels);
984 /* output a pcm frame */
985 /* determine the size of the coded buffer */
988 size_out = size_out*coded_bps/8;
990 if(size_out > audio_out_size){
991 fprintf(stderr, "Internal error, buffer size too small\n");
995 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
996 ret = avcodec_encode_audio(enc, audio_out, size_out,
999 fprintf(stderr, "Audio encoding failed\n");
1003 pkt.stream_index= ost->index;
1004 pkt.data= audio_out;
1006 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1007 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1008 pkt.flags |= AV_PKT_FLAG_KEY;
1009 write_frame(s, &pkt, enc, ost->bitstream_filters);
1013 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1015 AVCodecContext *dec;
1016 AVPicture *picture2;
1017 AVPicture picture_tmp;
1020 dec = ist->st->codec;
1022 /* deinterlace : must be done before any resize */
1023 if (do_deinterlace) {
1026 /* create temporary picture */
1027 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1028 buf = av_malloc(size);
1032 picture2 = &picture_tmp;
1033 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1035 if(avpicture_deinterlace(picture2, picture,
1036 dec->pix_fmt, dec->width, dec->height) < 0) {
1037 /* if error, do not deinterlace */
1038 fprintf(stderr, "Deinterlacing failed\n");
1047 if (picture != picture2)
1048 *picture = *picture2;
1052 /* we begin to correct av delay at this threshold */
1053 #define AV_DELAY_MAX 0.100
1055 static void do_subtitle_out(AVFormatContext *s,
1056 AVOutputStream *ost,
1061 static uint8_t *subtitle_out = NULL;
1062 int subtitle_out_max_size = 1024 * 1024;
1063 int subtitle_out_size, nb, i;
1064 AVCodecContext *enc;
1067 if (pts == AV_NOPTS_VALUE) {
1068 fprintf(stderr, "Subtitle packets must have a pts\n");
1074 enc = ost->st->codec;
1076 if (!subtitle_out) {
1077 subtitle_out = av_malloc(subtitle_out_max_size);
1080 /* Note: DVB subtitle need one packet to draw them and one other
1081 packet to clear them */
1082 /* XXX: signal it in the codec context ? */
1083 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1088 for(i = 0; i < nb; i++) {
1089 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1090 // start_display_time is required to be 0
1091 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1092 sub->end_display_time -= sub->start_display_time;
1093 sub->start_display_time = 0;
1094 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1095 subtitle_out_max_size, sub);
1096 if (subtitle_out_size < 0) {
1097 fprintf(stderr, "Subtitle encoding failed\n");
1101 av_init_packet(&pkt);
1102 pkt.stream_index = ost->index;
1103 pkt.data = subtitle_out;
1104 pkt.size = subtitle_out_size;
1105 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1106 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1107 /* XXX: the pts correction is handled here. Maybe handling
1108 it in the codec would be better */
1110 pkt.pts += 90 * sub->start_display_time;
1112 pkt.pts += 90 * sub->end_display_time;
1114 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1118 static int bit_buffer_size= 1024*256;
1119 static uint8_t *bit_buffer= NULL;
1121 static void do_video_out(AVFormatContext *s,
1122 AVOutputStream *ost,
1124 AVFrame *in_picture,
1127 int nb_frames, i, ret;
1128 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1129 AVCodecContext *enc, *dec;
1132 enc = ost->st->codec;
1133 dec = ist->st->codec;
1135 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1137 /* by default, we output a single frame */
1142 if(video_sync_method){
1143 double vdelta = sync_ipts - ost->sync_opts;
1144 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1147 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1150 }else if(vdelta>0.6)
1151 ost->sync_opts= lrintf(sync_ipts);
1152 }else if (vdelta > 1.1)
1153 nb_frames = lrintf(vdelta);
1154 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1155 if (nb_frames == 0){
1158 fprintf(stderr, "*** drop!\n");
1159 }else if (nb_frames > 1) {
1160 nb_frames_dup += nb_frames - 1;
1162 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1165 ost->sync_opts= lrintf(sync_ipts);
1167 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1171 formatted_picture = in_picture;
1172 final_picture = formatted_picture;
1173 padding_src = formatted_picture;
1174 resampling_dst = &ost->pict_tmp;
1176 if ( ost->resample_height != ist->st->codec->height
1177 || ost->resample_width != ist->st->codec->width
1178 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1180 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1181 if(!ost->video_resample)
1185 #if !CONFIG_AVFILTER
1186 if (ost->video_resample) {
1188 final_picture = &ost->pict_tmp;
1189 if( ost->resample_height != ist->st->codec->height
1190 || ost->resample_width != ist->st->codec->width
1191 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1193 /* initialize a new scaler context */
1194 sws_freeContext(ost->img_resample_ctx);
1195 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1196 ost->img_resample_ctx = sws_getContext(
1197 ist->st->codec->width,
1198 ist->st->codec->height,
1199 ist->st->codec->pix_fmt,
1200 ost->st->codec->width,
1201 ost->st->codec->height,
1202 ost->st->codec->pix_fmt,
1203 sws_flags, NULL, NULL, NULL);
1204 if (ost->img_resample_ctx == NULL) {
1205 fprintf(stderr, "Cannot get resampling context\n");
1209 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1210 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1214 /* duplicates frame if needed */
1215 for(i=0;i<nb_frames;i++) {
1217 av_init_packet(&pkt);
1218 pkt.stream_index= ost->index;
1220 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1221 /* raw pictures are written as AVPicture structure to
1222 avoid any copies. We support temorarily the older
1224 AVFrame* old_frame = enc->coded_frame;
1225 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1226 pkt.data= (uint8_t *)final_picture;
1227 pkt.size= sizeof(AVPicture);
1228 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1229 pkt.flags |= AV_PKT_FLAG_KEY;
1231 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1232 enc->coded_frame = old_frame;
1234 AVFrame big_picture;
1236 big_picture= *final_picture;
1237 /* better than nothing: use input picture interlaced
1239 big_picture.interlaced_frame = in_picture->interlaced_frame;
1240 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1241 if(top_field_first == -1)
1242 big_picture.top_field_first = in_picture->top_field_first;
1244 big_picture.top_field_first = top_field_first;
1247 /* handles sameq here. This is not correct because it may
1248 not be a global option */
1249 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1251 big_picture.pict_type = 0;
1252 // big_picture.pts = AV_NOPTS_VALUE;
1253 big_picture.pts= ost->sync_opts;
1254 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1255 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1256 if (ost->forced_kf_index < ost->forced_kf_count &&
1257 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1258 big_picture.pict_type = FF_I_TYPE;
1259 ost->forced_kf_index++;
1261 ret = avcodec_encode_video(enc,
1262 bit_buffer, bit_buffer_size,
1265 fprintf(stderr, "Video encoding failed\n");
1270 pkt.data= bit_buffer;
1272 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1273 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1274 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1275 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1276 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1278 if(enc->coded_frame->key_frame)
1279 pkt.flags |= AV_PKT_FLAG_KEY;
1280 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1283 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1284 // enc->frame_number-1, ret, enc->pict_type);
1285 /* if two pass, output log */
1286 if (ost->logfile && enc->stats_out) {
1287 fprintf(ost->logfile, "%s", enc->stats_out);
1292 ost->frame_number++;
1296 static double psnr(double d){
1297 return -10.0*log(d)/log(10.0);
1300 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1303 AVCodecContext *enc;
1305 double ti1, bitrate, avg_bitrate;
1307 /* this is executed just the first time do_video_stats is called */
1309 vstats_file = fopen(vstats_filename, "w");
1316 enc = ost->st->codec;
1317 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1318 frame_number = ost->frame_number;
1319 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1320 if (enc->flags&CODEC_FLAG_PSNR)
1321 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1323 fprintf(vstats_file,"f_size= %6d ", frame_size);
1324 /* compute pts value */
1325 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1329 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1330 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1331 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1332 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1333 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1337 static void print_report(AVFormatContext **output_files,
1338 AVOutputStream **ost_table, int nb_ostreams,
1342 AVOutputStream *ost;
1343 AVFormatContext *oc;
1345 AVCodecContext *enc;
1346 int frame_number, vid, i;
1347 double bitrate, ti1, pts;
1348 static int64_t last_time = -1;
1349 static int qp_histogram[52];
1351 if (!is_last_report) {
1353 /* display the report every 0.5 seconds */
1354 cur_time = av_gettime();
1355 if (last_time == -1) {
1356 last_time = cur_time;
1359 if ((cur_time - last_time) < 500000)
1361 last_time = cur_time;
1365 oc = output_files[0];
1367 total_size = avio_size(oc->pb);
1368 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1369 total_size= avio_tell(oc->pb);
1374 for(i=0;i<nb_ostreams;i++) {
1376 enc = ost->st->codec;
1377 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1378 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1379 !ost->st->stream_copy ?
1380 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1382 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1383 float t = (av_gettime()-timer_start) / 1000000.0;
1385 frame_number = ost->frame_number;
1386 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1387 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1388 !ost->st->stream_copy ?
1389 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1391 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1394 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1395 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1398 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1400 if (enc->flags&CODEC_FLAG_PSNR){
1402 double error, error_sum=0;
1403 double scale, scale_sum=0;
1404 char type[3]= {'Y','U','V'};
1405 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1408 error= enc->error[j];
1409 scale= enc->width*enc->height*255.0*255.0*frame_number;
1411 error= enc->coded_frame->error[j];
1412 scale= enc->width*enc->height*255.0*255.0;
1417 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1423 /* compute min output value */
1424 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1425 if ((pts < ti1) && (pts > 0))
1431 if (verbose || is_last_report) {
1432 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1434 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1435 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1436 (double)total_size / 1024, ti1, bitrate);
1438 if (nb_frames_dup || nb_frames_drop)
1439 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1440 nb_frames_dup, nb_frames_drop);
1443 fprintf(stderr, "%s \r", buf);
1448 if (is_last_report && verbose >= 0){
1449 int64_t raw= audio_size + video_size + extra_size;
1450 fprintf(stderr, "\n");
1451 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1455 100.0*(total_size - raw)/raw
1460 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1461 static int output_packet(AVInputStream *ist, int ist_index,
1462 AVOutputStream **ost_table, int nb_ostreams,
1463 const AVPacket *pkt)
1465 AVFormatContext *os;
1466 AVOutputStream *ost;
1470 void *buffer_to_free;
1471 static unsigned int samples_size= 0;
1472 AVSubtitle subtitle, *subtitle_to_free;
1473 int64_t pkt_pts = AV_NOPTS_VALUE;
1475 int frame_available;
1479 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1481 if(ist->next_pts == AV_NOPTS_VALUE)
1482 ist->next_pts= ist->pts;
1486 av_init_packet(&avpkt);
1494 if(pkt->dts != AV_NOPTS_VALUE)
1495 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1496 if(pkt->pts != AV_NOPTS_VALUE)
1497 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1499 //while we have more to decode or while the decoder did output something on EOF
1500 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1501 uint8_t *data_buf, *decoded_data_buf;
1502 int data_size, decoded_data_size;
1504 ist->pts= ist->next_pts;
1506 if(avpkt.size && avpkt.size != pkt->size &&
1507 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1508 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1509 ist->showed_multi_packet_warning=1;
1512 /* decode the packet if needed */
1513 decoded_data_buf = NULL; /* fail safe */
1514 decoded_data_size= 0;
1515 data_buf = avpkt.data;
1516 data_size = avpkt.size;
1517 subtitle_to_free = NULL;
1518 if (ist->decoding_needed) {
1519 switch(ist->st->codec->codec_type) {
1520 case AVMEDIA_TYPE_AUDIO:{
1521 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1522 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1524 samples= av_malloc(samples_size);
1526 decoded_data_size= samples_size;
1527 /* XXX: could avoid copy if PCM 16 bits with same
1528 endianness as CPU */
1529 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1536 /* Some bug in mpeg audio decoder gives */
1537 /* decoded_data_size < 0, it seems they are overflows */
1538 if (decoded_data_size <= 0) {
1539 /* no audio frame */
1542 decoded_data_buf = (uint8_t *)samples;
1543 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1544 (ist->st->codec->sample_rate * ist->st->codec->channels);
1546 case AVMEDIA_TYPE_VIDEO:
1547 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1548 /* XXX: allocate picture correctly */
1549 avcodec_get_frame_defaults(&picture);
1550 avpkt.pts = pkt_pts;
1551 avpkt.dts = ist->pts;
1552 pkt_pts = AV_NOPTS_VALUE;
1554 ret = avcodec_decode_video2(ist->st->codec,
1555 &picture, &got_picture, &avpkt);
1556 ist->st->quality= picture.quality;
1560 /* no picture yet */
1561 goto discard_packet;
1563 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1564 if (ist->st->codec->time_base.num != 0) {
1565 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1566 ist->next_pts += ((int64_t)AV_TIME_BASE *
1567 ist->st->codec->time_base.num * ticks) /
1568 ist->st->codec->time_base.den;
1572 case AVMEDIA_TYPE_SUBTITLE:
1573 ret = avcodec_decode_subtitle2(ist->st->codec,
1574 &subtitle, &got_picture, &avpkt);
1578 goto discard_packet;
1580 subtitle_to_free = &subtitle;
1587 switch(ist->st->codec->codec_type) {
1588 case AVMEDIA_TYPE_AUDIO:
1589 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1590 ist->st->codec->sample_rate;
1592 case AVMEDIA_TYPE_VIDEO:
1593 if (ist->st->codec->time_base.num != 0) {
1594 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1595 ist->next_pts += ((int64_t)AV_TIME_BASE *
1596 ist->st->codec->time_base.num * ticks) /
1597 ist->st->codec->time_base.den;
1605 buffer_to_free = NULL;
1606 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1607 pre_process_video_frame(ist, (AVPicture *)&picture,
1612 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
1613 for(i=0;i<nb_ostreams;i++) {
1615 if (ost->input_video_filter && ost->source_index == ist_index) {
1617 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1618 else sar = ist->st->codec->sample_aspect_ratio;
1619 // add it to be filtered
1620 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1628 // preprocess audio (volume)
1629 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1630 if (audio_volume != 256) {
1633 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1634 int v = ((*volp) * audio_volume + 128) >> 8;
1635 if (v < -32768) v = -32768;
1636 if (v > 32767) v = 32767;
1642 /* frame rate emulation */
1644 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1645 int64_t now = av_gettime() - ist->start;
1649 /* if output time reached then transcode raw format,
1650 encode packets and output them */
1651 if (start_time == 0 || ist->pts >= start_time)
1652 for(i=0;i<nb_ostreams;i++) {
1656 if (ost->source_index == ist_index) {
1658 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1659 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1660 while (frame_available) {
1661 AVRational ist_pts_tb;
1662 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1663 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1665 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1667 os = output_files[ost->file_index];
1669 /* set the input output pts pairs */
1670 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1672 if (ost->encoding_needed) {
1673 av_assert0(ist->decoding_needed);
1674 switch(ost->st->codec->codec_type) {
1675 case AVMEDIA_TYPE_AUDIO:
1676 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1678 case AVMEDIA_TYPE_VIDEO:
1680 if (ost->picref->video)
1681 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1683 do_video_out(os, ost, ist, &picture, &frame_size);
1684 if (vstats_filename && frame_size)
1685 do_video_stats(os, ost, frame_size);
1687 case AVMEDIA_TYPE_SUBTITLE:
1688 do_subtitle_out(os, ost, ist, &subtitle,
1695 AVFrame avframe; //FIXME/XXX remove this
1697 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1699 av_init_packet(&opkt);
1701 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1704 /* no reencoding needed : output the packet directly */
1705 /* force the input stream PTS */
1707 avcodec_get_frame_defaults(&avframe);
1708 ost->st->codec->coded_frame= &avframe;
1709 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1711 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1712 audio_size += data_size;
1713 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1714 video_size += data_size;
1718 opkt.stream_index= ost->index;
1719 if(pkt->pts != AV_NOPTS_VALUE)
1720 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1722 opkt.pts= AV_NOPTS_VALUE;
1724 if (pkt->dts == AV_NOPTS_VALUE)
1725 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1727 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1728 opkt.dts -= ost_tb_start_time;
1730 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1731 opkt.flags= pkt->flags;
1733 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1734 if( ost->st->codec->codec_id != CODEC_ID_H264
1735 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1736 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1738 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1739 opkt.destruct= av_destruct_packet;
1741 opkt.data = data_buf;
1742 opkt.size = data_size;
1745 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1746 ost->st->codec->frame_number++;
1747 ost->frame_number++;
1748 av_free_packet(&opkt);
1752 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1753 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1755 avfilter_unref_buffer(ost->picref);
1761 av_free(buffer_to_free);
1762 /* XXX: allocate the subtitles in the codec ? */
1763 if (subtitle_to_free) {
1764 avsubtitle_free(subtitle_to_free);
1765 subtitle_to_free = NULL;
1772 for(i=0;i<nb_ostreams;i++) {
1774 if (ost->source_index == ist_index) {
1775 AVCodecContext *enc= ost->st->codec;
1776 os = output_files[ost->file_index];
1778 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1780 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1783 if (ost->encoding_needed) {
1787 av_init_packet(&pkt);
1788 pkt.stream_index= ost->index;
1790 switch(ost->st->codec->codec_type) {
1791 case AVMEDIA_TYPE_AUDIO:
1792 fifo_bytes = av_fifo_size(ost->fifo);
1794 /* encode any samples remaining in fifo */
1795 if (fifo_bytes > 0) {
1796 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1797 int fs_tmp = enc->frame_size;
1799 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1800 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1801 enc->frame_size = fifo_bytes / (osize * enc->channels);
1803 int frame_bytes = enc->frame_size*osize*enc->channels;
1804 if (allocated_audio_buf_size < frame_bytes)
1806 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1809 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1810 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1811 ost->st->time_base.num, enc->sample_rate);
1812 enc->frame_size = fs_tmp;
1815 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1818 fprintf(stderr, "Audio encoding failed\n");
1822 pkt.flags |= AV_PKT_FLAG_KEY;
1824 case AVMEDIA_TYPE_VIDEO:
1825 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1827 fprintf(stderr, "Video encoding failed\n");
1831 if(enc->coded_frame && enc->coded_frame->key_frame)
1832 pkt.flags |= AV_PKT_FLAG_KEY;
1833 if (ost->logfile && enc->stats_out) {
1834 fprintf(ost->logfile, "%s", enc->stats_out);
1843 pkt.data= bit_buffer;
1845 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1846 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1847 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1859 static void print_sdp(AVFormatContext **avc, int n)
1863 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1864 printf("SDP:\n%s\n", sdp);
1868 static int copy_chapters(int infile, int outfile)
1870 AVFormatContext *is = input_files[infile];
1871 AVFormatContext *os = output_files[outfile];
1874 for (i = 0; i < is->nb_chapters; i++) {
1875 AVChapter *in_ch = is->chapters[i], *out_ch;
1876 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1877 AV_TIME_BASE_Q, in_ch->time_base);
1878 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1879 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1882 if (in_ch->end < ts_off)
1884 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1887 out_ch = av_mallocz(sizeof(AVChapter));
1889 return AVERROR(ENOMEM);
1891 out_ch->id = in_ch->id;
1892 out_ch->time_base = in_ch->time_base;
1893 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1894 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1896 if (metadata_chapters_autocopy)
1897 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1900 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1902 return AVERROR(ENOMEM);
1903 os->chapters[os->nb_chapters - 1] = out_ch;
1908 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1909 AVCodecContext *avctx)
1915 for (p = kf; *p; p++)
1918 ost->forced_kf_count = n;
1919 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1920 if (!ost->forced_kf_pts) {
1921 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1924 for (i = 0; i < n; i++) {
1925 p = i ? strchr(p, ',') + 1 : kf;
1926 t = parse_time_or_die("force_key_frames", p, 1);
1927 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1932 * The following code is the main loop of the file converter
1934 static int transcode(AVFormatContext **output_files,
1935 int nb_output_files,
1936 AVFormatContext **input_files,
1938 AVStreamMap *stream_maps, int nb_stream_maps)
1940 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1941 AVFormatContext *is, *os;
1942 AVCodecContext *codec, *icodec;
1943 AVOutputStream *ost, **ost_table = NULL;
1944 AVInputStream *ist, **ist_table = NULL;
1945 AVInputFile *file_table;
1949 uint8_t no_packet[MAX_FILES]={0};
1950 int no_packet_count=0;
1952 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1956 /* input stream init */
1958 for(i=0;i<nb_input_files;i++) {
1959 is = input_files[i];
1960 file_table[i].ist_index = j;
1961 file_table[i].nb_streams = is->nb_streams;
1962 j += is->nb_streams;
1966 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1970 for(i=0;i<nb_istreams;i++) {
1971 ist = av_mallocz(sizeof(AVInputStream));
1977 for(i=0;i<nb_input_files;i++) {
1978 is = input_files[i];
1979 for(k=0;k<is->nb_streams;k++) {
1980 ist = ist_table[j++];
1981 ist->st = is->streams[k];
1982 ist->file_index = i;
1984 ist->discard = 1; /* the stream is discarded by default
1988 ist->start = av_gettime();
1993 /* output stream init */
1995 for(i=0;i<nb_output_files;i++) {
1996 os = output_files[i];
1997 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1998 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1999 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2000 ret = AVERROR(EINVAL);
2003 nb_ostreams += os->nb_streams;
2005 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2006 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2007 ret = AVERROR(EINVAL);
2011 /* Sanity check the mapping args -- do the input files & streams exist? */
2012 for(i=0;i<nb_stream_maps;i++) {
2013 int fi = stream_maps[i].file_index;
2014 int si = stream_maps[i].stream_index;
2016 if (fi < 0 || fi > nb_input_files - 1 ||
2017 si < 0 || si > file_table[fi].nb_streams - 1) {
2018 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2019 ret = AVERROR(EINVAL);
2022 fi = stream_maps[i].sync_file_index;
2023 si = stream_maps[i].sync_stream_index;
2024 if (fi < 0 || fi > nb_input_files - 1 ||
2025 si < 0 || si > file_table[fi].nb_streams - 1) {
2026 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2027 ret = AVERROR(EINVAL);
2032 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2036 for(k=0;k<nb_output_files;k++) {
2037 os = output_files[k];
2038 for(i=0;i<os->nb_streams;i++,n++) {
2040 ost = ost_table[n] = output_streams_for_file[k][i];
2041 ost->st = os->streams[i];
2042 if (nb_stream_maps > 0) {
2043 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2044 stream_maps[n].stream_index;
2046 /* Sanity check that the stream types match */
2047 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2048 int i= ost->file_index;
2049 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2050 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2051 stream_maps[n].file_index, stream_maps[n].stream_index,
2052 ost->file_index, ost->index);
2057 int best_nb_frames=-1;
2058 /* get corresponding input stream index : we select the first one with the right type */
2060 for(j=0;j<nb_istreams;j++) {
2065 AVFormatContext *f= input_files[ ist->file_index ];
2067 for(pi=0; pi<f->nb_programs; pi++){
2068 AVProgram *p= f->programs[pi];
2069 if(p->id == opt_programid)
2070 for(si=0; si<p->nb_stream_indexes; si++){
2071 if(f->streams[ p->stream_index[si] ] == ist->st)
2076 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2077 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2078 if(best_nb_frames < ist->st->codec_info_nb_frames){
2079 best_nb_frames= ist->st->codec_info_nb_frames;
2080 ost->source_index = j;
2087 if(! opt_programid) {
2088 /* try again and reuse existing stream */
2089 for(j=0;j<nb_istreams;j++) {
2091 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2092 && ist->st->discard != AVDISCARD_ALL) {
2093 ost->source_index = j;
2099 int i= ost->file_index;
2100 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2101 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2102 ost->file_index, ost->index);
2107 ist = ist_table[ost->source_index];
2109 ost->sync_ist = (nb_stream_maps > 0) ?
2110 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2111 stream_maps[n].sync_stream_index] : ist;
2115 /* for each output stream, we compute the right encoding parameters */
2116 for(i=0;i<nb_ostreams;i++) {
2118 os = output_files[ost->file_index];
2119 ist = ist_table[ost->source_index];
2121 codec = ost->st->codec;
2122 icodec = ist->st->codec;
2124 if (metadata_streams_autocopy)
2125 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2126 AV_METADATA_DONT_OVERWRITE);
2128 ost->st->disposition = ist->st->disposition;
2129 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2130 codec->chroma_sample_location = icodec->chroma_sample_location;
2132 if (ost->st->stream_copy) {
2133 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2135 if (extra_size > INT_MAX)
2138 /* if stream_copy is selected, no need to decode or encode */
2139 codec->codec_id = icodec->codec_id;
2140 codec->codec_type = icodec->codec_type;
2142 if(!codec->codec_tag){
2143 if( !os->oformat->codec_tag
2144 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2145 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2146 codec->codec_tag = icodec->codec_tag;
2149 codec->bit_rate = icodec->bit_rate;
2150 codec->rc_max_rate = icodec->rc_max_rate;
2151 codec->rc_buffer_size = icodec->rc_buffer_size;
2152 codec->extradata= av_mallocz(extra_size);
2153 if (!codec->extradata)
2155 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2156 codec->extradata_size= icodec->extradata_size;
2157 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2158 codec->time_base = icodec->time_base;
2159 codec->time_base.num *= icodec->ticks_per_frame;
2160 av_reduce(&codec->time_base.num, &codec->time_base.den,
2161 codec->time_base.num, codec->time_base.den, INT_MAX);
2163 codec->time_base = ist->st->time_base;
2164 switch(codec->codec_type) {
2165 case AVMEDIA_TYPE_AUDIO:
2166 if(audio_volume != 256) {
2167 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2170 codec->channel_layout = icodec->channel_layout;
2171 codec->sample_rate = icodec->sample_rate;
2172 codec->channels = icodec->channels;
2173 codec->frame_size = icodec->frame_size;
2174 codec->block_align= icodec->block_align;
2175 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2176 codec->block_align= 0;
2177 if(codec->codec_id == CODEC_ID_AC3)
2178 codec->block_align= 0;
2180 case AVMEDIA_TYPE_VIDEO:
2181 codec->pix_fmt = icodec->pix_fmt;
2182 codec->width = icodec->width;
2183 codec->height = icodec->height;
2184 codec->has_b_frames = icodec->has_b_frames;
2186 case AVMEDIA_TYPE_SUBTITLE:
2187 codec->width = icodec->width;
2188 codec->height = icodec->height;
2194 switch(codec->codec_type) {
2195 case AVMEDIA_TYPE_AUDIO:
2196 ost->fifo= av_fifo_alloc(1024);
2199 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2200 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2201 icodec->request_channels = codec->channels;
2202 ist->decoding_needed = 1;
2203 ost->encoding_needed = 1;
2204 ost->resample_sample_fmt = icodec->sample_fmt;
2205 ost->resample_sample_rate = icodec->sample_rate;
2206 ost->resample_channels = icodec->channels;
2208 case AVMEDIA_TYPE_VIDEO:
2209 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2210 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2213 ost->video_resample = (codec->width != icodec->width ||
2214 codec->height != icodec->height ||
2215 (codec->pix_fmt != icodec->pix_fmt));
2216 if (ost->video_resample) {
2217 #if !CONFIG_AVFILTER
2218 avcodec_get_frame_defaults(&ost->pict_tmp);
2219 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2220 codec->width, codec->height)) {
2221 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2224 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2225 ost->img_resample_ctx = sws_getContext(
2232 sws_flags, NULL, NULL, NULL);
2233 if (ost->img_resample_ctx == NULL) {
2234 fprintf(stderr, "Cannot get resampling context\n");
2238 ost->original_height = icodec->height;
2239 ost->original_width = icodec->width;
2241 codec->bits_per_raw_sample= 0;
2243 ost->resample_height = icodec->height;
2244 ost->resample_width = icodec->width;
2245 ost->resample_pix_fmt= icodec->pix_fmt;
2246 ost->encoding_needed = 1;
2247 ist->decoding_needed = 1;
2250 if (configure_filters(ist, ost)) {
2251 fprintf(stderr, "Error opening filters!\n");
2256 case AVMEDIA_TYPE_SUBTITLE:
2257 ost->encoding_needed = 1;
2258 ist->decoding_needed = 1;
2265 if (ost->encoding_needed &&
2266 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2267 char logfilename[1024];
2270 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2271 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2273 if (codec->flags & CODEC_FLAG_PASS1) {
2274 f = fopen(logfilename, "wb");
2276 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2282 size_t logbuffer_size;
2283 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2284 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2287 codec->stats_in = logbuffer;
2291 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2292 int size= codec->width * codec->height;
2293 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2298 bit_buffer = av_malloc(bit_buffer_size);
2300 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2302 ret = AVERROR(ENOMEM);
2306 /* open each encoder */
2307 for(i=0;i<nb_ostreams;i++) {
2309 if (ost->encoding_needed) {
2310 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2311 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2313 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2315 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2316 ost->st->codec->codec_id, ost->file_index, ost->index);
2317 ret = AVERROR(EINVAL);
2320 if (dec->subtitle_header) {
2321 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2322 if (!ost->st->codec->subtitle_header) {
2323 ret = AVERROR(ENOMEM);
2326 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2327 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2329 if (avcodec_open(ost->st->codec, codec) < 0) {
2330 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2331 ost->file_index, ost->index);
2332 ret = AVERROR(EINVAL);
2335 extra_size += ost->st->codec->extradata_size;
2339 /* open each decoder */
2340 for(i=0;i<nb_istreams;i++) {
2342 if (ist->decoding_needed) {
2343 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2345 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2347 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2348 ist->st->codec->codec_id, ist->file_index, ist->index);
2349 ret = AVERROR(EINVAL);
2352 if (avcodec_open(ist->st->codec, codec) < 0) {
2353 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2354 ist->file_index, ist->index);
2355 ret = AVERROR(EINVAL);
2358 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2359 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2364 for(i=0;i<nb_istreams;i++) {
2368 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2369 ist->next_pts = AV_NOPTS_VALUE;
2373 /* set meta data information from input file if required */
2374 for (i=0;i<nb_meta_data_maps;i++) {
2375 AVFormatContext *files[2];
2376 AVMetadata **meta[2];
2379 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2380 if ((index) < 0 || (index) >= (nb_elems)) {\
2381 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2383 ret = AVERROR(EINVAL);\
2387 int out_file_index = meta_data_maps[i][0].file;
2388 int in_file_index = meta_data_maps[i][1].file;
2389 if (in_file_index < 0 || out_file_index < 0)
2391 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2392 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2394 files[0] = output_files[out_file_index];
2395 files[1] = input_files[in_file_index];
2397 for (j = 0; j < 2; j++) {
2398 AVMetaDataMap *map = &meta_data_maps[i][j];
2400 switch (map->type) {
2402 meta[j] = &files[j]->metadata;
2405 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2406 meta[j] = &files[j]->streams[map->index]->metadata;
2409 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2410 meta[j] = &files[j]->chapters[map->index]->metadata;
2413 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2414 meta[j] = &files[j]->programs[map->index]->metadata;
2419 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2422 /* copy global metadata by default */
2423 if (metadata_global_autocopy) {
2425 for (i = 0; i < nb_output_files; i++)
2426 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2427 AV_METADATA_DONT_OVERWRITE);
2430 /* copy chapters according to chapter maps */
2431 for (i = 0; i < nb_chapter_maps; i++) {
2432 int infile = chapter_maps[i].in_file;
2433 int outfile = chapter_maps[i].out_file;
2435 if (infile < 0 || outfile < 0)
2437 if (infile >= nb_input_files) {
2438 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2439 ret = AVERROR(EINVAL);
2442 if (outfile >= nb_output_files) {
2443 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2444 ret = AVERROR(EINVAL);
2447 copy_chapters(infile, outfile);
2450 /* copy chapters from the first input file that has them*/
2451 if (!nb_chapter_maps)
2452 for (i = 0; i < nb_input_files; i++) {
2453 if (!input_files[i]->nb_chapters)
2456 for (j = 0; j < nb_output_files; j++)
2457 if ((ret = copy_chapters(i, j)) < 0)
2462 /* open files and write file headers */
2463 for(i=0;i<nb_output_files;i++) {
2464 os = output_files[i];
2465 if (av_write_header(os) < 0) {
2466 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2467 ret = AVERROR(EINVAL);
2470 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2476 /* dump the file output parameters - cannot be done before in case
2478 for(i=0;i<nb_output_files;i++) {
2479 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2482 /* dump the stream mapping */
2484 fprintf(stderr, "Stream mapping:\n");
2485 for(i=0;i<nb_ostreams;i++) {
2487 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2488 ist_table[ost->source_index]->file_index,
2489 ist_table[ost->source_index]->index,
2492 if (ost->sync_ist != ist_table[ost->source_index])
2493 fprintf(stderr, " [sync #%d.%d]",
2494 ost->sync_ist->file_index,
2495 ost->sync_ist->index);
2496 fprintf(stderr, "\n");
2501 fprintf(stderr, "%s\n", error);
2506 print_sdp(output_files, nb_output_files);
2511 fprintf(stderr, "Press [q] to stop encoding\n");
2512 url_set_interrupt_cb(decode_interrupt_cb);
2516 timer_start = av_gettime();
2518 for(; received_sigterm == 0;) {
2519 int file_index, ist_index;
2527 /* if 'q' pressed, exits */
2531 /* read_key() returns 0 on EOF */
2537 /* select the stream that we must read now by looking at the
2538 smallest output pts */
2540 for(i=0;i<nb_ostreams;i++) {
2543 os = output_files[ost->file_index];
2544 ist = ist_table[ost->source_index];
2545 if(ist->is_past_recording_time || no_packet[ist->file_index])
2547 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2548 ipts = (double)ist->pts;
2549 if (!file_table[ist->file_index].eof_reached){
2550 if(ipts < ipts_min) {
2552 if(input_sync ) file_index = ist->file_index;
2554 if(opts < opts_min) {
2556 if(!input_sync) file_index = ist->file_index;
2559 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2564 /* if none, if is finished */
2565 if (file_index < 0) {
2566 if(no_packet_count){
2568 memset(no_packet, 0, sizeof(no_packet));
2575 /* finish if limit size exhausted */
2576 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2579 /* read a frame from it and output it in the fifo */
2580 is = input_files[file_index];
2581 ret= av_read_frame(is, &pkt);
2582 if(ret == AVERROR(EAGAIN)){
2583 no_packet[file_index]=1;
2588 file_table[file_index].eof_reached = 1;
2596 memset(no_packet, 0, sizeof(no_packet));
2599 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2600 is->streams[pkt.stream_index]);
2602 /* the following test is needed in case new streams appear
2603 dynamically in stream : we ignore them */
2604 if (pkt.stream_index >= file_table[file_index].nb_streams)
2605 goto discard_packet;
2606 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2607 ist = ist_table[ist_index];
2609 goto discard_packet;
2611 if (pkt.dts != AV_NOPTS_VALUE)
2612 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2613 if (pkt.pts != AV_NOPTS_VALUE)
2614 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2616 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2617 && input_files_ts_scale[file_index][pkt.stream_index]){
2618 if(pkt.pts != AV_NOPTS_VALUE)
2619 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2620 if(pkt.dts != AV_NOPTS_VALUE)
2621 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2624 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2625 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2626 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2627 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2628 int64_t delta= pkt_dts - ist->next_pts;
2629 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2630 input_files_ts_offset[ist->file_index]-= delta;
2632 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2633 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2634 if(pkt.pts != AV_NOPTS_VALUE)
2635 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2639 /* finish if recording time exhausted */
2640 if (recording_time != INT64_MAX &&
2641 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2642 ist->is_past_recording_time = 1;
2643 goto discard_packet;
2646 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2647 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2650 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2651 ist->file_index, ist->index);
2654 av_free_packet(&pkt);
2659 av_free_packet(&pkt);
2661 /* dump report by using the output first video and audio streams */
2662 print_report(output_files, ost_table, nb_ostreams, 0);
2665 /* at the end of stream, we must flush the decoder buffers */
2666 for(i=0;i<nb_istreams;i++) {
2668 if (ist->decoding_needed) {
2669 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2675 /* write the trailer if needed and close file */
2676 for(i=0;i<nb_output_files;i++) {
2677 os = output_files[i];
2678 av_write_trailer(os);
2681 /* dump report by using the first video and audio streams */
2682 print_report(output_files, ost_table, nb_ostreams, 1);
2684 /* close each encoder */
2685 for(i=0;i<nb_ostreams;i++) {
2687 if (ost->encoding_needed) {
2688 av_freep(&ost->st->codec->stats_in);
2689 avcodec_close(ost->st->codec);
2692 avfilter_graph_free(&ost->graph);
2696 /* close each decoder */
2697 for(i=0;i<nb_istreams;i++) {
2699 if (ist->decoding_needed) {
2700 avcodec_close(ist->st->codec);
2708 av_freep(&bit_buffer);
2709 av_free(file_table);
2712 for(i=0;i<nb_istreams;i++) {
2719 for(i=0;i<nb_ostreams;i++) {
2722 if (ost->st->stream_copy)
2723 av_freep(&ost->st->codec->extradata);
2725 fclose(ost->logfile);
2726 ost->logfile = NULL;
2728 av_fifo_free(ost->fifo); /* works even if fifo is not
2729 initialized but set to zero */
2730 av_freep(&ost->st->codec->subtitle_header);
2731 av_free(ost->pict_tmp.data[0]);
2732 av_free(ost->forced_kf_pts);
2733 if (ost->video_resample)
2734 sws_freeContext(ost->img_resample_ctx);
2736 audio_resample_close(ost->resample);
2737 if (ost->reformat_ctx)
2738 av_audio_convert_free(ost->reformat_ctx);
2747 static void opt_format(const char *arg)
2749 last_asked_format = arg;
2752 static void opt_video_rc_override_string(const char *arg)
2754 video_rc_override_string = arg;
2757 static int opt_me_threshold(const char *opt, const char *arg)
2759 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2763 static int opt_verbose(const char *opt, const char *arg)
2765 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2769 static int opt_frame_rate(const char *opt, const char *arg)
2771 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2772 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2778 static int opt_bitrate(const char *opt, const char *arg)
2780 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2782 opt_default(opt, arg);
2784 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2785 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2790 static int opt_frame_crop(const char *opt, const char *arg)
2792 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2793 return AVERROR(EINVAL);
2796 static void opt_frame_size(const char *arg)
2798 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2799 fprintf(stderr, "Incorrect frame size\n");
2804 static int opt_pad(const char *opt, const char *arg) {
2805 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2809 static void opt_frame_pix_fmt(const char *arg)
2811 if (strcmp(arg, "list")) {
2812 frame_pix_fmt = av_get_pix_fmt(arg);
2813 if (frame_pix_fmt == PIX_FMT_NONE) {
2814 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2823 static void opt_frame_aspect_ratio(const char *arg)
2830 p = strchr(arg, ':');
2832 x = strtol(arg, &end, 10);
2834 y = strtol(end+1, &end, 10);
2836 ar = (double)x / (double)y;
2838 ar = strtod(arg, NULL);
2841 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2844 frame_aspect_ratio = ar;
2847 static int opt_metadata(const char *opt, const char *arg)
2849 char *mid= strchr(arg, '=');
2852 fprintf(stderr, "Missing =\n");
2857 av_metadata_set2(&metadata, arg, mid, 0);
2862 static void opt_qscale(const char *arg)
2864 video_qscale = atof(arg);
2865 if (video_qscale <= 0 ||
2866 video_qscale > 255) {
2867 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2872 static void opt_top_field_first(const char *arg)
2874 top_field_first= atoi(arg);
2877 static int opt_thread_count(const char *opt, const char *arg)
2879 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2882 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2887 static void opt_audio_sample_fmt(const char *arg)
2889 if (strcmp(arg, "list")) {
2890 audio_sample_fmt = av_get_sample_fmt(arg);
2891 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2892 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2896 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2901 static int opt_audio_rate(const char *opt, const char *arg)
2903 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2907 static int opt_audio_channels(const char *opt, const char *arg)
2909 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2913 static void opt_video_channel(const char *arg)
2915 video_channel = strtol(arg, NULL, 0);
2918 static void opt_video_standard(const char *arg)
2920 video_standard = av_strdup(arg);
2923 static void opt_codec(int *pstream_copy, char **pcodec_name,
2924 int codec_type, const char *arg)
2926 av_freep(pcodec_name);
2927 if (!strcmp(arg, "copy")) {
2930 *pcodec_name = av_strdup(arg);
2934 static void opt_audio_codec(const char *arg)
2936 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2939 static void opt_video_codec(const char *arg)
2941 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2944 static void opt_subtitle_codec(const char *arg)
2946 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2949 static int opt_codec_tag(const char *opt, const char *arg)
2952 uint32_t *codec_tag;
2954 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2955 !strcmp(opt, "vtag") ? &video_codec_tag :
2956 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2960 *codec_tag = strtol(arg, &tail, 0);
2962 *codec_tag = AV_RL32(arg);
2967 static void opt_map(const char *arg)
2972 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2973 m = &stream_maps[nb_stream_maps-1];
2975 m->file_index = strtol(arg, &p, 0);
2979 m->stream_index = strtol(p, &p, 0);
2982 m->sync_file_index = strtol(p, &p, 0);
2985 m->sync_stream_index = strtol(p, &p, 0);
2987 m->sync_file_index = m->file_index;
2988 m->sync_stream_index = m->stream_index;
2992 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3003 *index = strtol(++arg, endptr, 0);
3006 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3013 static void opt_map_metadata(const char *arg)
3015 AVMetaDataMap *m, *m1;
3018 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3019 &nb_meta_data_maps, nb_meta_data_maps + 1);
3021 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3022 m->file = strtol(arg, &p, 0);
3023 parse_meta_type(p, &m->type, &m->index, &p);
3027 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3028 m1->file = strtol(p, &p, 0);
3029 parse_meta_type(p, &m1->type, &m1->index, &p);
3031 if (m->type == 'g' || m1->type == 'g')
3032 metadata_global_autocopy = 0;
3033 if (m->type == 's' || m1->type == 's')
3034 metadata_streams_autocopy = 0;
3035 if (m->type == 'c' || m1->type == 'c')
3036 metadata_chapters_autocopy = 0;
3039 static void opt_map_meta_data(const char *arg)
3041 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3042 "Use -map_metadata instead.\n");
3043 opt_map_metadata(arg);
3046 static void opt_map_chapters(const char *arg)
3051 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3052 nb_chapter_maps + 1);
3053 c = &chapter_maps[nb_chapter_maps - 1];
3054 c->out_file = strtol(arg, &p, 0);
3058 c->in_file = strtol(p, &p, 0);
3061 static void opt_input_ts_scale(const char *arg)
3063 unsigned int stream;
3067 stream = strtol(arg, &p, 0);
3070 scale= strtod(p, &p);
3072 if(stream >= MAX_STREAMS)
3075 input_files_ts_scale[nb_input_files] = grow_array(input_files_ts_scale[nb_input_files], sizeof(*input_files_ts_scale[nb_input_files]), &nb_input_files_ts_scale[nb_input_files], stream + 1);
3076 input_files_ts_scale[nb_input_files][stream]= scale;
3079 static int opt_recording_time(const char *opt, const char *arg)
3081 recording_time = parse_time_or_die(opt, arg, 1);
3085 static int opt_start_time(const char *opt, const char *arg)
3087 start_time = parse_time_or_die(opt, arg, 1);
3091 static int opt_recording_timestamp(const char *opt, const char *arg)
3093 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3097 static int opt_input_ts_offset(const char *opt, const char *arg)
3099 input_ts_offset = parse_time_or_die(opt, arg, 1);
3103 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3105 const char *codec_string = encoder ? "encoder" : "decoder";
3109 return CODEC_ID_NONE;
3111 avcodec_find_encoder_by_name(name) :
3112 avcodec_find_decoder_by_name(name);
3114 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3117 if(codec->type != type) {
3118 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3121 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3122 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3123 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3124 "results.\nAdd '-strict experimental' if you want to use it.\n",
3125 codec_string, codec->name);
3127 avcodec_find_encoder(codec->id) :
3128 avcodec_find_decoder(codec->id);
3129 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3130 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3131 codec_string, codec->name);
3137 static void opt_input_file(const char *filename)
3139 AVFormatContext *ic;
3140 AVFormatParameters params, *ap = ¶ms;
3141 AVInputFormat *file_iformat = NULL;
3142 int err, i, ret, rfps, rfps_base;
3145 if (last_asked_format) {
3146 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3147 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3150 last_asked_format = NULL;
3153 if (!strcmp(filename, "-"))
3156 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3157 !strcmp(filename, "/dev/stdin");
3159 /* get default parameters from command line */
3160 ic = avformat_alloc_context();
3162 print_error(filename, AVERROR(ENOMEM));
3166 memset(ap, 0, sizeof(*ap));
3167 ap->prealloced_context = 1;
3168 ap->sample_rate = audio_sample_rate;
3169 ap->channels = audio_channels;
3170 ap->time_base.den = frame_rate.num;
3171 ap->time_base.num = frame_rate.den;
3172 ap->width = frame_width;
3173 ap->height = frame_height;
3174 ap->pix_fmt = frame_pix_fmt;
3175 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3176 ap->channel = video_channel;
3177 ap->standard = video_standard;
3179 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3181 ic->video_codec_id =
3182 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3183 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3184 ic->audio_codec_id =
3185 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3186 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3187 ic->subtitle_codec_id=
3188 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3189 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3190 ic->flags |= AVFMT_FLAG_NONBLOCK;
3192 /* open the input file with generic libav function */
3193 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3195 print_error(filename, err);
3201 for(i=0; i<ic->nb_streams; i++){
3202 ic->streams[i]->discard= AVDISCARD_ALL;
3204 for(i=0; i<ic->nb_programs; i++){
3205 AVProgram *p= ic->programs[i];
3206 if(p->id != opt_programid){
3207 p->discard = AVDISCARD_ALL;
3210 for(j=0; j<p->nb_stream_indexes; j++){
3211 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3216 fprintf(stderr, "Specified program id not found\n");
3222 ic->loop_input = loop_input;
3224 /* If not enough info to get the stream parameters, we decode the
3225 first frames to get it. (used in mpeg case for example) */
3226 ret = av_find_stream_info(ic);
3227 if (ret < 0 && verbose >= 0) {
3228 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3229 av_close_input_file(ic);
3233 timestamp = start_time;
3234 /* add the stream start time */
3235 if (ic->start_time != AV_NOPTS_VALUE)
3236 timestamp += ic->start_time;
3238 /* if seeking requested, we execute it */
3239 if (start_time != 0) {
3240 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3242 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3243 filename, (double)timestamp / AV_TIME_BASE);
3245 /* reset seek info */
3249 /* update the current parameters so that they match the one of the input stream */
3250 for(i=0;i<ic->nb_streams;i++) {
3251 AVStream *st = ic->streams[i];
3252 AVCodecContext *dec = st->codec;
3253 dec->thread_count = thread_count;
3254 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3255 switch (dec->codec_type) {
3256 case AVMEDIA_TYPE_AUDIO:
3257 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3258 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3259 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3260 channel_layout = dec->channel_layout;
3261 audio_channels = dec->channels;
3262 audio_sample_rate = dec->sample_rate;
3263 audio_sample_fmt = dec->sample_fmt;
3265 st->discard= AVDISCARD_ALL;
3266 /* Note that av_find_stream_info can add more streams, and we
3267 * currently have no chance of setting up lowres decoding
3268 * early enough for them. */
3270 audio_sample_rate >>= dec->lowres;
3272 case AVMEDIA_TYPE_VIDEO:
3273 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3274 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3275 frame_height = dec->height;
3276 frame_width = dec->width;
3277 if(ic->streams[i]->sample_aspect_ratio.num)
3278 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3280 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3281 frame_aspect_ratio *= (float) dec->width / dec->height;
3282 frame_pix_fmt = dec->pix_fmt;
3283 rfps = ic->streams[i]->r_frame_rate.num;
3284 rfps_base = ic->streams[i]->r_frame_rate.den;
3286 dec->flags |= CODEC_FLAG_EMU_EDGE;
3287 frame_height >>= dec->lowres;
3288 frame_width >>= dec->lowres;
3289 dec->height = frame_height;
3290 dec->width = frame_width;
3293 dec->debug |= FF_DEBUG_MV;
3295 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3298 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3299 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3301 (float)rfps / rfps_base, rfps, rfps_base);
3303 /* update the current frame rate to match the stream frame rate */
3304 frame_rate.num = rfps;
3305 frame_rate.den = rfps_base;
3308 st->discard= AVDISCARD_ALL;
3309 else if(video_discard)
3310 st->discard= video_discard;
3312 case AVMEDIA_TYPE_DATA:
3314 case AVMEDIA_TYPE_SUBTITLE:
3315 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3316 if(subtitle_disable)
3317 st->discard = AVDISCARD_ALL;
3319 case AVMEDIA_TYPE_ATTACHMENT:
3320 case AVMEDIA_TYPE_UNKNOWN:
3327 input_files[nb_input_files] = ic;
3328 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3329 /* dump the file content */
3331 av_dump_format(ic, nb_input_files, filename, 0);
3337 av_freep(&video_codec_name);
3338 av_freep(&audio_codec_name);
3339 av_freep(&subtitle_codec_name);
3342 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3343 int *has_subtitle_ptr)
3345 int has_video, has_audio, has_subtitle, i, j;
3346 AVFormatContext *ic;
3351 for(j=0;j<nb_input_files;j++) {
3352 ic = input_files[j];
3353 for(i=0;i<ic->nb_streams;i++) {
3354 AVCodecContext *enc = ic->streams[i]->codec;
3355 switch(enc->codec_type) {
3356 case AVMEDIA_TYPE_AUDIO:
3359 case AVMEDIA_TYPE_VIDEO:
3362 case AVMEDIA_TYPE_SUBTITLE:
3365 case AVMEDIA_TYPE_DATA:
3366 case AVMEDIA_TYPE_ATTACHMENT:
3367 case AVMEDIA_TYPE_UNKNOWN:
3374 *has_video_ptr = has_video;
3375 *has_audio_ptr = has_audio;
3376 *has_subtitle_ptr = has_subtitle;
3379 static void new_video_stream(AVFormatContext *oc, int file_idx)
3382 AVOutputStream *ost;
3383 AVCodecContext *video_enc;
3384 enum CodecID codec_id = CODEC_ID_NONE;
3385 AVCodec *codec= NULL;
3388 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3390 fprintf(stderr, "Could not alloc stream\n");
3393 ost = new_output_stream(oc, file_idx);
3395 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3396 if(!video_stream_copy){
3397 if (video_codec_name) {
3398 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3399 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3400 codec = avcodec_find_encoder_by_name(video_codec_name);
3401 output_codecs[nb_output_codecs-1] = codec;
3403 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3404 codec = avcodec_find_encoder(codec_id);
3407 if(frame_aspect_ratio > 0){
3408 i = vfilters ? strlen(vfilters) : 0;
3409 vfilters = av_realloc(vfilters, i+100);
3410 snprintf(vfilters+i, i+100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
3411 frame_aspect_ratio=0;
3414 ost->avfilter= vfilters;
3418 avcodec_get_context_defaults3(st->codec, codec);
3419 ost->bitstream_filters = video_bitstream_filters;
3420 video_bitstream_filters= NULL;
3422 st->codec->thread_count= thread_count;
3424 video_enc = st->codec;
3427 video_enc->codec_tag= video_codec_tag;
3429 if( (video_global_header&1)
3430 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3431 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3432 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3434 if(video_global_header&2){
3435 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3436 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3439 if (video_stream_copy) {
3440 st->stream_copy = 1;
3441 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3442 video_enc->sample_aspect_ratio =
3443 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3447 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3449 video_enc->codec_id = codec_id;
3450 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3452 if (codec && codec->supported_framerates && !force_fps)
3453 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3454 video_enc->time_base.den = fps.num;
3455 video_enc->time_base.num = fps.den;
3457 video_enc->width = frame_width;
3458 video_enc->height = frame_height;
3459 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3460 video_enc->pix_fmt = frame_pix_fmt;
3461 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3463 choose_pixel_fmt(st, codec);
3466 video_enc->gop_size = 0;
3467 if (video_qscale || same_quality) {
3468 video_enc->flags |= CODEC_FLAG_QSCALE;
3469 video_enc->global_quality=
3470 st->quality = FF_QP2LAMBDA * video_qscale;
3474 video_enc->intra_matrix = intra_matrix;
3476 video_enc->inter_matrix = inter_matrix;
3478 p= video_rc_override_string;
3481 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3483 fprintf(stderr, "error parsing rc_override\n");
3486 video_enc->rc_override=
3487 av_realloc(video_enc->rc_override,
3488 sizeof(RcOverride)*(i+1));
3489 video_enc->rc_override[i].start_frame= start;
3490 video_enc->rc_override[i].end_frame = end;
3492 video_enc->rc_override[i].qscale= q;
3493 video_enc->rc_override[i].quality_factor= 1.0;
3496 video_enc->rc_override[i].qscale= 0;
3497 video_enc->rc_override[i].quality_factor= -q/100.0;
3502 video_enc->rc_override_count=i;
3503 if (!video_enc->rc_initial_buffer_occupancy)
3504 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3505 video_enc->me_threshold= me_threshold;
3506 video_enc->intra_dc_precision= intra_dc_precision - 8;
3509 video_enc->flags|= CODEC_FLAG_PSNR;
3514 video_enc->flags |= CODEC_FLAG_PASS1;
3516 video_enc->flags |= CODEC_FLAG_PASS2;
3520 if (forced_key_frames)
3521 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3523 if (video_language) {
3524 av_metadata_set2(&st->metadata, "language", video_language, 0);
3525 av_freep(&video_language);
3528 /* reset some key parameters */
3530 av_freep(&video_codec_name);
3531 av_freep(&forced_key_frames);
3532 video_stream_copy = 0;
3533 frame_pix_fmt = PIX_FMT_NONE;
3536 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3539 AVOutputStream *ost;
3540 AVCodec *codec= NULL;
3541 AVCodecContext *audio_enc;
3542 enum CodecID codec_id = CODEC_ID_NONE;
3544 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3546 fprintf(stderr, "Could not alloc stream\n");
3549 ost = new_output_stream(oc, file_idx);
3551 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3552 if(!audio_stream_copy){
3553 if (audio_codec_name) {
3554 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3555 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3556 codec = avcodec_find_encoder_by_name(audio_codec_name);
3557 output_codecs[nb_output_codecs-1] = codec;
3559 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3560 codec = avcodec_find_encoder(codec_id);
3564 avcodec_get_context_defaults3(st->codec, codec);
3566 ost->bitstream_filters = audio_bitstream_filters;
3567 audio_bitstream_filters= NULL;
3569 st->codec->thread_count= thread_count;
3571 audio_enc = st->codec;
3572 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3575 audio_enc->codec_tag= audio_codec_tag;
3577 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3578 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3579 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3581 if (audio_stream_copy) {
3582 st->stream_copy = 1;
3583 audio_enc->channels = audio_channels;
3584 audio_enc->sample_rate = audio_sample_rate;
3586 audio_enc->codec_id = codec_id;
3587 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3589 if (audio_qscale > QSCALE_NONE) {
3590 audio_enc->flags |= CODEC_FLAG_QSCALE;
3591 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3593 audio_enc->channels = audio_channels;
3594 audio_enc->sample_fmt = audio_sample_fmt;
3595 audio_enc->sample_rate = audio_sample_rate;
3596 audio_enc->channel_layout = channel_layout;
3597 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3598 audio_enc->channel_layout = 0;
3599 choose_sample_fmt(st, codec);
3600 choose_sample_rate(st, codec);
3602 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3603 if (audio_language) {
3604 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3605 av_freep(&audio_language);
3608 /* reset some key parameters */
3610 av_freep(&audio_codec_name);
3611 audio_stream_copy = 0;
3614 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3617 AVOutputStream *ost;
3618 AVCodec *codec=NULL;
3619 AVCodecContext *subtitle_enc;
3620 enum CodecID codec_id = CODEC_ID_NONE;
3622 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3624 fprintf(stderr, "Could not alloc stream\n");
3627 ost = new_output_stream(oc, file_idx);
3628 subtitle_enc = st->codec;
3629 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3630 if(!subtitle_stream_copy){
3631 if (subtitle_codec_name) {
3632 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3633 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3634 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3636 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3637 codec = avcodec_find_encoder(codec_id);
3640 avcodec_get_context_defaults3(st->codec, codec);
3642 ost->bitstream_filters = subtitle_bitstream_filters;
3643 subtitle_bitstream_filters= NULL;
3645 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3647 if(subtitle_codec_tag)
3648 subtitle_enc->codec_tag= subtitle_codec_tag;
3650 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3651 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3652 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3654 if (subtitle_stream_copy) {
3655 st->stream_copy = 1;
3657 subtitle_enc->codec_id = codec_id;
3658 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3661 if (subtitle_language) {
3662 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3663 av_freep(&subtitle_language);
3666 subtitle_disable = 0;
3667 av_freep(&subtitle_codec_name);
3668 subtitle_stream_copy = 0;
3671 static int opt_new_stream(const char *opt, const char *arg)
3673 AVFormatContext *oc;
3674 int file_idx = nb_output_files - 1;
3675 if (nb_output_files <= 0) {
3676 fprintf(stderr, "At least one output file must be specified\n");
3679 oc = output_files[file_idx];
3681 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3682 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3683 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3688 /* arg format is "output-stream-index:streamid-value". */
3689 static int opt_streamid(const char *opt, const char *arg)
3695 strncpy(idx_str, arg, sizeof(idx_str));
3696 idx_str[sizeof(idx_str)-1] = '\0';
3697 p = strchr(idx_str, ':');
3700 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3705 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3706 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3707 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3711 static void opt_output_file(const char *filename)
3713 AVFormatContext *oc;
3714 int err, use_video, use_audio, use_subtitle;
3715 int input_has_video, input_has_audio, input_has_subtitle;
3716 AVFormatParameters params, *ap = ¶ms;
3717 AVOutputFormat *file_oformat;
3719 if (!strcmp(filename, "-"))
3722 oc = avformat_alloc_context();
3724 print_error(filename, AVERROR(ENOMEM));
3728 if (last_asked_format) {
3729 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3730 if (!file_oformat) {
3731 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3734 last_asked_format = NULL;
3736 file_oformat = av_guess_format(NULL, filename, NULL);
3737 if (!file_oformat) {
3738 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3744 oc->oformat = file_oformat;
3745 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3747 if (!strcmp(file_oformat->name, "ffm") &&
3748 av_strstart(filename, "http:", NULL)) {
3749 /* special case for files sent to ffserver: we get the stream
3750 parameters from ffserver */
3751 int err = read_ffserver_streams(oc, filename);
3753 print_error(filename, err);
3757 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3758 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3759 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3761 /* disable if no corresponding type found and at least one
3763 if (nb_input_files > 0) {
3764 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3765 &input_has_subtitle);
3766 if (!input_has_video)
3768 if (!input_has_audio)
3770 if (!input_has_subtitle)
3774 /* manual disable */
3775 if (audio_disable) use_audio = 0;
3776 if (video_disable) use_video = 0;
3777 if (subtitle_disable) use_subtitle = 0;
3779 if (use_video) new_video_stream(oc, nb_output_files);
3780 if (use_audio) new_audio_stream(oc, nb_output_files);
3781 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3783 oc->timestamp = recording_timestamp;
3785 av_metadata_copy(&oc->metadata, metadata, 0);
3786 av_metadata_free(&metadata);
3789 output_files[nb_output_files++] = oc;
3791 /* check filename in case of an image number is expected */
3792 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3793 if (!av_filename_number_test(oc->filename)) {
3794 print_error(oc->filename, AVERROR_NUMEXPECTED);
3799 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3800 /* test if it already exists to avoid loosing precious files */
3801 if (!file_overwrite &&
3802 (strchr(filename, ':') == NULL ||
3803 filename[1] == ':' ||
3804 av_strstart(filename, "file:", NULL))) {
3805 if (url_exist(filename)) {
3807 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3809 if (!read_yesno()) {
3810 fprintf(stderr, "Not overwriting - exiting\n");
3815 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3822 if ((err = avio_open(&oc->pb, filename, URL_WRONLY)) < 0) {
3823 print_error(filename, err);
3828 memset(ap, 0, sizeof(*ap));
3829 if (av_set_parameters(oc, ap) < 0) {
3830 fprintf(stderr, "%s: Invalid encoding parameters\n",
3835 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3836 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3837 oc->loop_output = loop_output;
3839 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3841 av_freep(&forced_key_frames);
3844 /* same option as mencoder */
3845 static void opt_pass(const char *pass_str)
3848 pass = atoi(pass_str);
3849 if (pass != 1 && pass != 2) {
3850 fprintf(stderr, "pass number can be only 1 or 2\n");
3856 static int64_t getutime(void)
3859 struct rusage rusage;
3861 getrusage(RUSAGE_SELF, &rusage);
3862 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3863 #elif HAVE_GETPROCESSTIMES
3865 FILETIME c, e, k, u;
3866 proc = GetCurrentProcess();
3867 GetProcessTimes(proc, &c, &e, &k, &u);
3868 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3870 return av_gettime();
3874 static int64_t getmaxrss(void)
3876 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3877 struct rusage rusage;
3878 getrusage(RUSAGE_SELF, &rusage);
3879 return (int64_t)rusage.ru_maxrss * 1024;
3880 #elif HAVE_GETPROCESSMEMORYINFO
3882 PROCESS_MEMORY_COUNTERS memcounters;
3883 proc = GetCurrentProcess();
3884 memcounters.cb = sizeof(memcounters);
3885 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3886 return memcounters.PeakPagefileUsage;
3892 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3895 const char *p = str;
3902 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3909 static void opt_inter_matrix(const char *arg)
3911 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3912 parse_matrix_coeffs(inter_matrix, arg);
3915 static void opt_intra_matrix(const char *arg)
3917 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3918 parse_matrix_coeffs(intra_matrix, arg);
3921 static void show_usage(void)
3923 printf("Hyper fast Audio and Video encoder\n");
3924 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3928 static void show_help(void)
3931 AVOutputFormat *oformat = NULL;
3933 av_log_set_callback(log_callback_help);
3935 show_help_options(options, "Main options:\n",
3936 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3937 show_help_options(options, "\nAdvanced options:\n",
3938 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3940 show_help_options(options, "\nVideo options:\n",
3941 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3943 show_help_options(options, "\nAdvanced Video options:\n",
3944 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3945 OPT_VIDEO | OPT_EXPERT);
3946 show_help_options(options, "\nAudio options:\n",
3947 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3949 show_help_options(options, "\nAdvanced Audio options:\n",
3950 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3951 OPT_AUDIO | OPT_EXPERT);
3952 show_help_options(options, "\nSubtitle options:\n",
3953 OPT_SUBTITLE | OPT_GRAB,
3955 show_help_options(options, "\nAudio/Video grab options:\n",
3959 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3962 /* individual codec options */
3964 while ((c = av_codec_next(c))) {
3965 if (c->priv_class) {
3966 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3971 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3974 /* individual muxer options */
3975 while ((oformat = av_oformat_next(oformat))) {
3976 if (oformat->priv_class) {
3977 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3982 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3985 static void opt_target(const char *arg)
3987 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3988 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3990 if(!strncmp(arg, "pal-", 4)) {
3993 } else if(!strncmp(arg, "ntsc-", 5)) {
3996 } else if(!strncmp(arg, "film-", 5)) {
4001 /* Calculate FR via float to avoid int overflow */
4002 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4005 } else if((fr == 29970) || (fr == 23976)) {
4008 /* Try to determine PAL/NTSC by peeking in the input files */
4009 if(nb_input_files) {
4011 for(j = 0; j < nb_input_files; j++) {
4012 for(i = 0; i < input_files[j]->nb_streams; i++) {
4013 AVCodecContext *c = input_files[j]->streams[i]->codec;
4014 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4016 fr = c->time_base.den * 1000 / c->time_base.num;
4020 } else if((fr == 29970) || (fr == 23976)) {
4030 if(verbose && norm != UNKNOWN)
4031 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4034 if(norm == UNKNOWN) {
4035 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4036 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4037 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4041 if(!strcmp(arg, "vcd")) {
4043 opt_video_codec("mpeg1video");
4044 opt_audio_codec("mp2");
4047 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4048 opt_frame_rate(NULL, frame_rates[norm]);
4049 opt_default("g", norm == PAL ? "15" : "18");
4051 opt_default("b", "1150000");
4052 opt_default("maxrate", "1150000");
4053 opt_default("minrate", "1150000");
4054 opt_default("bufsize", "327680"); // 40*1024*8;
4056 opt_default("ab", "224000");
4057 audio_sample_rate = 44100;
4060 opt_default("packetsize", "2324");
4061 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4063 /* We have to offset the PTS, so that it is consistent with the SCR.
4064 SCR starts at 36000, but the first two packs contain only padding
4065 and the first pack from the other stream, respectively, may also have
4066 been written before.
4067 So the real data starts at SCR 36000+3*1200. */
4068 mux_preload= (36000+3*1200) / 90000.0; //0.44
4069 } else if(!strcmp(arg, "svcd")) {
4071 opt_video_codec("mpeg2video");
4072 opt_audio_codec("mp2");
4075 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4076 opt_frame_rate(NULL, frame_rates[norm]);
4077 opt_default("g", norm == PAL ? "15" : "18");
4079 opt_default("b", "2040000");
4080 opt_default("maxrate", "2516000");
4081 opt_default("minrate", "0"); //1145000;
4082 opt_default("bufsize", "1835008"); //224*1024*8;
4083 opt_default("flags", "+scan_offset");
4086 opt_default("ab", "224000");
4087 audio_sample_rate = 44100;
4089 opt_default("packetsize", "2324");
4091 } else if(!strcmp(arg, "dvd")) {
4093 opt_video_codec("mpeg2video");
4094 opt_audio_codec("ac3");
4097 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4098 opt_frame_rate(NULL, frame_rates[norm]);
4099 opt_default("g", norm == PAL ? "15" : "18");
4101 opt_default("b", "6000000");
4102 opt_default("maxrate", "9000000");
4103 opt_default("minrate", "0"); //1500000;
4104 opt_default("bufsize", "1835008"); //224*1024*8;
4106 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4107 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4109 opt_default("ab", "448000");
4110 audio_sample_rate = 48000;
4112 } else if(!strncmp(arg, "dv", 2)) {
4116 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4117 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4118 (norm == PAL ? "yuv420p" : "yuv411p"));
4119 opt_frame_rate(NULL, frame_rates[norm]);
4121 audio_sample_rate = 48000;
4125 fprintf(stderr, "Unknown target: %s\n", arg);
4130 static void opt_vstats_file (const char *arg)
4132 av_free (vstats_filename);
4133 vstats_filename=av_strdup (arg);
4136 static void opt_vstats (void)
4139 time_t today2 = time(NULL);
4140 struct tm *today = localtime(&today2);
4142 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4144 opt_vstats_file(filename);
4147 static int opt_bsf(const char *opt, const char *arg)
4149 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4150 AVBitStreamFilterContext **bsfp;
4153 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4157 bsfp= *opt == 'v' ? &video_bitstream_filters :
4158 *opt == 'a' ? &audio_bitstream_filters :
4159 &subtitle_bitstream_filters;
4161 bsfp= &(*bsfp)->next;
4168 static int opt_preset(const char *opt, const char *arg)
4171 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4172 char *codec_name = *opt == 'v' ? video_codec_name :
4173 *opt == 'a' ? audio_codec_name :
4174 subtitle_codec_name;
4176 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4177 fprintf(stderr, "File for preset '%s' not found\n", arg);
4182 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4183 if(line[0] == '#' && !e)
4185 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4187 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4190 if(!strcmp(tmp, "acodec")){
4191 opt_audio_codec(tmp2);
4192 }else if(!strcmp(tmp, "vcodec")){
4193 opt_video_codec(tmp2);
4194 }else if(!strcmp(tmp, "scodec")){
4195 opt_subtitle_codec(tmp2);
4196 }else if(opt_default(tmp, tmp2) < 0){
4197 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4207 static const OptionDef options[] = {
4209 #include "cmdutils_common_opts.h"
4210 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4211 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4212 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4213 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4214 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4215 "outfile[,metadata]:infile[,metadata]" },
4216 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4217 "outfile[,metadata]:infile[,metadata]" },
4218 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4219 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4220 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4221 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4222 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4223 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4224 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4225 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4226 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4227 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4228 "add timings for benchmarking" },
4229 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4230 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4231 "dump each input packet" },
4232 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4233 "when dumping packets, also dump the payload" },
4234 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4235 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4236 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4237 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4238 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4239 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4240 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4241 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4242 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4243 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4244 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4245 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4246 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4247 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4248 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4249 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4250 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4253 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4254 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4255 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4256 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4257 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4258 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4259 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
4260 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4261 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4262 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4263 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4264 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4265 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4266 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4267 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4268 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4269 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4270 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4271 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4272 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4273 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4274 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4275 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4276 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4277 "use same video quality as source (implies VBR)" },
4278 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4279 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4280 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4281 "deinterlace pictures" },
4282 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4283 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4284 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4286 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4288 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4289 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4290 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4291 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4292 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4293 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4294 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4295 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4296 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4297 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4298 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4301 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4302 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4303 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4304 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4305 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4306 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4307 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4308 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4309 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4310 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4311 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4312 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
4314 /* subtitle options */
4315 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4316 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4317 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4318 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4319 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4322 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4323 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4324 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4327 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4328 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4330 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4331 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4332 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4334 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4335 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4336 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4337 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4339 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4343 int main(int argc, char **argv)
4347 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4349 avcodec_register_all();
4351 avdevice_register_all();
4354 avfilter_register_all();
4359 if(isatty(STDIN_FILENO))
4360 url_set_interrupt_cb(decode_interrupt_cb);
4368 parse_options(argc, argv, options, opt_output_file);
4370 if(nb_output_files <= 0 && nb_input_files == 0) {
4372 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4376 /* file converter / grab */
4377 if (nb_output_files <= 0) {
4378 fprintf(stderr, "At least one output file must be specified\n");
4382 if (nb_input_files == 0) {
4383 fprintf(stderr, "At least one input file must be specified\n");
4388 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4389 stream_maps, nb_stream_maps) < 0)
4391 ti = getutime() - ti;
4393 int maxrss = getmaxrss() / 1024;
4394 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4397 return ffmpeg_exit(0);