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 AVCodec **output_codecs = NULL;
117 static int nb_output_files = 0;
118 static int nb_output_codecs = 0;
120 static AVStreamMap *stream_maps = NULL;
121 static int nb_stream_maps;
123 /* first item specifies output metadata, second is input */
124 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
125 static int nb_meta_data_maps;
126 static int metadata_global_autocopy = 1;
127 static int metadata_streams_autocopy = 1;
128 static int metadata_chapters_autocopy = 1;
130 static AVChapterMap *chapter_maps = NULL;
131 static int nb_chapter_maps;
133 /* indexed by output file stream index */
134 static int *streamid_map = NULL;
135 static int nb_streamid_map = 0;
137 static int frame_width = 0;
138 static int frame_height = 0;
139 static float frame_aspect_ratio = 0;
140 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
141 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
142 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
143 static AVRational frame_rate;
144 static float video_qscale = 0;
145 static uint16_t *intra_matrix = NULL;
146 static uint16_t *inter_matrix = NULL;
147 static const char *video_rc_override_string=NULL;
148 static int video_disable = 0;
149 static int video_discard = 0;
150 static char *video_codec_name = NULL;
151 static unsigned int video_codec_tag = 0;
152 static char *video_language = NULL;
153 static int same_quality = 0;
154 static int do_deinterlace = 0;
155 static int top_field_first = -1;
156 static int me_threshold = 0;
157 static int intra_dc_precision = 8;
158 static int loop_input = 0;
159 static int loop_output = AVFMT_NOOUTPUTLOOP;
160 static int qp_hist = 0;
162 static char *vfilters = NULL;
165 static int intra_only = 0;
166 static int audio_sample_rate = 0;
167 static int64_t channel_layout = 0;
168 #define QSCALE_NONE -99999
169 static float audio_qscale = QSCALE_NONE;
170 static int audio_disable = 0;
171 static int audio_channels = 0;
172 static char *audio_codec_name = NULL;
173 static unsigned int audio_codec_tag = 0;
174 static char *audio_language = NULL;
176 static int subtitle_disable = 0;
177 static char *subtitle_codec_name = NULL;
178 static char *subtitle_language = NULL;
179 static unsigned int subtitle_codec_tag = 0;
181 static int data_disable = 0;
182 static char *data_codec_name = NULL;
183 static unsigned int data_codec_tag = 0;
185 static float mux_preload= 0.5;
186 static float mux_max_delay= 0.7;
188 static int64_t recording_time = INT64_MAX;
189 static int64_t start_time = 0;
190 static int64_t recording_timestamp = 0;
191 static int64_t input_ts_offset = 0;
192 static int file_overwrite = 0;
193 static AVDictionary *metadata;
194 static int do_benchmark = 0;
195 static int do_hex_dump = 0;
196 static int do_pkt_dump = 0;
197 static int do_psnr = 0;
198 static int do_pass = 0;
199 static char *pass_logfilename_prefix = NULL;
200 static int audio_stream_copy = 0;
201 static int video_stream_copy = 0;
202 static int subtitle_stream_copy = 0;
203 static int data_stream_copy = 0;
204 static int video_sync_method= -1;
205 static int audio_sync_method= 0;
206 static float audio_drift_threshold= 0.1;
207 static int copy_ts= 0;
209 static int opt_shortest = 0;
210 static char *vstats_filename;
211 static FILE *vstats_file;
212 static int opt_programid = 0;
213 static int copy_initial_nonkeyframes = 0;
215 static int rate_emu = 0;
217 static int video_channel = 0;
218 static char *video_standard;
220 static int audio_volume = 256;
222 static int exit_on_error = 0;
223 static int using_stdin = 0;
224 static int verbose = 1;
225 static int thread_count= 1;
226 static int64_t video_size = 0;
227 static int64_t audio_size = 0;
228 static int64_t extra_size = 0;
229 static int nb_frames_dup = 0;
230 static int nb_frames_drop = 0;
231 static int input_sync;
232 static uint64_t limit_filesize = 0;
233 static int force_fps = 0;
234 static char *forced_key_frames = NULL;
236 static float dts_delta_threshold = 10;
238 static int64_t timer_start;
240 static uint8_t *audio_buf;
241 static uint8_t *audio_out;
242 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
244 static short *samples;
246 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
247 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
248 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
250 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
252 struct AVInputStream;
254 typedef struct AVOutputStream {
255 int file_index; /* file index */
256 int index; /* stream index in the output file */
257 int source_index; /* AVInputStream index */
258 AVStream *st; /* stream in the output file */
259 int encoding_needed; /* true if encoding needed for this stream */
261 /* input pts and corresponding output pts
263 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
264 struct AVInputStream *sync_ist; /* input stream to sync against */
265 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
266 AVBitStreamFilterContext *bitstream_filters;
269 AVFrame pict_tmp; /* temporary image for resampling */
270 struct SwsContext *img_resample_ctx; /* for image resampling */
273 int resample_pix_fmt;
274 AVRational frame_rate;
276 float frame_aspect_ratio;
278 /* forced key frames */
279 int64_t *forced_kf_pts;
285 ReSampleContext *resample; /* for audio resampling */
286 int resample_sample_fmt;
287 int resample_channels;
288 int resample_sample_rate;
290 AVAudioConvert *reformat_ctx;
291 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
295 AVFilterContext *output_video_filter;
296 AVFilterContext *input_video_filter;
297 AVFilterBufferRef *picref;
299 AVFilterGraph *graph;
305 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
306 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
308 typedef struct AVInputStream {
311 int discard; /* true if stream data should be discarded */
312 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
313 int64_t sample_index; /* current sample */
315 int64_t start; /* time when read started */
316 int64_t next_pts; /* synthetic pts for cases where pkt.pts
318 int64_t pts; /* current pts */
319 PtsCorrectionContext pts_ctx;
320 int is_start; /* is 1 at the start and after a discontinuity */
321 int showed_multi_packet_warning;
322 int is_past_recording_time;
324 AVFrame *filter_frame;
325 int has_filter_frame;
329 typedef struct AVInputFile {
330 AVFormatContext *ctx;
331 int eof_reached; /* true if eof reached */
332 int ist_index; /* index of first stream in ist_table */
333 int buffer_size; /* current total buffer size */
336 static AVInputStream *input_streams = NULL;
337 static int nb_input_streams = 0;
338 static AVInputFile *input_files = NULL;
339 static int nb_input_files = 0;
343 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
345 AVFilterContext *last_filter, *filter;
346 /** filter graph containing all filters including input & output */
347 AVCodecContext *codec = ost->st->codec;
348 AVCodecContext *icodec = ist->st->codec;
349 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
350 AVRational sample_aspect_ratio;
354 ost->graph = avfilter_graph_alloc();
356 if (ist->st->sample_aspect_ratio.num){
357 sample_aspect_ratio = ist->st->sample_aspect_ratio;
359 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
361 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
362 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
363 sample_aspect_ratio.num, sample_aspect_ratio.den);
365 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
366 "src", args, NULL, ost->graph);
369 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
370 "out", NULL, &ffsink_ctx, ost->graph);
373 last_filter = ost->input_video_filter;
375 if (codec->width != icodec->width || codec->height != icodec->height) {
376 snprintf(args, 255, "%d:%d:flags=0x%X",
380 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
381 NULL, args, NULL, ost->graph)) < 0)
383 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
385 last_filter = filter;
388 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
389 ost->graph->scale_sws_opts = av_strdup(args);
392 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
393 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
395 outputs->name = av_strdup("in");
396 outputs->filter_ctx = last_filter;
397 outputs->pad_idx = 0;
398 outputs->next = NULL;
400 inputs->name = av_strdup("out");
401 inputs->filter_ctx = ost->output_video_filter;
405 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
407 av_freep(&ost->avfilter);
409 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
413 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
416 codec->width = ost->output_video_filter->inputs[0]->w;
417 codec->height = ost->output_video_filter->inputs[0]->h;
418 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
419 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
420 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
421 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
425 #endif /* CONFIG_AVFILTER */
427 static void term_exit(void)
429 av_log(NULL, AV_LOG_QUIET, "");
432 static volatile int received_sigterm = 0;
433 static volatile int received_nb_signals = 0;
436 sigterm_handler(int sig)
438 received_sigterm = sig;
439 received_nb_signals++;
443 static void term_init(void)
445 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
446 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
448 signal(SIGXCPU, sigterm_handler);
452 static int decode_interrupt_cb(void)
454 return received_nb_signals > 1;
457 static int ffmpeg_exit(int ret)
462 for(i=0;i<nb_output_files;i++) {
463 AVFormatContext *s = output_files[i];
464 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
466 avformat_free_context(s);
467 av_free(output_streams_for_file[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(output_codecs);
484 av_free(stream_maps);
485 av_free(meta_data_maps);
487 av_freep(&input_streams);
488 av_freep(&input_files);
490 av_free(video_codec_name);
491 av_free(audio_codec_name);
492 av_free(subtitle_codec_name);
493 av_free(data_codec_name);
495 av_free(video_standard);
500 allocated_audio_buf_size= allocated_audio_out_size= 0;
507 if (received_sigterm) {
509 "Received signal %d: terminating.\n",
510 (int) received_sigterm);
514 exit(ret); /* not all OS-es handle main() return value */
518 /* similar to ff_dynarray_add() and av_fast_realloc() */
519 static void *grow_array(void *array, int elem_size, int *size, int new_size)
521 if (new_size >= INT_MAX / elem_size) {
522 fprintf(stderr, "Array too big.\n");
525 if (*size < new_size) {
526 uint8_t *tmp = av_realloc(array, new_size*elem_size);
528 fprintf(stderr, "Could not alloc buffer.\n");
531 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
538 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
540 if(codec && codec->sample_fmts){
541 const enum AVSampleFormat *p= codec->sample_fmts;
543 if(*p == st->codec->sample_fmt)
547 av_log(NULL, AV_LOG_WARNING,
548 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
549 av_get_sample_fmt_name(st->codec->sample_fmt),
551 av_get_sample_fmt_name(codec->sample_fmts[0]));
552 st->codec->sample_fmt = codec->sample_fmts[0];
558 * Update the requested input sample format based on the output sample format.
559 * This is currently only used to request float output from decoders which
560 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
561 * Ideally this will be removed in the future when decoders do not do format
562 * conversion and only output in their native format.
564 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
567 /* if sample formats match or a decoder sample format has already been
568 requested, just return */
569 if (enc->sample_fmt == dec->sample_fmt ||
570 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
573 /* if decoder supports more than one output format */
574 if (dec_codec && dec_codec->sample_fmts &&
575 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
576 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
577 const enum AVSampleFormat *p;
578 int min_dec = -1, min_inc = -1;
580 /* find a matching sample format in the encoder */
581 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
582 if (*p == enc->sample_fmt) {
583 dec->request_sample_fmt = *p;
585 } else if (*p > enc->sample_fmt) {
586 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
588 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
591 /* if none match, provide the one that matches quality closest */
592 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
593 enc->sample_fmt - min_dec;
597 static void choose_sample_rate(AVStream *st, AVCodec *codec)
599 if(codec && codec->supported_samplerates){
600 const int *p= codec->supported_samplerates;
602 int best_dist=INT_MAX;
604 int dist= abs(st->codec->sample_rate - *p);
605 if(dist < best_dist){
611 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
613 st->codec->sample_rate= best;
617 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
619 if(codec && codec->pix_fmts){
620 const enum PixelFormat *p= codec->pix_fmts;
621 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
622 if(st->codec->codec_id==CODEC_ID_MJPEG){
623 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
624 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
625 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};
629 if(*p == st->codec->pix_fmt)
633 if(st->codec->pix_fmt != PIX_FMT_NONE)
634 av_log(NULL, AV_LOG_WARNING,
635 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
636 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
638 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
639 st->codec->pix_fmt = codec->pix_fmts[0];
644 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
646 int idx = oc->nb_streams - 1;
649 output_streams_for_file[file_idx] =
650 grow_array(output_streams_for_file[file_idx],
651 sizeof(*output_streams_for_file[file_idx]),
652 &nb_output_streams_for_file[file_idx],
654 ost = output_streams_for_file[file_idx][idx] =
655 av_mallocz(sizeof(AVOutputStream));
657 fprintf(stderr, "Could not alloc output stream\n");
660 ost->file_index = file_idx;
663 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
667 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
673 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
676 /* copy stream format */
678 s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
679 for(i=0;i<ic->nb_streams;i++) {
685 // FIXME: a more elegant solution is needed
686 st = av_mallocz(sizeof(AVStream));
687 memcpy(st, ic->streams[i], sizeof(AVStream));
689 st->codec = avcodec_alloc_context();
691 print_error(filename, AVERROR(ENOMEM));
694 avcodec_copy_context(st->codec, ic->streams[i]->codec);
697 codec = avcodec_find_encoder(st->codec->codec_id);
698 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
699 if (audio_stream_copy) {
702 choose_sample_fmt(st, codec);
703 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
704 if (video_stream_copy) {
707 choose_pixel_fmt(st, codec);
710 if(st->codec->flags & CODEC_FLAG_BITEXACT)
713 new_output_stream(s, nb_output_files);
717 s->timestamp = av_gettime();
719 av_close_input_file(ic);
724 get_sync_ipts(const AVOutputStream *ost)
726 const AVInputStream *ist = ost->sync_ist;
727 return (double)(ist->pts - start_time)/AV_TIME_BASE;
730 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
734 AVPacket new_pkt= *pkt;
735 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
736 &new_pkt.data, &new_pkt.size,
737 pkt->data, pkt->size,
738 pkt->flags & AV_PKT_FLAG_KEY);
741 new_pkt.destruct= av_destruct_packet;
743 fprintf(stderr, "%s failed for stream %d, codec %s",
744 bsfc->filter->name, pkt->stream_index,
745 avctx->codec ? avctx->codec->name : "copy");
755 ret= av_interleaved_write_frame(s, pkt);
757 print_error("av_interleaved_write_frame()", ret);
762 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
764 static void do_audio_out(AVFormatContext *s,
767 unsigned char *buf, int size)
770 int64_t audio_out_size, audio_buf_size;
771 int64_t allocated_for_size= size;
773 int size_out, frame_bytes, ret, resample_changed;
774 AVCodecContext *enc= ost->st->codec;
775 AVCodecContext *dec= ist->st->codec;
776 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
777 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
778 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
781 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
782 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
783 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
784 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
785 audio_buf_size*= osize*enc->channels;
787 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
788 if(coded_bps > 8*osize)
789 audio_out_size= audio_out_size * coded_bps / (8*osize);
790 audio_out_size += FF_MIN_BUFFER_SIZE;
792 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
793 fprintf(stderr, "Buffer sizes too large\n");
797 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
798 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
799 if (!audio_buf || !audio_out){
800 fprintf(stderr, "Out of memory in do_audio_out\n");
804 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
805 ost->audio_resample = 1;
807 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
808 ost->resample_channels != dec->channels ||
809 ost->resample_sample_rate != dec->sample_rate;
811 if ((ost->audio_resample && !ost->resample) || resample_changed) {
812 if (resample_changed) {
813 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",
814 ist->file_index, ist->st->index,
815 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
816 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
817 ost->resample_sample_fmt = dec->sample_fmt;
818 ost->resample_channels = dec->channels;
819 ost->resample_sample_rate = dec->sample_rate;
821 audio_resample_close(ost->resample);
823 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
824 if (audio_sync_method <= 1 &&
825 ost->resample_sample_fmt == enc->sample_fmt &&
826 ost->resample_channels == enc->channels &&
827 ost->resample_sample_rate == enc->sample_rate) {
828 ost->resample = NULL;
829 ost->audio_resample = 0;
830 } else if (ost->audio_resample) {
831 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
832 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
833 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
834 enc->sample_rate, dec->sample_rate,
835 enc->sample_fmt, dec->sample_fmt,
837 if (!ost->resample) {
838 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
839 dec->channels, dec->sample_rate,
840 enc->channels, enc->sample_rate);
846 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
847 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
848 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
849 if (ost->reformat_ctx)
850 av_audio_convert_free(ost->reformat_ctx);
851 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
852 dec->sample_fmt, 1, NULL, 0);
853 if (!ost->reformat_ctx) {
854 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
855 av_get_sample_fmt_name(dec->sample_fmt),
856 av_get_sample_fmt_name(enc->sample_fmt));
859 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
862 if(audio_sync_method){
863 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
864 - av_fifo_size(ost->fifo)/(enc->channels * 2);
865 double idelta= delta*dec->sample_rate / enc->sample_rate;
866 int byte_delta= ((int)idelta)*2*dec->channels;
868 //FIXME resample delay
869 if(fabs(delta) > 50){
870 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
872 byte_delta= FFMAX(byte_delta, -size);
876 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
881 static uint8_t *input_tmp= NULL;
882 input_tmp= av_realloc(input_tmp, byte_delta + size);
884 if(byte_delta > allocated_for_size - size){
885 allocated_for_size= byte_delta + (int64_t)size;
890 memset(input_tmp, 0, byte_delta);
891 memcpy(input_tmp + byte_delta, buf, size);
895 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
897 }else if(audio_sync_method>1){
898 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
899 av_assert0(ost->audio_resample);
901 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
902 // 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));
903 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
907 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
908 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
910 if (ost->audio_resample) {
912 size_out = audio_resample(ost->resample,
913 (short *)buftmp, (short *)buf,
914 size / (dec->channels * isize));
915 size_out = size_out * enc->channels * osize;
921 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
922 const void *ibuf[6]= {buftmp};
923 void *obuf[6]= {audio_buf};
924 int istride[6]= {isize};
925 int ostride[6]= {osize};
926 int len= size_out/istride[0];
927 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
928 printf("av_audio_convert() failed\n");
934 size_out = len*osize;
937 /* now encode as many frames as possible */
938 if (enc->frame_size > 1) {
939 /* output resampled raw samples */
940 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
941 fprintf(stderr, "av_fifo_realloc2() failed\n");
944 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
946 frame_bytes = enc->frame_size * osize * enc->channels;
948 while (av_fifo_size(ost->fifo) >= frame_bytes) {
950 av_init_packet(&pkt);
952 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
954 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
956 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
959 fprintf(stderr, "Audio encoding failed\n");
963 pkt.stream_index= ost->index;
966 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
967 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
968 pkt.flags |= AV_PKT_FLAG_KEY;
969 write_frame(s, &pkt, enc, ost->bitstream_filters);
971 ost->sync_opts += enc->frame_size;
975 av_init_packet(&pkt);
977 ost->sync_opts += size_out / (osize * enc->channels);
979 /* output a pcm frame */
980 /* determine the size of the coded buffer */
983 size_out = size_out*coded_bps/8;
985 if(size_out > audio_out_size){
986 fprintf(stderr, "Internal error, buffer size too small\n");
990 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
991 ret = avcodec_encode_audio(enc, audio_out, size_out,
994 fprintf(stderr, "Audio encoding failed\n");
998 pkt.stream_index= ost->index;
1001 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1002 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1003 pkt.flags |= AV_PKT_FLAG_KEY;
1004 write_frame(s, &pkt, enc, ost->bitstream_filters);
1008 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1010 AVCodecContext *dec;
1011 AVPicture *picture2;
1012 AVPicture picture_tmp;
1015 dec = ist->st->codec;
1017 /* deinterlace : must be done before any resize */
1018 if (do_deinterlace) {
1021 /* create temporary picture */
1022 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1023 buf = av_malloc(size);
1027 picture2 = &picture_tmp;
1028 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1030 if(avpicture_deinterlace(picture2, picture,
1031 dec->pix_fmt, dec->width, dec->height) < 0) {
1032 /* if error, do not deinterlace */
1033 fprintf(stderr, "Deinterlacing failed\n");
1042 if (picture != picture2)
1043 *picture = *picture2;
1047 /* we begin to correct av delay at this threshold */
1048 #define AV_DELAY_MAX 0.100
1050 static void do_subtitle_out(AVFormatContext *s,
1051 AVOutputStream *ost,
1056 static uint8_t *subtitle_out = NULL;
1057 int subtitle_out_max_size = 1024 * 1024;
1058 int subtitle_out_size, nb, i;
1059 AVCodecContext *enc;
1062 if (pts == AV_NOPTS_VALUE) {
1063 fprintf(stderr, "Subtitle packets must have a pts\n");
1069 enc = ost->st->codec;
1071 if (!subtitle_out) {
1072 subtitle_out = av_malloc(subtitle_out_max_size);
1075 /* Note: DVB subtitle need one packet to draw them and one other
1076 packet to clear them */
1077 /* XXX: signal it in the codec context ? */
1078 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1083 for(i = 0; i < nb; i++) {
1084 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1085 // start_display_time is required to be 0
1086 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1087 sub->end_display_time -= sub->start_display_time;
1088 sub->start_display_time = 0;
1089 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1090 subtitle_out_max_size, sub);
1091 if (subtitle_out_size < 0) {
1092 fprintf(stderr, "Subtitle encoding failed\n");
1096 av_init_packet(&pkt);
1097 pkt.stream_index = ost->index;
1098 pkt.data = subtitle_out;
1099 pkt.size = subtitle_out_size;
1100 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1101 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1102 /* XXX: the pts correction is handled here. Maybe handling
1103 it in the codec would be better */
1105 pkt.pts += 90 * sub->start_display_time;
1107 pkt.pts += 90 * sub->end_display_time;
1109 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1113 static int bit_buffer_size= 1024*256;
1114 static uint8_t *bit_buffer= NULL;
1116 static void do_video_out(AVFormatContext *s,
1117 AVOutputStream *ost,
1119 AVFrame *in_picture,
1122 int nb_frames, i, ret, resample_changed;
1123 AVFrame *final_picture, *formatted_picture;
1124 AVCodecContext *enc, *dec;
1127 enc = ost->st->codec;
1128 dec = ist->st->codec;
1130 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1132 /* by default, we output a single frame */
1137 if(video_sync_method){
1138 double vdelta = sync_ipts - ost->sync_opts;
1139 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1142 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1145 }else if(vdelta>0.6)
1146 ost->sync_opts= lrintf(sync_ipts);
1147 }else if (vdelta > 1.1)
1148 nb_frames = lrintf(vdelta);
1149 //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);
1150 if (nb_frames == 0){
1153 fprintf(stderr, "*** drop!\n");
1154 }else if (nb_frames > 1) {
1155 nb_frames_dup += nb_frames - 1;
1157 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1160 ost->sync_opts= lrintf(sync_ipts);
1162 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1166 formatted_picture = in_picture;
1167 final_picture = formatted_picture;
1169 resample_changed = ost->resample_width != dec->width ||
1170 ost->resample_height != dec->height ||
1171 ost->resample_pix_fmt != dec->pix_fmt;
1173 if (resample_changed) {
1174 av_log(NULL, AV_LOG_INFO,
1175 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1176 ist->file_index, ist->st->index,
1177 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1178 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1179 if(!ost->video_resample)
1183 #if !CONFIG_AVFILTER
1184 if (ost->video_resample) {
1185 final_picture = &ost->pict_tmp;
1186 if (resample_changed) {
1187 /* initialize a new scaler context */
1188 sws_freeContext(ost->img_resample_ctx);
1189 ost->img_resample_ctx = sws_getContext(
1190 ist->st->codec->width,
1191 ist->st->codec->height,
1192 ist->st->codec->pix_fmt,
1193 ost->st->codec->width,
1194 ost->st->codec->height,
1195 ost->st->codec->pix_fmt,
1196 ost->sws_flags, NULL, NULL, NULL);
1197 if (ost->img_resample_ctx == NULL) {
1198 fprintf(stderr, "Cannot get resampling context\n");
1202 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1203 0, ost->resample_height, final_picture->data, final_picture->linesize);
1207 /* duplicates frame if needed */
1208 for(i=0;i<nb_frames;i++) {
1210 av_init_packet(&pkt);
1211 pkt.stream_index= ost->index;
1213 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1214 /* raw pictures are written as AVPicture structure to
1215 avoid any copies. We support temorarily the older
1217 AVFrame* old_frame = enc->coded_frame;
1218 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1219 pkt.data= (uint8_t *)final_picture;
1220 pkt.size= sizeof(AVPicture);
1221 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1222 pkt.flags |= AV_PKT_FLAG_KEY;
1224 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1225 enc->coded_frame = old_frame;
1227 AVFrame big_picture;
1229 big_picture= *final_picture;
1230 /* better than nothing: use input picture interlaced
1232 big_picture.interlaced_frame = in_picture->interlaced_frame;
1233 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1234 if(top_field_first == -1)
1235 big_picture.top_field_first = in_picture->top_field_first;
1237 big_picture.top_field_first = top_field_first;
1240 /* handles sameq here. This is not correct because it may
1241 not be a global option */
1242 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1244 big_picture.pict_type = 0;
1245 // big_picture.pts = AV_NOPTS_VALUE;
1246 big_picture.pts= ost->sync_opts;
1247 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1248 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1249 if (ost->forced_kf_index < ost->forced_kf_count &&
1250 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1251 big_picture.pict_type = AV_PICTURE_TYPE_I;
1252 ost->forced_kf_index++;
1254 ret = avcodec_encode_video(enc,
1255 bit_buffer, bit_buffer_size,
1258 fprintf(stderr, "Video encoding failed\n");
1263 pkt.data= bit_buffer;
1265 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1266 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1267 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1268 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1269 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1271 if(enc->coded_frame->key_frame)
1272 pkt.flags |= AV_PKT_FLAG_KEY;
1273 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1276 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1277 // enc->frame_number-1, ret, enc->pict_type);
1278 /* if two pass, output log */
1279 if (ost->logfile && enc->stats_out) {
1280 fprintf(ost->logfile, "%s", enc->stats_out);
1285 ost->frame_number++;
1289 static double psnr(double d){
1290 return -10.0*log(d)/log(10.0);
1293 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1296 AVCodecContext *enc;
1298 double ti1, bitrate, avg_bitrate;
1300 /* this is executed just the first time do_video_stats is called */
1302 vstats_file = fopen(vstats_filename, "w");
1309 enc = ost->st->codec;
1310 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1311 frame_number = ost->frame_number;
1312 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1313 if (enc->flags&CODEC_FLAG_PSNR)
1314 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1316 fprintf(vstats_file,"f_size= %6d ", frame_size);
1317 /* compute pts value */
1318 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1322 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1323 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1324 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1325 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1326 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1330 static void print_report(AVFormatContext **output_files,
1331 AVOutputStream **ost_table, int nb_ostreams,
1335 AVOutputStream *ost;
1336 AVFormatContext *oc;
1338 AVCodecContext *enc;
1339 int frame_number, vid, i;
1340 double bitrate, ti1, pts;
1341 static int64_t last_time = -1;
1342 static int qp_histogram[52];
1344 if (!is_last_report) {
1346 /* display the report every 0.5 seconds */
1347 cur_time = av_gettime();
1348 if (last_time == -1) {
1349 last_time = cur_time;
1352 if ((cur_time - last_time) < 500000)
1354 last_time = cur_time;
1358 oc = output_files[0];
1360 total_size = avio_size(oc->pb);
1361 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1362 total_size= avio_tell(oc->pb);
1367 for(i=0;i<nb_ostreams;i++) {
1370 enc = ost->st->codec;
1371 if (!ost->st->stream_copy && enc->coded_frame)
1372 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1373 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1376 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1377 float t = (av_gettime()-timer_start) / 1000000.0;
1379 frame_number = ost->frame_number;
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1381 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1383 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1387 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1392 if (enc->flags&CODEC_FLAG_PSNR){
1394 double error, error_sum=0;
1395 double scale, scale_sum=0;
1396 char type[3]= {'Y','U','V'};
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1400 error= enc->error[j];
1401 scale= enc->width*enc->height*255.0*255.0*frame_number;
1403 error= enc->coded_frame->error[j];
1404 scale= enc->width*enc->height*255.0*255.0;
1409 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1411 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1415 /* compute min output value */
1416 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1417 if ((pts < ti1) && (pts > 0))
1423 if (verbose > 0 || is_last_report) {
1424 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1426 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1427 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1428 (double)total_size / 1024, ti1, bitrate);
1430 if (nb_frames_dup || nb_frames_drop)
1431 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1432 nb_frames_dup, nb_frames_drop);
1435 fprintf(stderr, "%s \r", buf);
1440 if (is_last_report && verbose >= 0){
1441 int64_t raw= audio_size + video_size + extra_size;
1442 fprintf(stderr, "\n");
1443 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1447 100.0*(total_size - raw)/raw
1452 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1454 int fill_char = 0x00;
1455 if (sample_fmt == AV_SAMPLE_FMT_U8)
1457 memset(buf, fill_char, size);
1460 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1461 static int output_packet(AVInputStream *ist, int ist_index,
1462 AVOutputStream **ost_table, int nb_ostreams,
1463 const AVPacket *pkt)
1465 AVFormatContext *os;
1466 AVOutputStream *ost;
1470 void *buffer_to_free = NULL;
1471 static unsigned int samples_size= 0;
1472 AVSubtitle subtitle, *subtitle_to_free;
1473 int64_t pkt_pts = AV_NOPTS_VALUE;
1475 int frame_available;
1479 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1481 if(ist->next_pts == AV_NOPTS_VALUE)
1482 ist->next_pts= ist->pts;
1486 av_init_packet(&avpkt);
1494 if(pkt->dts != AV_NOPTS_VALUE)
1495 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1496 if(pkt->pts != AV_NOPTS_VALUE)
1497 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1499 //while we have more to decode or while the decoder did output something on EOF
1500 while (avpkt.size > 0 || (!pkt && got_output)) {
1501 uint8_t *data_buf, *decoded_data_buf;
1502 int data_size, decoded_data_size;
1504 ist->pts= ist->next_pts;
1506 if(avpkt.size && avpkt.size != pkt->size &&
1507 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1508 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1509 ist->showed_multi_packet_warning=1;
1512 /* decode the packet if needed */
1513 decoded_data_buf = NULL; /* fail safe */
1514 decoded_data_size= 0;
1515 data_buf = avpkt.data;
1516 data_size = avpkt.size;
1517 subtitle_to_free = NULL;
1518 if (ist->decoding_needed) {
1519 switch(ist->st->codec->codec_type) {
1520 case AVMEDIA_TYPE_AUDIO:{
1521 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1522 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1524 samples= av_malloc(samples_size);
1526 decoded_data_size= samples_size;
1527 /* XXX: could avoid copy if PCM 16 bits with same
1528 endianness as CPU */
1529 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1536 got_output = decoded_data_size > 0;
1537 /* Some bug in mpeg audio decoder gives */
1538 /* decoded_data_size < 0, it seems they are overflows */
1540 /* no audio frame */
1543 decoded_data_buf = (uint8_t *)samples;
1544 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1545 (ist->st->codec->sample_rate * ist->st->codec->channels);
1547 case AVMEDIA_TYPE_VIDEO:
1548 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1549 /* XXX: allocate picture correctly */
1550 avcodec_get_frame_defaults(&picture);
1551 avpkt.pts = pkt_pts;
1552 avpkt.dts = ist->pts;
1553 pkt_pts = AV_NOPTS_VALUE;
1555 ret = avcodec_decode_video2(ist->st->codec,
1556 &picture, &got_output, &avpkt);
1557 ist->st->quality= picture.quality;
1561 /* no picture yet */
1562 goto discard_packet;
1564 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1565 if (ist->st->codec->time_base.num != 0) {
1566 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1567 ist->next_pts += ((int64_t)AV_TIME_BASE *
1568 ist->st->codec->time_base.num * ticks) /
1569 ist->st->codec->time_base.den;
1572 buffer_to_free = NULL;
1573 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1575 case AVMEDIA_TYPE_SUBTITLE:
1576 ret = avcodec_decode_subtitle2(ist->st->codec,
1577 &subtitle, &got_output, &avpkt);
1581 goto discard_packet;
1583 subtitle_to_free = &subtitle;
1590 switch(ist->st->codec->codec_type) {
1591 case AVMEDIA_TYPE_AUDIO:
1592 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1593 ist->st->codec->sample_rate;
1595 case AVMEDIA_TYPE_VIDEO:
1596 if (ist->st->codec->time_base.num != 0) {
1597 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1598 ist->next_pts += ((int64_t)AV_TIME_BASE *
1599 ist->st->codec->time_base.num * ticks) /
1600 ist->st->codec->time_base.den;
1609 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1610 for (i = 0; i < nb_ostreams; i++) {
1612 if (ost->input_video_filter && ost->source_index == ist_index) {
1614 if (ist->st->sample_aspect_ratio.num)
1615 sar = ist->st->sample_aspect_ratio;
1617 sar = ist->st->codec->sample_aspect_ratio;
1618 // add it to be filtered
1619 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1627 // preprocess audio (volume)
1628 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1629 if (audio_volume != 256) {
1632 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1633 int v = ((*volp) * audio_volume + 128) >> 8;
1634 if (v < -32768) v = -32768;
1635 if (v > 32767) v = 32767;
1641 /* frame rate emulation */
1643 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1644 int64_t now = av_gettime() - ist->start;
1648 /* if output time reached then transcode raw format,
1649 encode packets and output them */
1650 if (start_time == 0 || ist->pts >= start_time)
1651 for(i=0;i<nb_ostreams;i++) {
1655 if (ost->source_index == ist_index) {
1657 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1658 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1659 while (frame_available) {
1660 AVRational ist_pts_tb;
1661 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1662 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1664 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1666 os = output_files[ost->file_index];
1668 /* set the input output pts pairs */
1669 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1671 if (ost->encoding_needed) {
1672 av_assert0(ist->decoding_needed);
1673 switch(ost->st->codec->codec_type) {
1674 case AVMEDIA_TYPE_AUDIO:
1675 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1677 case AVMEDIA_TYPE_VIDEO:
1679 if (ost->picref->video && !ost->frame_aspect_ratio)
1680 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1682 do_video_out(os, ost, ist, &picture, &frame_size);
1683 if (vstats_filename && frame_size)
1684 do_video_stats(os, ost, frame_size);
1686 case AVMEDIA_TYPE_SUBTITLE:
1687 do_subtitle_out(os, ost, ist, &subtitle,
1694 AVFrame avframe; //FIXME/XXX remove this
1696 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1698 av_init_packet(&opkt);
1700 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1701 #if !CONFIG_AVFILTER
1707 /* no reencoding needed : output the packet directly */
1708 /* force the input stream PTS */
1710 avcodec_get_frame_defaults(&avframe);
1711 ost->st->codec->coded_frame= &avframe;
1712 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1714 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1715 audio_size += data_size;
1716 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1717 video_size += data_size;
1721 opkt.stream_index= ost->index;
1722 if(pkt->pts != AV_NOPTS_VALUE)
1723 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1725 opkt.pts= AV_NOPTS_VALUE;
1727 if (pkt->dts == AV_NOPTS_VALUE)
1728 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1730 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1731 opkt.dts -= ost_tb_start_time;
1733 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1734 opkt.flags= pkt->flags;
1736 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1737 if( ost->st->codec->codec_id != CODEC_ID_H264
1738 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1739 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1741 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1742 opkt.destruct= av_destruct_packet;
1744 opkt.data = data_buf;
1745 opkt.size = data_size;
1748 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1749 ost->st->codec->frame_number++;
1750 ost->frame_number++;
1751 av_free_packet(&opkt);
1755 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1756 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1758 avfilter_unref_buffer(ost->picref);
1764 av_free(buffer_to_free);
1765 /* XXX: allocate the subtitles in the codec ? */
1766 if (subtitle_to_free) {
1767 avsubtitle_free(subtitle_to_free);
1768 subtitle_to_free = NULL;
1775 for(i=0;i<nb_ostreams;i++) {
1777 if (ost->source_index == ist_index) {
1778 AVCodecContext *enc= ost->st->codec;
1779 os = output_files[ost->file_index];
1781 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1783 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1786 if (ost->encoding_needed) {
1790 av_init_packet(&pkt);
1791 pkt.stream_index= ost->index;
1793 switch(ost->st->codec->codec_type) {
1794 case AVMEDIA_TYPE_AUDIO:
1795 fifo_bytes = av_fifo_size(ost->fifo);
1797 /* encode any samples remaining in fifo */
1798 if (fifo_bytes > 0) {
1799 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1800 int fs_tmp = enc->frame_size;
1802 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1803 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1804 enc->frame_size = fifo_bytes / (osize * enc->channels);
1806 int frame_bytes = enc->frame_size*osize*enc->channels;
1807 if (allocated_audio_buf_size < frame_bytes)
1809 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1812 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1813 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1814 ost->st->time_base.num, enc->sample_rate);
1815 enc->frame_size = fs_tmp;
1818 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1821 fprintf(stderr, "Audio encoding failed\n");
1825 pkt.flags |= AV_PKT_FLAG_KEY;
1827 case AVMEDIA_TYPE_VIDEO:
1828 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1830 fprintf(stderr, "Video encoding failed\n");
1834 if(enc->coded_frame && enc->coded_frame->key_frame)
1835 pkt.flags |= AV_PKT_FLAG_KEY;
1836 if (ost->logfile && enc->stats_out) {
1837 fprintf(ost->logfile, "%s", enc->stats_out);
1846 pkt.data= bit_buffer;
1848 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1849 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1850 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1862 static void print_sdp(AVFormatContext **avc, int n)
1866 av_sdp_create(avc, n, sdp, sizeof(sdp));
1867 printf("SDP:\n%s\n", sdp);
1871 static int copy_chapters(int infile, int outfile)
1873 AVFormatContext *is = input_files[infile].ctx;
1874 AVFormatContext *os = output_files[outfile];
1877 for (i = 0; i < is->nb_chapters; i++) {
1878 AVChapter *in_ch = is->chapters[i], *out_ch;
1879 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1880 AV_TIME_BASE_Q, in_ch->time_base);
1881 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1882 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1885 if (in_ch->end < ts_off)
1887 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1890 out_ch = av_mallocz(sizeof(AVChapter));
1892 return AVERROR(ENOMEM);
1894 out_ch->id = in_ch->id;
1895 out_ch->time_base = in_ch->time_base;
1896 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1897 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1899 if (metadata_chapters_autocopy)
1900 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1903 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1905 return AVERROR(ENOMEM);
1906 os->chapters[os->nb_chapters - 1] = out_ch;
1911 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1912 AVCodecContext *avctx)
1918 for (p = kf; *p; p++)
1921 ost->forced_kf_count = n;
1922 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1923 if (!ost->forced_kf_pts) {
1924 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1927 for (i = 0; i < n; i++) {
1928 p = i ? strchr(p, ',') + 1 : kf;
1929 t = parse_time_or_die("force_key_frames", p, 1);
1930 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1935 * The following code is the main loop of the file converter
1937 static int transcode(AVFormatContext **output_files,
1938 int nb_output_files,
1939 AVInputFile *input_files,
1941 AVStreamMap *stream_maps, int nb_stream_maps)
1943 int ret = 0, i, j, k, n, nb_ostreams = 0;
1944 AVFormatContext *is, *os;
1945 AVCodecContext *codec, *icodec;
1946 AVOutputStream *ost, **ost_table = NULL;
1950 uint8_t no_packet[MAX_FILES]={0};
1951 int no_packet_count=0;
1954 for (i = 0; i < nb_input_streams; i++)
1955 input_streams[i].start = av_gettime();
1957 /* output stream init */
1959 for(i=0;i<nb_output_files;i++) {
1960 os = output_files[i];
1961 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1962 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1963 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1964 ret = AVERROR(EINVAL);
1967 nb_ostreams += os->nb_streams;
1969 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1970 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1971 ret = AVERROR(EINVAL);
1975 /* Sanity check the mapping args -- do the input files & streams exist? */
1976 for(i=0;i<nb_stream_maps;i++) {
1977 int fi = stream_maps[i].file_index;
1978 int si = stream_maps[i].stream_index;
1980 if (fi < 0 || fi > nb_input_files - 1 ||
1981 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
1982 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1983 ret = AVERROR(EINVAL);
1986 fi = stream_maps[i].sync_file_index;
1987 si = stream_maps[i].sync_stream_index;
1988 if (fi < 0 || fi > nb_input_files - 1 ||
1989 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
1990 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1991 ret = AVERROR(EINVAL);
1996 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2000 for(k=0;k<nb_output_files;k++) {
2001 os = output_files[k];
2002 for(i=0;i<os->nb_streams;i++,n++) {
2004 ost = ost_table[n] = output_streams_for_file[k][i];
2005 ost->st = os->streams[i];
2006 if (nb_stream_maps > 0) {
2007 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2008 stream_maps[n].stream_index;
2010 /* Sanity check that the stream types match */
2011 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2012 int i= ost->file_index;
2013 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2014 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2015 stream_maps[n].file_index, stream_maps[n].stream_index,
2016 ost->file_index, ost->index);
2021 int best_nb_frames=-1;
2022 /* get corresponding input stream index : we select the first one with the right type */
2024 for (j = 0; j < nb_input_streams; j++) {
2026 ist = &input_streams[j];
2029 AVFormatContext *f = input_files[ist->file_index].ctx;
2031 for(pi=0; pi<f->nb_programs; pi++){
2032 AVProgram *p= f->programs[pi];
2033 if(p->id == opt_programid)
2034 for(si=0; si<p->nb_stream_indexes; si++){
2035 if(f->streams[ p->stream_index[si] ] == ist->st)
2040 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2041 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2042 if(best_nb_frames < ist->st->codec_info_nb_frames){
2043 best_nb_frames= ist->st->codec_info_nb_frames;
2044 ost->source_index = j;
2051 if(! opt_programid) {
2052 /* try again and reuse existing stream */
2053 for (j = 0; j < nb_input_streams; j++) {
2054 ist = &input_streams[j];
2055 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2056 && ist->st->discard != AVDISCARD_ALL) {
2057 ost->source_index = j;
2063 int i= ost->file_index;
2064 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2065 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2066 ost->file_index, ost->index);
2071 ist = &input_streams[ost->source_index];
2073 ost->sync_ist = (nb_stream_maps > 0) ?
2074 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2075 stream_maps[n].sync_stream_index] : ist;
2079 /* for each output stream, we compute the right encoding parameters */
2080 for(i=0;i<nb_ostreams;i++) {
2082 os = output_files[ost->file_index];
2083 ist = &input_streams[ost->source_index];
2085 codec = ost->st->codec;
2086 icodec = ist->st->codec;
2088 if (metadata_streams_autocopy)
2089 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2090 AV_DICT_DONT_OVERWRITE);
2092 ost->st->disposition = ist->st->disposition;
2093 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2094 codec->chroma_sample_location = icodec->chroma_sample_location;
2096 if (ost->st->stream_copy) {
2097 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2099 if (extra_size > INT_MAX)
2102 /* if stream_copy is selected, no need to decode or encode */
2103 codec->codec_id = icodec->codec_id;
2104 codec->codec_type = icodec->codec_type;
2106 if(!codec->codec_tag){
2107 if( !os->oformat->codec_tag
2108 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2109 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2110 codec->codec_tag = icodec->codec_tag;
2113 codec->bit_rate = icodec->bit_rate;
2114 codec->rc_max_rate = icodec->rc_max_rate;
2115 codec->rc_buffer_size = icodec->rc_buffer_size;
2116 codec->extradata= av_mallocz(extra_size);
2117 if (!codec->extradata)
2119 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2120 codec->extradata_size= icodec->extradata_size;
2121 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){
2122 codec->time_base = icodec->time_base;
2123 codec->time_base.num *= icodec->ticks_per_frame;
2124 av_reduce(&codec->time_base.num, &codec->time_base.den,
2125 codec->time_base.num, codec->time_base.den, INT_MAX);
2127 codec->time_base = ist->st->time_base;
2128 switch(codec->codec_type) {
2129 case AVMEDIA_TYPE_AUDIO:
2130 if(audio_volume != 256) {
2131 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2134 codec->channel_layout = icodec->channel_layout;
2135 codec->sample_rate = icodec->sample_rate;
2136 codec->channels = icodec->channels;
2137 codec->frame_size = icodec->frame_size;
2138 codec->audio_service_type = icodec->audio_service_type;
2139 codec->block_align= icodec->block_align;
2140 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2141 codec->block_align= 0;
2142 if(codec->codec_id == CODEC_ID_AC3)
2143 codec->block_align= 0;
2145 case AVMEDIA_TYPE_VIDEO:
2146 codec->pix_fmt = icodec->pix_fmt;
2147 codec->width = icodec->width;
2148 codec->height = icodec->height;
2149 codec->has_b_frames = icodec->has_b_frames;
2150 if (!codec->sample_aspect_ratio.num) {
2151 codec->sample_aspect_ratio =
2152 ost->st->sample_aspect_ratio =
2153 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2154 ist->st->codec->sample_aspect_ratio.num ?
2155 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2158 case AVMEDIA_TYPE_SUBTITLE:
2159 codec->width = icodec->width;
2160 codec->height = icodec->height;
2162 case AVMEDIA_TYPE_DATA:
2168 switch(codec->codec_type) {
2169 case AVMEDIA_TYPE_AUDIO:
2170 ost->fifo= av_fifo_alloc(1024);
2173 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2174 if (!codec->sample_rate) {
2175 codec->sample_rate = icodec->sample_rate;
2177 codec->sample_rate >>= icodec->lowres;
2179 choose_sample_rate(ost->st, codec->codec);
2180 codec->time_base = (AVRational){1, codec->sample_rate};
2181 if (!codec->channels)
2182 codec->channels = icodec->channels;
2183 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2184 codec->channel_layout = 0;
2185 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2186 icodec->request_channels = codec->channels;
2187 ist->decoding_needed = 1;
2188 ost->encoding_needed = 1;
2189 ost->resample_sample_fmt = icodec->sample_fmt;
2190 ost->resample_sample_rate = icodec->sample_rate;
2191 ost->resample_channels = icodec->channels;
2193 case AVMEDIA_TYPE_VIDEO:
2194 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2195 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2198 ost->video_resample = codec->width != icodec->width ||
2199 codec->height != icodec->height ||
2200 codec->pix_fmt != icodec->pix_fmt;
2201 if (ost->video_resample) {
2202 #if !CONFIG_AVFILTER
2203 avcodec_get_frame_defaults(&ost->pict_tmp);
2204 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2205 codec->width, codec->height)) {
2206 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2209 ost->img_resample_ctx = sws_getContext(
2216 ost->sws_flags, NULL, NULL, NULL);
2217 if (ost->img_resample_ctx == NULL) {
2218 fprintf(stderr, "Cannot get resampling context\n");
2222 codec->bits_per_raw_sample= 0;
2224 ost->resample_height = icodec->height;
2225 ost->resample_width = icodec->width;
2226 ost->resample_pix_fmt= icodec->pix_fmt;
2227 ost->encoding_needed = 1;
2228 ist->decoding_needed = 1;
2230 if (!ost->frame_rate.num)
2231 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2232 if (codec->codec && codec->codec->supported_framerates && !force_fps) {
2233 int idx = av_find_nearest_q_idx(ost->frame_rate, codec->codec->supported_framerates);
2234 ost->frame_rate = codec->codec->supported_framerates[idx];
2236 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2239 if (configure_video_filters(ist, ost)) {
2240 fprintf(stderr, "Error opening filters!\n");
2245 case AVMEDIA_TYPE_SUBTITLE:
2246 ost->encoding_needed = 1;
2247 ist->decoding_needed = 1;
2254 if (ost->encoding_needed &&
2255 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2256 char logfilename[1024];
2259 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2260 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2262 if (codec->flags & CODEC_FLAG_PASS1) {
2263 f = fopen(logfilename, "wb");
2265 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2271 size_t logbuffer_size;
2272 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2273 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2276 codec->stats_in = logbuffer;
2280 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2281 int size= codec->width * codec->height;
2282 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2287 bit_buffer = av_malloc(bit_buffer_size);
2289 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2291 ret = AVERROR(ENOMEM);
2295 /* open each encoder */
2296 for(i=0;i<nb_ostreams;i++) {
2298 if (ost->encoding_needed) {
2299 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2300 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2302 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2304 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2305 ost->st->codec->codec_id, ost->file_index, ost->index);
2306 ret = AVERROR(EINVAL);
2309 if (dec->subtitle_header) {
2310 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2311 if (!ost->st->codec->subtitle_header) {
2312 ret = AVERROR(ENOMEM);
2315 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2316 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2318 if (avcodec_open(ost->st->codec, codec) < 0) {
2319 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2320 ost->file_index, ost->index);
2321 ret = AVERROR(EINVAL);
2324 extra_size += ost->st->codec->extradata_size;
2328 /* open each decoder */
2329 for (i = 0; i < nb_input_streams; i++) {
2330 ist = &input_streams[i];
2331 if (ist->decoding_needed) {
2332 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2334 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2336 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2337 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2338 ret = AVERROR(EINVAL);
2342 /* update requested sample format for the decoder based on the
2343 corresponding encoder sample format */
2344 for (j = 0; j < nb_ostreams; j++) {
2346 if (ost->source_index == i) {
2347 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2352 if (avcodec_open(ist->st->codec, codec) < 0) {
2353 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2354 ist->file_index, ist->st->index);
2355 ret = AVERROR(EINVAL);
2358 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2359 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2364 for (i = 0; i < nb_input_streams; i++) {
2366 ist = &input_streams[i];
2368 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2369 ist->next_pts = AV_NOPTS_VALUE;
2370 init_pts_correction(&ist->pts_ctx);
2374 /* set meta data information from input file if required */
2375 for (i=0;i<nb_meta_data_maps;i++) {
2376 AVFormatContext *files[2];
2377 AVDictionary **meta[2];
2380 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2381 if ((index) < 0 || (index) >= (nb_elems)) {\
2382 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2384 ret = AVERROR(EINVAL);\
2388 int out_file_index = meta_data_maps[i][0].file;
2389 int in_file_index = meta_data_maps[i][1].file;
2390 if (in_file_index < 0 || out_file_index < 0)
2392 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2393 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2395 files[0] = output_files[out_file_index];
2396 files[1] = input_files[in_file_index].ctx;
2398 for (j = 0; j < 2; j++) {
2399 AVMetaDataMap *map = &meta_data_maps[i][j];
2401 switch (map->type) {
2403 meta[j] = &files[j]->metadata;
2406 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2407 meta[j] = &files[j]->streams[map->index]->metadata;
2410 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2411 meta[j] = &files[j]->chapters[map->index]->metadata;
2414 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2415 meta[j] = &files[j]->programs[map->index]->metadata;
2420 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2423 /* copy global metadata by default */
2424 if (metadata_global_autocopy) {
2426 for (i = 0; i < nb_output_files; i++)
2427 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2428 AV_DICT_DONT_OVERWRITE);
2431 /* copy chapters according to chapter maps */
2432 for (i = 0; i < nb_chapter_maps; i++) {
2433 int infile = chapter_maps[i].in_file;
2434 int outfile = chapter_maps[i].out_file;
2436 if (infile < 0 || outfile < 0)
2438 if (infile >= nb_input_files) {
2439 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2440 ret = AVERROR(EINVAL);
2443 if (outfile >= nb_output_files) {
2444 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2445 ret = AVERROR(EINVAL);
2448 copy_chapters(infile, outfile);
2451 /* copy chapters from the first input file that has them*/
2452 if (!nb_chapter_maps)
2453 for (i = 0; i < nb_input_files; i++) {
2454 if (!input_files[i].ctx->nb_chapters)
2457 for (j = 0; j < nb_output_files; j++)
2458 if ((ret = copy_chapters(i, j)) < 0)
2463 /* open files and write file headers */
2464 for(i=0;i<nb_output_files;i++) {
2465 os = output_files[i];
2466 if (av_write_header(os) < 0) {
2467 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2468 ret = AVERROR(EINVAL);
2471 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2477 /* dump the file output parameters - cannot be done before in case
2479 for(i=0;i<nb_output_files;i++) {
2480 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2483 /* dump the stream mapping */
2485 fprintf(stderr, "Stream mapping:\n");
2486 for(i=0;i<nb_ostreams;i++) {
2488 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2489 input_streams[ost->source_index].file_index,
2490 input_streams[ost->source_index].st->index,
2493 if (ost->sync_ist != &input_streams[ost->source_index])
2494 fprintf(stderr, " [sync #%d.%d]",
2495 ost->sync_ist->file_index,
2496 ost->sync_ist->st->index);
2497 fprintf(stderr, "\n");
2502 fprintf(stderr, "%s\n", error);
2507 print_sdp(output_files, nb_output_files);
2511 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2514 timer_start = av_gettime();
2516 for(; received_sigterm == 0;) {
2517 int file_index, ist_index;
2526 /* select the stream that we must read now by looking at the
2527 smallest output pts */
2529 for(i=0;i<nb_ostreams;i++) {
2532 os = output_files[ost->file_index];
2533 ist = &input_streams[ost->source_index];
2534 if(ist->is_past_recording_time || no_packet[ist->file_index])
2536 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2537 ipts = (double)ist->pts;
2538 if (!input_files[ist->file_index].eof_reached){
2539 if(ipts < ipts_min) {
2541 if(input_sync ) file_index = ist->file_index;
2543 if(opts < opts_min) {
2545 if(!input_sync) file_index = ist->file_index;
2548 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2553 /* if none, if is finished */
2554 if (file_index < 0) {
2555 if(no_packet_count){
2557 memset(no_packet, 0, sizeof(no_packet));
2564 /* finish if limit size exhausted */
2565 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2568 /* read a frame from it and output it in the fifo */
2569 is = input_files[file_index].ctx;
2570 ret= av_read_frame(is, &pkt);
2571 if(ret == AVERROR(EAGAIN)){
2572 no_packet[file_index]=1;
2577 input_files[file_index].eof_reached = 1;
2585 memset(no_packet, 0, sizeof(no_packet));
2588 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2589 is->streams[pkt.stream_index]);
2591 /* the following test is needed in case new streams appear
2592 dynamically in stream : we ignore them */
2593 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2594 goto discard_packet;
2595 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2596 ist = &input_streams[ist_index];
2598 goto discard_packet;
2600 if (pkt.dts != AV_NOPTS_VALUE)
2601 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2602 if (pkt.pts != AV_NOPTS_VALUE)
2603 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2605 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2606 && input_files_ts_scale[file_index][pkt.stream_index]){
2607 if(pkt.pts != AV_NOPTS_VALUE)
2608 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2609 if(pkt.dts != AV_NOPTS_VALUE)
2610 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2613 // 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);
2614 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2615 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2616 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2617 int64_t delta= pkt_dts - ist->next_pts;
2618 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2619 input_files_ts_offset[ist->file_index]-= delta;
2621 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2622 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2623 if(pkt.pts != AV_NOPTS_VALUE)
2624 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2628 /* finish if recording time exhausted */
2629 if (recording_time != INT64_MAX &&
2630 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2631 ist->is_past_recording_time = 1;
2632 goto discard_packet;
2635 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2636 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2639 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2640 ist->file_index, ist->st->index);
2643 av_free_packet(&pkt);
2648 av_free_packet(&pkt);
2650 /* dump report by using the output first video and audio streams */
2651 print_report(output_files, ost_table, nb_ostreams, 0);
2654 /* at the end of stream, we must flush the decoder buffers */
2655 for (i = 0; i < nb_input_streams; i++) {
2656 ist = &input_streams[i];
2657 if (ist->decoding_needed) {
2658 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2664 /* write the trailer if needed and close file */
2665 for(i=0;i<nb_output_files;i++) {
2666 os = output_files[i];
2667 av_write_trailer(os);
2670 /* dump report by using the first video and audio streams */
2671 print_report(output_files, ost_table, nb_ostreams, 1);
2673 /* close each encoder */
2674 for(i=0;i<nb_ostreams;i++) {
2676 if (ost->encoding_needed) {
2677 av_freep(&ost->st->codec->stats_in);
2678 avcodec_close(ost->st->codec);
2681 avfilter_graph_free(&ost->graph);
2685 /* close each decoder */
2686 for (i = 0; i < nb_input_streams; i++) {
2687 ist = &input_streams[i];
2688 if (ist->decoding_needed) {
2689 avcodec_close(ist->st->codec);
2697 av_freep(&bit_buffer);
2700 for(i=0;i<nb_ostreams;i++) {
2703 if (ost->st->stream_copy)
2704 av_freep(&ost->st->codec->extradata);
2706 fclose(ost->logfile);
2707 ost->logfile = NULL;
2709 av_fifo_free(ost->fifo); /* works even if fifo is not
2710 initialized but set to zero */
2711 av_freep(&ost->st->codec->subtitle_header);
2712 av_free(ost->pict_tmp.data[0]);
2713 av_free(ost->forced_kf_pts);
2714 if (ost->video_resample)
2715 sws_freeContext(ost->img_resample_ctx);
2717 audio_resample_close(ost->resample);
2718 if (ost->reformat_ctx)
2719 av_audio_convert_free(ost->reformat_ctx);
2728 static int opt_format(const char *opt, const char *arg)
2730 last_asked_format = arg;
2734 static int opt_video_rc_override_string(const char *opt, const char *arg)
2736 video_rc_override_string = arg;
2740 static int opt_me_threshold(const char *opt, const char *arg)
2742 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2746 static int opt_verbose(const char *opt, const char *arg)
2748 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2752 static int opt_frame_rate(const char *opt, const char *arg)
2754 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2755 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2761 static int opt_bitrate(const char *opt, const char *arg)
2763 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2765 opt_default(opt, arg);
2767 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2768 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2773 static int opt_frame_crop(const char *opt, const char *arg)
2775 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2776 return AVERROR(EINVAL);
2779 static int opt_frame_size(const char *opt, const char *arg)
2781 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2782 fprintf(stderr, "Incorrect frame size\n");
2783 return AVERROR(EINVAL);
2788 static int opt_pad(const char *opt, const char *arg) {
2789 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2793 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2795 if (strcmp(arg, "list")) {
2796 frame_pix_fmt = av_get_pix_fmt(arg);
2797 if (frame_pix_fmt == PIX_FMT_NONE) {
2798 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2799 return AVERROR(EINVAL);
2808 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2815 p = strchr(arg, ':');
2817 x = strtol(arg, &end, 10);
2819 y = strtol(end+1, &end, 10);
2821 ar = (double)x / (double)y;
2823 ar = strtod(arg, NULL);
2826 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2827 return AVERROR(EINVAL);
2829 frame_aspect_ratio = ar;
2833 static int opt_metadata(const char *opt, const char *arg)
2835 char *mid= strchr(arg, '=');
2838 fprintf(stderr, "Missing =\n");
2843 av_dict_set(&metadata, arg, mid, 0);
2848 static int opt_qscale(const char *opt, const char *arg)
2850 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2851 if (video_qscale == 0) {
2852 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2853 return AVERROR(EINVAL);
2858 static int opt_top_field_first(const char *opt, const char *arg)
2860 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2864 static int opt_thread_count(const char *opt, const char *arg)
2866 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2869 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2874 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2876 if (strcmp(arg, "list")) {
2877 audio_sample_fmt = av_get_sample_fmt(arg);
2878 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2879 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2880 return AVERROR(EINVAL);
2885 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2886 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2892 static int opt_audio_rate(const char *opt, const char *arg)
2894 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2898 static int opt_audio_channels(const char *opt, const char *arg)
2900 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2904 static int opt_video_channel(const char *opt, const char *arg)
2906 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2910 static int opt_video_standard(const char *opt, const char *arg)
2912 video_standard = av_strdup(arg);
2916 static int opt_codec(int *pstream_copy, char **pcodec_name,
2917 int codec_type, const char *arg)
2919 av_freep(pcodec_name);
2920 if (!strcmp(arg, "copy")) {
2923 *pcodec_name = av_strdup(arg);
2928 static int opt_audio_codec(const char *opt, const char *arg)
2930 return opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2933 static int opt_video_codec(const char *opt, const char *arg)
2935 return opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2938 static int opt_subtitle_codec(const char *opt, const char *arg)
2940 return opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2943 static int opt_data_codec(const char *opt, const char *arg)
2945 return opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2948 static int opt_codec_tag(const char *opt, const char *arg)
2951 uint32_t *codec_tag;
2953 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2954 !strcmp(opt, "vtag") ? &video_codec_tag :
2955 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2959 *codec_tag = strtol(arg, &tail, 0);
2961 *codec_tag = AV_RL32(arg);
2966 static int opt_map(const char *opt, const char *arg)
2971 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2972 m = &stream_maps[nb_stream_maps-1];
2974 m->file_index = strtol(arg, &p, 0);
2978 m->stream_index = strtol(p, &p, 0);
2981 m->sync_file_index = strtol(p, &p, 0);
2984 m->sync_stream_index = strtol(p, &p, 0);
2986 m->sync_file_index = m->file_index;
2987 m->sync_stream_index = m->stream_index;
2992 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3003 *index = strtol(++arg, endptr, 0);
3006 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3013 static int opt_map_metadata(const char *opt, const char *arg)
3015 AVMetaDataMap *m, *m1;
3018 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3019 &nb_meta_data_maps, nb_meta_data_maps + 1);
3021 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3022 m->file = strtol(arg, &p, 0);
3023 parse_meta_type(p, &m->type, &m->index, &p);
3027 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3028 m1->file = strtol(p, &p, 0);
3029 parse_meta_type(p, &m1->type, &m1->index, &p);
3031 if (m->type == 'g' || m1->type == 'g')
3032 metadata_global_autocopy = 0;
3033 if (m->type == 's' || m1->type == 's')
3034 metadata_streams_autocopy = 0;
3035 if (m->type == 'c' || m1->type == 'c')
3036 metadata_chapters_autocopy = 0;
3041 static int opt_map_meta_data(const char *opt, const char *arg)
3043 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3044 "Use -map_metadata instead.\n");
3045 return opt_map_metadata(opt, arg);
3048 static int opt_map_chapters(const char *opt, const char *arg)
3053 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3054 nb_chapter_maps + 1);
3055 c = &chapter_maps[nb_chapter_maps - 1];
3056 c->out_file = strtol(arg, &p, 0);
3060 c->in_file = strtol(p, &p, 0);
3064 static int opt_input_ts_scale(const char *opt, const char *arg)
3066 unsigned int stream;
3070 stream = strtol(arg, &p, 0);
3073 scale= strtod(p, &p);
3075 if(stream >= MAX_STREAMS)
3078 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);
3079 input_files_ts_scale[nb_input_files][stream]= scale;
3083 static int opt_recording_time(const char *opt, const char *arg)
3085 recording_time = parse_time_or_die(opt, arg, 1);
3089 static int opt_start_time(const char *opt, const char *arg)
3091 start_time = parse_time_or_die(opt, arg, 1);
3095 static int opt_recording_timestamp(const char *opt, const char *arg)
3097 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3101 static int opt_input_ts_offset(const char *opt, const char *arg)
3103 input_ts_offset = parse_time_or_die(opt, arg, 1);
3107 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3109 const char *codec_string = encoder ? "encoder" : "decoder";
3113 return CODEC_ID_NONE;
3115 avcodec_find_encoder_by_name(name) :
3116 avcodec_find_decoder_by_name(name);
3118 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3121 if(codec->type != type) {
3122 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3125 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3126 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3127 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3128 "results.\nAdd '-strict experimental' if you want to use it.\n",
3129 codec_string, codec->name);
3131 avcodec_find_encoder(codec->id) :
3132 avcodec_find_decoder(codec->id);
3133 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3134 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3135 codec_string, codec->name);
3141 static int opt_input_file(const char *opt, const char *filename)
3143 AVFormatContext *ic;
3144 AVFormatParameters params, *ap = ¶ms;
3145 AVInputFormat *file_iformat = NULL;
3146 int err, i, ret, rfps, rfps_base;
3149 if (last_asked_format) {
3150 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3151 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3154 last_asked_format = NULL;
3157 if (!strcmp(filename, "-"))
3160 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3161 !strcmp(filename, "/dev/stdin");
3163 /* get default parameters from command line */
3164 ic = avformat_alloc_context();
3166 print_error(filename, AVERROR(ENOMEM));
3170 memset(ap, 0, sizeof(*ap));
3171 ap->prealloced_context = 1;
3172 ap->sample_rate = audio_sample_rate;
3173 ap->channels = audio_channels;
3174 ap->time_base.den = frame_rate.num;
3175 ap->time_base.num = frame_rate.den;
3176 ap->width = frame_width;
3177 ap->height = frame_height;
3178 ap->pix_fmt = frame_pix_fmt;
3179 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3180 ap->channel = video_channel;
3181 ap->standard = video_standard;
3183 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3185 ic->video_codec_id =
3186 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3187 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3188 ic->audio_codec_id =
3189 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3190 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3191 ic->subtitle_codec_id=
3192 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3193 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3194 ic->flags |= AVFMT_FLAG_NONBLOCK;
3196 /* open the input file with generic libav function */
3197 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3199 print_error(filename, err);
3205 for(i=0; i<ic->nb_streams; i++){
3206 ic->streams[i]->discard= AVDISCARD_ALL;
3208 for(i=0; i<ic->nb_programs; i++){
3209 AVProgram *p= ic->programs[i];
3210 if(p->id != opt_programid){
3211 p->discard = AVDISCARD_ALL;
3214 for(j=0; j<p->nb_stream_indexes; j++){
3215 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3220 fprintf(stderr, "Specified program id not found\n");
3226 ic->loop_input = loop_input;
3228 /* Set AVCodecContext options so they will be seen by av_find_stream_info() */
3229 for (i = 0; i < ic->nb_streams; i++) {
3230 AVCodecContext *dec = ic->streams[i]->codec;
3231 switch (dec->codec_type) {
3232 case AVMEDIA_TYPE_AUDIO:
3233 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
3234 AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3237 case AVMEDIA_TYPE_VIDEO:
3238 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
3239 AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3245 /* If not enough info to get the stream parameters, we decode the
3246 first frames to get it. (used in mpeg case for example) */
3247 ret = av_find_stream_info(ic);
3248 if (ret < 0 && verbose >= 0) {
3249 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3250 av_close_input_file(ic);
3254 timestamp = start_time;
3255 /* add the stream start time */
3256 if (ic->start_time != AV_NOPTS_VALUE)
3257 timestamp += ic->start_time;
3259 /* if seeking requested, we execute it */
3260 if (start_time != 0) {
3261 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3263 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3264 filename, (double)timestamp / AV_TIME_BASE);
3266 /* reset seek info */
3270 /* update the current parameters so that they match the one of the input stream */
3271 for(i=0;i<ic->nb_streams;i++) {
3272 AVStream *st = ic->streams[i];
3273 AVCodecContext *dec = st->codec;
3276 dec->thread_count = thread_count;
3277 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3279 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3280 ist = &input_streams[nb_input_streams - 1];
3282 ist->file_index = nb_input_files;
3285 switch (dec->codec_type) {
3286 case AVMEDIA_TYPE_AUDIO:
3287 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3288 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]);
3289 channel_layout = dec->channel_layout;
3290 audio_sample_fmt = dec->sample_fmt;
3292 st->discard= AVDISCARD_ALL;
3294 case AVMEDIA_TYPE_VIDEO:
3295 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3296 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]);
3297 frame_height = dec->height;
3298 frame_width = dec->width;
3299 frame_pix_fmt = dec->pix_fmt;
3300 rfps = ic->streams[i]->r_frame_rate.num;
3301 rfps_base = ic->streams[i]->r_frame_rate.den;
3303 dec->flags |= CODEC_FLAG_EMU_EDGE;
3304 frame_height >>= dec->lowres;
3305 frame_width >>= dec->lowres;
3306 dec->height = frame_height;
3307 dec->width = frame_width;
3310 dec->debug |= FF_DEBUG_MV;
3312 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3315 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3316 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3318 (float)rfps / rfps_base, rfps, rfps_base);
3322 st->discard= AVDISCARD_ALL;
3323 else if(video_discard)
3324 st->discard= video_discard;
3326 case AVMEDIA_TYPE_DATA:
3328 case AVMEDIA_TYPE_SUBTITLE:
3329 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3330 if(subtitle_disable)
3331 st->discard = AVDISCARD_ALL;
3333 case AVMEDIA_TYPE_ATTACHMENT:
3334 case AVMEDIA_TYPE_UNKNOWN:
3341 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3342 /* dump the file content */
3344 av_dump_format(ic, nb_input_files, filename, 0);
3346 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3347 input_files[nb_input_files - 1].ctx = ic;
3348 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3351 frame_rate = (AVRational){0, 0};
3352 audio_sample_rate = 0;
3355 av_freep(&video_codec_name);
3356 av_freep(&audio_codec_name);
3357 av_freep(&subtitle_codec_name);
3363 static void check_inputs(int *has_video_ptr,
3365 int *has_subtitle_ptr,
3368 int has_video, has_audio, has_subtitle, has_data, i, j;
3369 AVFormatContext *ic;
3376 for(j=0;j<nb_input_files;j++) {
3377 ic = input_files[j].ctx;
3378 for(i=0;i<ic->nb_streams;i++) {
3379 AVCodecContext *enc = ic->streams[i]->codec;
3380 switch(enc->codec_type) {
3381 case AVMEDIA_TYPE_AUDIO:
3384 case AVMEDIA_TYPE_VIDEO:
3387 case AVMEDIA_TYPE_SUBTITLE:
3390 case AVMEDIA_TYPE_DATA:
3391 case AVMEDIA_TYPE_ATTACHMENT:
3392 case AVMEDIA_TYPE_UNKNOWN:
3400 *has_video_ptr = has_video;
3401 *has_audio_ptr = has_audio;
3402 *has_subtitle_ptr = has_subtitle;
3403 *has_data_ptr = has_data;
3406 static void new_video_stream(AVFormatContext *oc, int file_idx)
3409 AVOutputStream *ost;
3410 AVCodecContext *video_enc;
3411 enum CodecID codec_id = CODEC_ID_NONE;
3412 AVCodec *codec= NULL;
3414 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3416 fprintf(stderr, "Could not alloc stream\n");
3419 ost = new_output_stream(oc, file_idx);
3421 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3422 if(!video_stream_copy){
3423 if (video_codec_name) {
3424 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3425 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3426 codec = avcodec_find_encoder_by_name(video_codec_name);
3427 output_codecs[nb_output_codecs-1] = codec;
3429 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3430 codec = avcodec_find_encoder(codec_id);
3433 ost->frame_aspect_ratio = frame_aspect_ratio;
3434 frame_aspect_ratio = 0;
3436 ost->avfilter= vfilters;
3441 avcodec_get_context_defaults3(st->codec, codec);
3442 ost->bitstream_filters = video_bitstream_filters;
3443 video_bitstream_filters= NULL;
3445 st->codec->thread_count= thread_count;
3447 video_enc = st->codec;
3450 video_enc->codec_tag= video_codec_tag;
3452 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3453 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3454 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3457 if (video_stream_copy) {
3458 st->stream_copy = 1;
3459 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3460 video_enc->sample_aspect_ratio =
3461 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3467 ost->frame_rate = frame_rate;
3468 video_enc->codec_id = codec_id;
3469 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3471 video_enc->width = frame_width;
3472 video_enc->height = frame_height;
3473 video_enc->pix_fmt = frame_pix_fmt;
3474 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3476 choose_pixel_fmt(st, codec);
3479 video_enc->gop_size = 0;
3480 if (video_qscale || same_quality) {
3481 video_enc->flags |= CODEC_FLAG_QSCALE;
3482 video_enc->global_quality=
3483 st->quality = FF_QP2LAMBDA * video_qscale;
3487 video_enc->intra_matrix = intra_matrix;
3489 video_enc->inter_matrix = inter_matrix;
3491 p= video_rc_override_string;
3494 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3496 fprintf(stderr, "error parsing rc_override\n");
3499 video_enc->rc_override=
3500 av_realloc(video_enc->rc_override,
3501 sizeof(RcOverride)*(i+1));
3502 video_enc->rc_override[i].start_frame= start;
3503 video_enc->rc_override[i].end_frame = end;
3505 video_enc->rc_override[i].qscale= q;
3506 video_enc->rc_override[i].quality_factor= 1.0;
3509 video_enc->rc_override[i].qscale= 0;
3510 video_enc->rc_override[i].quality_factor= -q/100.0;
3515 video_enc->rc_override_count=i;
3516 if (!video_enc->rc_initial_buffer_occupancy)
3517 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3518 video_enc->me_threshold= me_threshold;
3519 video_enc->intra_dc_precision= intra_dc_precision - 8;
3522 video_enc->flags|= CODEC_FLAG_PSNR;
3527 video_enc->flags |= CODEC_FLAG_PASS1;
3529 video_enc->flags |= CODEC_FLAG_PASS2;
3533 if (forced_key_frames)
3534 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3536 if (video_language) {
3537 av_dict_set(&st->metadata, "language", video_language, 0);
3538 av_freep(&video_language);
3541 /* reset some key parameters */
3543 av_freep(&video_codec_name);
3544 av_freep(&forced_key_frames);
3545 video_stream_copy = 0;
3546 frame_pix_fmt = PIX_FMT_NONE;
3549 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3552 AVOutputStream *ost;
3553 AVCodec *codec= NULL;
3554 AVCodecContext *audio_enc;
3555 enum CodecID codec_id = CODEC_ID_NONE;
3557 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3559 fprintf(stderr, "Could not alloc stream\n");
3562 ost = new_output_stream(oc, file_idx);
3564 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3565 if(!audio_stream_copy){
3566 if (audio_codec_name) {
3567 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3568 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3569 codec = avcodec_find_encoder_by_name(audio_codec_name);
3570 output_codecs[nb_output_codecs-1] = codec;
3572 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3573 codec = avcodec_find_encoder(codec_id);
3577 avcodec_get_context_defaults3(st->codec, codec);
3579 ost->bitstream_filters = audio_bitstream_filters;
3580 audio_bitstream_filters= NULL;
3582 st->codec->thread_count= thread_count;
3584 audio_enc = st->codec;
3585 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3588 audio_enc->codec_tag= audio_codec_tag;
3590 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3591 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3592 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3594 if (audio_stream_copy) {
3595 st->stream_copy = 1;
3597 audio_enc->codec_id = codec_id;
3598 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3600 if (audio_qscale > QSCALE_NONE) {
3601 audio_enc->flags |= CODEC_FLAG_QSCALE;
3602 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3605 audio_enc->channels = audio_channels;
3606 audio_enc->sample_fmt = audio_sample_fmt;
3607 if (audio_sample_rate)
3608 audio_enc->sample_rate = audio_sample_rate;
3609 audio_enc->channel_layout = channel_layout;
3610 choose_sample_fmt(st, codec);
3612 if (audio_language) {
3613 av_dict_set(&st->metadata, "language", audio_language, 0);
3614 av_freep(&audio_language);
3617 /* reset some key parameters */
3619 av_freep(&audio_codec_name);
3620 audio_stream_copy = 0;
3623 static void new_data_stream(AVFormatContext *oc, int file_idx)
3626 AVCodec *codec=NULL;
3627 AVCodecContext *data_enc;
3629 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3631 fprintf(stderr, "Could not alloc stream\n");
3634 new_output_stream(oc, file_idx);
3635 data_enc = st->codec;
3636 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3637 if (!data_stream_copy) {
3638 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3641 avcodec_get_context_defaults3(st->codec, codec);
3643 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3646 data_enc->codec_tag= data_codec_tag;
3648 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3649 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3650 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3652 if (data_stream_copy) {
3653 st->stream_copy = 1;
3657 av_freep(&data_codec_name);
3658 data_stream_copy = 0;
3661 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3664 AVOutputStream *ost;
3665 AVCodec *codec=NULL;
3666 AVCodecContext *subtitle_enc;
3667 enum CodecID codec_id = CODEC_ID_NONE;
3669 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3671 fprintf(stderr, "Could not alloc stream\n");
3674 ost = new_output_stream(oc, file_idx);
3675 subtitle_enc = st->codec;
3676 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3677 if(!subtitle_stream_copy){
3678 if (subtitle_codec_name) {
3679 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3680 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3681 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3683 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3684 codec = avcodec_find_encoder(codec_id);
3687 avcodec_get_context_defaults3(st->codec, codec);
3689 ost->bitstream_filters = subtitle_bitstream_filters;
3690 subtitle_bitstream_filters= NULL;
3692 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3694 if(subtitle_codec_tag)
3695 subtitle_enc->codec_tag= subtitle_codec_tag;
3697 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3698 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3699 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3701 if (subtitle_stream_copy) {
3702 st->stream_copy = 1;
3704 subtitle_enc->codec_id = codec_id;
3705 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3708 if (subtitle_language) {
3709 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3710 av_freep(&subtitle_language);
3713 subtitle_disable = 0;
3714 av_freep(&subtitle_codec_name);
3715 subtitle_stream_copy = 0;
3718 static int opt_new_stream(const char *opt, const char *arg)
3720 AVFormatContext *oc;
3721 int file_idx = nb_output_files - 1;
3722 if (nb_output_files <= 0) {
3723 fprintf(stderr, "At least one output file must be specified\n");
3726 oc = output_files[file_idx];
3728 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3729 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3730 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3731 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3736 /* arg format is "output-stream-index:streamid-value". */
3737 static int opt_streamid(const char *opt, const char *arg)
3743 av_strlcpy(idx_str, arg, sizeof(idx_str));
3744 p = strchr(idx_str, ':');
3747 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3752 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3753 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3754 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3758 static void opt_output_file(const char *filename)
3760 AVFormatContext *oc;
3761 int err, use_video, use_audio, use_subtitle, use_data;
3762 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3763 AVFormatParameters params, *ap = ¶ms;
3764 AVOutputFormat *file_oformat;
3766 if (!strcmp(filename, "-"))
3769 oc = avformat_alloc_context();
3771 print_error(filename, AVERROR(ENOMEM));
3775 if (last_asked_format) {
3776 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3777 if (!file_oformat) {
3778 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3781 last_asked_format = NULL;
3783 file_oformat = av_guess_format(NULL, filename, NULL);
3784 if (!file_oformat) {
3785 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3791 oc->oformat = file_oformat;
3792 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3794 if (!strcmp(file_oformat->name, "ffm") &&
3795 av_strstart(filename, "http:", NULL)) {
3796 /* special case for files sent to ffserver: we get the stream
3797 parameters from ffserver */
3798 int err = read_ffserver_streams(oc, filename);
3800 print_error(filename, err);
3804 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3805 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3806 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3807 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 */
3809 /* disable if no corresponding type found and at least one
3811 if (nb_input_files > 0) {
3812 check_inputs(&input_has_video,
3814 &input_has_subtitle,
3817 if (!input_has_video)
3819 if (!input_has_audio)
3821 if (!input_has_subtitle)
3823 if (!input_has_data)
3827 /* manual disable */
3828 if (audio_disable) use_audio = 0;
3829 if (video_disable) use_video = 0;
3830 if (subtitle_disable) use_subtitle = 0;
3831 if (data_disable) use_data = 0;
3833 if (use_video) new_video_stream(oc, nb_output_files);
3834 if (use_audio) new_audio_stream(oc, nb_output_files);
3835 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3836 if (use_data) new_data_stream(oc, nb_output_files);
3838 oc->timestamp = recording_timestamp;
3840 av_dict_copy(&oc->metadata, metadata, 0);
3841 av_dict_free(&metadata);
3844 output_files[nb_output_files++] = oc;
3846 /* check filename in case of an image number is expected */
3847 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3848 if (!av_filename_number_test(oc->filename)) {
3849 print_error(oc->filename, AVERROR(EINVAL));
3854 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3855 /* test if it already exists to avoid loosing precious files */
3856 if (!file_overwrite &&
3857 (strchr(filename, ':') == NULL ||
3858 filename[1] == ':' ||
3859 av_strstart(filename, "file:", NULL))) {
3860 if (avio_check(filename, 0) == 0) {
3862 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3864 if (!read_yesno()) {
3865 fprintf(stderr, "Not overwriting - exiting\n");
3870 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3877 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3878 print_error(filename, err);
3883 memset(ap, 0, sizeof(*ap));
3884 if (av_set_parameters(oc, ap) < 0) {
3885 fprintf(stderr, "%s: Invalid encoding parameters\n",
3890 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3891 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3892 oc->loop_output = loop_output;
3893 oc->flags |= AVFMT_FLAG_NONBLOCK;
3895 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3897 frame_rate = (AVRational){0, 0};
3898 audio_sample_rate = 0;
3901 av_freep(&forced_key_frames);
3906 /* same option as mencoder */
3907 static int opt_pass(const char *opt, const char *arg)
3909 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3913 static int64_t getutime(void)
3916 struct rusage rusage;
3918 getrusage(RUSAGE_SELF, &rusage);
3919 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3920 #elif HAVE_GETPROCESSTIMES
3922 FILETIME c, e, k, u;
3923 proc = GetCurrentProcess();
3924 GetProcessTimes(proc, &c, &e, &k, &u);
3925 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3927 return av_gettime();
3931 static int64_t getmaxrss(void)
3933 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3934 struct rusage rusage;
3935 getrusage(RUSAGE_SELF, &rusage);
3936 return (int64_t)rusage.ru_maxrss * 1024;
3937 #elif HAVE_GETPROCESSMEMORYINFO
3939 PROCESS_MEMORY_COUNTERS memcounters;
3940 proc = GetCurrentProcess();
3941 memcounters.cb = sizeof(memcounters);
3942 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3943 return memcounters.PeakPagefileUsage;
3949 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3952 const char *p = str;
3959 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3966 static void opt_inter_matrix(const char *arg)
3968 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3969 parse_matrix_coeffs(inter_matrix, arg);
3972 static void opt_intra_matrix(const char *arg)
3974 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3975 parse_matrix_coeffs(intra_matrix, arg);
3978 static void show_usage(void)
3980 printf("Hyper fast Audio and Video encoder\n");
3981 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3985 static void show_help(void)
3988 AVOutputFormat *oformat = NULL;
3990 av_log_set_callback(log_callback_help);
3992 show_help_options(options, "Main options:\n",
3993 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3994 show_help_options(options, "\nAdvanced options:\n",
3995 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3997 show_help_options(options, "\nVideo options:\n",
3998 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4000 show_help_options(options, "\nAdvanced Video options:\n",
4001 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4002 OPT_VIDEO | OPT_EXPERT);
4003 show_help_options(options, "\nAudio options:\n",
4004 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4006 show_help_options(options, "\nAdvanced Audio options:\n",
4007 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4008 OPT_AUDIO | OPT_EXPERT);
4009 show_help_options(options, "\nSubtitle options:\n",
4010 OPT_SUBTITLE | OPT_GRAB,
4012 show_help_options(options, "\nAudio/Video grab options:\n",
4016 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4019 /* individual codec options */
4021 while ((c = av_codec_next(c))) {
4022 if (c->priv_class) {
4023 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4028 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4031 /* individual muxer options */
4032 while ((oformat = av_oformat_next(oformat))) {
4033 if (oformat->priv_class) {
4034 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4039 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4042 static int opt_target(const char *opt, const char *arg)
4044 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4045 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4047 if(!strncmp(arg, "pal-", 4)) {
4050 } else if(!strncmp(arg, "ntsc-", 5)) {
4053 } else if(!strncmp(arg, "film-", 5)) {
4058 /* Calculate FR via float to avoid int overflow */
4059 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4062 } else if((fr == 29970) || (fr == 23976)) {
4065 /* Try to determine PAL/NTSC by peeking in the input files */
4066 if(nb_input_files) {
4068 for (j = 0; j < nb_input_files; j++) {
4069 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4070 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4071 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4073 fr = c->time_base.den * 1000 / c->time_base.num;
4077 } else if((fr == 29970) || (fr == 23976)) {
4087 if(verbose > 0 && norm != UNKNOWN)
4088 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4091 if(norm == UNKNOWN) {
4092 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4093 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4094 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4098 if(!strcmp(arg, "vcd")) {
4099 opt_video_codec("vcodec", "mpeg1video");
4100 opt_audio_codec("vcodec", "mp2");
4101 opt_format("f", "vcd");
4103 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4104 opt_frame_rate("r", frame_rates[norm]);
4105 opt_default("g", norm == PAL ? "15" : "18");
4107 opt_default("b", "1150000");
4108 opt_default("maxrate", "1150000");
4109 opt_default("minrate", "1150000");
4110 opt_default("bufsize", "327680"); // 40*1024*8;
4112 opt_default("ab", "224000");
4113 audio_sample_rate = 44100;
4116 opt_default("packetsize", "2324");
4117 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4119 /* We have to offset the PTS, so that it is consistent with the SCR.
4120 SCR starts at 36000, but the first two packs contain only padding
4121 and the first pack from the other stream, respectively, may also have
4122 been written before.
4123 So the real data starts at SCR 36000+3*1200. */
4124 mux_preload= (36000+3*1200) / 90000.0; //0.44
4125 } else if(!strcmp(arg, "svcd")) {
4127 opt_video_codec("vcodec", "mpeg2video");
4128 opt_audio_codec("acodec", "mp2");
4129 opt_format("f", "svcd");
4131 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4132 opt_frame_rate("r", frame_rates[norm]);
4133 opt_default("g", norm == PAL ? "15" : "18");
4135 opt_default("b", "2040000");
4136 opt_default("maxrate", "2516000");
4137 opt_default("minrate", "0"); //1145000;
4138 opt_default("bufsize", "1835008"); //224*1024*8;
4139 opt_default("flags", "+scan_offset");
4142 opt_default("ab", "224000");
4143 audio_sample_rate = 44100;
4145 opt_default("packetsize", "2324");
4147 } else if(!strcmp(arg, "dvd")) {
4149 opt_video_codec("vcodec", "mpeg2video");
4150 opt_audio_codec("vcodec", "ac3");
4151 opt_format("f", "dvd");
4153 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4154 opt_frame_rate("r", frame_rates[norm]);
4155 opt_default("g", norm == PAL ? "15" : "18");
4157 opt_default("b", "6000000");
4158 opt_default("maxrate", "9000000");
4159 opt_default("minrate", "0"); //1500000;
4160 opt_default("bufsize", "1835008"); //224*1024*8;
4162 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4163 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4165 opt_default("ab", "448000");
4166 audio_sample_rate = 48000;
4168 } else if(!strncmp(arg, "dv", 2)) {
4170 opt_format("f", "dv");
4172 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4173 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4174 norm == PAL ? "yuv420p" : "yuv411p");
4175 opt_frame_rate("r", frame_rates[norm]);
4177 audio_sample_rate = 48000;
4181 fprintf(stderr, "Unknown target: %s\n", arg);
4182 return AVERROR(EINVAL);
4187 static int opt_vstats_file(const char *opt, const char *arg)
4189 av_free (vstats_filename);
4190 vstats_filename=av_strdup (arg);
4194 static int opt_vstats(const char *opt, const char *arg)
4197 time_t today2 = time(NULL);
4198 struct tm *today = localtime(&today2);
4200 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4202 return opt_vstats_file(opt, filename);
4205 static int opt_bsf(const char *opt, const char *arg)
4207 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4208 AVBitStreamFilterContext **bsfp;
4211 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4215 bsfp= *opt == 'v' ? &video_bitstream_filters :
4216 *opt == 'a' ? &audio_bitstream_filters :
4217 &subtitle_bitstream_filters;
4219 bsfp= &(*bsfp)->next;
4226 static int opt_preset(const char *opt, const char *arg)
4229 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4230 char *codec_name = *opt == 'v' ? video_codec_name :
4231 *opt == 'a' ? audio_codec_name :
4232 subtitle_codec_name;
4234 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4235 fprintf(stderr, "File for preset '%s' not found\n", arg);
4240 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4241 if(line[0] == '#' && !e)
4243 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4245 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4248 if(!strcmp(tmp, "acodec")){
4249 opt_audio_codec(tmp, tmp2);
4250 }else if(!strcmp(tmp, "vcodec")){
4251 opt_video_codec(tmp, tmp2);
4252 }else if(!strcmp(tmp, "scodec")){
4253 opt_subtitle_codec(tmp, tmp2);
4254 }else if(!strcmp(tmp, "dcodec")){
4255 opt_data_codec(tmp, tmp2);
4256 }else if(opt_default(tmp, tmp2) < 0){
4257 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4267 static const OptionDef options[] = {
4269 #include "cmdutils_common_opts.h"
4270 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4271 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4272 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4273 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4274 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4275 "outfile[,metadata]:infile[,metadata]" },
4276 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4277 "outfile[,metadata]:infile[,metadata]" },
4278 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4279 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4280 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4281 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4282 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4283 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4284 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4285 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4286 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4287 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4288 "add timings for benchmarking" },
4289 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4290 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4291 "dump each input packet" },
4292 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4293 "when dumping packets, also dump the payload" },
4294 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4295 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4296 { "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)", "" },
4297 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4298 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4299 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4300 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4301 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4302 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4303 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4304 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4305 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4306 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4307 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4308 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4309 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4312 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4313 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4314 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4315 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4316 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4317 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4318 { "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" },
4319 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4320 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4321 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4322 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4323 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4324 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4325 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4326 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4327 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4328 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4329 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4330 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4331 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4332 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4333 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4334 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4335 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4336 "use same quantizer as source (implies VBR)" },
4337 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4338 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4339 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4340 "deinterlace pictures" },
4341 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4342 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4343 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4345 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4347 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4348 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4349 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4350 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4351 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4352 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4353 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4354 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4355 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4356 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4357 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4360 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4361 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4362 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4363 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4364 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4365 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4366 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4367 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4368 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4369 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4370 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4371 { "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" },
4373 /* subtitle options */
4374 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4375 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4376 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4377 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4378 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4381 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4382 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4383 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4386 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4387 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4389 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4390 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4391 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4393 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4394 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4395 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4396 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4397 /* data codec support */
4398 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4400 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4404 int main(int argc, char **argv)
4408 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4410 avcodec_register_all();
4412 avdevice_register_all();
4415 avfilter_register_all();
4419 avio_set_interrupt_cb(decode_interrupt_cb);
4426 parse_options(argc, argv, options, opt_output_file);
4428 if(nb_output_files <= 0 && nb_input_files == 0) {
4430 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4434 /* file converter / grab */
4435 if (nb_output_files <= 0) {
4436 fprintf(stderr, "At least one output file must be specified\n");
4440 if (nb_input_files == 0) {
4441 fprintf(stderr, "At least one input file must be specified\n");
4446 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4447 stream_maps, nb_stream_maps) < 0)
4449 ti = getutime() - ti;
4451 int maxrss = getmaxrss() / 1024;
4452 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4455 return ffmpeg_exit(0);