3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/pixdesc.h"
44 #include "libavutil/avstring.h"
45 #include "libavutil/libm.h"
46 #include "libavformat/os_support.h"
49 # include "libavfilter/avfilter.h"
50 # include "libavfilter/avfiltergraph.h"
51 # include "libavfilter/vsrc_buffer.h"
54 #if HAVE_SYS_RESOURCE_H
55 #include <sys/types.h>
57 #include <sys/resource.h>
58 #elif HAVE_GETPROCESSTIMES
61 #if HAVE_GETPROCESSMEMORYINFO
67 #include <sys/select.h>
74 #include "libavutil/avassert.h"
76 const char program_name[] = "ffmpeg";
77 const int program_birth_year = 2000;
79 /* select an input stream for an output stream */
80 typedef struct AVStreamMap {
84 int sync_stream_index;
88 * select an input file for an output file
90 typedef struct AVMetaDataMap {
91 int file; //< file index
92 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
93 int index; //< stream/chapter/program number
96 typedef struct AVChapterMap {
101 static const OptionDef options[];
103 #define MAX_FILES 100
104 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
106 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
108 static const char *last_asked_format = NULL;
109 static int64_t input_files_ts_offset[MAX_FILES];
110 static double *input_files_ts_scale[MAX_FILES] = {NULL};
111 static AVCodec **input_codecs = NULL;
112 static int nb_input_codecs = 0;
113 static int nb_input_files_ts_scale[MAX_FILES] = {0};
115 static AVFormatContext *output_files[MAX_FILES];
116 static AVDictionary *output_opts[MAX_FILES];
117 static int nb_output_files = 0;
119 static AVStreamMap *stream_maps = NULL;
120 static int nb_stream_maps;
122 /* first item specifies output metadata, second is input */
123 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
124 static int nb_meta_data_maps;
125 static int metadata_global_autocopy = 1;
126 static int metadata_streams_autocopy = 1;
127 static int metadata_chapters_autocopy = 1;
129 static AVChapterMap *chapter_maps = NULL;
130 static int nb_chapter_maps;
132 /* indexed by output file stream index */
133 static int *streamid_map = NULL;
134 static int nb_streamid_map = 0;
136 static int frame_width = 0;
137 static int frame_height = 0;
138 static float frame_aspect_ratio = 0;
139 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
140 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
141 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
142 static AVRational frame_rate;
143 static float video_qscale = 0;
144 static uint16_t *intra_matrix = NULL;
145 static uint16_t *inter_matrix = NULL;
146 static const char *video_rc_override_string=NULL;
147 static int video_disable = 0;
148 static int video_discard = 0;
149 static char *video_codec_name = NULL;
150 static unsigned int video_codec_tag = 0;
151 static char *video_language = NULL;
152 static int same_quality = 0;
153 static int do_deinterlace = 0;
154 static int top_field_first = -1;
155 static int me_threshold = 0;
156 static int intra_dc_precision = 8;
157 static int loop_input = 0;
158 static int loop_output = AVFMT_NOOUTPUTLOOP;
159 static int qp_hist = 0;
161 static char *vfilters = NULL;
164 static int intra_only = 0;
165 static int audio_sample_rate = 0;
166 static int64_t channel_layout = 0;
167 #define QSCALE_NONE -99999
168 static float audio_qscale = QSCALE_NONE;
169 static int audio_disable = 0;
170 static int audio_channels = 0;
171 static char *audio_codec_name = NULL;
172 static unsigned int audio_codec_tag = 0;
173 static char *audio_language = NULL;
175 static int subtitle_disable = 0;
176 static char *subtitle_codec_name = NULL;
177 static char *subtitle_language = NULL;
178 static unsigned int subtitle_codec_tag = 0;
180 static int data_disable = 0;
181 static char *data_codec_name = NULL;
182 static unsigned int data_codec_tag = 0;
184 static float mux_preload= 0.5;
185 static float mux_max_delay= 0.7;
187 static int64_t recording_time = INT64_MAX;
188 static int64_t start_time = 0;
189 static int64_t recording_timestamp = 0;
190 static int64_t input_ts_offset = 0;
191 static int file_overwrite = 0;
192 static AVDictionary *metadata;
193 static int do_benchmark = 0;
194 static int do_hex_dump = 0;
195 static int do_pkt_dump = 0;
196 static int do_psnr = 0;
197 static int do_pass = 0;
198 static char *pass_logfilename_prefix = NULL;
199 static int audio_stream_copy = 0;
200 static int video_stream_copy = 0;
201 static int subtitle_stream_copy = 0;
202 static int data_stream_copy = 0;
203 static int video_sync_method= -1;
204 static int audio_sync_method= 0;
205 static float audio_drift_threshold= 0.1;
206 static int copy_ts= 0;
208 static int opt_shortest = 0;
209 static char *vstats_filename;
210 static FILE *vstats_file;
211 static int opt_programid = 0;
212 static int copy_initial_nonkeyframes = 0;
214 static int rate_emu = 0;
216 static int audio_volume = 256;
218 static int exit_on_error = 0;
219 static int using_stdin = 0;
220 static int verbose = 1;
221 static int thread_count= 1;
222 static int64_t video_size = 0;
223 static int64_t audio_size = 0;
224 static int64_t extra_size = 0;
225 static int nb_frames_dup = 0;
226 static int nb_frames_drop = 0;
227 static int input_sync;
228 static uint64_t limit_filesize = 0;
229 static int force_fps = 0;
230 static char *forced_key_frames = NULL;
232 static float dts_delta_threshold = 10;
234 static int64_t timer_start;
236 static uint8_t *audio_buf;
237 static uint8_t *audio_out;
238 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
240 static short *samples;
242 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
243 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
244 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
246 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
248 struct AVInputStream;
250 typedef struct AVOutputStream {
251 int file_index; /* file index */
252 int index; /* stream index in the output file */
253 int source_index; /* AVInputStream index */
254 AVStream *st; /* stream in the output file */
255 int encoding_needed; /* true if encoding needed for this stream */
257 /* input pts and corresponding output pts
259 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
260 struct AVInputStream *sync_ist; /* input stream to sync against */
261 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
262 AVBitStreamFilterContext *bitstream_filters;
267 AVFrame pict_tmp; /* temporary image for resampling */
268 struct SwsContext *img_resample_ctx; /* for image resampling */
271 int resample_pix_fmt;
272 AVRational frame_rate;
274 float frame_aspect_ratio;
276 /* forced key frames */
277 int64_t *forced_kf_pts;
283 ReSampleContext *resample; /* for audio resampling */
284 int resample_sample_fmt;
285 int resample_channels;
286 int resample_sample_rate;
288 AVAudioConvert *reformat_ctx;
289 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
293 AVFilterContext *output_video_filter;
294 AVFilterContext *input_video_filter;
295 AVFilterBufferRef *picref;
297 AVFilterGraph *graph;
303 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
304 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
306 typedef struct AVInputStream {
309 int discard; /* true if stream data should be discarded */
310 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
311 int64_t sample_index; /* current sample */
313 int64_t start; /* time when read started */
314 int64_t next_pts; /* synthetic pts for cases where pkt.pts
316 int64_t pts; /* current pts */
317 PtsCorrectionContext pts_ctx;
318 int is_start; /* is 1 at the start and after a discontinuity */
319 int showed_multi_packet_warning;
320 int is_past_recording_time;
322 AVFrame *filter_frame;
323 int has_filter_frame;
327 typedef struct AVInputFile {
328 AVFormatContext *ctx;
329 int eof_reached; /* true if eof reached */
330 int ist_index; /* index of first stream in ist_table */
331 int buffer_size; /* current total buffer size */
332 int nb_streams; /* nb streams we are aware of */
335 static AVInputStream *input_streams = NULL;
336 static int nb_input_streams = 0;
337 static AVInputFile *input_files = NULL;
338 static int nb_input_files = 0;
342 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
344 AVFilterContext *last_filter, *filter;
345 /** filter graph containing all filters including input & output */
346 AVCodecContext *codec = ost->st->codec;
347 AVCodecContext *icodec = ist->st->codec;
348 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
349 AVRational sample_aspect_ratio;
353 ost->graph = avfilter_graph_alloc();
355 if (ist->st->sample_aspect_ratio.num){
356 sample_aspect_ratio = ist->st->sample_aspect_ratio;
358 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
360 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
361 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
362 sample_aspect_ratio.num, sample_aspect_ratio.den);
364 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
365 "src", args, NULL, ost->graph);
368 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
369 "out", NULL, &ffsink_ctx, ost->graph);
372 last_filter = ost->input_video_filter;
374 if (codec->width != icodec->width || codec->height != icodec->height) {
375 snprintf(args, 255, "%d:%d:flags=0x%X",
379 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
380 NULL, args, NULL, ost->graph)) < 0)
382 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
384 last_filter = filter;
387 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
388 ost->graph->scale_sws_opts = av_strdup(args);
391 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
392 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
394 outputs->name = av_strdup("in");
395 outputs->filter_ctx = last_filter;
396 outputs->pad_idx = 0;
397 outputs->next = NULL;
399 inputs->name = av_strdup("out");
400 inputs->filter_ctx = ost->output_video_filter;
404 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
406 av_freep(&ost->avfilter);
408 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
412 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
415 codec->width = ost->output_video_filter->inputs[0]->w;
416 codec->height = ost->output_video_filter->inputs[0]->h;
417 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
418 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
419 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
420 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
424 #endif /* CONFIG_AVFILTER */
426 static void term_exit(void)
428 av_log(NULL, AV_LOG_QUIET, "");
431 static volatile int received_sigterm = 0;
432 static volatile int received_nb_signals = 0;
435 sigterm_handler(int sig)
437 received_sigterm = sig;
438 received_nb_signals++;
442 static void term_init(void)
444 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
445 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
447 signal(SIGXCPU, sigterm_handler);
451 static int decode_interrupt_cb(void)
453 return received_nb_signals > 1;
456 static int ffmpeg_exit(int ret)
461 for(i=0;i<nb_output_files;i++) {
462 AVFormatContext *s = output_files[i];
463 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
465 avformat_free_context(s);
466 av_free(output_streams_for_file[i]);
467 av_dict_free(&output_opts[i]);
469 for(i=0;i<nb_input_files;i++) {
470 av_close_input_file(input_files[i].ctx);
471 av_free(input_files_ts_scale[i]);
474 av_free(intra_matrix);
475 av_free(inter_matrix);
479 av_free(vstats_filename);
481 av_free(streamid_map);
482 av_free(input_codecs);
483 av_free(stream_maps);
484 av_free(meta_data_maps);
486 av_freep(&input_streams);
487 av_freep(&input_files);
489 av_free(video_codec_name);
490 av_free(audio_codec_name);
491 av_free(subtitle_codec_name);
492 av_free(data_codec_name);
497 allocated_audio_buf_size= allocated_audio_out_size= 0;
504 if (received_sigterm) {
506 "Received signal %d: terminating.\n",
507 (int) received_sigterm);
511 exit(ret); /* not all OS-es handle main() return value */
515 static void assert_avoptions(AVDictionary *m)
517 AVDictionaryEntry *t;
518 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
519 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
524 /* similar to ff_dynarray_add() and av_fast_realloc() */
525 static void *grow_array(void *array, int elem_size, int *size, int new_size)
527 if (new_size >= INT_MAX / elem_size) {
528 fprintf(stderr, "Array too big.\n");
531 if (*size < new_size) {
532 uint8_t *tmp = av_realloc(array, new_size*elem_size);
534 fprintf(stderr, "Could not alloc buffer.\n");
537 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
544 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
546 if(codec && codec->sample_fmts){
547 const enum AVSampleFormat *p= codec->sample_fmts;
549 if(*p == st->codec->sample_fmt)
553 av_log(NULL, AV_LOG_WARNING,
554 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
555 av_get_sample_fmt_name(st->codec->sample_fmt),
557 av_get_sample_fmt_name(codec->sample_fmts[0]));
558 st->codec->sample_fmt = codec->sample_fmts[0];
564 * Update the requested input sample format based on the output sample format.
565 * This is currently only used to request float output from decoders which
566 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
567 * Ideally this will be removed in the future when decoders do not do format
568 * conversion and only output in their native format.
570 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
573 /* if sample formats match or a decoder sample format has already been
574 requested, just return */
575 if (enc->sample_fmt == dec->sample_fmt ||
576 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
579 /* if decoder supports more than one output format */
580 if (dec_codec && dec_codec->sample_fmts &&
581 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
582 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
583 const enum AVSampleFormat *p;
584 int min_dec = -1, min_inc = -1;
586 /* find a matching sample format in the encoder */
587 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
588 if (*p == enc->sample_fmt) {
589 dec->request_sample_fmt = *p;
591 } else if (*p > enc->sample_fmt) {
592 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
594 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
597 /* if none match, provide the one that matches quality closest */
598 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
599 enc->sample_fmt - min_dec;
603 static void choose_sample_rate(AVStream *st, AVCodec *codec)
605 if(codec && codec->supported_samplerates){
606 const int *p= codec->supported_samplerates;
608 int best_dist=INT_MAX;
610 int dist= abs(st->codec->sample_rate - *p);
611 if(dist < best_dist){
617 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
619 st->codec->sample_rate= best;
623 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
625 if(codec && codec->pix_fmts){
626 const enum PixelFormat *p= codec->pix_fmts;
627 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
628 if(st->codec->codec_id==CODEC_ID_MJPEG){
629 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
630 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
631 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};
635 if(*p == st->codec->pix_fmt)
639 if(st->codec->pix_fmt != PIX_FMT_NONE)
640 av_log(NULL, AV_LOG_WARNING,
641 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
642 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
644 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
645 st->codec->pix_fmt = codec->pix_fmts[0];
650 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
652 int idx = oc->nb_streams - 1;
655 output_streams_for_file[file_idx] =
656 grow_array(output_streams_for_file[file_idx],
657 sizeof(*output_streams_for_file[file_idx]),
658 &nb_output_streams_for_file[file_idx],
660 ost = output_streams_for_file[file_idx][idx] =
661 av_mallocz(sizeof(AVOutputStream));
663 fprintf(stderr, "Could not alloc output stream\n");
666 ost->file_index = file_idx;
669 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
673 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
676 AVFormatContext *ic = NULL;
679 err = avformat_open_input(&ic, filename, NULL, NULL);
682 /* copy stream format */
684 s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
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));
695 st->codec = avcodec_alloc_context();
697 print_error(filename, AVERROR(ENOMEM));
700 avcodec_copy_context(st->codec, ic->streams[i]->codec);
703 codec = avcodec_find_encoder(st->codec->codec_id);
704 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
705 if (audio_stream_copy) {
708 choose_sample_fmt(st, codec);
709 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
710 if (video_stream_copy) {
713 choose_pixel_fmt(st, codec);
716 if(st->codec->flags & CODEC_FLAG_BITEXACT)
719 new_output_stream(s, nb_output_files);
723 s->timestamp = av_gettime();
725 av_close_input_file(ic);
730 get_sync_ipts(const AVOutputStream *ost)
732 const AVInputStream *ist = ost->sync_ist;
733 return (double)(ist->pts - start_time)/AV_TIME_BASE;
736 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
740 AVPacket new_pkt= *pkt;
741 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
742 &new_pkt.data, &new_pkt.size,
743 pkt->data, pkt->size,
744 pkt->flags & AV_PKT_FLAG_KEY);
747 new_pkt.destruct= av_destruct_packet;
749 fprintf(stderr, "%s failed for stream %d, codec %s",
750 bsfc->filter->name, pkt->stream_index,
751 avctx->codec ? avctx->codec->name : "copy");
761 ret= av_interleaved_write_frame(s, pkt);
763 print_error("av_interleaved_write_frame()", ret);
768 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
770 static void do_audio_out(AVFormatContext *s,
773 unsigned char *buf, int size)
776 int64_t audio_out_size, audio_buf_size;
777 int64_t allocated_for_size= size;
779 int size_out, frame_bytes, ret, resample_changed;
780 AVCodecContext *enc= ost->st->codec;
781 AVCodecContext *dec= ist->st->codec;
782 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
783 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
784 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
787 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
788 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
789 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
790 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
791 audio_buf_size*= osize*enc->channels;
793 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
794 if(coded_bps > 8*osize)
795 audio_out_size= audio_out_size * coded_bps / (8*osize);
796 audio_out_size += FF_MIN_BUFFER_SIZE;
798 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
799 fprintf(stderr, "Buffer sizes too large\n");
803 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
804 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
805 if (!audio_buf || !audio_out){
806 fprintf(stderr, "Out of memory in do_audio_out\n");
810 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
811 ost->audio_resample = 1;
813 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
814 ost->resample_channels != dec->channels ||
815 ost->resample_sample_rate != dec->sample_rate;
817 if ((ost->audio_resample && !ost->resample) || resample_changed) {
818 if (resample_changed) {
819 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",
820 ist->file_index, ist->st->index,
821 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
822 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
823 ost->resample_sample_fmt = dec->sample_fmt;
824 ost->resample_channels = dec->channels;
825 ost->resample_sample_rate = dec->sample_rate;
827 audio_resample_close(ost->resample);
829 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
830 if (audio_sync_method <= 1 &&
831 ost->resample_sample_fmt == enc->sample_fmt &&
832 ost->resample_channels == enc->channels &&
833 ost->resample_sample_rate == enc->sample_rate) {
834 ost->resample = NULL;
835 ost->audio_resample = 0;
836 } else if (ost->audio_resample) {
837 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
838 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
839 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
840 enc->sample_rate, dec->sample_rate,
841 enc->sample_fmt, dec->sample_fmt,
843 if (!ost->resample) {
844 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
845 dec->channels, dec->sample_rate,
846 enc->channels, enc->sample_rate);
852 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
853 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
854 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
855 if (ost->reformat_ctx)
856 av_audio_convert_free(ost->reformat_ctx);
857 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
858 dec->sample_fmt, 1, NULL, 0);
859 if (!ost->reformat_ctx) {
860 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
861 av_get_sample_fmt_name(dec->sample_fmt),
862 av_get_sample_fmt_name(enc->sample_fmt));
865 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
868 if(audio_sync_method){
869 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
870 - av_fifo_size(ost->fifo)/(enc->channels * 2);
871 double idelta= delta*dec->sample_rate / enc->sample_rate;
872 int byte_delta= ((int)idelta)*2*dec->channels;
874 //FIXME resample delay
875 if(fabs(delta) > 50){
876 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
878 byte_delta= FFMAX(byte_delta, -size);
882 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
887 static uint8_t *input_tmp= NULL;
888 input_tmp= av_realloc(input_tmp, byte_delta + size);
890 if(byte_delta > allocated_for_size - size){
891 allocated_for_size= byte_delta + (int64_t)size;
896 memset(input_tmp, 0, byte_delta);
897 memcpy(input_tmp + byte_delta, buf, size);
901 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
903 }else if(audio_sync_method>1){
904 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
905 av_assert0(ost->audio_resample);
907 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
908 // 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));
909 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
913 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
914 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
916 if (ost->audio_resample) {
918 size_out = audio_resample(ost->resample,
919 (short *)buftmp, (short *)buf,
920 size / (dec->channels * isize));
921 size_out = size_out * enc->channels * osize;
927 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
928 const void *ibuf[6]= {buftmp};
929 void *obuf[6]= {audio_buf};
930 int istride[6]= {isize};
931 int ostride[6]= {osize};
932 int len= size_out/istride[0];
933 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
934 printf("av_audio_convert() failed\n");
940 size_out = len*osize;
943 /* now encode as many frames as possible */
944 if (enc->frame_size > 1) {
945 /* output resampled raw samples */
946 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
947 fprintf(stderr, "av_fifo_realloc2() failed\n");
950 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
952 frame_bytes = enc->frame_size * osize * enc->channels;
954 while (av_fifo_size(ost->fifo) >= frame_bytes) {
956 av_init_packet(&pkt);
958 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
960 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
962 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
965 fprintf(stderr, "Audio encoding failed\n");
969 pkt.stream_index= ost->index;
972 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
973 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
974 pkt.flags |= AV_PKT_FLAG_KEY;
975 write_frame(s, &pkt, enc, ost->bitstream_filters);
977 ost->sync_opts += enc->frame_size;
981 av_init_packet(&pkt);
983 ost->sync_opts += size_out / (osize * enc->channels);
985 /* output a pcm frame */
986 /* determine the size of the coded buffer */
989 size_out = size_out*coded_bps/8;
991 if(size_out > audio_out_size){
992 fprintf(stderr, "Internal error, buffer size too small\n");
996 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
997 ret = avcodec_encode_audio(enc, audio_out, size_out,
1000 fprintf(stderr, "Audio encoding failed\n");
1004 pkt.stream_index= ost->index;
1005 pkt.data= audio_out;
1007 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1008 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1009 pkt.flags |= AV_PKT_FLAG_KEY;
1010 write_frame(s, &pkt, enc, ost->bitstream_filters);
1014 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1016 AVCodecContext *dec;
1017 AVPicture *picture2;
1018 AVPicture picture_tmp;
1021 dec = ist->st->codec;
1023 /* deinterlace : must be done before any resize */
1024 if (do_deinterlace) {
1027 /* create temporary picture */
1028 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1029 buf = av_malloc(size);
1033 picture2 = &picture_tmp;
1034 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1036 if(avpicture_deinterlace(picture2, picture,
1037 dec->pix_fmt, dec->width, dec->height) < 0) {
1038 /* if error, do not deinterlace */
1039 fprintf(stderr, "Deinterlacing failed\n");
1048 if (picture != picture2)
1049 *picture = *picture2;
1053 /* we begin to correct av delay at this threshold */
1054 #define AV_DELAY_MAX 0.100
1056 static void do_subtitle_out(AVFormatContext *s,
1057 AVOutputStream *ost,
1062 static uint8_t *subtitle_out = NULL;
1063 int subtitle_out_max_size = 1024 * 1024;
1064 int subtitle_out_size, nb, i;
1065 AVCodecContext *enc;
1068 if (pts == AV_NOPTS_VALUE) {
1069 fprintf(stderr, "Subtitle packets must have a pts\n");
1075 enc = ost->st->codec;
1077 if (!subtitle_out) {
1078 subtitle_out = av_malloc(subtitle_out_max_size);
1081 /* Note: DVB subtitle need one packet to draw them and one other
1082 packet to clear them */
1083 /* XXX: signal it in the codec context ? */
1084 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1089 for(i = 0; i < nb; i++) {
1090 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1091 // start_display_time is required to be 0
1092 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1093 sub->end_display_time -= sub->start_display_time;
1094 sub->start_display_time = 0;
1095 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1096 subtitle_out_max_size, sub);
1097 if (subtitle_out_size < 0) {
1098 fprintf(stderr, "Subtitle encoding failed\n");
1102 av_init_packet(&pkt);
1103 pkt.stream_index = ost->index;
1104 pkt.data = subtitle_out;
1105 pkt.size = subtitle_out_size;
1106 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1107 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1108 /* XXX: the pts correction is handled here. Maybe handling
1109 it in the codec would be better */
1111 pkt.pts += 90 * sub->start_display_time;
1113 pkt.pts += 90 * sub->end_display_time;
1115 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1119 static int bit_buffer_size= 1024*256;
1120 static uint8_t *bit_buffer= NULL;
1122 static void do_video_out(AVFormatContext *s,
1123 AVOutputStream *ost,
1125 AVFrame *in_picture,
1128 int nb_frames, i, ret, resample_changed;
1129 AVFrame *final_picture, *formatted_picture;
1130 AVCodecContext *enc, *dec;
1133 enc = ost->st->codec;
1134 dec = ist->st->codec;
1136 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1138 /* by default, we output a single frame */
1143 if(video_sync_method){
1144 double vdelta = sync_ipts - ost->sync_opts;
1145 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1148 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1151 }else if(vdelta>0.6)
1152 ost->sync_opts= lrintf(sync_ipts);
1153 }else if (vdelta > 1.1)
1154 nb_frames = lrintf(vdelta);
1155 //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);
1156 if (nb_frames == 0){
1159 fprintf(stderr, "*** drop!\n");
1160 }else if (nb_frames > 1) {
1161 nb_frames_dup += nb_frames - 1;
1163 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1166 ost->sync_opts= lrintf(sync_ipts);
1168 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1172 formatted_picture = in_picture;
1173 final_picture = formatted_picture;
1175 resample_changed = ost->resample_width != dec->width ||
1176 ost->resample_height != dec->height ||
1177 ost->resample_pix_fmt != dec->pix_fmt;
1179 if (resample_changed) {
1180 av_log(NULL, AV_LOG_INFO,
1181 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1182 ist->file_index, ist->st->index,
1183 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1184 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1185 if(!ost->video_resample)
1189 #if !CONFIG_AVFILTER
1190 if (ost->video_resample) {
1191 final_picture = &ost->pict_tmp;
1192 if (resample_changed) {
1193 /* initialize a new scaler context */
1194 sws_freeContext(ost->img_resample_ctx);
1195 ost->img_resample_ctx = sws_getContext(
1196 ist->st->codec->width,
1197 ist->st->codec->height,
1198 ist->st->codec->pix_fmt,
1199 ost->st->codec->width,
1200 ost->st->codec->height,
1201 ost->st->codec->pix_fmt,
1202 ost->sws_flags, NULL, NULL, NULL);
1203 if (ost->img_resample_ctx == NULL) {
1204 fprintf(stderr, "Cannot get resampling context\n");
1208 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1209 0, ost->resample_height, final_picture->data, final_picture->linesize);
1213 /* duplicates frame if needed */
1214 for(i=0;i<nb_frames;i++) {
1216 av_init_packet(&pkt);
1217 pkt.stream_index= ost->index;
1219 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1220 /* raw pictures are written as AVPicture structure to
1221 avoid any copies. We support temorarily the older
1223 AVFrame* old_frame = enc->coded_frame;
1224 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1225 pkt.data= (uint8_t *)final_picture;
1226 pkt.size= sizeof(AVPicture);
1227 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1228 pkt.flags |= AV_PKT_FLAG_KEY;
1230 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1231 enc->coded_frame = old_frame;
1233 AVFrame big_picture;
1235 big_picture= *final_picture;
1236 /* better than nothing: use input picture interlaced
1238 big_picture.interlaced_frame = in_picture->interlaced_frame;
1239 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1240 if(top_field_first == -1)
1241 big_picture.top_field_first = in_picture->top_field_first;
1243 big_picture.top_field_first = top_field_first;
1246 /* handles sameq here. This is not correct because it may
1247 not be a global option */
1248 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1250 big_picture.pict_type = 0;
1251 // big_picture.pts = AV_NOPTS_VALUE;
1252 big_picture.pts= ost->sync_opts;
1253 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1254 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1255 if (ost->forced_kf_index < ost->forced_kf_count &&
1256 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1257 big_picture.pict_type = AV_PICTURE_TYPE_I;
1258 ost->forced_kf_index++;
1260 ret = avcodec_encode_video(enc,
1261 bit_buffer, bit_buffer_size,
1264 fprintf(stderr, "Video encoding failed\n");
1269 pkt.data= bit_buffer;
1271 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1272 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1273 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1274 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1275 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1277 if(enc->coded_frame->key_frame)
1278 pkt.flags |= AV_PKT_FLAG_KEY;
1279 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1282 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1283 // enc->frame_number-1, ret, enc->pict_type);
1284 /* if two pass, output log */
1285 if (ost->logfile && enc->stats_out) {
1286 fprintf(ost->logfile, "%s", enc->stats_out);
1291 ost->frame_number++;
1295 static double psnr(double d){
1296 return -10.0*log(d)/log(10.0);
1299 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1302 AVCodecContext *enc;
1304 double ti1, bitrate, avg_bitrate;
1306 /* this is executed just the first time do_video_stats is called */
1308 vstats_file = fopen(vstats_filename, "w");
1315 enc = ost->st->codec;
1316 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1317 frame_number = ost->frame_number;
1318 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1319 if (enc->flags&CODEC_FLAG_PSNR)
1320 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1322 fprintf(vstats_file,"f_size= %6d ", frame_size);
1323 /* compute pts value */
1324 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1328 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1329 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1330 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1331 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1332 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1336 static void print_report(AVFormatContext **output_files,
1337 AVOutputStream **ost_table, int nb_ostreams,
1341 AVOutputStream *ost;
1342 AVFormatContext *oc;
1344 AVCodecContext *enc;
1345 int frame_number, vid, i;
1346 double bitrate, ti1, pts;
1347 static int64_t last_time = -1;
1348 static int qp_histogram[52];
1350 if (!is_last_report) {
1352 /* display the report every 0.5 seconds */
1353 cur_time = av_gettime();
1354 if (last_time == -1) {
1355 last_time = cur_time;
1358 if ((cur_time - last_time) < 500000)
1360 last_time = cur_time;
1364 oc = output_files[0];
1366 total_size = avio_size(oc->pb);
1367 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1368 total_size= avio_tell(oc->pb);
1373 for(i=0;i<nb_ostreams;i++) {
1376 enc = ost->st->codec;
1377 if (!ost->st->stream_copy && enc->coded_frame)
1378 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1379 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
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, q);
1389 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1393 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1396 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1398 if (enc->flags&CODEC_FLAG_PSNR){
1400 double error, error_sum=0;
1401 double scale, scale_sum=0;
1402 char type[3]= {'Y','U','V'};
1403 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1406 error= enc->error[j];
1407 scale= enc->width*enc->height*255.0*255.0*frame_number;
1409 error= enc->coded_frame->error[j];
1410 scale= enc->width*enc->height*255.0*255.0;
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1417 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1421 /* compute min output value */
1422 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1423 if ((pts < ti1) && (pts > 0))
1429 if (verbose > 0 || is_last_report) {
1430 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1432 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1433 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1434 (double)total_size / 1024, ti1, bitrate);
1436 if (nb_frames_dup || nb_frames_drop)
1437 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1438 nb_frames_dup, nb_frames_drop);
1441 fprintf(stderr, "%s \r", buf);
1446 if (is_last_report && verbose >= 0){
1447 int64_t raw= audio_size + video_size + extra_size;
1448 fprintf(stderr, "\n");
1449 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1453 100.0*(total_size - raw)/raw
1458 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1460 int fill_char = 0x00;
1461 if (sample_fmt == AV_SAMPLE_FMT_U8)
1463 memset(buf, fill_char, size);
1466 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1467 static int output_packet(AVInputStream *ist, int ist_index,
1468 AVOutputStream **ost_table, int nb_ostreams,
1469 const AVPacket *pkt)
1471 AVFormatContext *os;
1472 AVOutputStream *ost;
1476 void *buffer_to_free = NULL;
1477 static unsigned int samples_size= 0;
1478 AVSubtitle subtitle, *subtitle_to_free;
1479 int64_t pkt_pts = AV_NOPTS_VALUE;
1481 int frame_available;
1485 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1487 if(ist->next_pts == AV_NOPTS_VALUE)
1488 ist->next_pts= ist->pts;
1492 av_init_packet(&avpkt);
1500 if(pkt->dts != AV_NOPTS_VALUE)
1501 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1502 if(pkt->pts != AV_NOPTS_VALUE)
1503 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1505 //while we have more to decode or while the decoder did output something on EOF
1506 while (avpkt.size > 0 || (!pkt && got_output)) {
1507 uint8_t *data_buf, *decoded_data_buf;
1508 int data_size, decoded_data_size;
1510 ist->pts= ist->next_pts;
1512 if(avpkt.size && avpkt.size != pkt->size &&
1513 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1514 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1515 ist->showed_multi_packet_warning=1;
1518 /* decode the packet if needed */
1519 decoded_data_buf = NULL; /* fail safe */
1520 decoded_data_size= 0;
1521 data_buf = avpkt.data;
1522 data_size = avpkt.size;
1523 subtitle_to_free = NULL;
1524 if (ist->decoding_needed) {
1525 switch(ist->st->codec->codec_type) {
1526 case AVMEDIA_TYPE_AUDIO:{
1527 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1528 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1530 samples= av_malloc(samples_size);
1532 decoded_data_size= samples_size;
1533 /* XXX: could avoid copy if PCM 16 bits with same
1534 endianness as CPU */
1535 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1542 got_output = decoded_data_size > 0;
1543 /* Some bug in mpeg audio decoder gives */
1544 /* decoded_data_size < 0, it seems they are overflows */
1546 /* no audio frame */
1549 decoded_data_buf = (uint8_t *)samples;
1550 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1551 (ist->st->codec->sample_rate * ist->st->codec->channels);
1553 case AVMEDIA_TYPE_VIDEO:
1554 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1555 /* XXX: allocate picture correctly */
1556 avcodec_get_frame_defaults(&picture);
1557 avpkt.pts = pkt_pts;
1558 avpkt.dts = ist->pts;
1559 pkt_pts = AV_NOPTS_VALUE;
1561 ret = avcodec_decode_video2(ist->st->codec,
1562 &picture, &got_output, &avpkt);
1563 ist->st->quality= picture.quality;
1567 /* no picture yet */
1568 goto discard_packet;
1570 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1571 if (ist->st->codec->time_base.num != 0) {
1572 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1573 ist->next_pts += ((int64_t)AV_TIME_BASE *
1574 ist->st->codec->time_base.num * ticks) /
1575 ist->st->codec->time_base.den;
1578 buffer_to_free = NULL;
1579 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1581 case AVMEDIA_TYPE_SUBTITLE:
1582 ret = avcodec_decode_subtitle2(ist->st->codec,
1583 &subtitle, &got_output, &avpkt);
1587 goto discard_packet;
1589 subtitle_to_free = &subtitle;
1596 switch(ist->st->codec->codec_type) {
1597 case AVMEDIA_TYPE_AUDIO:
1598 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1599 ist->st->codec->sample_rate;
1601 case AVMEDIA_TYPE_VIDEO:
1602 if (ist->st->codec->time_base.num != 0) {
1603 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1604 ist->next_pts += ((int64_t)AV_TIME_BASE *
1605 ist->st->codec->time_base.num * ticks) /
1606 ist->st->codec->time_base.den;
1615 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1616 for (i = 0; i < nb_ostreams; i++) {
1618 if (ost->input_video_filter && ost->source_index == ist_index) {
1620 if (ist->st->sample_aspect_ratio.num)
1621 sar = ist->st->sample_aspect_ratio;
1623 sar = ist->st->codec->sample_aspect_ratio;
1624 // add it to be filtered
1625 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1633 // preprocess audio (volume)
1634 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1635 if (audio_volume != 256) {
1638 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1639 int v = ((*volp) * audio_volume + 128) >> 8;
1640 if (v < -32768) v = -32768;
1641 if (v > 32767) v = 32767;
1647 /* frame rate emulation */
1649 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1650 int64_t now = av_gettime() - ist->start;
1654 /* if output time reached then transcode raw format,
1655 encode packets and output them */
1656 if (start_time == 0 || ist->pts >= start_time)
1657 for(i=0;i<nb_ostreams;i++) {
1661 if (ost->source_index == ist_index) {
1663 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1664 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1665 while (frame_available) {
1666 AVRational ist_pts_tb;
1667 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1668 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1670 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1672 os = output_files[ost->file_index];
1674 /* set the input output pts pairs */
1675 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1677 if (ost->encoding_needed) {
1678 av_assert0(ist->decoding_needed);
1679 switch(ost->st->codec->codec_type) {
1680 case AVMEDIA_TYPE_AUDIO:
1681 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1683 case AVMEDIA_TYPE_VIDEO:
1685 if (ost->picref->video && !ost->frame_aspect_ratio)
1686 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1688 do_video_out(os, ost, ist, &picture, &frame_size);
1689 if (vstats_filename && frame_size)
1690 do_video_stats(os, ost, frame_size);
1692 case AVMEDIA_TYPE_SUBTITLE:
1693 do_subtitle_out(os, ost, ist, &subtitle,
1700 AVFrame avframe; //FIXME/XXX remove this
1702 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1704 av_init_packet(&opkt);
1706 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1707 #if !CONFIG_AVFILTER
1713 /* no reencoding needed : output the packet directly */
1714 /* force the input stream PTS */
1716 avcodec_get_frame_defaults(&avframe);
1717 ost->st->codec->coded_frame= &avframe;
1718 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1720 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1721 audio_size += data_size;
1722 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1723 video_size += data_size;
1727 opkt.stream_index= ost->index;
1728 if(pkt->pts != AV_NOPTS_VALUE)
1729 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1731 opkt.pts= AV_NOPTS_VALUE;
1733 if (pkt->dts == AV_NOPTS_VALUE)
1734 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1736 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1737 opkt.dts -= ost_tb_start_time;
1739 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1740 opkt.flags= pkt->flags;
1742 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1743 if( ost->st->codec->codec_id != CODEC_ID_H264
1744 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1745 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1747 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1748 opkt.destruct= av_destruct_packet;
1750 opkt.data = data_buf;
1751 opkt.size = data_size;
1754 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1755 ost->st->codec->frame_number++;
1756 ost->frame_number++;
1757 av_free_packet(&opkt);
1761 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1762 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1764 avfilter_unref_buffer(ost->picref);
1770 av_free(buffer_to_free);
1771 /* XXX: allocate the subtitles in the codec ? */
1772 if (subtitle_to_free) {
1773 avsubtitle_free(subtitle_to_free);
1774 subtitle_to_free = NULL;
1781 for(i=0;i<nb_ostreams;i++) {
1783 if (ost->source_index == ist_index) {
1784 AVCodecContext *enc= ost->st->codec;
1785 os = output_files[ost->file_index];
1787 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1789 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1792 if (ost->encoding_needed) {
1796 av_init_packet(&pkt);
1797 pkt.stream_index= ost->index;
1799 switch(ost->st->codec->codec_type) {
1800 case AVMEDIA_TYPE_AUDIO:
1801 fifo_bytes = av_fifo_size(ost->fifo);
1803 /* encode any samples remaining in fifo */
1804 if (fifo_bytes > 0) {
1805 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1806 int fs_tmp = enc->frame_size;
1808 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1809 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1810 enc->frame_size = fifo_bytes / (osize * enc->channels);
1812 int frame_bytes = enc->frame_size*osize*enc->channels;
1813 if (allocated_audio_buf_size < frame_bytes)
1815 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1818 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1819 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1820 ost->st->time_base.num, enc->sample_rate);
1821 enc->frame_size = fs_tmp;
1824 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1827 fprintf(stderr, "Audio encoding failed\n");
1831 pkt.flags |= AV_PKT_FLAG_KEY;
1833 case AVMEDIA_TYPE_VIDEO:
1834 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1836 fprintf(stderr, "Video encoding failed\n");
1840 if(enc->coded_frame && enc->coded_frame->key_frame)
1841 pkt.flags |= AV_PKT_FLAG_KEY;
1842 if (ost->logfile && enc->stats_out) {
1843 fprintf(ost->logfile, "%s", enc->stats_out);
1852 pkt.data= bit_buffer;
1854 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1855 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1856 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1868 static void print_sdp(AVFormatContext **avc, int n)
1872 av_sdp_create(avc, n, sdp, sizeof(sdp));
1873 printf("SDP:\n%s\n", sdp);
1877 static int copy_chapters(int infile, int outfile)
1879 AVFormatContext *is = input_files[infile].ctx;
1880 AVFormatContext *os = output_files[outfile];
1883 for (i = 0; i < is->nb_chapters; i++) {
1884 AVChapter *in_ch = is->chapters[i], *out_ch;
1885 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1886 AV_TIME_BASE_Q, in_ch->time_base);
1887 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1888 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1891 if (in_ch->end < ts_off)
1893 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1896 out_ch = av_mallocz(sizeof(AVChapter));
1898 return AVERROR(ENOMEM);
1900 out_ch->id = in_ch->id;
1901 out_ch->time_base = in_ch->time_base;
1902 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1903 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1905 if (metadata_chapters_autocopy)
1906 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1909 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1911 return AVERROR(ENOMEM);
1912 os->chapters[os->nb_chapters - 1] = out_ch;
1917 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1918 AVCodecContext *avctx)
1924 for (p = kf; *p; p++)
1927 ost->forced_kf_count = n;
1928 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1929 if (!ost->forced_kf_pts) {
1930 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1933 for (i = 0; i < n; i++) {
1934 p = i ? strchr(p, ',') + 1 : kf;
1935 t = parse_time_or_die("force_key_frames", p, 1);
1936 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1941 * The following code is the main loop of the file converter
1943 static int transcode(AVFormatContext **output_files,
1944 int nb_output_files,
1945 AVInputFile *input_files,
1947 AVStreamMap *stream_maps, int nb_stream_maps)
1949 int ret = 0, i, j, k, n, nb_ostreams = 0;
1950 AVFormatContext *is, *os;
1951 AVCodecContext *codec, *icodec;
1952 AVOutputStream *ost, **ost_table = NULL;
1956 uint8_t no_packet[MAX_FILES]={0};
1957 int no_packet_count=0;
1960 for (i = 0; i < nb_input_streams; i++)
1961 input_streams[i].start = av_gettime();
1963 /* output stream init */
1965 for(i=0;i<nb_output_files;i++) {
1966 os = output_files[i];
1967 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1968 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1969 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1970 ret = AVERROR(EINVAL);
1973 nb_ostreams += os->nb_streams;
1975 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1976 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1977 ret = AVERROR(EINVAL);
1981 /* Sanity check the mapping args -- do the input files & streams exist? */
1982 for(i=0;i<nb_stream_maps;i++) {
1983 int fi = stream_maps[i].file_index;
1984 int si = stream_maps[i].stream_index;
1986 if (fi < 0 || fi > nb_input_files - 1 ||
1987 si < 0 || si > input_files[fi].nb_streams - 1) {
1988 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1989 ret = AVERROR(EINVAL);
1992 fi = stream_maps[i].sync_file_index;
1993 si = stream_maps[i].sync_stream_index;
1994 if (fi < 0 || fi > nb_input_files - 1 ||
1995 si < 0 || si > input_files[fi].nb_streams - 1) {
1996 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1997 ret = AVERROR(EINVAL);
2002 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2006 for(k=0;k<nb_output_files;k++) {
2007 os = output_files[k];
2008 for(i=0;i<os->nb_streams;i++,n++) {
2010 ost = ost_table[n] = output_streams_for_file[k][i];
2011 ost->st = os->streams[i];
2012 if (nb_stream_maps > 0) {
2013 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2014 stream_maps[n].stream_index;
2016 /* Sanity check that the stream types match */
2017 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2018 int i= ost->file_index;
2019 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2020 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2021 stream_maps[n].file_index, stream_maps[n].stream_index,
2022 ost->file_index, ost->index);
2027 int best_nb_frames=-1;
2028 /* get corresponding input stream index : we select the first one with the right type */
2030 for (j = 0; j < nb_input_streams; j++) {
2032 ist = &input_streams[j];
2035 AVFormatContext *f = input_files[ist->file_index].ctx;
2037 for(pi=0; pi<f->nb_programs; pi++){
2038 AVProgram *p= f->programs[pi];
2039 if(p->id == opt_programid)
2040 for(si=0; si<p->nb_stream_indexes; si++){
2041 if(f->streams[ p->stream_index[si] ] == ist->st)
2046 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2047 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2048 if(best_nb_frames < ist->st->codec_info_nb_frames){
2049 best_nb_frames= ist->st->codec_info_nb_frames;
2050 ost->source_index = j;
2057 if(! opt_programid) {
2058 /* try again and reuse existing stream */
2059 for (j = 0; j < nb_input_streams; j++) {
2060 ist = &input_streams[j];
2061 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2062 && ist->st->discard != AVDISCARD_ALL) {
2063 ost->source_index = j;
2069 int i= ost->file_index;
2070 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2071 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2072 ost->file_index, ost->index);
2077 ist = &input_streams[ost->source_index];
2079 ost->sync_ist = (nb_stream_maps > 0) ?
2080 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2081 stream_maps[n].sync_stream_index] : ist;
2085 /* for each output stream, we compute the right encoding parameters */
2086 for(i=0;i<nb_ostreams;i++) {
2088 os = output_files[ost->file_index];
2089 ist = &input_streams[ost->source_index];
2091 codec = ost->st->codec;
2092 icodec = ist->st->codec;
2094 if (metadata_streams_autocopy)
2095 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2096 AV_DICT_DONT_OVERWRITE);
2098 ost->st->disposition = ist->st->disposition;
2099 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2100 codec->chroma_sample_location = icodec->chroma_sample_location;
2102 if (ost->st->stream_copy) {
2103 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2105 if (extra_size > INT_MAX)
2108 /* if stream_copy is selected, no need to decode or encode */
2109 codec->codec_id = icodec->codec_id;
2110 codec->codec_type = icodec->codec_type;
2112 if(!codec->codec_tag){
2113 if( !os->oformat->codec_tag
2114 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2115 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2116 codec->codec_tag = icodec->codec_tag;
2119 codec->bit_rate = icodec->bit_rate;
2120 codec->rc_max_rate = icodec->rc_max_rate;
2121 codec->rc_buffer_size = icodec->rc_buffer_size;
2122 codec->extradata= av_mallocz(extra_size);
2123 if (!codec->extradata)
2125 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2126 codec->extradata_size= icodec->extradata_size;
2127 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){
2128 codec->time_base = icodec->time_base;
2129 codec->time_base.num *= icodec->ticks_per_frame;
2130 av_reduce(&codec->time_base.num, &codec->time_base.den,
2131 codec->time_base.num, codec->time_base.den, INT_MAX);
2133 codec->time_base = ist->st->time_base;
2134 switch(codec->codec_type) {
2135 case AVMEDIA_TYPE_AUDIO:
2136 if(audio_volume != 256) {
2137 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2140 codec->channel_layout = icodec->channel_layout;
2141 codec->sample_rate = icodec->sample_rate;
2142 codec->channels = icodec->channels;
2143 codec->frame_size = icodec->frame_size;
2144 codec->audio_service_type = icodec->audio_service_type;
2145 codec->block_align= icodec->block_align;
2146 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2147 codec->block_align= 0;
2148 if(codec->codec_id == CODEC_ID_AC3)
2149 codec->block_align= 0;
2151 case AVMEDIA_TYPE_VIDEO:
2152 codec->pix_fmt = icodec->pix_fmt;
2153 codec->width = icodec->width;
2154 codec->height = icodec->height;
2155 codec->has_b_frames = icodec->has_b_frames;
2156 if (!codec->sample_aspect_ratio.num) {
2157 codec->sample_aspect_ratio =
2158 ost->st->sample_aspect_ratio =
2159 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2160 ist->st->codec->sample_aspect_ratio.num ?
2161 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2164 case AVMEDIA_TYPE_SUBTITLE:
2165 codec->width = icodec->width;
2166 codec->height = icodec->height;
2168 case AVMEDIA_TYPE_DATA:
2175 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2176 switch(codec->codec_type) {
2177 case AVMEDIA_TYPE_AUDIO:
2178 ost->fifo= av_fifo_alloc(1024);
2181 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2182 if (!codec->sample_rate) {
2183 codec->sample_rate = icodec->sample_rate;
2185 codec->sample_rate >>= icodec->lowres;
2187 choose_sample_rate(ost->st, ost->enc);
2188 codec->time_base = (AVRational){1, codec->sample_rate};
2189 if (!codec->channels)
2190 codec->channels = icodec->channels;
2191 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2192 codec->channel_layout = 0;
2193 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2194 icodec->request_channels = codec->channels;
2195 ist->decoding_needed = 1;
2196 ost->encoding_needed = 1;
2197 ost->resample_sample_fmt = icodec->sample_fmt;
2198 ost->resample_sample_rate = icodec->sample_rate;
2199 ost->resample_channels = icodec->channels;
2201 case AVMEDIA_TYPE_VIDEO:
2202 if (codec->pix_fmt == PIX_FMT_NONE)
2203 codec->pix_fmt = icodec->pix_fmt;
2204 choose_pixel_fmt(ost->st, ost->enc);
2206 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2207 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2211 if (!codec->width || !codec->height) {
2212 codec->width = icodec->width;
2213 codec->height = icodec->height;
2216 ost->video_resample = codec->width != icodec->width ||
2217 codec->height != icodec->height ||
2218 codec->pix_fmt != icodec->pix_fmt;
2219 if (ost->video_resample) {
2220 #if !CONFIG_AVFILTER
2221 avcodec_get_frame_defaults(&ost->pict_tmp);
2222 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2223 codec->width, codec->height)) {
2224 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2227 ost->img_resample_ctx = sws_getContext(
2234 ost->sws_flags, NULL, NULL, NULL);
2235 if (ost->img_resample_ctx == NULL) {
2236 fprintf(stderr, "Cannot get resampling context\n");
2240 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;
2249 if (!ost->frame_rate.num)
2250 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2251 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2252 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2253 ost->frame_rate = ost->enc->supported_framerates[idx];
2255 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2258 if (configure_video_filters(ist, ost)) {
2259 fprintf(stderr, "Error opening filters!\n");
2264 case AVMEDIA_TYPE_SUBTITLE:
2265 ost->encoding_needed = 1;
2266 ist->decoding_needed = 1;
2273 if (ost->encoding_needed &&
2274 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2275 char logfilename[1024];
2278 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2279 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2281 if (codec->flags & CODEC_FLAG_PASS1) {
2282 f = fopen(logfilename, "wb");
2284 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2290 size_t logbuffer_size;
2291 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2292 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2295 codec->stats_in = logbuffer;
2299 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2300 int size= codec->width * codec->height;
2301 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2306 bit_buffer = av_malloc(bit_buffer_size);
2308 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2310 ret = AVERROR(ENOMEM);
2314 /* open each encoder */
2315 for(i=0;i<nb_ostreams;i++) {
2317 if (ost->encoding_needed) {
2318 AVCodec *codec = ost->enc;
2319 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2321 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2322 ost->st->codec->codec_id, ost->file_index, ost->index);
2323 ret = AVERROR(EINVAL);
2326 if (dec->subtitle_header) {
2327 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2328 if (!ost->st->codec->subtitle_header) {
2329 ret = AVERROR(ENOMEM);
2332 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2333 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2335 if (avcodec_open(ost->st->codec, codec) < 0) {
2336 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2337 ost->file_index, ost->index);
2338 ret = AVERROR(EINVAL);
2341 extra_size += ost->st->codec->extradata_size;
2345 /* open each decoder */
2346 for (i = 0; i < nb_input_streams; i++) {
2347 ist = &input_streams[i];
2348 if (ist->decoding_needed) {
2349 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2351 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2353 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2354 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2355 ret = AVERROR(EINVAL);
2359 /* update requested sample format for the decoder based on the
2360 corresponding encoder sample format */
2361 for (j = 0; j < nb_ostreams; j++) {
2363 if (ost->source_index == i) {
2364 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2369 if (avcodec_open(ist->st->codec, codec) < 0) {
2370 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2371 ist->file_index, ist->st->index);
2372 ret = AVERROR(EINVAL);
2375 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2376 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2381 for (i = 0; i < nb_input_streams; i++) {
2383 ist = &input_streams[i];
2385 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2386 ist->next_pts = AV_NOPTS_VALUE;
2387 init_pts_correction(&ist->pts_ctx);
2391 /* set meta data information from input file if required */
2392 for (i=0;i<nb_meta_data_maps;i++) {
2393 AVFormatContext *files[2];
2394 AVDictionary **meta[2];
2397 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2398 if ((index) < 0 || (index) >= (nb_elems)) {\
2399 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2401 ret = AVERROR(EINVAL);\
2405 int out_file_index = meta_data_maps[i][0].file;
2406 int in_file_index = meta_data_maps[i][1].file;
2407 if (in_file_index < 0 || out_file_index < 0)
2409 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2410 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2412 files[0] = output_files[out_file_index];
2413 files[1] = input_files[in_file_index].ctx;
2415 for (j = 0; j < 2; j++) {
2416 AVMetaDataMap *map = &meta_data_maps[i][j];
2418 switch (map->type) {
2420 meta[j] = &files[j]->metadata;
2423 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2424 meta[j] = &files[j]->streams[map->index]->metadata;
2427 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2428 meta[j] = &files[j]->chapters[map->index]->metadata;
2431 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2432 meta[j] = &files[j]->programs[map->index]->metadata;
2437 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2440 /* copy global metadata by default */
2441 if (metadata_global_autocopy) {
2443 for (i = 0; i < nb_output_files; i++)
2444 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2445 AV_DICT_DONT_OVERWRITE);
2448 /* copy chapters according to chapter maps */
2449 for (i = 0; i < nb_chapter_maps; i++) {
2450 int infile = chapter_maps[i].in_file;
2451 int outfile = chapter_maps[i].out_file;
2453 if (infile < 0 || outfile < 0)
2455 if (infile >= nb_input_files) {
2456 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2457 ret = AVERROR(EINVAL);
2460 if (outfile >= nb_output_files) {
2461 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2462 ret = AVERROR(EINVAL);
2465 copy_chapters(infile, outfile);
2468 /* copy chapters from the first input file that has them*/
2469 if (!nb_chapter_maps)
2470 for (i = 0; i < nb_input_files; i++) {
2471 if (!input_files[i].ctx->nb_chapters)
2474 for (j = 0; j < nb_output_files; j++)
2475 if ((ret = copy_chapters(i, j)) < 0)
2480 /* open files and write file headers */
2481 for(i=0;i<nb_output_files;i++) {
2482 os = output_files[i];
2483 if (avformat_write_header(os, &output_opts[i]) < 0) {
2484 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2485 ret = AVERROR(EINVAL);
2488 assert_avoptions(output_opts[i]);
2489 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2495 /* dump the file output parameters - cannot be done before in case
2497 for(i=0;i<nb_output_files;i++) {
2498 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2501 /* dump the stream mapping */
2503 fprintf(stderr, "Stream mapping:\n");
2504 for(i=0;i<nb_ostreams;i++) {
2506 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2507 input_streams[ost->source_index].file_index,
2508 input_streams[ost->source_index].st->index,
2511 if (ost->sync_ist != &input_streams[ost->source_index])
2512 fprintf(stderr, " [sync #%d.%d]",
2513 ost->sync_ist->file_index,
2514 ost->sync_ist->st->index);
2515 fprintf(stderr, "\n");
2520 fprintf(stderr, "%s\n", error);
2525 print_sdp(output_files, nb_output_files);
2529 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2532 timer_start = av_gettime();
2534 for(; received_sigterm == 0;) {
2535 int file_index, ist_index;
2544 /* select the stream that we must read now by looking at the
2545 smallest output pts */
2547 for(i=0;i<nb_ostreams;i++) {
2550 os = output_files[ost->file_index];
2551 ist = &input_streams[ost->source_index];
2552 if(ist->is_past_recording_time || no_packet[ist->file_index])
2554 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2555 ipts = (double)ist->pts;
2556 if (!input_files[ist->file_index].eof_reached){
2557 if(ipts < ipts_min) {
2559 if(input_sync ) file_index = ist->file_index;
2561 if(opts < opts_min) {
2563 if(!input_sync) file_index = ist->file_index;
2566 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2571 /* if none, if is finished */
2572 if (file_index < 0) {
2573 if(no_packet_count){
2575 memset(no_packet, 0, sizeof(no_packet));
2582 /* finish if limit size exhausted */
2583 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2586 /* read a frame from it and output it in the fifo */
2587 is = input_files[file_index].ctx;
2588 ret= av_read_frame(is, &pkt);
2589 if(ret == AVERROR(EAGAIN)){
2590 no_packet[file_index]=1;
2595 input_files[file_index].eof_reached = 1;
2603 memset(no_packet, 0, sizeof(no_packet));
2606 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2607 is->streams[pkt.stream_index]);
2609 /* the following test is needed in case new streams appear
2610 dynamically in stream : we ignore them */
2611 if (pkt.stream_index >= input_files[file_index].nb_streams)
2612 goto discard_packet;
2613 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2614 ist = &input_streams[ist_index];
2616 goto discard_packet;
2618 if (pkt.dts != AV_NOPTS_VALUE)
2619 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2620 if (pkt.pts != AV_NOPTS_VALUE)
2621 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2623 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2624 && input_files_ts_scale[file_index][pkt.stream_index]){
2625 if(pkt.pts != AV_NOPTS_VALUE)
2626 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2627 if(pkt.dts != AV_NOPTS_VALUE)
2628 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2631 // 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);
2632 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2633 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2634 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2635 int64_t delta= pkt_dts - ist->next_pts;
2636 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2637 input_files_ts_offset[ist->file_index]-= delta;
2639 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2640 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2641 if(pkt.pts != AV_NOPTS_VALUE)
2642 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2646 /* finish if recording time exhausted */
2647 if (recording_time != INT64_MAX &&
2648 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2649 ist->is_past_recording_time = 1;
2650 goto discard_packet;
2653 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2654 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2657 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2658 ist->file_index, ist->st->index);
2661 av_free_packet(&pkt);
2666 av_free_packet(&pkt);
2668 /* dump report by using the output first video and audio streams */
2669 print_report(output_files, ost_table, nb_ostreams, 0);
2672 /* at the end of stream, we must flush the decoder buffers */
2673 for (i = 0; i < nb_input_streams; i++) {
2674 ist = &input_streams[i];
2675 if (ist->decoding_needed) {
2676 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2682 /* write the trailer if needed and close file */
2683 for(i=0;i<nb_output_files;i++) {
2684 os = output_files[i];
2685 av_write_trailer(os);
2688 /* dump report by using the first video and audio streams */
2689 print_report(output_files, ost_table, nb_ostreams, 1);
2691 /* close each encoder */
2692 for(i=0;i<nb_ostreams;i++) {
2694 if (ost->encoding_needed) {
2695 av_freep(&ost->st->codec->stats_in);
2696 avcodec_close(ost->st->codec);
2699 avfilter_graph_free(&ost->graph);
2703 /* close each decoder */
2704 for (i = 0; i < nb_input_streams; i++) {
2705 ist = &input_streams[i];
2706 if (ist->decoding_needed) {
2707 avcodec_close(ist->st->codec);
2715 av_freep(&bit_buffer);
2718 for(i=0;i<nb_ostreams;i++) {
2721 if (ost->st->stream_copy)
2722 av_freep(&ost->st->codec->extradata);
2724 fclose(ost->logfile);
2725 ost->logfile = NULL;
2727 av_fifo_free(ost->fifo); /* works even if fifo is not
2728 initialized but set to zero */
2729 av_freep(&ost->st->codec->subtitle_header);
2730 av_free(ost->pict_tmp.data[0]);
2731 av_free(ost->forced_kf_pts);
2732 if (ost->video_resample)
2733 sws_freeContext(ost->img_resample_ctx);
2735 audio_resample_close(ost->resample);
2736 if (ost->reformat_ctx)
2737 av_audio_convert_free(ost->reformat_ctx);
2746 static int opt_format(const char *opt, const char *arg)
2748 last_asked_format = arg;
2752 static int opt_video_rc_override_string(const char *opt, const char *arg)
2754 video_rc_override_string = arg;
2758 static int opt_me_threshold(const char *opt, const char *arg)
2760 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2764 static int opt_verbose(const char *opt, const char *arg)
2766 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2770 static int opt_frame_rate(const char *opt, const char *arg)
2772 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2773 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2779 static int opt_bitrate(const char *opt, const char *arg)
2781 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2783 opt_default(opt, arg);
2785 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2786 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2791 static int opt_frame_crop(const char *opt, const char *arg)
2793 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2794 return AVERROR(EINVAL);
2797 static int opt_frame_size(const char *opt, const char *arg)
2799 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2800 fprintf(stderr, "Incorrect frame size\n");
2801 return AVERROR(EINVAL);
2806 static int opt_pad(const char *opt, const char *arg) {
2807 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2811 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2813 if (strcmp(arg, "list")) {
2814 frame_pix_fmt = av_get_pix_fmt(arg);
2815 if (frame_pix_fmt == PIX_FMT_NONE) {
2816 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2817 return AVERROR(EINVAL);
2826 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2833 p = strchr(arg, ':');
2835 x = strtol(arg, &end, 10);
2837 y = strtol(end+1, &end, 10);
2839 ar = (double)x / (double)y;
2841 ar = strtod(arg, NULL);
2844 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2845 return AVERROR(EINVAL);
2847 frame_aspect_ratio = ar;
2851 static int opt_metadata(const char *opt, const char *arg)
2853 char *mid= strchr(arg, '=');
2856 fprintf(stderr, "Missing =\n");
2861 av_dict_set(&metadata, arg, mid, 0);
2866 static int opt_qscale(const char *opt, const char *arg)
2868 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2869 if (video_qscale == 0) {
2870 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2871 return AVERROR(EINVAL);
2876 static int opt_top_field_first(const char *opt, const char *arg)
2878 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2882 static int opt_thread_count(const char *opt, const char *arg)
2884 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2887 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2892 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2894 if (strcmp(arg, "list")) {
2895 audio_sample_fmt = av_get_sample_fmt(arg);
2896 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2897 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2898 return AVERROR(EINVAL);
2903 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2904 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2910 static int opt_audio_rate(const char *opt, const char *arg)
2912 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2916 static int opt_audio_channels(const char *opt, const char *arg)
2918 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2922 static int opt_video_channel(const char *opt, const char *arg)
2924 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2925 opt_default("channel", arg);
2929 static int opt_video_standard(const char *opt, const char *arg)
2931 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2932 opt_default("standard", arg);
2936 static int opt_codec(int *pstream_copy, char **pcodec_name,
2937 int codec_type, const char *arg)
2939 av_freep(pcodec_name);
2940 if (!strcmp(arg, "copy")) {
2943 *pcodec_name = av_strdup(arg);
2948 static int opt_audio_codec(const char *opt, const char *arg)
2950 return opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2953 static int opt_video_codec(const char *opt, const char *arg)
2955 return opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2958 static int opt_subtitle_codec(const char *opt, const char *arg)
2960 return opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2963 static int opt_data_codec(const char *opt, const char *arg)
2965 return opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2968 static int opt_codec_tag(const char *opt, const char *arg)
2971 uint32_t *codec_tag;
2973 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2974 !strcmp(opt, "vtag") ? &video_codec_tag :
2975 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2979 *codec_tag = strtol(arg, &tail, 0);
2981 *codec_tag = AV_RL32(arg);
2986 static int opt_map(const char *opt, const char *arg)
2991 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2992 m = &stream_maps[nb_stream_maps-1];
2994 m->file_index = strtol(arg, &p, 0);
2998 m->stream_index = strtol(p, &p, 0);
3001 m->sync_file_index = strtol(p, &p, 0);
3004 m->sync_stream_index = strtol(p, &p, 0);
3006 m->sync_file_index = m->file_index;
3007 m->sync_stream_index = m->stream_index;
3012 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3023 *index = strtol(++arg, endptr, 0);
3026 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3033 static int opt_map_metadata(const char *opt, const char *arg)
3035 AVMetaDataMap *m, *m1;
3038 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3039 &nb_meta_data_maps, nb_meta_data_maps + 1);
3041 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3042 m->file = strtol(arg, &p, 0);
3043 parse_meta_type(p, &m->type, &m->index, &p);
3047 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3048 m1->file = strtol(p, &p, 0);
3049 parse_meta_type(p, &m1->type, &m1->index, &p);
3051 if (m->type == 'g' || m1->type == 'g')
3052 metadata_global_autocopy = 0;
3053 if (m->type == 's' || m1->type == 's')
3054 metadata_streams_autocopy = 0;
3055 if (m->type == 'c' || m1->type == 'c')
3056 metadata_chapters_autocopy = 0;
3061 static int opt_map_meta_data(const char *opt, const char *arg)
3063 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3064 "Use -map_metadata instead.\n");
3065 return opt_map_metadata(opt, arg);
3068 static int opt_map_chapters(const char *opt, const char *arg)
3073 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3074 nb_chapter_maps + 1);
3075 c = &chapter_maps[nb_chapter_maps - 1];
3076 c->out_file = strtol(arg, &p, 0);
3080 c->in_file = strtol(p, &p, 0);
3084 static int opt_input_ts_scale(const char *opt, const char *arg)
3086 unsigned int stream;
3090 stream = strtol(arg, &p, 0);
3093 scale= strtod(p, &p);
3095 if(stream >= MAX_STREAMS)
3098 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);
3099 input_files_ts_scale[nb_input_files][stream]= scale;
3103 static int opt_recording_time(const char *opt, const char *arg)
3105 recording_time = parse_time_or_die(opt, arg, 1);
3109 static int opt_start_time(const char *opt, const char *arg)
3111 start_time = parse_time_or_die(opt, arg, 1);
3115 static int opt_recording_timestamp(const char *opt, const char *arg)
3117 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3121 static int opt_input_ts_offset(const char *opt, const char *arg)
3123 input_ts_offset = parse_time_or_die(opt, arg, 1);
3127 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3129 const char *codec_string = encoder ? "encoder" : "decoder";
3133 return CODEC_ID_NONE;
3135 avcodec_find_encoder_by_name(name) :
3136 avcodec_find_decoder_by_name(name);
3138 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3141 if(codec->type != type) {
3142 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3145 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3146 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3147 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3148 "results.\nAdd '-strict experimental' if you want to use it.\n",
3149 codec_string, codec->name);
3151 avcodec_find_encoder(codec->id) :
3152 avcodec_find_decoder(codec->id);
3153 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3154 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3155 codec_string, codec->name);
3161 static int opt_input_file(const char *opt, const char *filename)
3163 AVFormatContext *ic;
3164 AVInputFormat *file_iformat = NULL;
3165 int err, i, ret, rfps, rfps_base;
3169 if (last_asked_format) {
3170 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3171 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3174 last_asked_format = NULL;
3177 if (!strcmp(filename, "-"))
3180 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3181 !strcmp(filename, "/dev/stdin");
3183 /* get default parameters from command line */
3184 ic = avformat_alloc_context();
3186 print_error(filename, AVERROR(ENOMEM));
3189 if (audio_sample_rate) {
3190 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3191 av_dict_set(&format_opts, "sample_rate", buf, 0);
3193 if (audio_channels) {
3194 snprintf(buf, sizeof(buf), "%d", audio_channels);
3195 av_dict_set(&format_opts, "channels", buf, 0);
3197 if (frame_rate.num) {
3198 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3199 av_dict_set(&format_opts, "framerate", buf, 0);
3201 if (frame_width && frame_height) {
3202 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3203 av_dict_set(&format_opts, "video_size", buf, 0);
3205 if (frame_pix_fmt != PIX_FMT_NONE)
3206 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3208 ic->video_codec_id =
3209 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3210 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3211 ic->audio_codec_id =
3212 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3213 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3214 ic->subtitle_codec_id=
3215 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3216 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3217 ic->flags |= AVFMT_FLAG_NONBLOCK;
3219 /* open the input file with generic libav function */
3220 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3222 print_error(filename, err);
3225 assert_avoptions(format_opts);
3230 for(i=0; i<ic->nb_streams; i++){
3231 ic->streams[i]->discard= AVDISCARD_ALL;
3233 for(i=0; i<ic->nb_programs; i++){
3234 AVProgram *p= ic->programs[i];
3235 if(p->id != opt_programid){
3236 p->discard = AVDISCARD_ALL;
3239 for(j=0; j<p->nb_stream_indexes; j++){
3240 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3245 fprintf(stderr, "Specified program id not found\n");
3251 ic->loop_input = loop_input;
3253 /* Set AVCodecContext options so they will be seen by av_find_stream_info() */
3254 for (i = 0; i < ic->nb_streams; i++) {
3255 AVCodecContext *dec = ic->streams[i]->codec;
3256 switch (dec->codec_type) {
3257 case AVMEDIA_TYPE_AUDIO:
3258 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
3259 AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3262 case AVMEDIA_TYPE_VIDEO:
3263 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
3264 AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3270 /* If not enough info to get the stream parameters, we decode the
3271 first frames to get it. (used in mpeg case for example) */
3272 ret = av_find_stream_info(ic);
3273 if (ret < 0 && verbose >= 0) {
3274 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3275 av_close_input_file(ic);
3279 timestamp = start_time;
3280 /* add the stream start time */
3281 if (ic->start_time != AV_NOPTS_VALUE)
3282 timestamp += ic->start_time;
3284 /* if seeking requested, we execute it */
3285 if (start_time != 0) {
3286 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3288 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3289 filename, (double)timestamp / AV_TIME_BASE);
3291 /* reset seek info */
3295 /* update the current parameters so that they match the one of the input stream */
3296 for(i=0;i<ic->nb_streams;i++) {
3297 AVStream *st = ic->streams[i];
3298 AVCodecContext *dec = st->codec;
3301 dec->thread_count = thread_count;
3302 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3304 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3305 ist = &input_streams[nb_input_streams - 1];
3307 ist->file_index = nb_input_files;
3310 switch (dec->codec_type) {
3311 case AVMEDIA_TYPE_AUDIO:
3312 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3313 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]);
3314 channel_layout = dec->channel_layout;
3315 audio_sample_fmt = dec->sample_fmt;
3317 st->discard= AVDISCARD_ALL;
3319 case AVMEDIA_TYPE_VIDEO:
3320 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3321 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]);
3322 rfps = ic->streams[i]->r_frame_rate.num;
3323 rfps_base = ic->streams[i]->r_frame_rate.den;
3325 dec->flags |= CODEC_FLAG_EMU_EDGE;
3326 dec->height >>= dec->lowres;
3327 dec->width >>= dec->lowres;
3330 dec->debug |= FF_DEBUG_MV;
3332 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3335 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3336 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3338 (float)rfps / rfps_base, rfps, rfps_base);
3342 st->discard= AVDISCARD_ALL;
3343 else if(video_discard)
3344 st->discard= video_discard;
3346 case AVMEDIA_TYPE_DATA:
3348 case AVMEDIA_TYPE_SUBTITLE:
3349 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3350 if(subtitle_disable)
3351 st->discard = AVDISCARD_ALL;
3353 case AVMEDIA_TYPE_ATTACHMENT:
3354 case AVMEDIA_TYPE_UNKNOWN:
3361 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3362 /* dump the file content */
3364 av_dump_format(ic, nb_input_files, filename, 0);
3366 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3367 input_files[nb_input_files - 1].ctx = ic;
3368 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3369 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3371 frame_rate = (AVRational){0, 0};
3372 frame_pix_fmt = PIX_FMT_NONE;
3375 audio_sample_rate = 0;
3378 av_freep(&video_codec_name);
3379 av_freep(&audio_codec_name);
3380 av_freep(&subtitle_codec_name);
3386 static void check_inputs(int *has_video_ptr,
3388 int *has_subtitle_ptr,
3391 int has_video, has_audio, has_subtitle, has_data, i, j;
3392 AVFormatContext *ic;
3399 for(j=0;j<nb_input_files;j++) {
3400 ic = input_files[j].ctx;
3401 for(i=0;i<ic->nb_streams;i++) {
3402 AVCodecContext *enc = ic->streams[i]->codec;
3403 switch(enc->codec_type) {
3404 case AVMEDIA_TYPE_AUDIO:
3407 case AVMEDIA_TYPE_VIDEO:
3410 case AVMEDIA_TYPE_SUBTITLE:
3413 case AVMEDIA_TYPE_DATA:
3414 case AVMEDIA_TYPE_ATTACHMENT:
3415 case AVMEDIA_TYPE_UNKNOWN:
3423 *has_video_ptr = has_video;
3424 *has_audio_ptr = has_audio;
3425 *has_subtitle_ptr = has_subtitle;
3426 *has_data_ptr = has_data;
3429 static void new_video_stream(AVFormatContext *oc, int file_idx)
3432 AVOutputStream *ost;
3433 AVCodecContext *video_enc;
3434 enum CodecID codec_id = CODEC_ID_NONE;
3435 AVCodec *codec= NULL;
3437 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3439 fprintf(stderr, "Could not alloc stream\n");
3442 ost = new_output_stream(oc, file_idx);
3444 if(!video_stream_copy){
3445 if (video_codec_name) {
3446 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3447 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3448 codec = avcodec_find_encoder_by_name(video_codec_name);
3451 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3452 codec = avcodec_find_encoder(codec_id);
3455 ost->frame_aspect_ratio = frame_aspect_ratio;
3456 frame_aspect_ratio = 0;
3458 ost->avfilter= vfilters;
3463 avcodec_get_context_defaults3(st->codec, codec);
3464 ost->bitstream_filters = video_bitstream_filters;
3465 video_bitstream_filters= NULL;
3467 st->codec->thread_count= thread_count;
3469 video_enc = st->codec;
3472 video_enc->codec_tag= video_codec_tag;
3474 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3475 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3476 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3479 if (video_stream_copy) {
3480 st->stream_copy = 1;
3481 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3482 video_enc->sample_aspect_ratio =
3483 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3489 ost->frame_rate = frame_rate;
3490 video_enc->codec_id = codec_id;
3491 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3493 video_enc->width = frame_width;
3494 video_enc->height = frame_height;
3495 video_enc->pix_fmt = frame_pix_fmt;
3496 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3499 video_enc->gop_size = 0;
3500 if (video_qscale || same_quality) {
3501 video_enc->flags |= CODEC_FLAG_QSCALE;
3502 video_enc->global_quality=
3503 st->quality = FF_QP2LAMBDA * video_qscale;
3507 video_enc->intra_matrix = intra_matrix;
3509 video_enc->inter_matrix = inter_matrix;
3511 p= video_rc_override_string;
3514 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3516 fprintf(stderr, "error parsing rc_override\n");
3519 video_enc->rc_override=
3520 av_realloc(video_enc->rc_override,
3521 sizeof(RcOverride)*(i+1));
3522 video_enc->rc_override[i].start_frame= start;
3523 video_enc->rc_override[i].end_frame = end;
3525 video_enc->rc_override[i].qscale= q;
3526 video_enc->rc_override[i].quality_factor= 1.0;
3529 video_enc->rc_override[i].qscale= 0;
3530 video_enc->rc_override[i].quality_factor= -q/100.0;
3535 video_enc->rc_override_count=i;
3536 if (!video_enc->rc_initial_buffer_occupancy)
3537 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3538 video_enc->me_threshold= me_threshold;
3539 video_enc->intra_dc_precision= intra_dc_precision - 8;
3542 video_enc->flags|= CODEC_FLAG_PSNR;
3547 video_enc->flags |= CODEC_FLAG_PASS1;
3549 video_enc->flags |= CODEC_FLAG_PASS2;
3553 if (forced_key_frames)
3554 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3556 if (video_language) {
3557 av_dict_set(&st->metadata, "language", video_language, 0);
3558 av_freep(&video_language);
3561 /* reset some key parameters */
3563 av_freep(&video_codec_name);
3564 av_freep(&forced_key_frames);
3565 video_stream_copy = 0;
3566 frame_pix_fmt = PIX_FMT_NONE;
3569 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3572 AVOutputStream *ost;
3573 AVCodec *codec= NULL;
3574 AVCodecContext *audio_enc;
3575 enum CodecID codec_id = CODEC_ID_NONE;
3577 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3579 fprintf(stderr, "Could not alloc stream\n");
3582 ost = new_output_stream(oc, file_idx);
3584 if(!audio_stream_copy){
3585 if (audio_codec_name) {
3586 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3587 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3588 codec = avcodec_find_encoder_by_name(audio_codec_name);
3591 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3592 codec = avcodec_find_encoder(codec_id);
3596 avcodec_get_context_defaults3(st->codec, codec);
3598 ost->bitstream_filters = audio_bitstream_filters;
3599 audio_bitstream_filters= NULL;
3601 st->codec->thread_count= thread_count;
3603 audio_enc = st->codec;
3604 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3607 audio_enc->codec_tag= audio_codec_tag;
3609 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3610 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3611 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3613 if (audio_stream_copy) {
3614 st->stream_copy = 1;
3616 audio_enc->codec_id = codec_id;
3617 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3619 if (audio_qscale > QSCALE_NONE) {
3620 audio_enc->flags |= CODEC_FLAG_QSCALE;
3621 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3624 audio_enc->channels = audio_channels;
3625 audio_enc->sample_fmt = audio_sample_fmt;
3626 if (audio_sample_rate)
3627 audio_enc->sample_rate = audio_sample_rate;
3628 audio_enc->channel_layout = channel_layout;
3629 choose_sample_fmt(st, codec);
3631 if (audio_language) {
3632 av_dict_set(&st->metadata, "language", audio_language, 0);
3633 av_freep(&audio_language);
3636 /* reset some key parameters */
3638 av_freep(&audio_codec_name);
3639 audio_stream_copy = 0;
3642 static void new_data_stream(AVFormatContext *oc, int file_idx)
3645 AVCodec *codec=NULL;
3646 AVCodecContext *data_enc;
3648 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3650 fprintf(stderr, "Could not alloc stream\n");
3653 new_output_stream(oc, file_idx);
3654 data_enc = st->codec;
3655 if (!data_stream_copy) {
3656 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3659 avcodec_get_context_defaults3(st->codec, codec);
3661 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3664 data_enc->codec_tag= data_codec_tag;
3666 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3667 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3668 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3670 if (data_stream_copy) {
3671 st->stream_copy = 1;
3675 av_freep(&data_codec_name);
3676 data_stream_copy = 0;
3679 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3682 AVOutputStream *ost;
3683 AVCodec *codec=NULL;
3684 AVCodecContext *subtitle_enc;
3685 enum CodecID codec_id = CODEC_ID_NONE;
3687 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3689 fprintf(stderr, "Could not alloc stream\n");
3692 ost = new_output_stream(oc, file_idx);
3693 subtitle_enc = st->codec;
3694 if(!subtitle_stream_copy){
3695 if (subtitle_codec_name) {
3696 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3697 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3698 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3701 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3702 codec = avcodec_find_encoder(codec_id);
3705 avcodec_get_context_defaults3(st->codec, codec);
3707 ost->bitstream_filters = subtitle_bitstream_filters;
3708 subtitle_bitstream_filters= NULL;
3710 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3712 if(subtitle_codec_tag)
3713 subtitle_enc->codec_tag= subtitle_codec_tag;
3715 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3716 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3717 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3719 if (subtitle_stream_copy) {
3720 st->stream_copy = 1;
3722 subtitle_enc->codec_id = codec_id;
3723 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3726 if (subtitle_language) {
3727 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3728 av_freep(&subtitle_language);
3731 subtitle_disable = 0;
3732 av_freep(&subtitle_codec_name);
3733 subtitle_stream_copy = 0;
3736 static int opt_new_stream(const char *opt, const char *arg)
3738 AVFormatContext *oc;
3739 int file_idx = nb_output_files - 1;
3740 if (nb_output_files <= 0) {
3741 fprintf(stderr, "At least one output file must be specified\n");
3744 oc = output_files[file_idx];
3746 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3747 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3748 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3749 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3754 /* arg format is "output-stream-index:streamid-value". */
3755 static int opt_streamid(const char *opt, const char *arg)
3761 av_strlcpy(idx_str, arg, sizeof(idx_str));
3762 p = strchr(idx_str, ':');
3765 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3770 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3771 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3772 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3776 static void opt_output_file(const char *filename)
3778 AVFormatContext *oc;
3779 int err, use_video, use_audio, use_subtitle, use_data;
3780 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3781 AVOutputFormat *file_oformat;
3783 if (!strcmp(filename, "-"))
3786 oc = avformat_alloc_context();
3788 print_error(filename, AVERROR(ENOMEM));
3792 if (last_asked_format) {
3793 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3794 if (!file_oformat) {
3795 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3798 last_asked_format = NULL;
3800 file_oformat = av_guess_format(NULL, filename, NULL);
3801 if (!file_oformat) {
3802 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3808 oc->oformat = file_oformat;
3809 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3811 if (!strcmp(file_oformat->name, "ffm") &&
3812 av_strstart(filename, "http:", NULL)) {
3813 /* special case for files sent to ffserver: we get the stream
3814 parameters from ffserver */
3815 int err = read_ffserver_streams(oc, filename);
3817 print_error(filename, err);
3821 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3822 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3823 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3824 use_data = data_stream_copy || data_codec_name; /* XXX once generic data codec will be available add a ->data_codec reference and use it here */
3826 /* disable if no corresponding type found and at least one
3828 if (nb_input_files > 0) {
3829 check_inputs(&input_has_video,
3831 &input_has_subtitle,
3834 if (!input_has_video)
3836 if (!input_has_audio)
3838 if (!input_has_subtitle)
3840 if (!input_has_data)
3844 /* manual disable */
3845 if (audio_disable) use_audio = 0;
3846 if (video_disable) use_video = 0;
3847 if (subtitle_disable) use_subtitle = 0;
3848 if (data_disable) use_data = 0;
3850 if (use_video) new_video_stream(oc, nb_output_files);
3851 if (use_audio) new_audio_stream(oc, nb_output_files);
3852 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3853 if (use_data) new_data_stream(oc, nb_output_files);
3855 oc->timestamp = recording_timestamp;
3857 av_dict_copy(&oc->metadata, metadata, 0);
3858 av_dict_free(&metadata);
3861 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3862 output_files[nb_output_files++] = oc;
3864 /* check filename in case of an image number is expected */
3865 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3866 if (!av_filename_number_test(oc->filename)) {
3867 print_error(oc->filename, AVERROR(EINVAL));
3872 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3873 /* test if it already exists to avoid loosing precious files */
3874 if (!file_overwrite &&
3875 (strchr(filename, ':') == NULL ||
3876 filename[1] == ':' ||
3877 av_strstart(filename, "file:", NULL))) {
3878 if (avio_check(filename, 0) == 0) {
3880 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3882 if (!read_yesno()) {
3883 fprintf(stderr, "Not overwriting - exiting\n");
3888 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3895 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3896 print_error(filename, err);
3901 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3902 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3903 oc->loop_output = loop_output;
3904 oc->flags |= AVFMT_FLAG_NONBLOCK;
3906 frame_rate = (AVRational){0, 0};
3909 audio_sample_rate = 0;
3912 av_freep(&forced_key_frames);
3917 /* same option as mencoder */
3918 static int opt_pass(const char *opt, const char *arg)
3920 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3924 static int64_t getutime(void)
3927 struct rusage rusage;
3929 getrusage(RUSAGE_SELF, &rusage);
3930 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3931 #elif HAVE_GETPROCESSTIMES
3933 FILETIME c, e, k, u;
3934 proc = GetCurrentProcess();
3935 GetProcessTimes(proc, &c, &e, &k, &u);
3936 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3938 return av_gettime();
3942 static int64_t getmaxrss(void)
3944 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3945 struct rusage rusage;
3946 getrusage(RUSAGE_SELF, &rusage);
3947 return (int64_t)rusage.ru_maxrss * 1024;
3948 #elif HAVE_GETPROCESSMEMORYINFO
3950 PROCESS_MEMORY_COUNTERS memcounters;
3951 proc = GetCurrentProcess();
3952 memcounters.cb = sizeof(memcounters);
3953 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3954 return memcounters.PeakPagefileUsage;
3960 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3963 const char *p = str;
3970 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3977 static void opt_inter_matrix(const char *arg)
3979 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3980 parse_matrix_coeffs(inter_matrix, arg);
3983 static void opt_intra_matrix(const char *arg)
3985 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3986 parse_matrix_coeffs(intra_matrix, arg);
3989 static void show_usage(void)
3991 printf("Hyper fast Audio and Video encoder\n");
3992 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3996 static void show_help(void)
3999 AVOutputFormat *oformat = NULL;
4000 AVInputFormat *iformat = NULL;
4002 av_log_set_callback(log_callback_help);
4004 show_help_options(options, "Main options:\n",
4005 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4006 show_help_options(options, "\nAdvanced options:\n",
4007 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4009 show_help_options(options, "\nVideo options:\n",
4010 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4012 show_help_options(options, "\nAdvanced Video options:\n",
4013 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4014 OPT_VIDEO | OPT_EXPERT);
4015 show_help_options(options, "\nAudio options:\n",
4016 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4018 show_help_options(options, "\nAdvanced Audio options:\n",
4019 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4020 OPT_AUDIO | OPT_EXPERT);
4021 show_help_options(options, "\nSubtitle options:\n",
4022 OPT_SUBTITLE | OPT_GRAB,
4024 show_help_options(options, "\nAudio/Video grab options:\n",
4028 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4031 /* individual codec options */
4033 while ((c = av_codec_next(c))) {
4034 if (c->priv_class) {
4035 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4040 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4043 /* individual muxer options */
4044 while ((oformat = av_oformat_next(oformat))) {
4045 if (oformat->priv_class) {
4046 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4051 /* individual demuxer options */
4052 while ((iformat = av_iformat_next(iformat))) {
4053 if (iformat->priv_class) {
4054 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4059 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4062 static int opt_target(const char *opt, const char *arg)
4064 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4065 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4067 if(!strncmp(arg, "pal-", 4)) {
4070 } else if(!strncmp(arg, "ntsc-", 5)) {
4073 } else if(!strncmp(arg, "film-", 5)) {
4078 /* Calculate FR via float to avoid int overflow */
4079 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4082 } else if((fr == 29970) || (fr == 23976)) {
4085 /* Try to determine PAL/NTSC by peeking in the input files */
4086 if(nb_input_files) {
4088 for (j = 0; j < nb_input_files; j++) {
4089 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4090 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4091 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4093 fr = c->time_base.den * 1000 / c->time_base.num;
4097 } else if((fr == 29970) || (fr == 23976)) {
4107 if(verbose > 0 && norm != UNKNOWN)
4108 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4111 if(norm == UNKNOWN) {
4112 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4113 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4114 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4118 if(!strcmp(arg, "vcd")) {
4119 opt_video_codec("vcodec", "mpeg1video");
4120 opt_audio_codec("vcodec", "mp2");
4121 opt_format("f", "vcd");
4123 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4124 opt_frame_rate("r", frame_rates[norm]);
4125 opt_default("g", norm == PAL ? "15" : "18");
4127 opt_default("b", "1150000");
4128 opt_default("maxrate", "1150000");
4129 opt_default("minrate", "1150000");
4130 opt_default("bufsize", "327680"); // 40*1024*8;
4132 opt_default("ab", "224000");
4133 audio_sample_rate = 44100;
4136 opt_default("packetsize", "2324");
4137 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4139 /* We have to offset the PTS, so that it is consistent with the SCR.
4140 SCR starts at 36000, but the first two packs contain only padding
4141 and the first pack from the other stream, respectively, may also have
4142 been written before.
4143 So the real data starts at SCR 36000+3*1200. */
4144 mux_preload= (36000+3*1200) / 90000.0; //0.44
4145 } else if(!strcmp(arg, "svcd")) {
4147 opt_video_codec("vcodec", "mpeg2video");
4148 opt_audio_codec("acodec", "mp2");
4149 opt_format("f", "svcd");
4151 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4152 opt_frame_rate("r", frame_rates[norm]);
4153 opt_default("g", norm == PAL ? "15" : "18");
4155 opt_default("b", "2040000");
4156 opt_default("maxrate", "2516000");
4157 opt_default("minrate", "0"); //1145000;
4158 opt_default("bufsize", "1835008"); //224*1024*8;
4159 opt_default("flags", "+scan_offset");
4162 opt_default("ab", "224000");
4163 audio_sample_rate = 44100;
4165 opt_default("packetsize", "2324");
4167 } else if(!strcmp(arg, "dvd")) {
4169 opt_video_codec("vcodec", "mpeg2video");
4170 opt_audio_codec("vcodec", "ac3");
4171 opt_format("f", "dvd");
4173 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4174 opt_frame_rate("r", frame_rates[norm]);
4175 opt_default("g", norm == PAL ? "15" : "18");
4177 opt_default("b", "6000000");
4178 opt_default("maxrate", "9000000");
4179 opt_default("minrate", "0"); //1500000;
4180 opt_default("bufsize", "1835008"); //224*1024*8;
4182 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4183 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4185 opt_default("ab", "448000");
4186 audio_sample_rate = 48000;
4188 } else if(!strncmp(arg, "dv", 2)) {
4190 opt_format("f", "dv");
4192 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4193 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4194 norm == PAL ? "yuv420p" : "yuv411p");
4195 opt_frame_rate("r", frame_rates[norm]);
4197 audio_sample_rate = 48000;
4201 fprintf(stderr, "Unknown target: %s\n", arg);
4202 return AVERROR(EINVAL);
4207 static int opt_vstats_file(const char *opt, const char *arg)
4209 av_free (vstats_filename);
4210 vstats_filename=av_strdup (arg);
4214 static int opt_vstats(const char *opt, const char *arg)
4217 time_t today2 = time(NULL);
4218 struct tm *today = localtime(&today2);
4220 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4222 return opt_vstats_file(opt, filename);
4225 static int opt_bsf(const char *opt, const char *arg)
4227 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4228 AVBitStreamFilterContext **bsfp;
4231 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4235 bsfp= *opt == 'v' ? &video_bitstream_filters :
4236 *opt == 'a' ? &audio_bitstream_filters :
4237 &subtitle_bitstream_filters;
4239 bsfp= &(*bsfp)->next;
4246 static int opt_preset(const char *opt, const char *arg)
4249 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4250 char *codec_name = *opt == 'v' ? video_codec_name :
4251 *opt == 'a' ? audio_codec_name :
4252 subtitle_codec_name;
4254 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4255 fprintf(stderr, "File for preset '%s' not found\n", arg);
4260 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4261 if(line[0] == '#' && !e)
4263 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4265 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4268 if(!strcmp(tmp, "acodec")){
4269 opt_audio_codec(tmp, tmp2);
4270 }else if(!strcmp(tmp, "vcodec")){
4271 opt_video_codec(tmp, tmp2);
4272 }else if(!strcmp(tmp, "scodec")){
4273 opt_subtitle_codec(tmp, tmp2);
4274 }else if(!strcmp(tmp, "dcodec")){
4275 opt_data_codec(tmp, tmp2);
4276 }else if(opt_default(tmp, tmp2) < 0){
4277 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4287 static const OptionDef options[] = {
4289 #include "cmdutils_common_opts.h"
4290 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4291 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4292 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4293 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4294 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4295 "outfile[,metadata]:infile[,metadata]" },
4296 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4297 "outfile[,metadata]:infile[,metadata]" },
4298 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4299 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4300 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4301 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4302 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4303 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4304 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4305 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4306 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4307 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4308 "add timings for benchmarking" },
4309 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4310 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4311 "dump each input packet" },
4312 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4313 "when dumping packets, also dump the payload" },
4314 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4315 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4316 { "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)", "" },
4317 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4318 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4319 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4320 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4321 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4322 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4323 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4324 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4325 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4326 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4327 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4328 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4329 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4332 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4333 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4334 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4335 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4336 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4337 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4338 { "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" },
4339 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4340 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4341 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4342 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4343 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4344 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4345 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4346 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4347 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4348 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4349 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4350 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4351 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4352 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4353 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4354 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4355 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4356 "use same quantizer as source (implies VBR)" },
4357 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4358 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4359 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4360 "deinterlace pictures" },
4361 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4362 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4363 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4365 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4367 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4368 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4369 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4370 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4371 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4372 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4373 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4374 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4375 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4376 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4377 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4380 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4381 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4382 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4383 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4384 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4385 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4386 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4387 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4388 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4389 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4390 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4391 { "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" },
4393 /* subtitle options */
4394 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4395 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4396 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4397 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4398 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4401 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4402 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4403 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4406 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4407 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4409 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4410 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4411 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4413 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4414 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4415 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4416 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4417 /* data codec support */
4418 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4420 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4424 int main(int argc, char **argv)
4428 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4430 avcodec_register_all();
4432 avdevice_register_all();
4435 avfilter_register_all();
4439 avio_set_interrupt_cb(decode_interrupt_cb);
4446 parse_options(argc, argv, options, opt_output_file);
4448 if(nb_output_files <= 0 && nb_input_files == 0) {
4450 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4454 /* file converter / grab */
4455 if (nb_output_files <= 0) {
4456 fprintf(stderr, "At least one output file must be specified\n");
4460 if (nb_input_files == 0) {
4461 fprintf(stderr, "At least one input file must be specified\n");
4466 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4467 stream_maps, nb_stream_maps) < 0)
4469 ti = getutime() - ti;
4471 int maxrss = getmaxrss() / 1024;
4472 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4475 return ffmpeg_exit(0);