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
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavutil/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
79 #include "libavutil/avassert.h"
81 const char program_name[] = "ffmpeg";
82 const int program_birth_year = 2000;
84 /* select an input stream for an output stream */
85 typedef struct AVStreamMap {
89 int sync_stream_index;
93 * select an input file for an output file
95 typedef struct AVMetaDataMap {
96 int file; //< file index
97 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
98 int index; //< stream/chapter/program number
101 typedef struct AVChapterMap {
106 static const OptionDef options[];
108 #define MAX_FILES 100
109 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
111 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
113 static const char *last_asked_format = NULL;
114 static AVFormatContext *input_files[MAX_FILES];
115 static int64_t input_files_ts_offset[MAX_FILES];
116 static double *input_files_ts_scale[MAX_FILES] = {NULL};
117 static AVCodec **input_codecs = NULL;
118 static int nb_input_files = 0;
119 static int nb_input_codecs = 0;
120 static int nb_input_files_ts_scale[MAX_FILES] = {0};
122 static AVFormatContext *output_files[MAX_FILES];
123 static AVCodec **output_codecs = NULL;
124 static int nb_output_files = 0;
125 static int nb_output_codecs = 0;
127 static AVStreamMap *stream_maps = NULL;
128 static int nb_stream_maps;
130 /* first item specifies output metadata, second is input */
131 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
132 static int nb_meta_data_maps;
133 static int metadata_global_autocopy = 1;
134 static int metadata_streams_autocopy = 1;
135 static int metadata_chapters_autocopy = 1;
137 static AVChapterMap *chapter_maps = NULL;
138 static int nb_chapter_maps;
140 /* indexed by output file stream index */
141 static int *streamid_map = NULL;
142 static int nb_streamid_map = 0;
144 static int frame_width = 0;
145 static int frame_height = 0;
146 static float frame_aspect_ratio = 0;
147 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
148 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
149 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
150 static AVRational frame_rate;
151 static float video_qscale = 0;
152 static uint16_t *intra_matrix = NULL;
153 static uint16_t *inter_matrix = NULL;
154 static const char *video_rc_override_string=NULL;
155 static int video_disable = 0;
156 static int video_discard = 0;
157 static char *video_codec_name = NULL;
158 static unsigned int video_codec_tag = 0;
159 static char *video_language = NULL;
160 static int same_quality = 0;
161 static int do_deinterlace = 0;
162 static int top_field_first = -1;
163 static int me_threshold = 0;
164 static int intra_dc_precision = 8;
165 static int loop_input = 0;
166 static int loop_output = AVFMT_NOOUTPUTLOOP;
167 static int qp_hist = 0;
169 static char *vfilters = NULL;
170 static AVFilterGraph *graph = NULL;
173 static int intra_only = 0;
174 static int audio_sample_rate = 44100;
175 static int64_t channel_layout = 0;
176 #define QSCALE_NONE -99999
177 static float audio_qscale = QSCALE_NONE;
178 static int audio_disable = 0;
179 static int audio_channels = 1;
180 static char *audio_codec_name = NULL;
181 static unsigned int audio_codec_tag = 0;
182 static char *audio_language = NULL;
184 static int subtitle_disable = 0;
185 static char *subtitle_codec_name = NULL;
186 static char *subtitle_language = NULL;
187 static unsigned int subtitle_codec_tag = 0;
189 static int data_disable = 0;
190 static char *data_codec_name = NULL;
191 static unsigned int data_codec_tag = 0;
193 static float mux_preload= 0.5;
194 static float mux_max_delay= 0.7;
196 static int64_t recording_time = INT64_MAX;
197 static int64_t start_time = 0;
198 static int64_t recording_timestamp = 0;
199 static int64_t input_ts_offset = 0;
200 static int file_overwrite = 0;
201 static AVMetadata *metadata;
202 static int do_benchmark = 0;
203 static int do_hex_dump = 0;
204 static int do_pkt_dump = 0;
205 static int do_psnr = 0;
206 static int do_pass = 0;
207 static char *pass_logfilename_prefix = NULL;
208 static int audio_stream_copy = 0;
209 static int video_stream_copy = 0;
210 static int subtitle_stream_copy = 0;
211 static int data_stream_copy = 0;
212 static int video_sync_method= -1;
213 static int audio_sync_method= 0;
214 static float audio_drift_threshold= 0.1;
215 static int copy_ts= 0;
217 static int opt_shortest = 0;
218 static int video_global_header = 0;
219 static char *vstats_filename;
220 static FILE *vstats_file;
221 static int opt_programid = 0;
222 static int copy_initial_nonkeyframes = 0;
224 static int rate_emu = 0;
226 static int video_channel = 0;
227 static char *video_standard;
229 static int audio_volume = 256;
231 static int exit_on_error = 0;
232 static int using_stdin = 0;
233 static int verbose = 1;
234 static int thread_count= 1;
235 static int q_pressed = 0;
236 static int64_t video_size = 0;
237 static int64_t audio_size = 0;
238 static int64_t extra_size = 0;
239 static int nb_frames_dup = 0;
240 static int nb_frames_drop = 0;
241 static int input_sync;
242 static uint64_t limit_filesize = 0;
243 static int force_fps = 0;
244 static char *forced_key_frames = NULL;
246 static float dts_delta_threshold = 10;
248 static int64_t timer_start;
250 static uint8_t *audio_buf;
251 static uint8_t *audio_out;
252 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
254 static short *samples;
256 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
257 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
258 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
260 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
262 struct AVInputStream;
264 typedef struct AVOutputStream {
265 int file_index; /* file index */
266 int index; /* stream index in the output file */
267 int source_index; /* AVInputStream index */
268 AVStream *st; /* stream in the output file */
269 int encoding_needed; /* true if encoding needed for this stream */
271 /* input pts and corresponding output pts
273 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
274 struct AVInputStream *sync_ist; /* input stream to sync against */
275 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
276 AVBitStreamFilterContext *bitstream_filters;
279 AVFrame pict_tmp; /* temporary image for resampling */
280 struct SwsContext *img_resample_ctx; /* for image resampling */
283 int resample_pix_fmt;
285 /* full frame size of first frame */
289 /* forced key frames */
290 int64_t *forced_kf_pts;
296 ReSampleContext *resample; /* for audio resampling */
297 int resample_sample_fmt;
298 int resample_channels;
299 int resample_sample_rate;
301 AVAudioConvert *reformat_ctx;
302 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
308 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
309 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
311 typedef struct AVInputStream {
315 int discard; /* true if stream data should be discarded */
316 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
317 int64_t sample_index; /* current sample */
319 int64_t start; /* time when read started */
320 int64_t next_pts; /* synthetic pts for cases where pkt.pts
322 int64_t pts; /* current pts */
323 PtsCorrectionContext pts_ctx;
324 int is_start; /* is 1 at the start and after a discontinuity */
325 int showed_multi_packet_warning;
326 int is_past_recording_time;
328 AVFilterContext *output_video_filter;
329 AVFilterContext *input_video_filter;
330 AVFrame *filter_frame;
331 int has_filter_frame;
332 AVFilterBufferRef *picref;
336 typedef struct AVInputFile {
337 int eof_reached; /* true if eof reached */
338 int ist_index; /* index of first stream in ist_table */
339 int buffer_size; /* current total buffer size */
340 int nb_streams; /* nb streams we are aware of */
345 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
347 AVFilterContext *last_filter, *filter;
348 /** filter graph containing all filters including input & output */
349 AVCodecContext *codec = ost->st->codec;
350 AVCodecContext *icodec = ist->st->codec;
351 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
352 AVRational sample_aspect_ratio;
356 graph = avfilter_graph_alloc();
358 if (ist->st->sample_aspect_ratio.num){
359 sample_aspect_ratio = ist->st->sample_aspect_ratio;
361 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
363 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
364 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
365 sample_aspect_ratio.num, sample_aspect_ratio.den);
367 ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"),
368 "src", args, NULL, graph);
371 ret = avfilter_graph_create_filter(&ist->output_video_filter, &ffsink,
372 "out", NULL, &ffsink_ctx, graph);
375 last_filter = ist->input_video_filter;
377 if (codec->width != icodec->width || codec->height != icodec->height) {
378 snprintf(args, 255, "%d:%d:flags=0x%X",
382 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
383 NULL, args, NULL, graph)) < 0)
385 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
387 last_filter = filter;
390 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
391 graph->scale_sws_opts = av_strdup(args);
394 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
395 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
397 outputs->name = av_strdup("in");
398 outputs->filter_ctx = last_filter;
399 outputs->pad_idx = 0;
400 outputs->next = NULL;
402 inputs->name = av_strdup("out");
403 inputs->filter_ctx = ist->output_video_filter;
407 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
411 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
415 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
418 codec->width = ist->output_video_filter->inputs[0]->w;
419 codec->height = ist->output_video_filter->inputs[0]->h;
420 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
421 ist->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;
435 sigterm_handler(int sig)
437 received_sigterm = sig;
441 static void term_init(void)
443 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
444 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
446 signal(SIGXCPU, sigterm_handler);
450 /* read a key without blocking */
451 static int read_key(void)
460 static int decode_interrupt_cb(void)
462 return q_pressed || (q_pressed = read_key() == 'q');
465 static int ffmpeg_exit(int ret)
470 for(i=0;i<nb_output_files;i++) {
471 AVFormatContext *s = output_files[i];
472 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
474 avformat_free_context(s);
475 av_free(output_streams_for_file[i]);
477 for(i=0;i<nb_input_files;i++) {
478 av_close_input_file(input_files[i]);
479 av_free(input_files_ts_scale[i]);
482 av_free(intra_matrix);
483 av_free(inter_matrix);
487 av_free(vstats_filename);
489 av_free(streamid_map);
490 av_free(input_codecs);
491 av_free(output_codecs);
492 av_free(stream_maps);
493 av_free(meta_data_maps);
495 av_free(video_codec_name);
496 av_free(audio_codec_name);
497 av_free(subtitle_codec_name);
498 av_free(data_codec_name);
500 av_free(video_standard);
505 allocated_audio_buf_size= allocated_audio_out_size= 0;
512 if (received_sigterm) {
514 "Received signal %d: terminating.\n",
515 (int) received_sigterm);
519 exit(ret); /* not all OS-es handle main() return value */
523 /* similar to ff_dynarray_add() and av_fast_realloc() */
524 static void *grow_array(void *array, int elem_size, int *size, int new_size)
526 if (new_size >= INT_MAX / elem_size) {
527 fprintf(stderr, "Array too big.\n");
530 if (*size < new_size) {
531 uint8_t *tmp = av_realloc(array, new_size*elem_size);
533 fprintf(stderr, "Could not alloc buffer.\n");
536 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
543 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
545 if(codec && codec->sample_fmts){
546 const enum AVSampleFormat *p= codec->sample_fmts;
548 if(*p == st->codec->sample_fmt)
552 av_log(NULL, AV_LOG_WARNING,
553 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
554 av_get_sample_fmt_name(st->codec->sample_fmt),
556 av_get_sample_fmt_name(codec->sample_fmts[0]));
557 st->codec->sample_fmt = codec->sample_fmts[0];
562 static void choose_sample_rate(AVStream *st, AVCodec *codec)
564 if(codec && codec->supported_samplerates){
565 const int *p= codec->supported_samplerates;
567 int best_dist=INT_MAX;
569 int dist= abs(st->codec->sample_rate - *p);
570 if(dist < best_dist){
576 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
578 st->codec->sample_rate= best;
582 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
584 if(codec && codec->pix_fmts){
585 const enum PixelFormat *p= codec->pix_fmts;
586 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
587 if(st->codec->codec_id==CODEC_ID_MJPEG){
588 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
589 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
590 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};
594 if(*p == st->codec->pix_fmt)
598 st->codec->pix_fmt = codec->pix_fmts[0];
602 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
604 int idx = oc->nb_streams - 1;
607 output_streams_for_file[file_idx] =
608 grow_array(output_streams_for_file[file_idx],
609 sizeof(*output_streams_for_file[file_idx]),
610 &nb_output_streams_for_file[file_idx],
612 ost = output_streams_for_file[file_idx][idx] =
613 av_mallocz(sizeof(AVOutputStream));
615 fprintf(stderr, "Could not alloc output stream\n");
618 ost->file_index = file_idx;
621 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
625 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
631 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
634 /* copy stream format */
636 for(i=0;i<ic->nb_streams;i++) {
642 // FIXME: a more elegant solution is needed
643 st = av_mallocz(sizeof(AVStream));
644 memcpy(st, ic->streams[i], sizeof(AVStream));
645 st->codec = avcodec_alloc_context();
647 print_error(filename, AVERROR(ENOMEM));
650 avcodec_copy_context(st->codec, ic->streams[i]->codec);
653 codec = avcodec_find_encoder(st->codec->codec_id);
654 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
655 if (audio_stream_copy) {
658 choose_sample_fmt(st, codec);
659 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
660 if (video_stream_copy) {
663 choose_pixel_fmt(st, codec);
666 if(st->codec->flags & CODEC_FLAG_BITEXACT)
669 new_output_stream(s, nb_output_files);
673 s->timestamp = av_gettime();
675 av_close_input_file(ic);
680 get_sync_ipts(const AVOutputStream *ost)
682 const AVInputStream *ist = ost->sync_ist;
683 return (double)(ist->pts - start_time)/AV_TIME_BASE;
686 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
690 AVPacket new_pkt= *pkt;
691 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
692 &new_pkt.data, &new_pkt.size,
693 pkt->data, pkt->size,
694 pkt->flags & AV_PKT_FLAG_KEY);
697 new_pkt.destruct= av_destruct_packet;
699 fprintf(stderr, "%s failed for stream %d, codec %s",
700 bsfc->filter->name, pkt->stream_index,
701 avctx->codec ? avctx->codec->name : "copy");
711 ret= av_interleaved_write_frame(s, pkt);
713 print_error("av_interleaved_write_frame()", ret);
718 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
720 static void do_audio_out(AVFormatContext *s,
723 unsigned char *buf, int size)
726 int64_t audio_out_size, audio_buf_size;
727 int64_t allocated_for_size= size;
729 int size_out, frame_bytes, ret, resample_changed;
730 AVCodecContext *enc= ost->st->codec;
731 AVCodecContext *dec= ist->st->codec;
732 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
733 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
734 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
737 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
738 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
739 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
740 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
741 audio_buf_size*= osize*enc->channels;
743 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
744 if(coded_bps > 8*osize)
745 audio_out_size= audio_out_size * coded_bps / (8*osize);
746 audio_out_size += FF_MIN_BUFFER_SIZE;
748 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
749 fprintf(stderr, "Buffer sizes too large\n");
753 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
754 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
755 if (!audio_buf || !audio_out){
756 fprintf(stderr, "Out of memory in do_audio_out\n");
760 if (enc->channels != dec->channels)
761 ost->audio_resample = 1;
763 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
764 ost->resample_channels != dec->channels ||
765 ost->resample_sample_rate != dec->sample_rate;
767 if ((ost->audio_resample && !ost->resample) || resample_changed) {
768 if (resample_changed) {
769 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",
770 ist->file_index, ist->index,
771 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
772 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
773 ost->resample_sample_fmt = dec->sample_fmt;
774 ost->resample_channels = dec->channels;
775 ost->resample_sample_rate = dec->sample_rate;
777 audio_resample_close(ost->resample);
779 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
780 if (audio_sync_method <= 1 &&
781 ost->resample_sample_fmt == enc->sample_fmt &&
782 ost->resample_channels == enc->channels &&
783 ost->resample_sample_rate == enc->sample_rate) {
784 ost->resample = NULL;
785 ost->audio_resample = 0;
787 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
788 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
789 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
790 enc->sample_rate, dec->sample_rate,
791 enc->sample_fmt, dec->sample_fmt,
793 if (!ost->resample) {
794 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
795 dec->channels, dec->sample_rate,
796 enc->channels, enc->sample_rate);
802 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
803 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
804 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
805 if (ost->reformat_ctx)
806 av_audio_convert_free(ost->reformat_ctx);
807 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
808 dec->sample_fmt, 1, NULL, 0);
809 if (!ost->reformat_ctx) {
810 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
811 av_get_sample_fmt_name(dec->sample_fmt),
812 av_get_sample_fmt_name(enc->sample_fmt));
815 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
818 if(audio_sync_method){
819 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
820 - av_fifo_size(ost->fifo)/(enc->channels * 2);
821 double idelta= delta*dec->sample_rate / enc->sample_rate;
822 int byte_delta= ((int)idelta)*2*dec->channels;
824 //FIXME resample delay
825 if(fabs(delta) > 50){
826 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
828 byte_delta= FFMAX(byte_delta, -size);
832 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
837 static uint8_t *input_tmp= NULL;
838 input_tmp= av_realloc(input_tmp, byte_delta + size);
840 if(byte_delta > allocated_for_size - size){
841 allocated_for_size= byte_delta + (int64_t)size;
846 memset(input_tmp, 0, byte_delta);
847 memcpy(input_tmp + byte_delta, buf, size);
851 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
853 }else if(audio_sync_method>1){
854 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
855 av_assert0(ost->audio_resample);
857 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
858 // 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));
859 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
863 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
864 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
866 if (ost->audio_resample) {
868 size_out = audio_resample(ost->resample,
869 (short *)buftmp, (short *)buf,
870 size / (dec->channels * isize));
871 size_out = size_out * enc->channels * osize;
877 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
878 const void *ibuf[6]= {buftmp};
879 void *obuf[6]= {audio_buf};
880 int istride[6]= {isize};
881 int ostride[6]= {osize};
882 int len= size_out/istride[0];
883 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
884 printf("av_audio_convert() failed\n");
890 size_out = len*osize;
893 /* now encode as many frames as possible */
894 if (enc->frame_size > 1) {
895 /* output resampled raw samples */
896 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
897 fprintf(stderr, "av_fifo_realloc2() failed\n");
900 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
902 frame_bytes = enc->frame_size * osize * enc->channels;
904 while (av_fifo_size(ost->fifo) >= frame_bytes) {
906 av_init_packet(&pkt);
908 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
910 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
912 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
915 fprintf(stderr, "Audio encoding failed\n");
919 pkt.stream_index= ost->index;
922 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
923 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
924 pkt.flags |= AV_PKT_FLAG_KEY;
925 write_frame(s, &pkt, enc, ost->bitstream_filters);
927 ost->sync_opts += enc->frame_size;
931 av_init_packet(&pkt);
933 ost->sync_opts += size_out / (osize * enc->channels);
935 /* output a pcm frame */
936 /* determine the size of the coded buffer */
939 size_out = size_out*coded_bps/8;
941 if(size_out > audio_out_size){
942 fprintf(stderr, "Internal error, buffer size too small\n");
946 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
947 ret = avcodec_encode_audio(enc, audio_out, size_out,
950 fprintf(stderr, "Audio encoding failed\n");
954 pkt.stream_index= ost->index;
957 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
958 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
959 pkt.flags |= AV_PKT_FLAG_KEY;
960 write_frame(s, &pkt, enc, ost->bitstream_filters);
964 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
968 AVPicture picture_tmp;
971 dec = ist->st->codec;
973 /* deinterlace : must be done before any resize */
974 if (do_deinterlace) {
977 /* create temporary picture */
978 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
979 buf = av_malloc(size);
983 picture2 = &picture_tmp;
984 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
986 if(avpicture_deinterlace(picture2, picture,
987 dec->pix_fmt, dec->width, dec->height) < 0) {
988 /* if error, do not deinterlace */
989 fprintf(stderr, "Deinterlacing failed\n");
998 if (picture != picture2)
999 *picture = *picture2;
1003 /* we begin to correct av delay at this threshold */
1004 #define AV_DELAY_MAX 0.100
1006 static void do_subtitle_out(AVFormatContext *s,
1007 AVOutputStream *ost,
1012 static uint8_t *subtitle_out = NULL;
1013 int subtitle_out_max_size = 1024 * 1024;
1014 int subtitle_out_size, nb, i;
1015 AVCodecContext *enc;
1018 if (pts == AV_NOPTS_VALUE) {
1019 fprintf(stderr, "Subtitle packets must have a pts\n");
1025 enc = ost->st->codec;
1027 if (!subtitle_out) {
1028 subtitle_out = av_malloc(subtitle_out_max_size);
1031 /* Note: DVB subtitle need one packet to draw them and one other
1032 packet to clear them */
1033 /* XXX: signal it in the codec context ? */
1034 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1039 for(i = 0; i < nb; i++) {
1040 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1041 // start_display_time is required to be 0
1042 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1043 sub->end_display_time -= sub->start_display_time;
1044 sub->start_display_time = 0;
1045 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1046 subtitle_out_max_size, sub);
1047 if (subtitle_out_size < 0) {
1048 fprintf(stderr, "Subtitle encoding failed\n");
1052 av_init_packet(&pkt);
1053 pkt.stream_index = ost->index;
1054 pkt.data = subtitle_out;
1055 pkt.size = subtitle_out_size;
1056 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1057 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1058 /* XXX: the pts correction is handled here. Maybe handling
1059 it in the codec would be better */
1061 pkt.pts += 90 * sub->start_display_time;
1063 pkt.pts += 90 * sub->end_display_time;
1065 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1069 static int bit_buffer_size= 1024*256;
1070 static uint8_t *bit_buffer= NULL;
1072 static void do_video_out(AVFormatContext *s,
1073 AVOutputStream *ost,
1075 AVFrame *in_picture,
1078 int nb_frames, i, ret;
1079 AVFrame *final_picture, *formatted_picture, *resampling_dst;
1080 AVCodecContext *enc, *dec;
1083 enc = ost->st->codec;
1084 dec = ist->st->codec;
1086 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1088 /* by default, we output a single frame */
1093 if(video_sync_method){
1094 double vdelta = sync_ipts - ost->sync_opts;
1095 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1098 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1101 }else if(vdelta>0.6)
1102 ost->sync_opts= lrintf(sync_ipts);
1103 }else if (vdelta > 1.1)
1104 nb_frames = lrintf(vdelta);
1105 //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);
1106 if (nb_frames == 0){
1109 fprintf(stderr, "*** drop!\n");
1110 }else if (nb_frames > 1) {
1111 nb_frames_dup += nb_frames - 1;
1113 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1116 ost->sync_opts= lrintf(sync_ipts);
1118 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1122 formatted_picture = in_picture;
1123 final_picture = formatted_picture;
1124 resampling_dst = &ost->pict_tmp;
1126 if ( ost->resample_height != ist->st->codec->height
1127 || ost->resample_width != ist->st->codec->width
1128 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1130 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1131 if(!ost->video_resample)
1135 #if !CONFIG_AVFILTER
1136 if (ost->video_resample) {
1137 final_picture = &ost->pict_tmp;
1138 if( ost->resample_height != ist->st->codec->height
1139 || ost->resample_width != ist->st->codec->width
1140 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1142 /* initialize a new scaler context */
1143 sws_freeContext(ost->img_resample_ctx);
1144 ost->img_resample_ctx = sws_getContext(
1145 ist->st->codec->width,
1146 ist->st->codec->height,
1147 ist->st->codec->pix_fmt,
1148 ost->st->codec->width,
1149 ost->st->codec->height,
1150 ost->st->codec->pix_fmt,
1151 ost->sws_flags, NULL, NULL, NULL);
1152 if (ost->img_resample_ctx == NULL) {
1153 fprintf(stderr, "Cannot get resampling context\n");
1157 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1158 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1162 /* duplicates frame if needed */
1163 for(i=0;i<nb_frames;i++) {
1165 av_init_packet(&pkt);
1166 pkt.stream_index= ost->index;
1168 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1169 /* raw pictures are written as AVPicture structure to
1170 avoid any copies. We support temorarily the older
1172 AVFrame* old_frame = enc->coded_frame;
1173 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1174 pkt.data= (uint8_t *)final_picture;
1175 pkt.size= sizeof(AVPicture);
1176 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1177 pkt.flags |= AV_PKT_FLAG_KEY;
1179 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1180 enc->coded_frame = old_frame;
1182 AVFrame big_picture;
1184 big_picture= *final_picture;
1185 /* better than nothing: use input picture interlaced
1187 big_picture.interlaced_frame = in_picture->interlaced_frame;
1188 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1189 if(top_field_first == -1)
1190 big_picture.top_field_first = in_picture->top_field_first;
1192 big_picture.top_field_first = top_field_first;
1195 /* handles sameq here. This is not correct because it may
1196 not be a global option */
1197 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1199 big_picture.pict_type = 0;
1200 // big_picture.pts = AV_NOPTS_VALUE;
1201 big_picture.pts= ost->sync_opts;
1202 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1203 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1204 if (ost->forced_kf_index < ost->forced_kf_count &&
1205 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1206 big_picture.pict_type = AV_PICTURE_TYPE_I;
1207 ost->forced_kf_index++;
1209 ret = avcodec_encode_video(enc,
1210 bit_buffer, bit_buffer_size,
1213 fprintf(stderr, "Video encoding failed\n");
1218 pkt.data= bit_buffer;
1220 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1221 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1222 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1223 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1224 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1226 if(enc->coded_frame->key_frame)
1227 pkt.flags |= AV_PKT_FLAG_KEY;
1228 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1231 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1232 // enc->frame_number-1, ret, enc->pict_type);
1233 /* if two pass, output log */
1234 if (ost->logfile && enc->stats_out) {
1235 fprintf(ost->logfile, "%s", enc->stats_out);
1240 ost->frame_number++;
1244 static double psnr(double d){
1245 return -10.0*log(d)/log(10.0);
1248 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1251 AVCodecContext *enc;
1253 double ti1, bitrate, avg_bitrate;
1255 /* this is executed just the first time do_video_stats is called */
1257 vstats_file = fopen(vstats_filename, "w");
1264 enc = ost->st->codec;
1265 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1266 frame_number = ost->frame_number;
1267 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1268 if (enc->flags&CODEC_FLAG_PSNR)
1269 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1271 fprintf(vstats_file,"f_size= %6d ", frame_size);
1272 /* compute pts value */
1273 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1277 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1278 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1279 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1280 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1281 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1285 static void print_report(AVFormatContext **output_files,
1286 AVOutputStream **ost_table, int nb_ostreams,
1290 AVOutputStream *ost;
1291 AVFormatContext *oc;
1293 AVCodecContext *enc;
1294 int frame_number, vid, i;
1295 double bitrate, ti1, pts;
1296 static int64_t last_time = -1;
1297 static int qp_histogram[52];
1299 if (!is_last_report) {
1301 /* display the report every 0.5 seconds */
1302 cur_time = av_gettime();
1303 if (last_time == -1) {
1304 last_time = cur_time;
1307 if ((cur_time - last_time) < 500000)
1309 last_time = cur_time;
1313 oc = output_files[0];
1315 total_size = avio_size(oc->pb);
1316 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1317 total_size= avio_tell(oc->pb);
1322 for(i=0;i<nb_ostreams;i++) {
1324 enc = ost->st->codec;
1325 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1326 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1327 !ost->st->stream_copy ?
1328 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1330 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1331 float t = (av_gettime()-timer_start) / 1000000.0;
1333 frame_number = ost->frame_number;
1334 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1335 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1336 !ost->st->stream_copy ?
1337 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1339 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1342 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1343 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1346 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1348 if (enc->flags&CODEC_FLAG_PSNR){
1350 double error, error_sum=0;
1351 double scale, scale_sum=0;
1352 char type[3]= {'Y','U','V'};
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1356 error= enc->error[j];
1357 scale= enc->width*enc->height*255.0*255.0*frame_number;
1359 error= enc->coded_frame->error[j];
1360 scale= enc->width*enc->height*255.0*255.0;
1365 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1367 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1371 /* compute min output value */
1372 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1373 if ((pts < ti1) && (pts > 0))
1379 if (verbose > 0 || is_last_report) {
1380 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1383 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1384 (double)total_size / 1024, ti1, bitrate);
1386 if (nb_frames_dup || nb_frames_drop)
1387 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1388 nb_frames_dup, nb_frames_drop);
1391 fprintf(stderr, "%s \r", buf);
1396 if (is_last_report && verbose >= 0){
1397 int64_t raw= audio_size + video_size + extra_size;
1398 fprintf(stderr, "\n");
1399 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1403 100.0*(total_size - raw)/raw
1408 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1410 int fill_char = 0x00;
1411 if (sample_fmt == AV_SAMPLE_FMT_U8)
1413 memset(buf, fill_char, size);
1416 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1417 static int output_packet(AVInputStream *ist, int ist_index,
1418 AVOutputStream **ost_table, int nb_ostreams,
1419 const AVPacket *pkt)
1421 AVFormatContext *os;
1422 AVOutputStream *ost;
1426 void *buffer_to_free;
1427 static unsigned int samples_size= 0;
1428 AVSubtitle subtitle, *subtitle_to_free;
1429 int64_t pkt_pts = AV_NOPTS_VALUE;
1431 int frame_available;
1435 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1437 if(ist->next_pts == AV_NOPTS_VALUE)
1438 ist->next_pts= ist->pts;
1442 av_init_packet(&avpkt);
1450 if(pkt->dts != AV_NOPTS_VALUE)
1451 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1452 if(pkt->pts != AV_NOPTS_VALUE)
1453 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1455 //while we have more to decode or while the decoder did output something on EOF
1456 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1457 uint8_t *data_buf, *decoded_data_buf;
1458 int data_size, decoded_data_size;
1460 ist->pts= ist->next_pts;
1462 if(avpkt.size && avpkt.size != pkt->size &&
1463 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1464 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1465 ist->showed_multi_packet_warning=1;
1468 /* decode the packet if needed */
1469 decoded_data_buf = NULL; /* fail safe */
1470 decoded_data_size= 0;
1471 data_buf = avpkt.data;
1472 data_size = avpkt.size;
1473 subtitle_to_free = NULL;
1474 if (ist->decoding_needed) {
1475 switch(ist->st->codec->codec_type) {
1476 case AVMEDIA_TYPE_AUDIO:{
1477 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1478 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1480 samples= av_malloc(samples_size);
1482 decoded_data_size= samples_size;
1483 /* XXX: could avoid copy if PCM 16 bits with same
1484 endianness as CPU */
1485 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1492 /* Some bug in mpeg audio decoder gives */
1493 /* decoded_data_size < 0, it seems they are overflows */
1494 if (decoded_data_size <= 0) {
1495 /* no audio frame */
1498 decoded_data_buf = (uint8_t *)samples;
1499 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1500 (ist->st->codec->sample_rate * ist->st->codec->channels);
1502 case AVMEDIA_TYPE_VIDEO:
1503 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1504 /* XXX: allocate picture correctly */
1505 avcodec_get_frame_defaults(&picture);
1506 avpkt.pts = pkt_pts;
1507 avpkt.dts = ist->pts;
1508 pkt_pts = AV_NOPTS_VALUE;
1510 ret = avcodec_decode_video2(ist->st->codec,
1511 &picture, &got_picture, &avpkt);
1512 ist->st->quality= picture.quality;
1516 /* no picture yet */
1517 goto discard_packet;
1519 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1520 if (ist->st->codec->time_base.num != 0) {
1521 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1522 ist->next_pts += ((int64_t)AV_TIME_BASE *
1523 ist->st->codec->time_base.num * ticks) /
1524 ist->st->codec->time_base.den;
1528 case AVMEDIA_TYPE_SUBTITLE:
1529 ret = avcodec_decode_subtitle2(ist->st->codec,
1530 &subtitle, &got_picture, &avpkt);
1534 goto discard_packet;
1536 subtitle_to_free = &subtitle;
1543 switch(ist->st->codec->codec_type) {
1544 case AVMEDIA_TYPE_AUDIO:
1545 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1546 ist->st->codec->sample_rate;
1548 case AVMEDIA_TYPE_VIDEO:
1549 if (ist->st->codec->time_base.num != 0) {
1550 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1551 ist->next_pts += ((int64_t)AV_TIME_BASE *
1552 ist->st->codec->time_base.num * ticks) /
1553 ist->st->codec->time_base.den;
1561 buffer_to_free = NULL;
1562 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1563 pre_process_video_frame(ist, (AVPicture *)&picture,
1568 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1570 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1571 else sar = ist->st->codec->sample_aspect_ratio;
1572 // add it to be filtered
1573 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1579 // preprocess audio (volume)
1580 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1581 if (audio_volume != 256) {
1584 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1585 int v = ((*volp) * audio_volume + 128) >> 8;
1586 if (v < -32768) v = -32768;
1587 if (v > 32767) v = 32767;
1593 /* frame rate emulation */
1595 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1596 int64_t now = av_gettime() - ist->start;
1601 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1602 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1604 /* if output time reached then transcode raw format,
1605 encode packets and output them */
1606 if (start_time == 0 || ist->pts >= start_time)
1608 while (frame_available) {
1609 AVRational ist_pts_tb;
1610 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1611 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1613 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1615 for(i=0;i<nb_ostreams;i++) {
1619 if (ost->source_index == ist_index) {
1620 os = output_files[ost->file_index];
1622 /* set the input output pts pairs */
1623 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1625 if (ost->encoding_needed) {
1626 av_assert0(ist->decoding_needed);
1627 switch(ost->st->codec->codec_type) {
1628 case AVMEDIA_TYPE_AUDIO:
1629 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1631 case AVMEDIA_TYPE_VIDEO:
1633 if (ist->picref->video)
1634 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1636 do_video_out(os, ost, ist, &picture, &frame_size);
1637 if (vstats_filename && frame_size)
1638 do_video_stats(os, ost, frame_size);
1640 case AVMEDIA_TYPE_SUBTITLE:
1641 do_subtitle_out(os, ost, ist, &subtitle,
1648 AVFrame avframe; //FIXME/XXX remove this
1650 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1652 av_init_packet(&opkt);
1654 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1657 /* no reencoding needed : output the packet directly */
1658 /* force the input stream PTS */
1660 avcodec_get_frame_defaults(&avframe);
1661 ost->st->codec->coded_frame= &avframe;
1662 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1664 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1665 audio_size += data_size;
1666 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1667 video_size += data_size;
1671 opkt.stream_index= ost->index;
1672 if(pkt->pts != AV_NOPTS_VALUE)
1673 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1675 opkt.pts= AV_NOPTS_VALUE;
1677 if (pkt->dts == AV_NOPTS_VALUE)
1678 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1680 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1681 opkt.dts -= ost_tb_start_time;
1683 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1684 opkt.flags= pkt->flags;
1686 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1687 if( ost->st->codec->codec_id != CODEC_ID_H264
1688 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1689 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1691 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1692 opkt.destruct= av_destruct_packet;
1694 opkt.data = data_buf;
1695 opkt.size = data_size;
1698 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1699 ost->st->codec->frame_number++;
1700 ost->frame_number++;
1701 av_free_packet(&opkt);
1707 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1708 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1710 avfilter_unref_buffer(ist->picref);
1713 av_free(buffer_to_free);
1714 /* XXX: allocate the subtitles in the codec ? */
1715 if (subtitle_to_free) {
1716 avsubtitle_free(subtitle_to_free);
1717 subtitle_to_free = NULL;
1724 for(i=0;i<nb_ostreams;i++) {
1726 if (ost->source_index == ist_index) {
1727 AVCodecContext *enc= ost->st->codec;
1728 os = output_files[ost->file_index];
1730 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1732 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1735 if (ost->encoding_needed) {
1739 av_init_packet(&pkt);
1740 pkt.stream_index= ost->index;
1742 switch(ost->st->codec->codec_type) {
1743 case AVMEDIA_TYPE_AUDIO:
1744 fifo_bytes = av_fifo_size(ost->fifo);
1746 /* encode any samples remaining in fifo */
1747 if (fifo_bytes > 0) {
1748 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1749 int fs_tmp = enc->frame_size;
1751 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1752 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1753 enc->frame_size = fifo_bytes / (osize * enc->channels);
1755 int frame_bytes = enc->frame_size*osize*enc->channels;
1756 if (allocated_audio_buf_size < frame_bytes)
1758 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1761 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1762 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1763 ost->st->time_base.num, enc->sample_rate);
1764 enc->frame_size = fs_tmp;
1767 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1770 fprintf(stderr, "Audio encoding failed\n");
1774 pkt.flags |= AV_PKT_FLAG_KEY;
1776 case AVMEDIA_TYPE_VIDEO:
1777 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1779 fprintf(stderr, "Video encoding failed\n");
1783 if(enc->coded_frame && enc->coded_frame->key_frame)
1784 pkt.flags |= AV_PKT_FLAG_KEY;
1785 if (ost->logfile && enc->stats_out) {
1786 fprintf(ost->logfile, "%s", enc->stats_out);
1795 pkt.data= bit_buffer;
1797 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1798 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1799 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1811 static void print_sdp(AVFormatContext **avc, int n)
1815 av_sdp_create(avc, n, sdp, sizeof(sdp));
1816 printf("SDP:\n%s\n", sdp);
1820 static int copy_chapters(int infile, int outfile)
1822 AVFormatContext *is = input_files[infile];
1823 AVFormatContext *os = output_files[outfile];
1826 for (i = 0; i < is->nb_chapters; i++) {
1827 AVChapter *in_ch = is->chapters[i], *out_ch;
1828 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1829 AV_TIME_BASE_Q, in_ch->time_base);
1830 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1831 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1834 if (in_ch->end < ts_off)
1836 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1839 out_ch = av_mallocz(sizeof(AVChapter));
1841 return AVERROR(ENOMEM);
1843 out_ch->id = in_ch->id;
1844 out_ch->time_base = in_ch->time_base;
1845 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1846 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1848 if (metadata_chapters_autocopy)
1849 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1852 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1854 return AVERROR(ENOMEM);
1855 os->chapters[os->nb_chapters - 1] = out_ch;
1860 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1861 AVCodecContext *avctx)
1867 for (p = kf; *p; p++)
1870 ost->forced_kf_count = n;
1871 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1872 if (!ost->forced_kf_pts) {
1873 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1876 for (i = 0; i < n; i++) {
1877 p = i ? strchr(p, ',') + 1 : kf;
1878 t = parse_time_or_die("force_key_frames", p, 1);
1879 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1884 * The following code is the main loop of the file converter
1886 static int transcode(AVFormatContext **output_files,
1887 int nb_output_files,
1888 AVFormatContext **input_files,
1890 AVStreamMap *stream_maps, int nb_stream_maps)
1892 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1893 AVFormatContext *is, *os;
1894 AVCodecContext *codec, *icodec;
1895 AVOutputStream *ost, **ost_table = NULL;
1896 AVInputStream *ist, **ist_table = NULL;
1897 AVInputFile *file_table;
1901 uint8_t no_packet[MAX_FILES]={0};
1902 int no_packet_count=0;
1904 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1908 /* input stream init */
1910 for(i=0;i<nb_input_files;i++) {
1911 is = input_files[i];
1912 file_table[i].ist_index = j;
1913 file_table[i].nb_streams = is->nb_streams;
1914 j += is->nb_streams;
1918 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1922 for(i=0;i<nb_istreams;i++) {
1923 ist = av_mallocz(sizeof(AVInputStream));
1929 for(i=0;i<nb_input_files;i++) {
1930 is = input_files[i];
1931 for(k=0;k<is->nb_streams;k++) {
1932 ist = ist_table[j++];
1933 ist->st = is->streams[k];
1934 ist->file_index = i;
1936 ist->discard = 1; /* the stream is discarded by default
1940 ist->start = av_gettime();
1945 /* output stream init */
1947 for(i=0;i<nb_output_files;i++) {
1948 os = output_files[i];
1949 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1950 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1951 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1952 ret = AVERROR(EINVAL);
1955 nb_ostreams += os->nb_streams;
1957 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1958 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1959 ret = AVERROR(EINVAL);
1963 /* Sanity check the mapping args -- do the input files & streams exist? */
1964 for(i=0;i<nb_stream_maps;i++) {
1965 int fi = stream_maps[i].file_index;
1966 int si = stream_maps[i].stream_index;
1968 if (fi < 0 || fi > nb_input_files - 1 ||
1969 si < 0 || si > file_table[fi].nb_streams - 1) {
1970 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1971 ret = AVERROR(EINVAL);
1974 fi = stream_maps[i].sync_file_index;
1975 si = stream_maps[i].sync_stream_index;
1976 if (fi < 0 || fi > nb_input_files - 1 ||
1977 si < 0 || si > file_table[fi].nb_streams - 1) {
1978 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1979 ret = AVERROR(EINVAL);
1984 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1988 for(k=0;k<nb_output_files;k++) {
1989 os = output_files[k];
1990 for(i=0;i<os->nb_streams;i++,n++) {
1992 ost = ost_table[n] = output_streams_for_file[k][i];
1993 ost->st = os->streams[i];
1994 if (nb_stream_maps > 0) {
1995 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1996 stream_maps[n].stream_index;
1998 /* Sanity check that the stream types match */
1999 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2000 int i= ost->file_index;
2001 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2002 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2003 stream_maps[n].file_index, stream_maps[n].stream_index,
2004 ost->file_index, ost->index);
2009 int best_nb_frames=-1;
2010 /* get corresponding input stream index : we select the first one with the right type */
2012 for(j=0;j<nb_istreams;j++) {
2017 AVFormatContext *f= input_files[ ist->file_index ];
2019 for(pi=0; pi<f->nb_programs; pi++){
2020 AVProgram *p= f->programs[pi];
2021 if(p->id == opt_programid)
2022 for(si=0; si<p->nb_stream_indexes; si++){
2023 if(f->streams[ p->stream_index[si] ] == ist->st)
2028 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2029 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2030 if(best_nb_frames < ist->st->codec_info_nb_frames){
2031 best_nb_frames= ist->st->codec_info_nb_frames;
2032 ost->source_index = j;
2039 if(! opt_programid) {
2040 /* try again and reuse existing stream */
2041 for(j=0;j<nb_istreams;j++) {
2043 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2044 && ist->st->discard != AVDISCARD_ALL) {
2045 ost->source_index = j;
2051 int i= ost->file_index;
2052 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2053 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2054 ost->file_index, ost->index);
2059 ist = ist_table[ost->source_index];
2061 ost->sync_ist = (nb_stream_maps > 0) ?
2062 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2063 stream_maps[n].sync_stream_index] : ist;
2067 /* for each output stream, we compute the right encoding parameters */
2068 for(i=0;i<nb_ostreams;i++) {
2070 os = output_files[ost->file_index];
2071 ist = ist_table[ost->source_index];
2073 codec = ost->st->codec;
2074 icodec = ist->st->codec;
2076 if (metadata_streams_autocopy)
2077 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2078 AV_METADATA_DONT_OVERWRITE);
2080 ost->st->disposition = ist->st->disposition;
2081 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2082 codec->chroma_sample_location = icodec->chroma_sample_location;
2084 if (ost->st->stream_copy) {
2085 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2087 if (extra_size > INT_MAX)
2090 /* if stream_copy is selected, no need to decode or encode */
2091 codec->codec_id = icodec->codec_id;
2092 codec->codec_type = icodec->codec_type;
2094 if(!codec->codec_tag){
2095 if( !os->oformat->codec_tag
2096 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2097 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2098 codec->codec_tag = icodec->codec_tag;
2101 codec->bit_rate = icodec->bit_rate;
2102 codec->rc_max_rate = icodec->rc_max_rate;
2103 codec->rc_buffer_size = icodec->rc_buffer_size;
2104 codec->extradata= av_mallocz(extra_size);
2105 if (!codec->extradata)
2107 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2108 codec->extradata_size= icodec->extradata_size;
2109 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){
2110 codec->time_base = icodec->time_base;
2111 codec->time_base.num *= icodec->ticks_per_frame;
2112 av_reduce(&codec->time_base.num, &codec->time_base.den,
2113 codec->time_base.num, codec->time_base.den, INT_MAX);
2115 codec->time_base = ist->st->time_base;
2116 switch(codec->codec_type) {
2117 case AVMEDIA_TYPE_AUDIO:
2118 if(audio_volume != 256) {
2119 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2122 codec->channel_layout = icodec->channel_layout;
2123 codec->sample_rate = icodec->sample_rate;
2124 codec->channels = icodec->channels;
2125 codec->frame_size = icodec->frame_size;
2126 codec->audio_service_type = icodec->audio_service_type;
2127 codec->block_align= icodec->block_align;
2128 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2129 codec->block_align= 0;
2130 if(codec->codec_id == CODEC_ID_AC3)
2131 codec->block_align= 0;
2133 case AVMEDIA_TYPE_VIDEO:
2134 codec->pix_fmt = icodec->pix_fmt;
2135 codec->width = icodec->width;
2136 codec->height = icodec->height;
2137 codec->has_b_frames = icodec->has_b_frames;
2139 case AVMEDIA_TYPE_SUBTITLE:
2140 codec->width = icodec->width;
2141 codec->height = icodec->height;
2143 case AVMEDIA_TYPE_DATA:
2149 switch(codec->codec_type) {
2150 case AVMEDIA_TYPE_AUDIO:
2151 ost->fifo= av_fifo_alloc(1024);
2154 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2155 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2156 icodec->request_channels = codec->channels;
2157 ist->decoding_needed = 1;
2158 ost->encoding_needed = 1;
2159 ost->resample_sample_fmt = icodec->sample_fmt;
2160 ost->resample_sample_rate = icodec->sample_rate;
2161 ost->resample_channels = icodec->channels;
2163 case AVMEDIA_TYPE_VIDEO:
2164 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2165 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2168 ost->video_resample = (codec->width != icodec->width ||
2169 codec->height != icodec->height ||
2170 (codec->pix_fmt != icodec->pix_fmt));
2171 if (ost->video_resample) {
2172 #if !CONFIG_AVFILTER
2173 avcodec_get_frame_defaults(&ost->pict_tmp);
2174 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2175 codec->width, codec->height)) {
2176 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2179 ost->img_resample_ctx = sws_getContext(
2186 ost->sws_flags, NULL, NULL, NULL);
2187 if (ost->img_resample_ctx == NULL) {
2188 fprintf(stderr, "Cannot get resampling context\n");
2192 ost->original_height = icodec->height;
2193 ost->original_width = icodec->width;
2195 codec->bits_per_raw_sample= 0;
2197 ost->resample_height = icodec->height;
2198 ost->resample_width = icodec->width;
2199 ost->resample_pix_fmt= icodec->pix_fmt;
2200 ost->encoding_needed = 1;
2201 ist->decoding_needed = 1;
2204 if (configure_video_filters(ist, ost)) {
2205 fprintf(stderr, "Error opening filters!\n");
2210 case AVMEDIA_TYPE_SUBTITLE:
2211 ost->encoding_needed = 1;
2212 ist->decoding_needed = 1;
2219 if (ost->encoding_needed &&
2220 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2221 char logfilename[1024];
2224 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2225 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2227 if (codec->flags & CODEC_FLAG_PASS1) {
2228 f = fopen(logfilename, "wb");
2230 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2236 size_t logbuffer_size;
2237 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2238 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2241 codec->stats_in = logbuffer;
2245 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2246 int size= codec->width * codec->height;
2247 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2252 bit_buffer = av_malloc(bit_buffer_size);
2254 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2256 ret = AVERROR(ENOMEM);
2260 /* open each encoder */
2261 for(i=0;i<nb_ostreams;i++) {
2263 if (ost->encoding_needed) {
2264 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2265 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2267 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2269 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2270 ost->st->codec->codec_id, ost->file_index, ost->index);
2271 ret = AVERROR(EINVAL);
2274 if (dec->subtitle_header) {
2275 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2276 if (!ost->st->codec->subtitle_header) {
2277 ret = AVERROR(ENOMEM);
2280 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2281 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2283 if (avcodec_open(ost->st->codec, codec) < 0) {
2284 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2285 ost->file_index, ost->index);
2286 ret = AVERROR(EINVAL);
2289 extra_size += ost->st->codec->extradata_size;
2293 /* open each decoder */
2294 for(i=0;i<nb_istreams;i++) {
2296 if (ist->decoding_needed) {
2297 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2299 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2301 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2302 ist->st->codec->codec_id, ist->file_index, ist->index);
2303 ret = AVERROR(EINVAL);
2306 if (avcodec_open(ist->st->codec, codec) < 0) {
2307 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2308 ist->file_index, ist->index);
2309 ret = AVERROR(EINVAL);
2312 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2313 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2318 for(i=0;i<nb_istreams;i++) {
2322 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2323 ist->next_pts = AV_NOPTS_VALUE;
2324 init_pts_correction(&ist->pts_ctx);
2328 /* set meta data information from input file if required */
2329 for (i=0;i<nb_meta_data_maps;i++) {
2330 AVFormatContext *files[2];
2331 AVMetadata **meta[2];
2334 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2335 if ((index) < 0 || (index) >= (nb_elems)) {\
2336 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2338 ret = AVERROR(EINVAL);\
2342 int out_file_index = meta_data_maps[i][0].file;
2343 int in_file_index = meta_data_maps[i][1].file;
2344 if (in_file_index < 0 || out_file_index < 0)
2346 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2347 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2349 files[0] = output_files[out_file_index];
2350 files[1] = input_files[in_file_index];
2352 for (j = 0; j < 2; j++) {
2353 AVMetaDataMap *map = &meta_data_maps[i][j];
2355 switch (map->type) {
2357 meta[j] = &files[j]->metadata;
2360 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2361 meta[j] = &files[j]->streams[map->index]->metadata;
2364 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2365 meta[j] = &files[j]->chapters[map->index]->metadata;
2368 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2369 meta[j] = &files[j]->programs[map->index]->metadata;
2374 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2377 /* copy global metadata by default */
2378 if (metadata_global_autocopy) {
2380 for (i = 0; i < nb_output_files; i++)
2381 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2382 AV_METADATA_DONT_OVERWRITE);
2385 /* copy chapters according to chapter maps */
2386 for (i = 0; i < nb_chapter_maps; i++) {
2387 int infile = chapter_maps[i].in_file;
2388 int outfile = chapter_maps[i].out_file;
2390 if (infile < 0 || outfile < 0)
2392 if (infile >= nb_input_files) {
2393 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2394 ret = AVERROR(EINVAL);
2397 if (outfile >= nb_output_files) {
2398 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2399 ret = AVERROR(EINVAL);
2402 copy_chapters(infile, outfile);
2405 /* copy chapters from the first input file that has them*/
2406 if (!nb_chapter_maps)
2407 for (i = 0; i < nb_input_files; i++) {
2408 if (!input_files[i]->nb_chapters)
2411 for (j = 0; j < nb_output_files; j++)
2412 if ((ret = copy_chapters(i, j)) < 0)
2417 /* open files and write file headers */
2418 for(i=0;i<nb_output_files;i++) {
2419 os = output_files[i];
2420 if (av_write_header(os) < 0) {
2421 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2422 ret = AVERROR(EINVAL);
2425 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2431 /* dump the file output parameters - cannot be done before in case
2433 for(i=0;i<nb_output_files;i++) {
2434 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2437 /* dump the stream mapping */
2439 fprintf(stderr, "Stream mapping:\n");
2440 for(i=0;i<nb_ostreams;i++) {
2442 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2443 ist_table[ost->source_index]->file_index,
2444 ist_table[ost->source_index]->index,
2447 if (ost->sync_ist != ist_table[ost->source_index])
2448 fprintf(stderr, " [sync #%d.%d]",
2449 ost->sync_ist->file_index,
2450 ost->sync_ist->index);
2451 fprintf(stderr, "\n");
2456 fprintf(stderr, "%s\n", error);
2461 print_sdp(output_files, nb_output_files);
2464 if (!using_stdin && verbose >= 0) {
2466 fprintf(stderr, "Press [q] to stop encoding\n");
2468 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2470 avio_set_interrupt_cb(decode_interrupt_cb);
2474 timer_start = av_gettime();
2476 for(; received_sigterm == 0;) {
2477 int file_index, ist_index;
2485 /* if 'q' pressed, exits */
2489 /* read_key() returns 0 on EOF */
2495 /* select the stream that we must read now by looking at the
2496 smallest output pts */
2498 for(i=0;i<nb_ostreams;i++) {
2501 os = output_files[ost->file_index];
2502 ist = ist_table[ost->source_index];
2503 if(ist->is_past_recording_time || no_packet[ist->file_index])
2505 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2506 ipts = (double)ist->pts;
2507 if (!file_table[ist->file_index].eof_reached){
2508 if(ipts < ipts_min) {
2510 if(input_sync ) file_index = ist->file_index;
2512 if(opts < opts_min) {
2514 if(!input_sync) file_index = ist->file_index;
2517 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2522 /* if none, if is finished */
2523 if (file_index < 0) {
2524 if(no_packet_count){
2526 memset(no_packet, 0, sizeof(no_packet));
2533 /* finish if limit size exhausted */
2534 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2537 /* read a frame from it and output it in the fifo */
2538 is = input_files[file_index];
2539 ret= av_read_frame(is, &pkt);
2540 if(ret == AVERROR(EAGAIN)){
2541 no_packet[file_index]=1;
2546 file_table[file_index].eof_reached = 1;
2554 memset(no_packet, 0, sizeof(no_packet));
2557 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2558 is->streams[pkt.stream_index]);
2560 /* the following test is needed in case new streams appear
2561 dynamically in stream : we ignore them */
2562 if (pkt.stream_index >= file_table[file_index].nb_streams)
2563 goto discard_packet;
2564 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2565 ist = ist_table[ist_index];
2567 goto discard_packet;
2569 if (pkt.dts != AV_NOPTS_VALUE)
2570 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2571 if (pkt.pts != AV_NOPTS_VALUE)
2572 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2574 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2575 && input_files_ts_scale[file_index][pkt.stream_index]){
2576 if(pkt.pts != AV_NOPTS_VALUE)
2577 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2578 if(pkt.dts != AV_NOPTS_VALUE)
2579 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2582 // 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);
2583 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2584 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2585 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2586 int64_t delta= pkt_dts - ist->next_pts;
2587 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2588 input_files_ts_offset[ist->file_index]-= delta;
2590 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2591 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2592 if(pkt.pts != AV_NOPTS_VALUE)
2593 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2597 /* finish if recording time exhausted */
2598 if (recording_time != INT64_MAX &&
2599 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2600 ist->is_past_recording_time = 1;
2601 goto discard_packet;
2604 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2605 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2608 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2609 ist->file_index, ist->index);
2612 av_free_packet(&pkt);
2617 av_free_packet(&pkt);
2619 /* dump report by using the output first video and audio streams */
2620 print_report(output_files, ost_table, nb_ostreams, 0);
2623 /* at the end of stream, we must flush the decoder buffers */
2624 for(i=0;i<nb_istreams;i++) {
2626 if (ist->decoding_needed) {
2627 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2633 /* write the trailer if needed and close file */
2634 for(i=0;i<nb_output_files;i++) {
2635 os = output_files[i];
2636 av_write_trailer(os);
2639 /* dump report by using the first video and audio streams */
2640 print_report(output_files, ost_table, nb_ostreams, 1);
2642 /* close each encoder */
2643 for(i=0;i<nb_ostreams;i++) {
2645 if (ost->encoding_needed) {
2646 av_freep(&ost->st->codec->stats_in);
2647 avcodec_close(ost->st->codec);
2651 /* close each decoder */
2652 for(i=0;i<nb_istreams;i++) {
2654 if (ist->decoding_needed) {
2655 avcodec_close(ist->st->codec);
2659 avfilter_graph_free(&graph);
2666 av_freep(&bit_buffer);
2667 av_free(file_table);
2670 for(i=0;i<nb_istreams;i++) {
2677 for(i=0;i<nb_ostreams;i++) {
2680 if (ost->st->stream_copy)
2681 av_freep(&ost->st->codec->extradata);
2683 fclose(ost->logfile);
2684 ost->logfile = NULL;
2686 av_fifo_free(ost->fifo); /* works even if fifo is not
2687 initialized but set to zero */
2688 av_freep(&ost->st->codec->subtitle_header);
2689 av_free(ost->pict_tmp.data[0]);
2690 av_free(ost->forced_kf_pts);
2691 if (ost->video_resample)
2692 sws_freeContext(ost->img_resample_ctx);
2694 audio_resample_close(ost->resample);
2695 if (ost->reformat_ctx)
2696 av_audio_convert_free(ost->reformat_ctx);
2705 static void opt_format(const char *arg)
2707 last_asked_format = arg;
2710 static void opt_video_rc_override_string(const char *arg)
2712 video_rc_override_string = arg;
2715 static int opt_me_threshold(const char *opt, const char *arg)
2717 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2721 static int opt_verbose(const char *opt, const char *arg)
2723 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2727 static int opt_frame_rate(const char *opt, const char *arg)
2729 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2730 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2736 static int opt_bitrate(const char *opt, const char *arg)
2738 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2740 opt_default(opt, arg);
2742 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2743 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2748 static int opt_frame_crop(const char *opt, const char *arg)
2750 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2751 return AVERROR(EINVAL);
2754 static void opt_frame_size(const char *arg)
2756 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2757 fprintf(stderr, "Incorrect frame size\n");
2762 static int opt_pad(const char *opt, const char *arg) {
2763 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2767 static void opt_frame_pix_fmt(const char *arg)
2769 if (strcmp(arg, "list")) {
2770 frame_pix_fmt = av_get_pix_fmt(arg);
2771 if (frame_pix_fmt == PIX_FMT_NONE) {
2772 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2781 static void opt_frame_aspect_ratio(const char *arg)
2788 p = strchr(arg, ':');
2790 x = strtol(arg, &end, 10);
2792 y = strtol(end+1, &end, 10);
2794 ar = (double)x / (double)y;
2796 ar = strtod(arg, NULL);
2799 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2802 frame_aspect_ratio = ar;
2805 x = vfilters ? strlen(vfilters) : 0;
2806 vfilters = av_realloc(vfilters, x+100);
2807 snprintf(vfilters+x, x+100, "%csetdar=%f\n", x?',':' ', ar);
2811 static int opt_metadata(const char *opt, const char *arg)
2813 char *mid= strchr(arg, '=');
2816 fprintf(stderr, "Missing =\n");
2821 av_metadata_set2(&metadata, arg, mid, 0);
2826 static void opt_qscale(const char *arg)
2828 video_qscale = atof(arg);
2829 if (video_qscale <= 0 ||
2830 video_qscale > 255) {
2831 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2836 static void opt_top_field_first(const char *arg)
2838 top_field_first= atoi(arg);
2841 static int opt_thread_count(const char *opt, const char *arg)
2843 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2846 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2851 static void opt_audio_sample_fmt(const char *arg)
2853 if (strcmp(arg, "list")) {
2854 audio_sample_fmt = av_get_sample_fmt(arg);
2855 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2856 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2862 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2863 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2868 static int opt_audio_rate(const char *opt, const char *arg)
2870 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2874 static int opt_audio_channels(const char *opt, const char *arg)
2876 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2880 static void opt_video_channel(const char *arg)
2882 video_channel = strtol(arg, NULL, 0);
2885 static void opt_video_standard(const char *arg)
2887 video_standard = av_strdup(arg);
2890 static void opt_codec(int *pstream_copy, char **pcodec_name,
2891 int codec_type, const char *arg)
2893 av_freep(pcodec_name);
2894 if (!strcmp(arg, "copy")) {
2897 *pcodec_name = av_strdup(arg);
2901 static void opt_audio_codec(const char *arg)
2903 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2906 static void opt_video_codec(const char *arg)
2908 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2911 static void opt_subtitle_codec(const char *arg)
2913 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2916 static void opt_data_codec(const char *arg)
2918 opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2921 static int opt_codec_tag(const char *opt, const char *arg)
2924 uint32_t *codec_tag;
2926 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2927 !strcmp(opt, "vtag") ? &video_codec_tag :
2928 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2932 *codec_tag = strtol(arg, &tail, 0);
2934 *codec_tag = AV_RL32(arg);
2939 static void opt_map(const char *arg)
2944 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2945 m = &stream_maps[nb_stream_maps-1];
2947 m->file_index = strtol(arg, &p, 0);
2951 m->stream_index = strtol(p, &p, 0);
2954 m->sync_file_index = strtol(p, &p, 0);
2957 m->sync_stream_index = strtol(p, &p, 0);
2959 m->sync_file_index = m->file_index;
2960 m->sync_stream_index = m->stream_index;
2964 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
2975 *index = strtol(++arg, endptr, 0);
2978 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2985 static void opt_map_metadata(const char *arg)
2987 AVMetaDataMap *m, *m1;
2990 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2991 &nb_meta_data_maps, nb_meta_data_maps + 1);
2993 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2994 m->file = strtol(arg, &p, 0);
2995 parse_meta_type(p, &m->type, &m->index, &p);
2999 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3000 m1->file = strtol(p, &p, 0);
3001 parse_meta_type(p, &m1->type, &m1->index, &p);
3003 if (m->type == 'g' || m1->type == 'g')
3004 metadata_global_autocopy = 0;
3005 if (m->type == 's' || m1->type == 's')
3006 metadata_streams_autocopy = 0;
3007 if (m->type == 'c' || m1->type == 'c')
3008 metadata_chapters_autocopy = 0;
3011 static void opt_map_meta_data(const char *arg)
3013 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3014 "Use -map_metadata instead.\n");
3015 opt_map_metadata(arg);
3018 static void opt_map_chapters(const char *arg)
3023 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3024 nb_chapter_maps + 1);
3025 c = &chapter_maps[nb_chapter_maps - 1];
3026 c->out_file = strtol(arg, &p, 0);
3030 c->in_file = strtol(p, &p, 0);
3033 static void opt_input_ts_scale(const char *arg)
3035 unsigned int stream;
3039 stream = strtol(arg, &p, 0);
3042 scale= strtod(p, &p);
3044 if(stream >= MAX_STREAMS)
3047 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);
3048 input_files_ts_scale[nb_input_files][stream]= scale;
3051 static int opt_recording_time(const char *opt, const char *arg)
3053 recording_time = parse_time_or_die(opt, arg, 1);
3057 static int opt_start_time(const char *opt, const char *arg)
3059 start_time = parse_time_or_die(opt, arg, 1);
3063 static int opt_recording_timestamp(const char *opt, const char *arg)
3065 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3069 static int opt_input_ts_offset(const char *opt, const char *arg)
3071 input_ts_offset = parse_time_or_die(opt, arg, 1);
3075 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3077 const char *codec_string = encoder ? "encoder" : "decoder";
3081 return CODEC_ID_NONE;
3083 avcodec_find_encoder_by_name(name) :
3084 avcodec_find_decoder_by_name(name);
3086 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3089 if(codec->type != type) {
3090 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3093 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3094 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3095 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3096 "results.\nAdd '-strict experimental' if you want to use it.\n",
3097 codec_string, codec->name);
3099 avcodec_find_encoder(codec->id) :
3100 avcodec_find_decoder(codec->id);
3101 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3102 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3103 codec_string, codec->name);
3109 static void opt_input_file(const char *filename)
3111 AVFormatContext *ic;
3112 AVFormatParameters params, *ap = ¶ms;
3113 AVInputFormat *file_iformat = NULL;
3114 int err, i, ret, rfps, rfps_base;
3117 if (last_asked_format) {
3118 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3119 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3122 last_asked_format = NULL;
3125 if (!strcmp(filename, "-"))
3128 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3129 !strcmp(filename, "/dev/stdin");
3131 /* get default parameters from command line */
3132 ic = avformat_alloc_context();
3134 print_error(filename, AVERROR(ENOMEM));
3138 memset(ap, 0, sizeof(*ap));
3139 ap->prealloced_context = 1;
3140 ap->sample_rate = audio_sample_rate;
3141 ap->channels = audio_channels;
3142 ap->time_base.den = frame_rate.num;
3143 ap->time_base.num = frame_rate.den;
3144 ap->width = frame_width;
3145 ap->height = frame_height;
3146 ap->pix_fmt = frame_pix_fmt;
3147 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3148 ap->channel = video_channel;
3149 ap->standard = video_standard;
3151 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3153 ic->video_codec_id =
3154 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3155 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3156 ic->audio_codec_id =
3157 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3158 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3159 ic->subtitle_codec_id=
3160 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3161 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3162 ic->flags |= AVFMT_FLAG_NONBLOCK;
3164 /* open the input file with generic libav function */
3165 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3167 print_error(filename, err);
3173 for(i=0; i<ic->nb_streams; i++){
3174 ic->streams[i]->discard= AVDISCARD_ALL;
3176 for(i=0; i<ic->nb_programs; i++){
3177 AVProgram *p= ic->programs[i];
3178 if(p->id != opt_programid){
3179 p->discard = AVDISCARD_ALL;
3182 for(j=0; j<p->nb_stream_indexes; j++){
3183 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3188 fprintf(stderr, "Specified program id not found\n");
3194 ic->loop_input = loop_input;
3196 /* If not enough info to get the stream parameters, we decode the
3197 first frames to get it. (used in mpeg case for example) */
3198 ret = av_find_stream_info(ic);
3199 if (ret < 0 && verbose >= 0) {
3200 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3201 av_close_input_file(ic);
3205 timestamp = start_time;
3206 /* add the stream start time */
3207 if (ic->start_time != AV_NOPTS_VALUE)
3208 timestamp += ic->start_time;
3210 /* if seeking requested, we execute it */
3211 if (start_time != 0) {
3212 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3214 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3215 filename, (double)timestamp / AV_TIME_BASE);
3217 /* reset seek info */
3221 /* update the current parameters so that they match the one of the input stream */
3222 for(i=0;i<ic->nb_streams;i++) {
3223 AVStream *st = ic->streams[i];
3224 AVCodecContext *dec = st->codec;
3225 dec->thread_count = thread_count;
3226 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3227 switch (dec->codec_type) {
3228 case AVMEDIA_TYPE_AUDIO:
3229 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3230 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]);
3231 channel_layout = dec->channel_layout;
3232 audio_channels = dec->channels;
3233 audio_sample_rate = dec->sample_rate;
3234 audio_sample_fmt = dec->sample_fmt;
3236 st->discard= AVDISCARD_ALL;
3237 /* Note that av_find_stream_info can add more streams, and we
3238 * currently have no chance of setting up lowres decoding
3239 * early enough for them. */
3241 audio_sample_rate >>= dec->lowres;
3243 case AVMEDIA_TYPE_VIDEO:
3244 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3245 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]);
3246 frame_height = dec->height;
3247 frame_width = dec->width;
3248 if(ic->streams[i]->sample_aspect_ratio.num)
3249 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3251 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3252 frame_aspect_ratio *= (float) dec->width / dec->height;
3253 frame_pix_fmt = dec->pix_fmt;
3254 rfps = ic->streams[i]->r_frame_rate.num;
3255 rfps_base = ic->streams[i]->r_frame_rate.den;
3257 dec->flags |= CODEC_FLAG_EMU_EDGE;
3258 frame_height >>= dec->lowres;
3259 frame_width >>= dec->lowres;
3260 dec->height = frame_height;
3261 dec->width = frame_width;
3264 dec->debug |= FF_DEBUG_MV;
3266 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3269 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3270 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3272 (float)rfps / rfps_base, rfps, rfps_base);
3274 /* update the current frame rate to match the stream frame rate */
3275 frame_rate.num = rfps;
3276 frame_rate.den = rfps_base;
3279 st->discard= AVDISCARD_ALL;
3280 else if(video_discard)
3281 st->discard= video_discard;
3283 case AVMEDIA_TYPE_DATA:
3285 case AVMEDIA_TYPE_SUBTITLE:
3286 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3287 if(subtitle_disable)
3288 st->discard = AVDISCARD_ALL;
3290 case AVMEDIA_TYPE_ATTACHMENT:
3291 case AVMEDIA_TYPE_UNKNOWN:
3298 input_files[nb_input_files] = ic;
3299 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3300 /* dump the file content */
3302 av_dump_format(ic, nb_input_files, filename, 0);
3308 av_freep(&video_codec_name);
3309 av_freep(&audio_codec_name);
3310 av_freep(&subtitle_codec_name);
3315 static void check_inputs(int *has_video_ptr,
3317 int *has_subtitle_ptr,
3320 int has_video, has_audio, has_subtitle, has_data, i, j;
3321 AVFormatContext *ic;
3328 for(j=0;j<nb_input_files;j++) {
3329 ic = input_files[j];
3330 for(i=0;i<ic->nb_streams;i++) {
3331 AVCodecContext *enc = ic->streams[i]->codec;
3332 switch(enc->codec_type) {
3333 case AVMEDIA_TYPE_AUDIO:
3336 case AVMEDIA_TYPE_VIDEO:
3339 case AVMEDIA_TYPE_SUBTITLE:
3342 case AVMEDIA_TYPE_DATA:
3343 case AVMEDIA_TYPE_ATTACHMENT:
3344 case AVMEDIA_TYPE_UNKNOWN:
3352 *has_video_ptr = has_video;
3353 *has_audio_ptr = has_audio;
3354 *has_subtitle_ptr = has_subtitle;
3355 *has_data_ptr = has_data;
3358 static void new_video_stream(AVFormatContext *oc, int file_idx)
3361 AVOutputStream *ost;
3362 AVCodecContext *video_enc;
3363 enum CodecID codec_id = CODEC_ID_NONE;
3364 AVCodec *codec= NULL;
3366 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3368 fprintf(stderr, "Could not alloc stream\n");
3371 ost = new_output_stream(oc, file_idx);
3373 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3374 if(!video_stream_copy){
3375 if (video_codec_name) {
3376 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3377 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3378 codec = avcodec_find_encoder_by_name(video_codec_name);
3379 output_codecs[nb_output_codecs-1] = codec;
3381 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3382 codec = avcodec_find_encoder(codec_id);
3386 avcodec_get_context_defaults3(st->codec, codec);
3387 ost->bitstream_filters = video_bitstream_filters;
3388 video_bitstream_filters= NULL;
3390 st->codec->thread_count= thread_count;
3392 video_enc = st->codec;
3395 video_enc->codec_tag= video_codec_tag;
3397 if( (video_global_header&1)
3398 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3399 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3400 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3402 if(video_global_header&2){
3403 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3404 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3407 if (video_stream_copy) {
3408 st->stream_copy = 1;
3409 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3410 video_enc->sample_aspect_ratio =
3411 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3415 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3417 video_enc->codec_id = codec_id;
3418 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3420 if (codec && codec->supported_framerates && !force_fps)
3421 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3422 video_enc->time_base.den = fps.num;
3423 video_enc->time_base.num = fps.den;
3425 video_enc->width = frame_width;
3426 video_enc->height = frame_height;
3427 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3428 video_enc->pix_fmt = frame_pix_fmt;
3429 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3431 choose_pixel_fmt(st, codec);
3434 video_enc->gop_size = 0;
3435 if (video_qscale || same_quality) {
3436 video_enc->flags |= CODEC_FLAG_QSCALE;
3437 video_enc->global_quality=
3438 st->quality = FF_QP2LAMBDA * video_qscale;
3442 video_enc->intra_matrix = intra_matrix;
3444 video_enc->inter_matrix = inter_matrix;
3446 p= video_rc_override_string;
3449 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3451 fprintf(stderr, "error parsing rc_override\n");
3454 video_enc->rc_override=
3455 av_realloc(video_enc->rc_override,
3456 sizeof(RcOverride)*(i+1));
3457 video_enc->rc_override[i].start_frame= start;
3458 video_enc->rc_override[i].end_frame = end;
3460 video_enc->rc_override[i].qscale= q;
3461 video_enc->rc_override[i].quality_factor= 1.0;
3464 video_enc->rc_override[i].qscale= 0;
3465 video_enc->rc_override[i].quality_factor= -q/100.0;
3470 video_enc->rc_override_count=i;
3471 if (!video_enc->rc_initial_buffer_occupancy)
3472 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3473 video_enc->me_threshold= me_threshold;
3474 video_enc->intra_dc_precision= intra_dc_precision - 8;
3477 video_enc->flags|= CODEC_FLAG_PSNR;
3482 video_enc->flags |= CODEC_FLAG_PASS1;
3484 video_enc->flags |= CODEC_FLAG_PASS2;
3488 if (forced_key_frames)
3489 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3491 if (video_language) {
3492 av_metadata_set2(&st->metadata, "language", video_language, 0);
3493 av_freep(&video_language);
3496 /* reset some key parameters */
3498 av_freep(&video_codec_name);
3499 av_freep(&forced_key_frames);
3500 video_stream_copy = 0;
3501 frame_pix_fmt = PIX_FMT_NONE;
3504 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3507 AVOutputStream *ost;
3508 AVCodec *codec= NULL;
3509 AVCodecContext *audio_enc;
3510 enum CodecID codec_id = CODEC_ID_NONE;
3512 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3514 fprintf(stderr, "Could not alloc stream\n");
3517 ost = new_output_stream(oc, file_idx);
3519 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3520 if(!audio_stream_copy){
3521 if (audio_codec_name) {
3522 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3523 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3524 codec = avcodec_find_encoder_by_name(audio_codec_name);
3525 output_codecs[nb_output_codecs-1] = codec;
3527 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3528 codec = avcodec_find_encoder(codec_id);
3532 avcodec_get_context_defaults3(st->codec, codec);
3534 ost->bitstream_filters = audio_bitstream_filters;
3535 audio_bitstream_filters= NULL;
3537 st->codec->thread_count= thread_count;
3539 audio_enc = st->codec;
3540 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3543 audio_enc->codec_tag= audio_codec_tag;
3545 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3546 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3547 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3549 if (audio_stream_copy) {
3550 st->stream_copy = 1;
3551 audio_enc->channels = audio_channels;
3552 audio_enc->sample_rate = audio_sample_rate;
3554 audio_enc->codec_id = codec_id;
3555 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3557 if (audio_qscale > QSCALE_NONE) {
3558 audio_enc->flags |= CODEC_FLAG_QSCALE;
3559 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3561 audio_enc->channels = audio_channels;
3562 audio_enc->sample_fmt = audio_sample_fmt;
3563 audio_enc->sample_rate = audio_sample_rate;
3564 audio_enc->channel_layout = channel_layout;
3565 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3566 audio_enc->channel_layout = 0;
3567 choose_sample_fmt(st, codec);
3568 choose_sample_rate(st, codec);
3570 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3571 if (audio_language) {
3572 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3573 av_freep(&audio_language);
3576 /* reset some key parameters */
3578 av_freep(&audio_codec_name);
3579 audio_stream_copy = 0;
3582 static void new_data_stream(AVFormatContext *oc, int file_idx)
3585 AVOutputStream *ost;
3586 AVCodec *codec=NULL;
3587 AVCodecContext *data_enc;
3589 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3591 fprintf(stderr, "Could not alloc stream\n");
3594 ost = new_output_stream(oc, file_idx);
3595 data_enc = st->codec;
3596 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3597 if (!data_stream_copy) {
3598 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3601 avcodec_get_context_defaults3(st->codec, codec);
3603 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3606 data_enc->codec_tag= data_codec_tag;
3608 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3609 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3610 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3612 if (data_stream_copy) {
3613 st->stream_copy = 1;
3617 av_freep(&data_codec_name);
3618 data_stream_copy = 0;
3621 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3624 AVOutputStream *ost;
3625 AVCodec *codec=NULL;
3626 AVCodecContext *subtitle_enc;
3627 enum CodecID codec_id = CODEC_ID_NONE;
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 ost = new_output_stream(oc, file_idx);
3635 subtitle_enc = st->codec;
3636 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3637 if(!subtitle_stream_copy){
3638 if (subtitle_codec_name) {
3639 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3640 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3641 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3643 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3644 codec = avcodec_find_encoder(codec_id);
3647 avcodec_get_context_defaults3(st->codec, codec);
3649 ost->bitstream_filters = subtitle_bitstream_filters;
3650 subtitle_bitstream_filters= NULL;
3652 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3654 if(subtitle_codec_tag)
3655 subtitle_enc->codec_tag= subtitle_codec_tag;
3657 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3658 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3659 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3661 if (subtitle_stream_copy) {
3662 st->stream_copy = 1;
3664 subtitle_enc->codec_id = codec_id;
3665 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3668 if (subtitle_language) {
3669 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3670 av_freep(&subtitle_language);
3673 subtitle_disable = 0;
3674 av_freep(&subtitle_codec_name);
3675 subtitle_stream_copy = 0;
3678 static int opt_new_stream(const char *opt, const char *arg)
3680 AVFormatContext *oc;
3681 int file_idx = nb_output_files - 1;
3682 if (nb_output_files <= 0) {
3683 fprintf(stderr, "At least one output file must be specified\n");
3686 oc = output_files[file_idx];
3688 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3689 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3690 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3691 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3696 /* arg format is "output-stream-index:streamid-value". */
3697 static int opt_streamid(const char *opt, const char *arg)
3703 av_strlcpy(idx_str, arg, sizeof(idx_str));
3704 p = strchr(idx_str, ':');
3707 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3712 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3713 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3714 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3718 static void opt_output_file(const char *filename)
3720 AVFormatContext *oc;
3721 int err, use_video, use_audio, use_subtitle, use_data;
3722 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3723 AVFormatParameters params, *ap = ¶ms;
3724 AVOutputFormat *file_oformat;
3726 if (!strcmp(filename, "-"))
3729 oc = avformat_alloc_context();
3731 print_error(filename, AVERROR(ENOMEM));
3735 if (last_asked_format) {
3736 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3737 if (!file_oformat) {
3738 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3741 last_asked_format = NULL;
3743 file_oformat = av_guess_format(NULL, filename, NULL);
3744 if (!file_oformat) {
3745 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3751 oc->oformat = file_oformat;
3752 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3754 if (!strcmp(file_oformat->name, "ffm") &&
3755 av_strstart(filename, "http:", NULL)) {
3756 /* special case for files sent to ffserver: we get the stream
3757 parameters from ffserver */
3758 int err = read_ffserver_streams(oc, filename);
3760 print_error(filename, err);
3764 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3765 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3766 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3767 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 */
3769 /* disable if no corresponding type found and at least one
3771 if (nb_input_files > 0) {
3772 check_inputs(&input_has_video,
3774 &input_has_subtitle,
3777 if (!input_has_video)
3779 if (!input_has_audio)
3781 if (!input_has_subtitle)
3783 if (!input_has_data)
3787 /* manual disable */
3788 if (audio_disable) use_audio = 0;
3789 if (video_disable) use_video = 0;
3790 if (subtitle_disable) use_subtitle = 0;
3791 if (data_disable) use_data = 0;
3793 if (use_video) new_video_stream(oc, nb_output_files);
3794 if (use_audio) new_audio_stream(oc, nb_output_files);
3795 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3796 if (use_data) new_data_stream(oc, nb_output_files);
3798 oc->timestamp = recording_timestamp;
3800 av_metadata_copy(&oc->metadata, metadata, 0);
3801 av_metadata_free(&metadata);
3804 output_files[nb_output_files++] = oc;
3806 /* check filename in case of an image number is expected */
3807 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3808 if (!av_filename_number_test(oc->filename)) {
3809 print_error(oc->filename, AVERROR(EINVAL));
3814 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3815 /* test if it already exists to avoid loosing precious files */
3816 if (!file_overwrite &&
3817 (strchr(filename, ':') == NULL ||
3818 filename[1] == ':' ||
3819 av_strstart(filename, "file:", NULL))) {
3820 if (avio_check(filename, 0) == 0) {
3822 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3824 if (!read_yesno()) {
3825 fprintf(stderr, "Not overwriting - exiting\n");
3830 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3837 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3838 print_error(filename, err);
3843 memset(ap, 0, sizeof(*ap));
3844 if (av_set_parameters(oc, ap) < 0) {
3845 fprintf(stderr, "%s: Invalid encoding parameters\n",
3850 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3851 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3852 oc->loop_output = loop_output;
3853 oc->flags |= AVFMT_FLAG_NONBLOCK;
3855 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3857 av_freep(&forced_key_frames);
3862 /* same option as mencoder */
3863 static void opt_pass(const char *pass_str)
3866 pass = atoi(pass_str);
3867 if (pass != 1 && pass != 2) {
3868 fprintf(stderr, "pass number can be only 1 or 2\n");
3874 static int64_t getutime(void)
3877 struct rusage rusage;
3879 getrusage(RUSAGE_SELF, &rusage);
3880 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3881 #elif HAVE_GETPROCESSTIMES
3883 FILETIME c, e, k, u;
3884 proc = GetCurrentProcess();
3885 GetProcessTimes(proc, &c, &e, &k, &u);
3886 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3888 return av_gettime();
3892 static int64_t getmaxrss(void)
3894 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3895 struct rusage rusage;
3896 getrusage(RUSAGE_SELF, &rusage);
3897 return (int64_t)rusage.ru_maxrss * 1024;
3898 #elif HAVE_GETPROCESSMEMORYINFO
3900 PROCESS_MEMORY_COUNTERS memcounters;
3901 proc = GetCurrentProcess();
3902 memcounters.cb = sizeof(memcounters);
3903 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3904 return memcounters.PeakPagefileUsage;
3910 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3913 const char *p = str;
3920 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3927 static void opt_inter_matrix(const char *arg)
3929 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3930 parse_matrix_coeffs(inter_matrix, arg);
3933 static void opt_intra_matrix(const char *arg)
3935 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3936 parse_matrix_coeffs(intra_matrix, arg);
3939 static void show_usage(void)
3941 printf("Hyper fast Audio and Video encoder\n");
3942 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3946 static void show_help(void)
3949 AVOutputFormat *oformat = NULL;
3951 av_log_set_callback(log_callback_help);
3953 show_help_options(options, "Main options:\n",
3954 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3955 show_help_options(options, "\nAdvanced options:\n",
3956 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3958 show_help_options(options, "\nVideo options:\n",
3959 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3961 show_help_options(options, "\nAdvanced Video options:\n",
3962 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3963 OPT_VIDEO | OPT_EXPERT);
3964 show_help_options(options, "\nAudio options:\n",
3965 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3967 show_help_options(options, "\nAdvanced Audio options:\n",
3968 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3969 OPT_AUDIO | OPT_EXPERT);
3970 show_help_options(options, "\nSubtitle options:\n",
3971 OPT_SUBTITLE | OPT_GRAB,
3973 show_help_options(options, "\nAudio/Video grab options:\n",
3977 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3980 /* individual codec options */
3982 while ((c = av_codec_next(c))) {
3983 if (c->priv_class) {
3984 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3989 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3992 /* individual muxer options */
3993 while ((oformat = av_oformat_next(oformat))) {
3994 if (oformat->priv_class) {
3995 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4000 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4003 static void opt_target(const char *arg)
4005 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4006 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4008 if(!strncmp(arg, "pal-", 4)) {
4011 } else if(!strncmp(arg, "ntsc-", 5)) {
4014 } else if(!strncmp(arg, "film-", 5)) {
4019 /* Calculate FR via float to avoid int overflow */
4020 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4023 } else if((fr == 29970) || (fr == 23976)) {
4026 /* Try to determine PAL/NTSC by peeking in the input files */
4027 if(nb_input_files) {
4029 for(j = 0; j < nb_input_files; j++) {
4030 for(i = 0; i < input_files[j]->nb_streams; i++) {
4031 AVCodecContext *c = input_files[j]->streams[i]->codec;
4032 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4034 fr = c->time_base.den * 1000 / c->time_base.num;
4038 } else if((fr == 29970) || (fr == 23976)) {
4048 if(verbose > 0 && norm != UNKNOWN)
4049 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4052 if(norm == UNKNOWN) {
4053 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4054 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4055 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4059 if(!strcmp(arg, "vcd")) {
4061 opt_video_codec("mpeg1video");
4062 opt_audio_codec("mp2");
4065 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4066 opt_frame_rate(NULL, frame_rates[norm]);
4067 opt_default("g", norm == PAL ? "15" : "18");
4069 opt_default("b", "1150000");
4070 opt_default("maxrate", "1150000");
4071 opt_default("minrate", "1150000");
4072 opt_default("bufsize", "327680"); // 40*1024*8;
4074 opt_default("ab", "224000");
4075 audio_sample_rate = 44100;
4078 opt_default("packetsize", "2324");
4079 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4081 /* We have to offset the PTS, so that it is consistent with the SCR.
4082 SCR starts at 36000, but the first two packs contain only padding
4083 and the first pack from the other stream, respectively, may also have
4084 been written before.
4085 So the real data starts at SCR 36000+3*1200. */
4086 mux_preload= (36000+3*1200) / 90000.0; //0.44
4087 } else if(!strcmp(arg, "svcd")) {
4089 opt_video_codec("mpeg2video");
4090 opt_audio_codec("mp2");
4093 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4094 opt_frame_rate(NULL, frame_rates[norm]);
4095 opt_default("g", norm == PAL ? "15" : "18");
4097 opt_default("b", "2040000");
4098 opt_default("maxrate", "2516000");
4099 opt_default("minrate", "0"); //1145000;
4100 opt_default("bufsize", "1835008"); //224*1024*8;
4101 opt_default("flags", "+scan_offset");
4104 opt_default("ab", "224000");
4105 audio_sample_rate = 44100;
4107 opt_default("packetsize", "2324");
4109 } else if(!strcmp(arg, "dvd")) {
4111 opt_video_codec("mpeg2video");
4112 opt_audio_codec("ac3");
4115 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4116 opt_frame_rate(NULL, frame_rates[norm]);
4117 opt_default("g", norm == PAL ? "15" : "18");
4119 opt_default("b", "6000000");
4120 opt_default("maxrate", "9000000");
4121 opt_default("minrate", "0"); //1500000;
4122 opt_default("bufsize", "1835008"); //224*1024*8;
4124 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4125 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4127 opt_default("ab", "448000");
4128 audio_sample_rate = 48000;
4130 } else if(!strncmp(arg, "dv", 2)) {
4134 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4135 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4136 (norm == PAL ? "yuv420p" : "yuv411p"));
4137 opt_frame_rate(NULL, frame_rates[norm]);
4139 audio_sample_rate = 48000;
4143 fprintf(stderr, "Unknown target: %s\n", arg);
4148 static void opt_vstats_file (const char *arg)
4150 av_free (vstats_filename);
4151 vstats_filename=av_strdup (arg);
4154 static void opt_vstats (void)
4157 time_t today2 = time(NULL);
4158 struct tm *today = localtime(&today2);
4160 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4162 opt_vstats_file(filename);
4165 static int opt_bsf(const char *opt, const char *arg)
4167 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4168 AVBitStreamFilterContext **bsfp;
4171 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4175 bsfp= *opt == 'v' ? &video_bitstream_filters :
4176 *opt == 'a' ? &audio_bitstream_filters :
4177 &subtitle_bitstream_filters;
4179 bsfp= &(*bsfp)->next;
4186 static int opt_preset(const char *opt, const char *arg)
4189 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4190 char *codec_name = *opt == 'v' ? video_codec_name :
4191 *opt == 'a' ? audio_codec_name :
4192 subtitle_codec_name;
4194 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4195 fprintf(stderr, "File for preset '%s' not found\n", arg);
4200 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4201 if(line[0] == '#' && !e)
4203 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4205 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4208 if(!strcmp(tmp, "acodec")){
4209 opt_audio_codec(tmp2);
4210 }else if(!strcmp(tmp, "vcodec")){
4211 opt_video_codec(tmp2);
4212 }else if(!strcmp(tmp, "scodec")){
4213 opt_subtitle_codec(tmp2);
4214 }else if(!strcmp(tmp, "dcodec")){
4215 opt_data_codec(tmp2);
4216 }else if(opt_default(tmp, tmp2) < 0){
4217 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4227 static const OptionDef options[] = {
4229 #include "cmdutils_common_opts.h"
4230 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4231 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4232 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4233 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4234 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4235 "outfile[,metadata]:infile[,metadata]" },
4236 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4237 "outfile[,metadata]:infile[,metadata]" },
4238 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4239 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4240 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4241 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4242 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4243 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4244 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4245 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4246 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4247 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4248 "add timings for benchmarking" },
4249 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4250 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4251 "dump each input packet" },
4252 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4253 "when dumping packets, also dump the payload" },
4254 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4255 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4256 { "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)", "" },
4257 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4258 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4259 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4260 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4261 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4262 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4263 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4264 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4265 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4266 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4267 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4268 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4269 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4270 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4273 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4274 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4275 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4276 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4277 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4278 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4279 { "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" },
4280 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4281 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4282 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4283 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4284 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4285 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4286 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4287 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4288 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4289 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4290 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4291 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4292 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4293 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4294 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4295 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4296 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4297 "use same quantizer as source (implies VBR)" },
4298 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4299 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4300 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4301 "deinterlace pictures" },
4302 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4303 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4304 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4306 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4308 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4309 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4310 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4311 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4312 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4313 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4314 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4315 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4316 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4317 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4318 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4321 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4322 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4323 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4324 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4325 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4326 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4327 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4328 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4329 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4330 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4331 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4332 { "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" },
4334 /* subtitle options */
4335 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4336 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4337 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4338 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4339 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4342 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4343 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4344 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4347 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4348 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4350 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4351 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4352 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4354 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4355 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4356 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4357 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4358 /* data codec support */
4359 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4361 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4365 int main(int argc, char **argv)
4369 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4371 avcodec_register_all();
4373 avdevice_register_all();
4376 avfilter_register_all();
4381 if(isatty(STDIN_FILENO))
4382 avio_set_interrupt_cb(decode_interrupt_cb);
4390 parse_options(argc, argv, options, opt_output_file);
4392 if(nb_output_files <= 0 && nb_input_files == 0) {
4394 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4398 /* file converter / grab */
4399 if (nb_output_files <= 0) {
4400 fprintf(stderr, "At least one output file must be specified\n");
4404 if (nb_input_files == 0) {
4405 fprintf(stderr, "At least one input file must be specified\n");
4410 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4411 stream_maps, nb_stream_maps) < 0)
4413 ti = getutime() - ti;
4415 int maxrss = getmaxrss() / 1024;
4416 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4419 return ffmpeg_exit(0);