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 "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
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 #if !FF_API_MAX_STREAMS
110 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
113 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
115 static const char *last_asked_format = NULL;
116 static AVFormatContext *input_files[MAX_FILES];
117 static int64_t input_files_ts_offset[MAX_FILES];
118 static double *input_files_ts_scale[MAX_FILES] = {NULL};
119 static AVCodec **input_codecs = NULL;
120 static int nb_input_files = 0;
121 static int nb_input_codecs = 0;
122 static int nb_input_files_ts_scale[MAX_FILES] = {0};
124 static AVFormatContext *output_files[MAX_FILES];
125 static AVCodec **output_codecs = NULL;
126 static int nb_output_files = 0;
127 static int nb_output_codecs = 0;
129 static AVStreamMap *stream_maps = NULL;
130 static int nb_stream_maps;
132 /* first item specifies output metadata, second is input */
133 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
134 static int nb_meta_data_maps;
135 static int metadata_global_autocopy = 1;
136 static int metadata_streams_autocopy = 1;
137 static int metadata_chapters_autocopy = 1;
139 static AVChapterMap *chapter_maps = NULL;
140 static int nb_chapter_maps;
142 /* indexed by output file stream index */
143 static int *streamid_map = NULL;
144 static int nb_streamid_map = 0;
146 static int frame_width = 0;
147 static int frame_height = 0;
148 static float frame_aspect_ratio = 0;
149 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
150 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
151 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
152 static AVRational frame_rate;
153 static float video_qscale = 0;
154 static uint16_t *intra_matrix = NULL;
155 static uint16_t *inter_matrix = NULL;
156 static const char *video_rc_override_string=NULL;
157 static int video_disable = 0;
158 static int video_discard = 0;
159 static char *video_codec_name = NULL;
160 static unsigned int video_codec_tag = 0;
161 static char *video_language = NULL;
162 static int same_quality = 0;
163 static int do_deinterlace = 0;
164 static int top_field_first = -1;
165 static int me_threshold = 0;
166 static int intra_dc_precision = 8;
167 static int loop_input = 0;
168 static int loop_output = AVFMT_NOOUTPUTLOOP;
169 static int qp_hist = 0;
171 static char *vfilters = NULL;
172 static AVFilterGraph *graph = NULL;
175 static int intra_only = 0;
176 static int audio_sample_rate = 44100;
177 static int64_t channel_layout = 0;
178 #define QSCALE_NONE -99999
179 static float audio_qscale = QSCALE_NONE;
180 static int audio_disable = 0;
181 static int audio_channels = 1;
182 static char *audio_codec_name = NULL;
183 static unsigned int audio_codec_tag = 0;
184 static char *audio_language = NULL;
186 static int subtitle_disable = 0;
187 static char *subtitle_codec_name = NULL;
188 static char *subtitle_language = NULL;
189 static unsigned int subtitle_codec_tag = 0;
191 static float mux_preload= 0.5;
192 static float mux_max_delay= 0.7;
194 static int64_t recording_time = INT64_MAX;
195 static int64_t start_time = 0;
196 static int64_t recording_timestamp = 0;
197 static int64_t input_ts_offset = 0;
198 static int file_overwrite = 0;
199 static AVMetadata *metadata;
200 static int do_benchmark = 0;
201 static int do_hex_dump = 0;
202 static int do_pkt_dump = 0;
203 static int do_psnr = 0;
204 static int do_pass = 0;
205 static char *pass_logfilename_prefix = NULL;
206 static int audio_stream_copy = 0;
207 static int video_stream_copy = 0;
208 static int subtitle_stream_copy = 0;
209 static int video_sync_method= -1;
210 static int audio_sync_method= 0;
211 static float audio_drift_threshold= 0.1;
212 static int copy_ts= 0;
214 static int opt_shortest = 0;
215 static int video_global_header = 0;
216 static char *vstats_filename;
217 static FILE *vstats_file;
218 static int opt_programid = 0;
219 static int copy_initial_nonkeyframes = 0;
221 static int rate_emu = 0;
223 static int video_channel = 0;
224 static char *video_standard;
226 static int audio_volume = 256;
228 static int exit_on_error = 0;
229 static int using_stdin = 0;
230 static int verbose = 1;
231 static int thread_count= 1;
232 static int q_pressed = 0;
233 static int64_t video_size = 0;
234 static int64_t audio_size = 0;
235 static int64_t extra_size = 0;
236 static int nb_frames_dup = 0;
237 static int nb_frames_drop = 0;
238 static int input_sync;
239 static uint64_t limit_filesize = 0;
240 static int force_fps = 0;
241 static char *forced_key_frames = NULL;
243 static float dts_delta_threshold = 10;
245 static unsigned int sws_flags = SWS_BICUBIC;
247 static int64_t timer_start;
249 static uint8_t *audio_buf;
250 static uint8_t *audio_out;
251 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
253 static short *samples;
255 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
256 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
257 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
259 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
261 struct AVInputStream;
263 typedef struct AVOutputStream {
264 int file_index; /* file index */
265 int index; /* stream index in the output file */
266 int source_index; /* AVInputStream index */
267 AVStream *st; /* stream in the output file */
268 int encoding_needed; /* true if encoding needed for this stream */
270 /* input pts and corresponding output pts
272 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
273 struct AVInputStream *sync_ist; /* input stream to sync against */
274 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
275 AVBitStreamFilterContext *bitstream_filters;
278 AVFrame pict_tmp; /* temporary image for resampling */
279 struct SwsContext *img_resample_ctx; /* for image resampling */
282 int resample_pix_fmt;
284 /* full frame size of first frame */
288 /* forced key frames */
289 int64_t *forced_kf_pts;
295 ReSampleContext *resample; /* for audio resampling */
296 int resample_sample_fmt;
297 int resample_channels;
298 int resample_sample_rate;
300 AVAudioConvert *reformat_ctx;
301 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
305 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
306 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
308 typedef struct AVInputStream {
312 int discard; /* true if stream data should be discarded */
313 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
314 int64_t sample_index; /* current sample */
316 int64_t start; /* time when read started */
317 int64_t next_pts; /* synthetic pts for cases where pkt.pts
319 int64_t pts; /* current pts */
320 PtsCorrectionContext pts_ctx;
321 int is_start; /* is 1 at the start and after a discontinuity */
322 int showed_multi_packet_warning;
323 int is_past_recording_time;
325 AVFilterContext *output_video_filter;
326 AVFilterContext *input_video_filter;
327 AVFrame *filter_frame;
328 int has_filter_frame;
329 AVFilterBufferRef *picref;
333 typedef struct AVInputFile {
334 int eof_reached; /* true if eof reached */
335 int ist_index; /* index of first stream in ist_table */
336 int buffer_size; /* current total buffer size */
337 int nb_streams; /* nb streams we are aware of */
342 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
344 AVFilterContext *last_filter, *filter;
345 /** filter graph containing all filters including input & output */
346 AVCodecContext *codec = ost->st->codec;
347 AVCodecContext *icodec = ist->st->codec;
348 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
352 graph = avfilter_graph_alloc();
354 snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
355 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE);
356 ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"),
357 "src", args, NULL, graph);
360 ret = avfilter_graph_create_filter(&ist->output_video_filter, &ffsink,
361 "out", NULL, &ffsink_ctx, graph);
364 last_filter = ist->input_video_filter;
366 if (codec->width != icodec->width || codec->height != icodec->height) {
367 snprintf(args, 255, "%d:%d:flags=0x%X",
370 (int)av_get_int(sws_opts, "sws_flags", NULL));
371 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
372 NULL, args, NULL, graph)) < 0)
374 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
376 last_filter = filter;
379 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
380 graph->scale_sws_opts = av_strdup(args);
383 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
384 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
386 outputs->name = av_strdup("in");
387 outputs->filter_ctx = last_filter;
388 outputs->pad_idx = 0;
389 outputs->next = NULL;
391 inputs->name = av_strdup("out");
392 inputs->filter_ctx = ist->output_video_filter;
396 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
400 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
404 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
407 codec->width = ist->output_video_filter->inputs[0]->w;
408 codec->height = ist->output_video_filter->inputs[0]->h;
412 #endif /* CONFIG_AVFILTER */
414 static void term_exit(void)
416 av_log(NULL, AV_LOG_QUIET, "");
419 static volatile int received_sigterm = 0;
422 sigterm_handler(int sig)
424 received_sigterm = sig;
428 static void term_init(void)
430 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
431 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
433 signal(SIGXCPU, sigterm_handler);
437 /* read a key without blocking */
438 static int read_key(void)
447 static int decode_interrupt_cb(void)
449 return q_pressed || (q_pressed = read_key() == 'q');
452 static int ffmpeg_exit(int ret)
457 for(i=0;i<nb_output_files;i++) {
458 AVFormatContext *s = output_files[i];
459 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
461 avformat_free_context(s);
462 av_free(output_streams_for_file[i]);
464 for(i=0;i<nb_input_files;i++) {
465 av_close_input_file(input_files[i]);
466 av_free(input_files_ts_scale[i]);
469 av_free(intra_matrix);
470 av_free(inter_matrix);
474 av_free(vstats_filename);
476 av_free(streamid_map);
477 av_free(input_codecs);
478 av_free(output_codecs);
479 av_free(stream_maps);
480 av_free(meta_data_maps);
482 av_free(video_codec_name);
483 av_free(audio_codec_name);
484 av_free(subtitle_codec_name);
486 av_free(video_standard);
491 allocated_audio_buf_size= allocated_audio_out_size= 0;
498 if (received_sigterm) {
500 "Received signal %d: terminating.\n",
501 (int) received_sigterm);
505 exit(ret); /* not all OS-es handle main() return value */
509 /* similar to ff_dynarray_add() and av_fast_realloc() */
510 static void *grow_array(void *array, int elem_size, int *size, int new_size)
512 if (new_size >= INT_MAX / elem_size) {
513 fprintf(stderr, "Array too big.\n");
516 if (*size < new_size) {
517 uint8_t *tmp = av_realloc(array, new_size*elem_size);
519 fprintf(stderr, "Could not alloc buffer.\n");
522 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
529 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
531 if(codec && codec->sample_fmts){
532 const enum AVSampleFormat *p= codec->sample_fmts;
534 if(*p == st->codec->sample_fmt)
538 av_log(NULL, AV_LOG_WARNING,
539 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
540 av_get_sample_fmt_name(st->codec->sample_fmt),
542 av_get_sample_fmt_name(codec->sample_fmts[0]));
543 st->codec->sample_fmt = codec->sample_fmts[0];
548 static void choose_sample_rate(AVStream *st, AVCodec *codec)
550 if(codec && codec->supported_samplerates){
551 const int *p= codec->supported_samplerates;
553 int best_dist=INT_MAX;
555 int dist= abs(st->codec->sample_rate - *p);
556 if(dist < best_dist){
562 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
564 st->codec->sample_rate= best;
568 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
570 if(codec && codec->pix_fmts){
571 const enum PixelFormat *p= codec->pix_fmts;
572 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
573 if(st->codec->codec_id==CODEC_ID_MJPEG){
574 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
575 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
576 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};
580 if(*p == st->codec->pix_fmt)
584 st->codec->pix_fmt = codec->pix_fmts[0];
588 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
590 int idx = oc->nb_streams - 1;
593 output_streams_for_file[file_idx] =
594 grow_array(output_streams_for_file[file_idx],
595 sizeof(*output_streams_for_file[file_idx]),
596 &nb_output_streams_for_file[file_idx],
598 ost = output_streams_for_file[file_idx][idx] =
599 av_mallocz(sizeof(AVOutputStream));
601 fprintf(stderr, "Could not alloc output stream\n");
604 ost->file_index = file_idx;
609 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
615 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
618 /* copy stream format */
620 for(i=0;i<ic->nb_streams;i++) {
626 // FIXME: a more elegant solution is needed
627 st = av_mallocz(sizeof(AVStream));
628 memcpy(st, ic->streams[i], sizeof(AVStream));
629 st->codec = avcodec_alloc_context();
631 print_error(filename, AVERROR(ENOMEM));
634 avcodec_copy_context(st->codec, ic->streams[i]->codec);
637 codec = avcodec_find_encoder(st->codec->codec_id);
638 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
639 if (audio_stream_copy) {
642 choose_sample_fmt(st, codec);
643 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
644 if (video_stream_copy) {
647 choose_pixel_fmt(st, codec);
650 if(st->codec->flags & CODEC_FLAG_BITEXACT)
653 new_output_stream(s, nb_output_files);
657 s->timestamp = av_gettime();
659 av_close_input_file(ic);
664 get_sync_ipts(const AVOutputStream *ost)
666 const AVInputStream *ist = ost->sync_ist;
667 return (double)(ist->pts - start_time)/AV_TIME_BASE;
670 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
674 AVPacket new_pkt= *pkt;
675 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
676 &new_pkt.data, &new_pkt.size,
677 pkt->data, pkt->size,
678 pkt->flags & AV_PKT_FLAG_KEY);
681 new_pkt.destruct= av_destruct_packet;
683 fprintf(stderr, "%s failed for stream %d, codec %s",
684 bsfc->filter->name, pkt->stream_index,
685 avctx->codec ? avctx->codec->name : "copy");
695 ret= av_interleaved_write_frame(s, pkt);
697 print_error("av_interleaved_write_frame()", ret);
702 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
704 static void do_audio_out(AVFormatContext *s,
707 unsigned char *buf, int size)
710 int64_t audio_out_size, audio_buf_size;
711 int64_t allocated_for_size= size;
713 int size_out, frame_bytes, ret, resample_changed;
714 AVCodecContext *enc= ost->st->codec;
715 AVCodecContext *dec= ist->st->codec;
716 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
717 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
718 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
721 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
722 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
723 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
724 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
725 audio_buf_size*= osize*enc->channels;
727 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
728 if(coded_bps > 8*osize)
729 audio_out_size= audio_out_size * coded_bps / (8*osize);
730 audio_out_size += FF_MIN_BUFFER_SIZE;
732 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
733 fprintf(stderr, "Buffer sizes too large\n");
737 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
738 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
739 if (!audio_buf || !audio_out){
740 fprintf(stderr, "Out of memory in do_audio_out\n");
744 if (enc->channels != dec->channels)
745 ost->audio_resample = 1;
747 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
748 ost->resample_channels != dec->channels ||
749 ost->resample_sample_rate != dec->sample_rate;
751 if ((ost->audio_resample && !ost->resample) || resample_changed) {
752 if (resample_changed) {
753 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",
754 ist->file_index, ist->index,
755 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
756 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
757 ost->resample_sample_fmt = dec->sample_fmt;
758 ost->resample_channels = dec->channels;
759 ost->resample_sample_rate = dec->sample_rate;
761 audio_resample_close(ost->resample);
763 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
764 if (audio_sync_method <= 1 &&
765 ost->resample_sample_fmt == enc->sample_fmt &&
766 ost->resample_channels == enc->channels &&
767 ost->resample_sample_rate == enc->sample_rate) {
768 ost->resample = NULL;
769 ost->audio_resample = 0;
771 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
772 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
773 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
774 enc->sample_rate, dec->sample_rate,
775 enc->sample_fmt, dec->sample_fmt,
777 if (!ost->resample) {
778 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
779 dec->channels, dec->sample_rate,
780 enc->channels, enc->sample_rate);
786 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
787 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
788 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
789 if (ost->reformat_ctx)
790 av_audio_convert_free(ost->reformat_ctx);
791 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
792 dec->sample_fmt, 1, NULL, 0);
793 if (!ost->reformat_ctx) {
794 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
795 av_get_sample_fmt_name(dec->sample_fmt),
796 av_get_sample_fmt_name(enc->sample_fmt));
799 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
802 if(audio_sync_method){
803 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
804 - av_fifo_size(ost->fifo)/(enc->channels * 2);
805 double idelta= delta*dec->sample_rate / enc->sample_rate;
806 int byte_delta= ((int)idelta)*2*dec->channels;
808 //FIXME resample delay
809 if(fabs(delta) > 50){
810 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
812 byte_delta= FFMAX(byte_delta, -size);
816 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
821 static uint8_t *input_tmp= NULL;
822 input_tmp= av_realloc(input_tmp, byte_delta + size);
824 if(byte_delta > allocated_for_size - size){
825 allocated_for_size= byte_delta + (int64_t)size;
830 memset(input_tmp, 0, byte_delta);
831 memcpy(input_tmp + byte_delta, buf, size);
835 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
837 }else if(audio_sync_method>1){
838 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
839 av_assert0(ost->audio_resample);
841 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
842 // 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));
843 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
847 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
848 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
850 if (ost->audio_resample) {
852 size_out = audio_resample(ost->resample,
853 (short *)buftmp, (short *)buf,
854 size / (dec->channels * isize));
855 size_out = size_out * enc->channels * osize;
861 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
862 const void *ibuf[6]= {buftmp};
863 void *obuf[6]= {audio_buf};
864 int istride[6]= {isize};
865 int ostride[6]= {osize};
866 int len= size_out/istride[0];
867 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
868 printf("av_audio_convert() failed\n");
874 size_out = len*osize;
877 /* now encode as many frames as possible */
878 if (enc->frame_size > 1) {
879 /* output resampled raw samples */
880 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
881 fprintf(stderr, "av_fifo_realloc2() failed\n");
884 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
886 frame_bytes = enc->frame_size * osize * enc->channels;
888 while (av_fifo_size(ost->fifo) >= frame_bytes) {
890 av_init_packet(&pkt);
892 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
894 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
896 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
899 fprintf(stderr, "Audio encoding failed\n");
903 pkt.stream_index= ost->index;
906 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
907 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
908 pkt.flags |= AV_PKT_FLAG_KEY;
909 write_frame(s, &pkt, enc, ost->bitstream_filters);
911 ost->sync_opts += enc->frame_size;
915 av_init_packet(&pkt);
917 ost->sync_opts += size_out / (osize * enc->channels);
919 /* output a pcm frame */
920 /* determine the size of the coded buffer */
923 size_out = size_out*coded_bps/8;
925 if(size_out > audio_out_size){
926 fprintf(stderr, "Internal error, buffer size too small\n");
930 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
931 ret = avcodec_encode_audio(enc, audio_out, size_out,
934 fprintf(stderr, "Audio encoding failed\n");
938 pkt.stream_index= ost->index;
941 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
942 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
943 pkt.flags |= AV_PKT_FLAG_KEY;
944 write_frame(s, &pkt, enc, ost->bitstream_filters);
948 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
952 AVPicture picture_tmp;
955 dec = ist->st->codec;
957 /* deinterlace : must be done before any resize */
958 if (do_deinterlace) {
961 /* create temporary picture */
962 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
963 buf = av_malloc(size);
967 picture2 = &picture_tmp;
968 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
970 if(avpicture_deinterlace(picture2, picture,
971 dec->pix_fmt, dec->width, dec->height) < 0) {
972 /* if error, do not deinterlace */
973 fprintf(stderr, "Deinterlacing failed\n");
982 if (picture != picture2)
983 *picture = *picture2;
987 /* we begin to correct av delay at this threshold */
988 #define AV_DELAY_MAX 0.100
990 static void do_subtitle_out(AVFormatContext *s,
996 static uint8_t *subtitle_out = NULL;
997 int subtitle_out_max_size = 1024 * 1024;
998 int subtitle_out_size, nb, i;
1002 if (pts == AV_NOPTS_VALUE) {
1003 fprintf(stderr, "Subtitle packets must have a pts\n");
1009 enc = ost->st->codec;
1011 if (!subtitle_out) {
1012 subtitle_out = av_malloc(subtitle_out_max_size);
1015 /* Note: DVB subtitle need one packet to draw them and one other
1016 packet to clear them */
1017 /* XXX: signal it in the codec context ? */
1018 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1023 for(i = 0; i < nb; i++) {
1024 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1025 // start_display_time is required to be 0
1026 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1027 sub->end_display_time -= sub->start_display_time;
1028 sub->start_display_time = 0;
1029 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1030 subtitle_out_max_size, sub);
1031 if (subtitle_out_size < 0) {
1032 fprintf(stderr, "Subtitle encoding failed\n");
1036 av_init_packet(&pkt);
1037 pkt.stream_index = ost->index;
1038 pkt.data = subtitle_out;
1039 pkt.size = subtitle_out_size;
1040 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1041 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1042 /* XXX: the pts correction is handled here. Maybe handling
1043 it in the codec would be better */
1045 pkt.pts += 90 * sub->start_display_time;
1047 pkt.pts += 90 * sub->end_display_time;
1049 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1053 static int bit_buffer_size= 1024*256;
1054 static uint8_t *bit_buffer= NULL;
1056 static void do_video_out(AVFormatContext *s,
1057 AVOutputStream *ost,
1059 AVFrame *in_picture,
1062 int nb_frames, i, ret;
1063 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1064 AVCodecContext *enc, *dec;
1067 enc = ost->st->codec;
1068 dec = ist->st->codec;
1070 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1072 /* by default, we output a single frame */
1077 if(video_sync_method){
1078 double vdelta = sync_ipts - ost->sync_opts;
1079 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1082 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1085 }else if(vdelta>0.6)
1086 ost->sync_opts= lrintf(sync_ipts);
1087 }else if (vdelta > 1.1)
1088 nb_frames = lrintf(vdelta);
1089 //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);
1090 if (nb_frames == 0){
1093 fprintf(stderr, "*** drop!\n");
1094 }else if (nb_frames > 1) {
1095 nb_frames_dup += nb_frames - 1;
1097 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1100 ost->sync_opts= lrintf(sync_ipts);
1102 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1106 formatted_picture = in_picture;
1107 final_picture = formatted_picture;
1108 padding_src = formatted_picture;
1109 resampling_dst = &ost->pict_tmp;
1111 if ( ost->resample_height != ist->st->codec->height
1112 || ost->resample_width != ist->st->codec->width
1113 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1115 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));
1116 if(!ost->video_resample)
1120 #if !CONFIG_AVFILTER
1121 if (ost->video_resample) {
1123 final_picture = &ost->pict_tmp;
1124 if( ost->resample_height != ist->st->codec->height
1125 || ost->resample_width != ist->st->codec->width
1126 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1128 /* initialize a new scaler context */
1129 sws_freeContext(ost->img_resample_ctx);
1130 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1131 ost->img_resample_ctx = sws_getContext(
1132 ist->st->codec->width,
1133 ist->st->codec->height,
1134 ist->st->codec->pix_fmt,
1135 ost->st->codec->width,
1136 ost->st->codec->height,
1137 ost->st->codec->pix_fmt,
1138 sws_flags, NULL, NULL, NULL);
1139 if (ost->img_resample_ctx == NULL) {
1140 fprintf(stderr, "Cannot get resampling context\n");
1144 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1145 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1149 /* duplicates frame if needed */
1150 for(i=0;i<nb_frames;i++) {
1152 av_init_packet(&pkt);
1153 pkt.stream_index= ost->index;
1155 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1156 /* raw pictures are written as AVPicture structure to
1157 avoid any copies. We support temorarily the older
1159 AVFrame* old_frame = enc->coded_frame;
1160 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1161 pkt.data= (uint8_t *)final_picture;
1162 pkt.size= sizeof(AVPicture);
1163 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1164 pkt.flags |= AV_PKT_FLAG_KEY;
1166 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1167 enc->coded_frame = old_frame;
1169 AVFrame big_picture;
1171 big_picture= *final_picture;
1172 /* better than nothing: use input picture interlaced
1174 big_picture.interlaced_frame = in_picture->interlaced_frame;
1175 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1176 if(top_field_first == -1)
1177 big_picture.top_field_first = in_picture->top_field_first;
1179 big_picture.top_field_first = top_field_first;
1182 /* handles sameq here. This is not correct because it may
1183 not be a global option */
1184 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1186 big_picture.pict_type = 0;
1187 // big_picture.pts = AV_NOPTS_VALUE;
1188 big_picture.pts= ost->sync_opts;
1189 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1190 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1191 if (ost->forced_kf_index < ost->forced_kf_count &&
1192 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1193 big_picture.pict_type = FF_I_TYPE;
1194 ost->forced_kf_index++;
1196 ret = avcodec_encode_video(enc,
1197 bit_buffer, bit_buffer_size,
1200 fprintf(stderr, "Video encoding failed\n");
1205 pkt.data= bit_buffer;
1207 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1208 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1209 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1210 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1211 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1213 if(enc->coded_frame->key_frame)
1214 pkt.flags |= AV_PKT_FLAG_KEY;
1215 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1218 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1219 // enc->frame_number-1, ret, enc->pict_type);
1220 /* if two pass, output log */
1221 if (ost->logfile && enc->stats_out) {
1222 fprintf(ost->logfile, "%s", enc->stats_out);
1227 ost->frame_number++;
1231 static double psnr(double d){
1232 return -10.0*log(d)/log(10.0);
1235 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1238 AVCodecContext *enc;
1240 double ti1, bitrate, avg_bitrate;
1242 /* this is executed just the first time do_video_stats is called */
1244 vstats_file = fopen(vstats_filename, "w");
1251 enc = ost->st->codec;
1252 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1253 frame_number = ost->frame_number;
1254 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1255 if (enc->flags&CODEC_FLAG_PSNR)
1256 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1258 fprintf(vstats_file,"f_size= %6d ", frame_size);
1259 /* compute pts value */
1260 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1264 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1265 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1266 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1267 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1268 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1272 static void print_report(AVFormatContext **output_files,
1273 AVOutputStream **ost_table, int nb_ostreams,
1277 AVOutputStream *ost;
1278 AVFormatContext *oc;
1280 AVCodecContext *enc;
1281 int frame_number, vid, i;
1282 double bitrate, ti1, pts;
1283 static int64_t last_time = -1;
1284 static int qp_histogram[52];
1286 if (!is_last_report) {
1288 /* display the report every 0.5 seconds */
1289 cur_time = av_gettime();
1290 if (last_time == -1) {
1291 last_time = cur_time;
1294 if ((cur_time - last_time) < 500000)
1296 last_time = cur_time;
1300 oc = output_files[0];
1302 total_size = avio_size(oc->pb);
1303 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1304 total_size= avio_tell(oc->pb);
1309 for(i=0;i<nb_ostreams;i++) {
1311 enc = ost->st->codec;
1312 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1313 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1314 !ost->st->stream_copy ?
1315 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1317 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1318 float t = (av_gettime()-timer_start) / 1000000.0;
1320 frame_number = ost->frame_number;
1321 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1322 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1323 !ost->st->stream_copy ?
1324 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1326 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1329 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1330 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1333 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1335 if (enc->flags&CODEC_FLAG_PSNR){
1337 double error, error_sum=0;
1338 double scale, scale_sum=0;
1339 char type[3]= {'Y','U','V'};
1340 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1343 error= enc->error[j];
1344 scale= enc->width*enc->height*255.0*255.0*frame_number;
1346 error= enc->coded_frame->error[j];
1347 scale= enc->width*enc->height*255.0*255.0;
1352 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1354 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1358 /* compute min output value */
1359 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1360 if ((pts < ti1) && (pts > 0))
1366 if (verbose || is_last_report) {
1367 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1370 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1371 (double)total_size / 1024, ti1, bitrate);
1373 if (nb_frames_dup || nb_frames_drop)
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1375 nb_frames_dup, nb_frames_drop);
1378 fprintf(stderr, "%s \r", buf);
1383 if (is_last_report && verbose >= 0){
1384 int64_t raw= audio_size + video_size + extra_size;
1385 fprintf(stderr, "\n");
1386 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1390 100.0*(total_size - raw)/raw
1395 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1397 int fill_char = 0x00;
1398 if (sample_fmt == AV_SAMPLE_FMT_U8)
1400 memset(buf, fill_char, size);
1403 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1404 static int output_packet(AVInputStream *ist, int ist_index,
1405 AVOutputStream **ost_table, int nb_ostreams,
1406 const AVPacket *pkt)
1408 AVFormatContext *os;
1409 AVOutputStream *ost;
1413 void *buffer_to_free;
1414 static unsigned int samples_size= 0;
1415 AVSubtitle subtitle, *subtitle_to_free;
1416 int64_t pkt_pts = AV_NOPTS_VALUE;
1418 int frame_available;
1422 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1424 if(ist->next_pts == AV_NOPTS_VALUE)
1425 ist->next_pts= ist->pts;
1429 av_init_packet(&avpkt);
1437 if(pkt->dts != AV_NOPTS_VALUE)
1438 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1439 if(pkt->pts != AV_NOPTS_VALUE)
1440 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1442 //while we have more to decode or while the decoder did output something on EOF
1443 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1444 uint8_t *data_buf, *decoded_data_buf;
1445 int data_size, decoded_data_size;
1447 ist->pts= ist->next_pts;
1449 if(avpkt.size && avpkt.size != pkt->size &&
1450 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1451 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1452 ist->showed_multi_packet_warning=1;
1455 /* decode the packet if needed */
1456 decoded_data_buf = NULL; /* fail safe */
1457 decoded_data_size= 0;
1458 data_buf = avpkt.data;
1459 data_size = avpkt.size;
1460 subtitle_to_free = NULL;
1461 if (ist->decoding_needed) {
1462 switch(ist->st->codec->codec_type) {
1463 case AVMEDIA_TYPE_AUDIO:{
1464 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1465 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1467 samples= av_malloc(samples_size);
1469 decoded_data_size= samples_size;
1470 /* XXX: could avoid copy if PCM 16 bits with same
1471 endianness as CPU */
1472 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1479 /* Some bug in mpeg audio decoder gives */
1480 /* decoded_data_size < 0, it seems they are overflows */
1481 if (decoded_data_size <= 0) {
1482 /* no audio frame */
1485 decoded_data_buf = (uint8_t *)samples;
1486 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1487 (ist->st->codec->sample_rate * ist->st->codec->channels);
1489 case AVMEDIA_TYPE_VIDEO:
1490 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1491 /* XXX: allocate picture correctly */
1492 avcodec_get_frame_defaults(&picture);
1493 avpkt.pts = pkt_pts;
1494 avpkt.dts = ist->pts;
1495 pkt_pts = AV_NOPTS_VALUE;
1497 ret = avcodec_decode_video2(ist->st->codec,
1498 &picture, &got_picture, &avpkt);
1499 ist->st->quality= picture.quality;
1503 /* no picture yet */
1504 goto discard_packet;
1506 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1507 if (ist->st->codec->time_base.num != 0) {
1508 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1509 ist->next_pts += ((int64_t)AV_TIME_BASE *
1510 ist->st->codec->time_base.num * ticks) /
1511 ist->st->codec->time_base.den;
1515 case AVMEDIA_TYPE_SUBTITLE:
1516 ret = avcodec_decode_subtitle2(ist->st->codec,
1517 &subtitle, &got_picture, &avpkt);
1521 goto discard_packet;
1523 subtitle_to_free = &subtitle;
1530 switch(ist->st->codec->codec_type) {
1531 case AVMEDIA_TYPE_AUDIO:
1532 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1533 ist->st->codec->sample_rate;
1535 case AVMEDIA_TYPE_VIDEO:
1536 if (ist->st->codec->time_base.num != 0) {
1537 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1538 ist->next_pts += ((int64_t)AV_TIME_BASE *
1539 ist->st->codec->time_base.num * ticks) /
1540 ist->st->codec->time_base.den;
1548 buffer_to_free = NULL;
1549 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1550 pre_process_video_frame(ist, (AVPicture *)&picture,
1555 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1557 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1558 else sar = ist->st->codec->sample_aspect_ratio;
1559 // add it to be filtered
1560 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1566 // preprocess audio (volume)
1567 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1568 if (audio_volume != 256) {
1571 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1572 int v = ((*volp) * audio_volume + 128) >> 8;
1573 if (v < -32768) v = -32768;
1574 if (v > 32767) v = 32767;
1580 /* frame rate emulation */
1582 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1583 int64_t now = av_gettime() - ist->start;
1588 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1589 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1591 /* if output time reached then transcode raw format,
1592 encode packets and output them */
1593 if (start_time == 0 || ist->pts >= start_time)
1595 while (frame_available) {
1596 AVRational ist_pts_tb;
1597 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1598 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1600 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1602 for(i=0;i<nb_ostreams;i++) {
1606 if (ost->source_index == ist_index) {
1607 os = output_files[ost->file_index];
1609 /* set the input output pts pairs */
1610 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1612 if (ost->encoding_needed) {
1613 av_assert0(ist->decoding_needed);
1614 switch(ost->st->codec->codec_type) {
1615 case AVMEDIA_TYPE_AUDIO:
1616 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1618 case AVMEDIA_TYPE_VIDEO:
1620 if (ist->picref->video)
1621 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1623 do_video_out(os, ost, ist, &picture, &frame_size);
1624 if (vstats_filename && frame_size)
1625 do_video_stats(os, ost, frame_size);
1627 case AVMEDIA_TYPE_SUBTITLE:
1628 do_subtitle_out(os, ost, ist, &subtitle,
1635 AVFrame avframe; //FIXME/XXX remove this
1637 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1639 av_init_packet(&opkt);
1641 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1644 /* no reencoding needed : output the packet directly */
1645 /* force the input stream PTS */
1647 avcodec_get_frame_defaults(&avframe);
1648 ost->st->codec->coded_frame= &avframe;
1649 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1651 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1652 audio_size += data_size;
1653 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1654 video_size += data_size;
1658 opkt.stream_index= ost->index;
1659 if(pkt->pts != AV_NOPTS_VALUE)
1660 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1662 opkt.pts= AV_NOPTS_VALUE;
1664 if (pkt->dts == AV_NOPTS_VALUE)
1665 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1667 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1668 opkt.dts -= ost_tb_start_time;
1670 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1671 opkt.flags= pkt->flags;
1673 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1674 if( ost->st->codec->codec_id != CODEC_ID_H264
1675 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1676 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1678 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1679 opkt.destruct= av_destruct_packet;
1681 opkt.data = data_buf;
1682 opkt.size = data_size;
1685 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1686 ost->st->codec->frame_number++;
1687 ost->frame_number++;
1688 av_free_packet(&opkt);
1694 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1695 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1697 avfilter_unref_buffer(ist->picref);
1700 av_free(buffer_to_free);
1701 /* XXX: allocate the subtitles in the codec ? */
1702 if (subtitle_to_free) {
1703 avsubtitle_free(subtitle_to_free);
1704 subtitle_to_free = NULL;
1711 for(i=0;i<nb_ostreams;i++) {
1713 if (ost->source_index == ist_index) {
1714 AVCodecContext *enc= ost->st->codec;
1715 os = output_files[ost->file_index];
1717 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1719 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1722 if (ost->encoding_needed) {
1726 av_init_packet(&pkt);
1727 pkt.stream_index= ost->index;
1729 switch(ost->st->codec->codec_type) {
1730 case AVMEDIA_TYPE_AUDIO:
1731 fifo_bytes = av_fifo_size(ost->fifo);
1733 /* encode any samples remaining in fifo */
1734 if (fifo_bytes > 0) {
1735 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1736 int fs_tmp = enc->frame_size;
1738 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1739 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1740 enc->frame_size = fifo_bytes / (osize * enc->channels);
1742 int frame_bytes = enc->frame_size*osize*enc->channels;
1743 if (allocated_audio_buf_size < frame_bytes)
1745 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1748 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1749 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1750 ost->st->time_base.num, enc->sample_rate);
1751 enc->frame_size = fs_tmp;
1754 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1757 fprintf(stderr, "Audio encoding failed\n");
1761 pkt.flags |= AV_PKT_FLAG_KEY;
1763 case AVMEDIA_TYPE_VIDEO:
1764 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1766 fprintf(stderr, "Video encoding failed\n");
1770 if(enc->coded_frame && enc->coded_frame->key_frame)
1771 pkt.flags |= AV_PKT_FLAG_KEY;
1772 if (ost->logfile && enc->stats_out) {
1773 fprintf(ost->logfile, "%s", enc->stats_out);
1782 pkt.data= bit_buffer;
1784 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1785 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1786 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1798 static void print_sdp(AVFormatContext **avc, int n)
1802 av_sdp_create(avc, n, sdp, sizeof(sdp));
1803 printf("SDP:\n%s\n", sdp);
1807 static int copy_chapters(int infile, int outfile)
1809 AVFormatContext *is = input_files[infile];
1810 AVFormatContext *os = output_files[outfile];
1813 for (i = 0; i < is->nb_chapters; i++) {
1814 AVChapter *in_ch = is->chapters[i], *out_ch;
1815 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1816 AV_TIME_BASE_Q, in_ch->time_base);
1817 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1818 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1821 if (in_ch->end < ts_off)
1823 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1826 out_ch = av_mallocz(sizeof(AVChapter));
1828 return AVERROR(ENOMEM);
1830 out_ch->id = in_ch->id;
1831 out_ch->time_base = in_ch->time_base;
1832 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1833 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1835 if (metadata_chapters_autocopy)
1836 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1839 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1841 return AVERROR(ENOMEM);
1842 os->chapters[os->nb_chapters - 1] = out_ch;
1847 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1848 AVCodecContext *avctx)
1854 for (p = kf; *p; p++)
1857 ost->forced_kf_count = n;
1858 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1859 if (!ost->forced_kf_pts) {
1860 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1863 for (i = 0; i < n; i++) {
1864 p = i ? strchr(p, ',') + 1 : kf;
1865 t = parse_time_or_die("force_key_frames", p, 1);
1866 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1871 * The following code is the main loop of the file converter
1873 static int transcode(AVFormatContext **output_files,
1874 int nb_output_files,
1875 AVFormatContext **input_files,
1877 AVStreamMap *stream_maps, int nb_stream_maps)
1879 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1880 AVFormatContext *is, *os;
1881 AVCodecContext *codec, *icodec;
1882 AVOutputStream *ost, **ost_table = NULL;
1883 AVInputStream *ist, **ist_table = NULL;
1884 AVInputFile *file_table;
1888 uint8_t no_packet[MAX_FILES]={0};
1889 int no_packet_count=0;
1891 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1895 /* input stream init */
1897 for(i=0;i<nb_input_files;i++) {
1898 is = input_files[i];
1899 file_table[i].ist_index = j;
1900 file_table[i].nb_streams = is->nb_streams;
1901 j += is->nb_streams;
1905 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1909 for(i=0;i<nb_istreams;i++) {
1910 ist = av_mallocz(sizeof(AVInputStream));
1916 for(i=0;i<nb_input_files;i++) {
1917 is = input_files[i];
1918 for(k=0;k<is->nb_streams;k++) {
1919 ist = ist_table[j++];
1920 ist->st = is->streams[k];
1921 ist->file_index = i;
1923 ist->discard = 1; /* the stream is discarded by default
1927 ist->start = av_gettime();
1932 /* output stream init */
1934 for(i=0;i<nb_output_files;i++) {
1935 os = output_files[i];
1936 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1937 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1938 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1939 ret = AVERROR(EINVAL);
1942 nb_ostreams += os->nb_streams;
1944 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1945 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1946 ret = AVERROR(EINVAL);
1950 /* Sanity check the mapping args -- do the input files & streams exist? */
1951 for(i=0;i<nb_stream_maps;i++) {
1952 int fi = stream_maps[i].file_index;
1953 int si = stream_maps[i].stream_index;
1955 if (fi < 0 || fi > nb_input_files - 1 ||
1956 si < 0 || si > file_table[fi].nb_streams - 1) {
1957 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1958 ret = AVERROR(EINVAL);
1961 fi = stream_maps[i].sync_file_index;
1962 si = stream_maps[i].sync_stream_index;
1963 if (fi < 0 || fi > nb_input_files - 1 ||
1964 si < 0 || si > file_table[fi].nb_streams - 1) {
1965 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1966 ret = AVERROR(EINVAL);
1971 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1975 for(k=0;k<nb_output_files;k++) {
1976 os = output_files[k];
1977 for(i=0;i<os->nb_streams;i++,n++) {
1979 ost = ost_table[n] = output_streams_for_file[k][i];
1980 ost->st = os->streams[i];
1981 if (nb_stream_maps > 0) {
1982 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1983 stream_maps[n].stream_index;
1985 /* Sanity check that the stream types match */
1986 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1987 int i= ost->file_index;
1988 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1989 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1990 stream_maps[n].file_index, stream_maps[n].stream_index,
1991 ost->file_index, ost->index);
1996 int best_nb_frames=-1;
1997 /* get corresponding input stream index : we select the first one with the right type */
1999 for(j=0;j<nb_istreams;j++) {
2004 AVFormatContext *f= input_files[ ist->file_index ];
2006 for(pi=0; pi<f->nb_programs; pi++){
2007 AVProgram *p= f->programs[pi];
2008 if(p->id == opt_programid)
2009 for(si=0; si<p->nb_stream_indexes; si++){
2010 if(f->streams[ p->stream_index[si] ] == ist->st)
2015 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2016 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2017 if(best_nb_frames < ist->st->codec_info_nb_frames){
2018 best_nb_frames= ist->st->codec_info_nb_frames;
2019 ost->source_index = j;
2026 if(! opt_programid) {
2027 /* try again and reuse existing stream */
2028 for(j=0;j<nb_istreams;j++) {
2030 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2031 && ist->st->discard != AVDISCARD_ALL) {
2032 ost->source_index = j;
2038 int i= ost->file_index;
2039 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2040 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2041 ost->file_index, ost->index);
2046 ist = ist_table[ost->source_index];
2048 ost->sync_ist = (nb_stream_maps > 0) ?
2049 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2050 stream_maps[n].sync_stream_index] : ist;
2054 /* for each output stream, we compute the right encoding parameters */
2055 for(i=0;i<nb_ostreams;i++) {
2057 os = output_files[ost->file_index];
2058 ist = ist_table[ost->source_index];
2060 codec = ost->st->codec;
2061 icodec = ist->st->codec;
2063 if (metadata_streams_autocopy)
2064 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2065 AV_METADATA_DONT_OVERWRITE);
2067 ost->st->disposition = ist->st->disposition;
2068 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2069 codec->chroma_sample_location = icodec->chroma_sample_location;
2071 if (ost->st->stream_copy) {
2072 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2074 if (extra_size > INT_MAX)
2077 /* if stream_copy is selected, no need to decode or encode */
2078 codec->codec_id = icodec->codec_id;
2079 codec->codec_type = icodec->codec_type;
2081 if(!codec->codec_tag){
2082 if( !os->oformat->codec_tag
2083 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2084 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2085 codec->codec_tag = icodec->codec_tag;
2088 codec->bit_rate = icodec->bit_rate;
2089 codec->rc_max_rate = icodec->rc_max_rate;
2090 codec->rc_buffer_size = icodec->rc_buffer_size;
2091 codec->extradata= av_mallocz(extra_size);
2092 if (!codec->extradata)
2094 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2095 codec->extradata_size= icodec->extradata_size;
2096 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){
2097 codec->time_base = icodec->time_base;
2098 codec->time_base.num *= icodec->ticks_per_frame;
2099 av_reduce(&codec->time_base.num, &codec->time_base.den,
2100 codec->time_base.num, codec->time_base.den, INT_MAX);
2102 codec->time_base = ist->st->time_base;
2103 switch(codec->codec_type) {
2104 case AVMEDIA_TYPE_AUDIO:
2105 if(audio_volume != 256) {
2106 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2109 codec->channel_layout = icodec->channel_layout;
2110 codec->sample_rate = icodec->sample_rate;
2111 codec->channels = icodec->channels;
2112 codec->frame_size = icodec->frame_size;
2113 codec->audio_service_type = icodec->audio_service_type;
2114 codec->block_align= icodec->block_align;
2115 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2116 codec->block_align= 0;
2117 if(codec->codec_id == CODEC_ID_AC3)
2118 codec->block_align= 0;
2120 case AVMEDIA_TYPE_VIDEO:
2121 codec->pix_fmt = icodec->pix_fmt;
2122 codec->width = icodec->width;
2123 codec->height = icodec->height;
2124 codec->has_b_frames = icodec->has_b_frames;
2126 case AVMEDIA_TYPE_SUBTITLE:
2127 codec->width = icodec->width;
2128 codec->height = icodec->height;
2134 switch(codec->codec_type) {
2135 case AVMEDIA_TYPE_AUDIO:
2136 ost->fifo= av_fifo_alloc(1024);
2139 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2140 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2141 icodec->request_channels = codec->channels;
2142 ist->decoding_needed = 1;
2143 ost->encoding_needed = 1;
2144 ost->resample_sample_fmt = icodec->sample_fmt;
2145 ost->resample_sample_rate = icodec->sample_rate;
2146 ost->resample_channels = icodec->channels;
2148 case AVMEDIA_TYPE_VIDEO:
2149 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2150 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2153 ost->video_resample = (codec->width != icodec->width ||
2154 codec->height != icodec->height ||
2155 (codec->pix_fmt != icodec->pix_fmt));
2156 if (ost->video_resample) {
2157 #if !CONFIG_AVFILTER
2158 avcodec_get_frame_defaults(&ost->pict_tmp);
2159 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2160 codec->width, codec->height)) {
2161 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2164 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2165 ost->img_resample_ctx = sws_getContext(
2172 sws_flags, NULL, NULL, NULL);
2173 if (ost->img_resample_ctx == NULL) {
2174 fprintf(stderr, "Cannot get resampling context\n");
2178 ost->original_height = icodec->height;
2179 ost->original_width = icodec->width;
2181 codec->bits_per_raw_sample= 0;
2183 ost->resample_height = icodec->height;
2184 ost->resample_width = icodec->width;
2185 ost->resample_pix_fmt= icodec->pix_fmt;
2186 ost->encoding_needed = 1;
2187 ist->decoding_needed = 1;
2190 if (configure_filters(ist, ost)) {
2191 fprintf(stderr, "Error opening filters!\n");
2196 case AVMEDIA_TYPE_SUBTITLE:
2197 ost->encoding_needed = 1;
2198 ist->decoding_needed = 1;
2205 if (ost->encoding_needed &&
2206 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2207 char logfilename[1024];
2210 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2211 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2213 if (codec->flags & CODEC_FLAG_PASS1) {
2214 f = fopen(logfilename, "wb");
2216 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2222 size_t logbuffer_size;
2223 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2224 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2227 codec->stats_in = logbuffer;
2231 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2232 int size= codec->width * codec->height;
2233 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2238 bit_buffer = av_malloc(bit_buffer_size);
2240 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2242 ret = AVERROR(ENOMEM);
2246 /* open each encoder */
2247 for(i=0;i<nb_ostreams;i++) {
2249 if (ost->encoding_needed) {
2250 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2251 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2253 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2255 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2256 ost->st->codec->codec_id, ost->file_index, ost->index);
2257 ret = AVERROR(EINVAL);
2260 if (dec->subtitle_header) {
2261 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2262 if (!ost->st->codec->subtitle_header) {
2263 ret = AVERROR(ENOMEM);
2266 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2267 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2269 if (avcodec_open(ost->st->codec, codec) < 0) {
2270 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2271 ost->file_index, ost->index);
2272 ret = AVERROR(EINVAL);
2275 extra_size += ost->st->codec->extradata_size;
2279 /* open each decoder */
2280 for(i=0;i<nb_istreams;i++) {
2282 if (ist->decoding_needed) {
2283 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2285 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2287 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2288 ist->st->codec->codec_id, ist->file_index, ist->index);
2289 ret = AVERROR(EINVAL);
2292 if (avcodec_open(ist->st->codec, codec) < 0) {
2293 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2294 ist->file_index, ist->index);
2295 ret = AVERROR(EINVAL);
2298 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2299 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2304 for(i=0;i<nb_istreams;i++) {
2308 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2309 ist->next_pts = AV_NOPTS_VALUE;
2310 init_pts_correction(&ist->pts_ctx);
2314 /* set meta data information from input file if required */
2315 for (i=0;i<nb_meta_data_maps;i++) {
2316 AVFormatContext *files[2];
2317 AVMetadata **meta[2];
2320 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2321 if ((index) < 0 || (index) >= (nb_elems)) {\
2322 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2324 ret = AVERROR(EINVAL);\
2328 int out_file_index = meta_data_maps[i][0].file;
2329 int in_file_index = meta_data_maps[i][1].file;
2330 if (in_file_index < 0 || out_file_index < 0)
2332 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2333 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2335 files[0] = output_files[out_file_index];
2336 files[1] = input_files[in_file_index];
2338 for (j = 0; j < 2; j++) {
2339 AVMetaDataMap *map = &meta_data_maps[i][j];
2341 switch (map->type) {
2343 meta[j] = &files[j]->metadata;
2346 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2347 meta[j] = &files[j]->streams[map->index]->metadata;
2350 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2351 meta[j] = &files[j]->chapters[map->index]->metadata;
2354 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2355 meta[j] = &files[j]->programs[map->index]->metadata;
2360 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2363 /* copy global metadata by default */
2364 if (metadata_global_autocopy) {
2366 for (i = 0; i < nb_output_files; i++)
2367 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2368 AV_METADATA_DONT_OVERWRITE);
2371 /* copy chapters according to chapter maps */
2372 for (i = 0; i < nb_chapter_maps; i++) {
2373 int infile = chapter_maps[i].in_file;
2374 int outfile = chapter_maps[i].out_file;
2376 if (infile < 0 || outfile < 0)
2378 if (infile >= nb_input_files) {
2379 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2380 ret = AVERROR(EINVAL);
2383 if (outfile >= nb_output_files) {
2384 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2385 ret = AVERROR(EINVAL);
2388 copy_chapters(infile, outfile);
2391 /* copy chapters from the first input file that has them*/
2392 if (!nb_chapter_maps)
2393 for (i = 0; i < nb_input_files; i++) {
2394 if (!input_files[i]->nb_chapters)
2397 for (j = 0; j < nb_output_files; j++)
2398 if ((ret = copy_chapters(i, j)) < 0)
2403 /* open files and write file headers */
2404 for(i=0;i<nb_output_files;i++) {
2405 os = output_files[i];
2406 if (av_write_header(os) < 0) {
2407 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2408 ret = AVERROR(EINVAL);
2411 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2417 /* dump the file output parameters - cannot be done before in case
2419 for(i=0;i<nb_output_files;i++) {
2420 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2423 /* dump the stream mapping */
2425 fprintf(stderr, "Stream mapping:\n");
2426 for(i=0;i<nb_ostreams;i++) {
2428 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2429 ist_table[ost->source_index]->file_index,
2430 ist_table[ost->source_index]->index,
2433 if (ost->sync_ist != ist_table[ost->source_index])
2434 fprintf(stderr, " [sync #%d.%d]",
2435 ost->sync_ist->file_index,
2436 ost->sync_ist->index);
2437 fprintf(stderr, "\n");
2442 fprintf(stderr, "%s\n", error);
2447 print_sdp(output_files, nb_output_files);
2450 if (!using_stdin && verbose >= 0) {
2452 fprintf(stderr, "Press [q] to stop encoding\n");
2454 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2456 avio_set_interrupt_cb(decode_interrupt_cb);
2460 timer_start = av_gettime();
2462 for(; received_sigterm == 0;) {
2463 int file_index, ist_index;
2471 /* if 'q' pressed, exits */
2475 /* read_key() returns 0 on EOF */
2481 /* select the stream that we must read now by looking at the
2482 smallest output pts */
2484 for(i=0;i<nb_ostreams;i++) {
2487 os = output_files[ost->file_index];
2488 ist = ist_table[ost->source_index];
2489 if(ist->is_past_recording_time || no_packet[ist->file_index])
2491 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2492 ipts = (double)ist->pts;
2493 if (!file_table[ist->file_index].eof_reached){
2494 if(ipts < ipts_min) {
2496 if(input_sync ) file_index = ist->file_index;
2498 if(opts < opts_min) {
2500 if(!input_sync) file_index = ist->file_index;
2503 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2508 /* if none, if is finished */
2509 if (file_index < 0) {
2510 if(no_packet_count){
2512 memset(no_packet, 0, sizeof(no_packet));
2519 /* finish if limit size exhausted */
2520 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2523 /* read a frame from it and output it in the fifo */
2524 is = input_files[file_index];
2525 ret= av_read_frame(is, &pkt);
2526 if(ret == AVERROR(EAGAIN)){
2527 no_packet[file_index]=1;
2532 file_table[file_index].eof_reached = 1;
2540 memset(no_packet, 0, sizeof(no_packet));
2543 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2544 is->streams[pkt.stream_index]);
2546 /* the following test is needed in case new streams appear
2547 dynamically in stream : we ignore them */
2548 if (pkt.stream_index >= file_table[file_index].nb_streams)
2549 goto discard_packet;
2550 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2551 ist = ist_table[ist_index];
2553 goto discard_packet;
2555 if (pkt.dts != AV_NOPTS_VALUE)
2556 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2557 if (pkt.pts != AV_NOPTS_VALUE)
2558 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2560 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2561 && input_files_ts_scale[file_index][pkt.stream_index]){
2562 if(pkt.pts != AV_NOPTS_VALUE)
2563 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2564 if(pkt.dts != AV_NOPTS_VALUE)
2565 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2568 // 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);
2569 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2570 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2571 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2572 int64_t delta= pkt_dts - ist->next_pts;
2573 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2574 input_files_ts_offset[ist->file_index]-= delta;
2576 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2577 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2578 if(pkt.pts != AV_NOPTS_VALUE)
2579 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2583 /* finish if recording time exhausted */
2584 if (recording_time != INT64_MAX &&
2585 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2586 ist->is_past_recording_time = 1;
2587 goto discard_packet;
2590 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2591 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2594 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2595 ist->file_index, ist->index);
2598 av_free_packet(&pkt);
2603 av_free_packet(&pkt);
2605 /* dump report by using the output first video and audio streams */
2606 print_report(output_files, ost_table, nb_ostreams, 0);
2609 /* at the end of stream, we must flush the decoder buffers */
2610 for(i=0;i<nb_istreams;i++) {
2612 if (ist->decoding_needed) {
2613 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2619 /* write the trailer if needed and close file */
2620 for(i=0;i<nb_output_files;i++) {
2621 os = output_files[i];
2622 av_write_trailer(os);
2625 /* dump report by using the first video and audio streams */
2626 print_report(output_files, ost_table, nb_ostreams, 1);
2628 /* close each encoder */
2629 for(i=0;i<nb_ostreams;i++) {
2631 if (ost->encoding_needed) {
2632 av_freep(&ost->st->codec->stats_in);
2633 avcodec_close(ost->st->codec);
2637 /* close each decoder */
2638 for(i=0;i<nb_istreams;i++) {
2640 if (ist->decoding_needed) {
2641 avcodec_close(ist->st->codec);
2645 avfilter_graph_free(&graph);
2652 av_freep(&bit_buffer);
2653 av_free(file_table);
2656 for(i=0;i<nb_istreams;i++) {
2663 for(i=0;i<nb_ostreams;i++) {
2666 if (ost->st->stream_copy)
2667 av_freep(&ost->st->codec->extradata);
2669 fclose(ost->logfile);
2670 ost->logfile = NULL;
2672 av_fifo_free(ost->fifo); /* works even if fifo is not
2673 initialized but set to zero */
2674 av_freep(&ost->st->codec->subtitle_header);
2675 av_free(ost->pict_tmp.data[0]);
2676 av_free(ost->forced_kf_pts);
2677 if (ost->video_resample)
2678 sws_freeContext(ost->img_resample_ctx);
2680 audio_resample_close(ost->resample);
2681 if (ost->reformat_ctx)
2682 av_audio_convert_free(ost->reformat_ctx);
2691 static void opt_format(const char *arg)
2693 last_asked_format = arg;
2696 static void opt_video_rc_override_string(const char *arg)
2698 video_rc_override_string = arg;
2701 static int opt_me_threshold(const char *opt, const char *arg)
2703 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2707 static int opt_verbose(const char *opt, const char *arg)
2709 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2713 static int opt_frame_rate(const char *opt, const char *arg)
2715 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2716 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2722 static int opt_bitrate(const char *opt, const char *arg)
2724 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2726 opt_default(opt, arg);
2728 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2729 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2734 static int opt_frame_crop(const char *opt, const char *arg)
2736 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2737 return AVERROR(EINVAL);
2740 static void opt_frame_size(const char *arg)
2742 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2743 fprintf(stderr, "Incorrect frame size\n");
2748 static int opt_pad(const char *opt, const char *arg) {
2749 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2753 static void opt_frame_pix_fmt(const char *arg)
2755 if (strcmp(arg, "list")) {
2756 frame_pix_fmt = av_get_pix_fmt(arg);
2757 if (frame_pix_fmt == PIX_FMT_NONE) {
2758 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2767 static void opt_frame_aspect_ratio(const char *arg)
2774 p = strchr(arg, ':');
2776 x = strtol(arg, &end, 10);
2778 y = strtol(end+1, &end, 10);
2780 ar = (double)x / (double)y;
2782 ar = strtod(arg, NULL);
2785 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2788 frame_aspect_ratio = ar;
2791 static int opt_metadata(const char *opt, const char *arg)
2793 char *mid= strchr(arg, '=');
2796 fprintf(stderr, "Missing =\n");
2801 av_metadata_set2(&metadata, arg, mid, 0);
2806 static void opt_qscale(const char *arg)
2808 video_qscale = atof(arg);
2809 if (video_qscale <= 0 ||
2810 video_qscale > 255) {
2811 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2816 static void opt_top_field_first(const char *arg)
2818 top_field_first= atoi(arg);
2821 static int opt_thread_count(const char *opt, const char *arg)
2823 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2826 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2831 static void opt_audio_sample_fmt(const char *arg)
2833 if (strcmp(arg, "list")) {
2834 audio_sample_fmt = av_get_sample_fmt(arg);
2835 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2836 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2840 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2845 static int opt_audio_rate(const char *opt, const char *arg)
2847 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2851 static int opt_audio_channels(const char *opt, const char *arg)
2853 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2857 static void opt_video_channel(const char *arg)
2859 video_channel = strtol(arg, NULL, 0);
2862 static void opt_video_standard(const char *arg)
2864 video_standard = av_strdup(arg);
2867 static void opt_codec(int *pstream_copy, char **pcodec_name,
2868 int codec_type, const char *arg)
2870 av_freep(pcodec_name);
2871 if (!strcmp(arg, "copy")) {
2874 *pcodec_name = av_strdup(arg);
2878 static void opt_audio_codec(const char *arg)
2880 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2883 static void opt_video_codec(const char *arg)
2885 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2888 static void opt_subtitle_codec(const char *arg)
2890 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2893 static int opt_codec_tag(const char *opt, const char *arg)
2896 uint32_t *codec_tag;
2898 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2899 !strcmp(opt, "vtag") ? &video_codec_tag :
2900 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2904 *codec_tag = strtol(arg, &tail, 0);
2906 *codec_tag = AV_RL32(arg);
2911 static void opt_map(const char *arg)
2916 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2917 m = &stream_maps[nb_stream_maps-1];
2919 m->file_index = strtol(arg, &p, 0);
2923 m->stream_index = strtol(p, &p, 0);
2926 m->sync_file_index = strtol(p, &p, 0);
2929 m->sync_stream_index = strtol(p, &p, 0);
2931 m->sync_file_index = m->file_index;
2932 m->sync_stream_index = m->stream_index;
2936 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
2947 *index = strtol(++arg, endptr, 0);
2950 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2957 static void opt_map_metadata(const char *arg)
2959 AVMetaDataMap *m, *m1;
2962 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2963 &nb_meta_data_maps, nb_meta_data_maps + 1);
2965 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2966 m->file = strtol(arg, &p, 0);
2967 parse_meta_type(p, &m->type, &m->index, &p);
2971 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
2972 m1->file = strtol(p, &p, 0);
2973 parse_meta_type(p, &m1->type, &m1->index, &p);
2975 if (m->type == 'g' || m1->type == 'g')
2976 metadata_global_autocopy = 0;
2977 if (m->type == 's' || m1->type == 's')
2978 metadata_streams_autocopy = 0;
2979 if (m->type == 'c' || m1->type == 'c')
2980 metadata_chapters_autocopy = 0;
2983 static void opt_map_meta_data(const char *arg)
2985 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2986 "Use -map_metadata instead.\n");
2987 opt_map_metadata(arg);
2990 static void opt_map_chapters(const char *arg)
2995 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
2996 nb_chapter_maps + 1);
2997 c = &chapter_maps[nb_chapter_maps - 1];
2998 c->out_file = strtol(arg, &p, 0);
3002 c->in_file = strtol(p, &p, 0);
3005 static void opt_input_ts_scale(const char *arg)
3007 unsigned int stream;
3011 stream = strtol(arg, &p, 0);
3014 scale= strtod(p, &p);
3016 if(stream >= MAX_STREAMS)
3019 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);
3020 input_files_ts_scale[nb_input_files][stream]= scale;
3023 static int opt_recording_time(const char *opt, const char *arg)
3025 recording_time = parse_time_or_die(opt, arg, 1);
3029 static int opt_start_time(const char *opt, const char *arg)
3031 start_time = parse_time_or_die(opt, arg, 1);
3035 static int opt_recording_timestamp(const char *opt, const char *arg)
3037 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3041 static int opt_input_ts_offset(const char *opt, const char *arg)
3043 input_ts_offset = parse_time_or_die(opt, arg, 1);
3047 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3049 const char *codec_string = encoder ? "encoder" : "decoder";
3053 return CODEC_ID_NONE;
3055 avcodec_find_encoder_by_name(name) :
3056 avcodec_find_decoder_by_name(name);
3058 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3061 if(codec->type != type) {
3062 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3065 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3066 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3067 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3068 "results.\nAdd '-strict experimental' if you want to use it.\n",
3069 codec_string, codec->name);
3071 avcodec_find_encoder(codec->id) :
3072 avcodec_find_decoder(codec->id);
3073 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3074 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3075 codec_string, codec->name);
3081 static void opt_input_file(const char *filename)
3083 AVFormatContext *ic;
3084 AVFormatParameters params, *ap = ¶ms;
3085 AVInputFormat *file_iformat = NULL;
3086 int err, i, ret, rfps, rfps_base;
3089 if (last_asked_format) {
3090 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3091 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3094 last_asked_format = NULL;
3097 if (!strcmp(filename, "-"))
3100 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3101 !strcmp(filename, "/dev/stdin");
3103 /* get default parameters from command line */
3104 ic = avformat_alloc_context();
3106 print_error(filename, AVERROR(ENOMEM));
3110 memset(ap, 0, sizeof(*ap));
3111 ap->prealloced_context = 1;
3112 ap->sample_rate = audio_sample_rate;
3113 ap->channels = audio_channels;
3114 ap->time_base.den = frame_rate.num;
3115 ap->time_base.num = frame_rate.den;
3116 ap->width = frame_width;
3117 ap->height = frame_height;
3118 ap->pix_fmt = frame_pix_fmt;
3119 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3120 ap->channel = video_channel;
3121 ap->standard = video_standard;
3123 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3125 ic->video_codec_id =
3126 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3127 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3128 ic->audio_codec_id =
3129 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3130 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3131 ic->subtitle_codec_id=
3132 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3133 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3134 ic->flags |= AVFMT_FLAG_NONBLOCK;
3136 /* open the input file with generic libav function */
3137 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3139 print_error(filename, err);
3145 for(i=0; i<ic->nb_streams; i++){
3146 ic->streams[i]->discard= AVDISCARD_ALL;
3148 for(i=0; i<ic->nb_programs; i++){
3149 AVProgram *p= ic->programs[i];
3150 if(p->id != opt_programid){
3151 p->discard = AVDISCARD_ALL;
3154 for(j=0; j<p->nb_stream_indexes; j++){
3155 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3160 fprintf(stderr, "Specified program id not found\n");
3166 ic->loop_input = loop_input;
3168 /* If not enough info to get the stream parameters, we decode the
3169 first frames to get it. (used in mpeg case for example) */
3170 ret = av_find_stream_info(ic);
3171 if (ret < 0 && verbose >= 0) {
3172 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3173 av_close_input_file(ic);
3177 timestamp = start_time;
3178 /* add the stream start time */
3179 if (ic->start_time != AV_NOPTS_VALUE)
3180 timestamp += ic->start_time;
3182 /* if seeking requested, we execute it */
3183 if (start_time != 0) {
3184 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3186 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3187 filename, (double)timestamp / AV_TIME_BASE);
3189 /* reset seek info */
3193 /* update the current parameters so that they match the one of the input stream */
3194 for(i=0;i<ic->nb_streams;i++) {
3195 AVStream *st = ic->streams[i];
3196 AVCodecContext *dec = st->codec;
3197 dec->thread_count = thread_count;
3198 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3199 switch (dec->codec_type) {
3200 case AVMEDIA_TYPE_AUDIO:
3201 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3202 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]);
3203 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3204 channel_layout = dec->channel_layout;
3205 audio_channels = dec->channels;
3206 audio_sample_rate = dec->sample_rate;
3207 audio_sample_fmt = dec->sample_fmt;
3209 st->discard= AVDISCARD_ALL;
3210 /* Note that av_find_stream_info can add more streams, and we
3211 * currently have no chance of setting up lowres decoding
3212 * early enough for them. */
3214 audio_sample_rate >>= dec->lowres;
3216 case AVMEDIA_TYPE_VIDEO:
3217 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3218 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]);
3219 frame_height = dec->height;
3220 frame_width = dec->width;
3221 if(ic->streams[i]->sample_aspect_ratio.num)
3222 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3224 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3225 frame_aspect_ratio *= (float) dec->width / dec->height;
3226 frame_pix_fmt = dec->pix_fmt;
3227 rfps = ic->streams[i]->r_frame_rate.num;
3228 rfps_base = ic->streams[i]->r_frame_rate.den;
3230 dec->flags |= CODEC_FLAG_EMU_EDGE;
3231 frame_height >>= dec->lowres;
3232 frame_width >>= dec->lowres;
3233 dec->height = frame_height;
3234 dec->width = frame_width;
3237 dec->debug |= FF_DEBUG_MV;
3239 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3242 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3243 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3245 (float)rfps / rfps_base, rfps, rfps_base);
3247 /* update the current frame rate to match the stream frame rate */
3248 frame_rate.num = rfps;
3249 frame_rate.den = rfps_base;
3252 st->discard= AVDISCARD_ALL;
3253 else if(video_discard)
3254 st->discard= video_discard;
3256 case AVMEDIA_TYPE_DATA:
3258 case AVMEDIA_TYPE_SUBTITLE:
3259 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3260 if(subtitle_disable)
3261 st->discard = AVDISCARD_ALL;
3263 case AVMEDIA_TYPE_ATTACHMENT:
3264 case AVMEDIA_TYPE_UNKNOWN:
3271 input_files[nb_input_files] = ic;
3272 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3273 /* dump the file content */
3275 av_dump_format(ic, nb_input_files, filename, 0);
3281 av_freep(&video_codec_name);
3282 av_freep(&audio_codec_name);
3283 av_freep(&subtitle_codec_name);
3286 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3287 int *has_subtitle_ptr)
3289 int has_video, has_audio, has_subtitle, i, j;
3290 AVFormatContext *ic;
3295 for(j=0;j<nb_input_files;j++) {
3296 ic = input_files[j];
3297 for(i=0;i<ic->nb_streams;i++) {
3298 AVCodecContext *enc = ic->streams[i]->codec;
3299 switch(enc->codec_type) {
3300 case AVMEDIA_TYPE_AUDIO:
3303 case AVMEDIA_TYPE_VIDEO:
3306 case AVMEDIA_TYPE_SUBTITLE:
3309 case AVMEDIA_TYPE_DATA:
3310 case AVMEDIA_TYPE_ATTACHMENT:
3311 case AVMEDIA_TYPE_UNKNOWN:
3318 *has_video_ptr = has_video;
3319 *has_audio_ptr = has_audio;
3320 *has_subtitle_ptr = has_subtitle;
3323 static void new_video_stream(AVFormatContext *oc, int file_idx)
3326 AVOutputStream *ost;
3327 AVCodecContext *video_enc;
3328 enum CodecID codec_id = CODEC_ID_NONE;
3329 AVCodec *codec= NULL;
3331 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3333 fprintf(stderr, "Could not alloc stream\n");
3336 ost = new_output_stream(oc, file_idx);
3338 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3339 if(!video_stream_copy){
3340 if (video_codec_name) {
3341 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3342 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3343 codec = avcodec_find_encoder_by_name(video_codec_name);
3344 output_codecs[nb_output_codecs-1] = codec;
3346 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3347 codec = avcodec_find_encoder(codec_id);
3351 avcodec_get_context_defaults3(st->codec, codec);
3352 ost->bitstream_filters = video_bitstream_filters;
3353 video_bitstream_filters= NULL;
3355 st->codec->thread_count= thread_count;
3357 video_enc = st->codec;
3360 video_enc->codec_tag= video_codec_tag;
3362 if( (video_global_header&1)
3363 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3364 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3365 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3367 if(video_global_header&2){
3368 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3369 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3372 if (video_stream_copy) {
3373 st->stream_copy = 1;
3374 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3375 video_enc->sample_aspect_ratio =
3376 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3380 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3382 video_enc->codec_id = codec_id;
3383 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3385 if (codec && codec->supported_framerates && !force_fps)
3386 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3387 video_enc->time_base.den = fps.num;
3388 video_enc->time_base.num = fps.den;
3390 video_enc->width = frame_width;
3391 video_enc->height = frame_height;
3392 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3393 video_enc->pix_fmt = frame_pix_fmt;
3394 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3396 choose_pixel_fmt(st, codec);
3399 video_enc->gop_size = 0;
3400 if (video_qscale || same_quality) {
3401 video_enc->flags |= CODEC_FLAG_QSCALE;
3402 video_enc->global_quality=
3403 st->quality = FF_QP2LAMBDA * video_qscale;
3407 video_enc->intra_matrix = intra_matrix;
3409 video_enc->inter_matrix = inter_matrix;
3411 p= video_rc_override_string;
3414 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3416 fprintf(stderr, "error parsing rc_override\n");
3419 video_enc->rc_override=
3420 av_realloc(video_enc->rc_override,
3421 sizeof(RcOverride)*(i+1));
3422 video_enc->rc_override[i].start_frame= start;
3423 video_enc->rc_override[i].end_frame = end;
3425 video_enc->rc_override[i].qscale= q;
3426 video_enc->rc_override[i].quality_factor= 1.0;
3429 video_enc->rc_override[i].qscale= 0;
3430 video_enc->rc_override[i].quality_factor= -q/100.0;
3435 video_enc->rc_override_count=i;
3436 if (!video_enc->rc_initial_buffer_occupancy)
3437 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3438 video_enc->me_threshold= me_threshold;
3439 video_enc->intra_dc_precision= intra_dc_precision - 8;
3442 video_enc->flags|= CODEC_FLAG_PSNR;
3447 video_enc->flags |= CODEC_FLAG_PASS1;
3449 video_enc->flags |= CODEC_FLAG_PASS2;
3453 if (forced_key_frames)
3454 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3456 if (video_language) {
3457 av_metadata_set2(&st->metadata, "language", video_language, 0);
3458 av_freep(&video_language);
3461 /* reset some key parameters */
3463 av_freep(&video_codec_name);
3464 av_freep(&forced_key_frames);
3465 video_stream_copy = 0;
3466 frame_pix_fmt = PIX_FMT_NONE;
3469 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3472 AVOutputStream *ost;
3473 AVCodec *codec= NULL;
3474 AVCodecContext *audio_enc;
3475 enum CodecID codec_id = CODEC_ID_NONE;
3477 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3479 fprintf(stderr, "Could not alloc stream\n");
3482 ost = new_output_stream(oc, file_idx);
3484 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3485 if(!audio_stream_copy){
3486 if (audio_codec_name) {
3487 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3488 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3489 codec = avcodec_find_encoder_by_name(audio_codec_name);
3490 output_codecs[nb_output_codecs-1] = codec;
3492 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3493 codec = avcodec_find_encoder(codec_id);
3497 avcodec_get_context_defaults3(st->codec, codec);
3499 ost->bitstream_filters = audio_bitstream_filters;
3500 audio_bitstream_filters= NULL;
3502 st->codec->thread_count= thread_count;
3504 audio_enc = st->codec;
3505 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3508 audio_enc->codec_tag= audio_codec_tag;
3510 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3511 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3512 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3514 if (audio_stream_copy) {
3515 st->stream_copy = 1;
3516 audio_enc->channels = audio_channels;
3517 audio_enc->sample_rate = audio_sample_rate;
3519 audio_enc->codec_id = codec_id;
3520 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3522 if (audio_qscale > QSCALE_NONE) {
3523 audio_enc->flags |= CODEC_FLAG_QSCALE;
3524 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3526 audio_enc->channels = audio_channels;
3527 audio_enc->sample_fmt = audio_sample_fmt;
3528 audio_enc->sample_rate = audio_sample_rate;
3529 audio_enc->channel_layout = channel_layout;
3530 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3531 audio_enc->channel_layout = 0;
3532 choose_sample_fmt(st, codec);
3533 choose_sample_rate(st, codec);
3535 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3536 if (audio_language) {
3537 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3538 av_freep(&audio_language);
3541 /* reset some key parameters */
3543 av_freep(&audio_codec_name);
3544 audio_stream_copy = 0;
3547 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3550 AVOutputStream *ost;
3551 AVCodec *codec=NULL;
3552 AVCodecContext *subtitle_enc;
3553 enum CodecID codec_id = CODEC_ID_NONE;
3555 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3557 fprintf(stderr, "Could not alloc stream\n");
3560 ost = new_output_stream(oc, file_idx);
3561 subtitle_enc = st->codec;
3562 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3563 if(!subtitle_stream_copy){
3564 if (subtitle_codec_name) {
3565 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3566 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3567 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3569 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3570 codec = avcodec_find_encoder(codec_id);
3573 avcodec_get_context_defaults3(st->codec, codec);
3575 ost->bitstream_filters = subtitle_bitstream_filters;
3576 subtitle_bitstream_filters= NULL;
3578 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3580 if(subtitle_codec_tag)
3581 subtitle_enc->codec_tag= subtitle_codec_tag;
3583 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3584 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3585 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3587 if (subtitle_stream_copy) {
3588 st->stream_copy = 1;
3590 subtitle_enc->codec_id = codec_id;
3591 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3594 if (subtitle_language) {
3595 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3596 av_freep(&subtitle_language);
3599 subtitle_disable = 0;
3600 av_freep(&subtitle_codec_name);
3601 subtitle_stream_copy = 0;
3604 static int opt_new_stream(const char *opt, const char *arg)
3606 AVFormatContext *oc;
3607 int file_idx = nb_output_files - 1;
3608 if (nb_output_files <= 0) {
3609 fprintf(stderr, "At least one output file must be specified\n");
3612 oc = output_files[file_idx];
3614 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3615 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3616 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3621 /* arg format is "output-stream-index:streamid-value". */
3622 static int opt_streamid(const char *opt, const char *arg)
3628 strncpy(idx_str, arg, sizeof(idx_str));
3629 idx_str[sizeof(idx_str)-1] = '\0';
3630 p = strchr(idx_str, ':');
3633 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3638 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3639 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3640 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3644 static void opt_output_file(const char *filename)
3646 AVFormatContext *oc;
3647 int err, use_video, use_audio, use_subtitle;
3648 int input_has_video, input_has_audio, input_has_subtitle;
3649 AVFormatParameters params, *ap = ¶ms;
3650 AVOutputFormat *file_oformat;
3652 if (!strcmp(filename, "-"))
3655 oc = avformat_alloc_context();
3657 print_error(filename, AVERROR(ENOMEM));
3661 if (last_asked_format) {
3662 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3663 if (!file_oformat) {
3664 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3667 last_asked_format = NULL;
3669 file_oformat = av_guess_format(NULL, filename, NULL);
3670 if (!file_oformat) {
3671 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3677 oc->oformat = file_oformat;
3678 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3680 if (!strcmp(file_oformat->name, "ffm") &&
3681 av_strstart(filename, "http:", NULL)) {
3682 /* special case for files sent to ffserver: we get the stream
3683 parameters from ffserver */
3684 int err = read_ffserver_streams(oc, filename);
3686 print_error(filename, err);
3690 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3691 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3692 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3694 /* disable if no corresponding type found and at least one
3696 if (nb_input_files > 0) {
3697 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3698 &input_has_subtitle);
3699 if (!input_has_video)
3701 if (!input_has_audio)
3703 if (!input_has_subtitle)
3707 /* manual disable */
3708 if (audio_disable) use_audio = 0;
3709 if (video_disable) use_video = 0;
3710 if (subtitle_disable) use_subtitle = 0;
3712 if (use_video) new_video_stream(oc, nb_output_files);
3713 if (use_audio) new_audio_stream(oc, nb_output_files);
3714 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3716 oc->timestamp = recording_timestamp;
3718 av_metadata_copy(&oc->metadata, metadata, 0);
3719 av_metadata_free(&metadata);
3722 output_files[nb_output_files++] = oc;
3724 /* check filename in case of an image number is expected */
3725 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3726 if (!av_filename_number_test(oc->filename)) {
3727 print_error(oc->filename, AVERROR_NUMEXPECTED);
3732 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3733 /* test if it already exists to avoid loosing precious files */
3734 if (!file_overwrite &&
3735 (strchr(filename, ':') == NULL ||
3736 filename[1] == ':' ||
3737 av_strstart(filename, "file:", NULL))) {
3738 if (url_exist(filename)) {
3740 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3742 if (!read_yesno()) {
3743 fprintf(stderr, "Not overwriting - exiting\n");
3748 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3755 if ((err = avio_open(&oc->pb, filename, AVIO_WRONLY)) < 0) {
3756 print_error(filename, err);
3761 memset(ap, 0, sizeof(*ap));
3762 if (av_set_parameters(oc, ap) < 0) {
3763 fprintf(stderr, "%s: Invalid encoding parameters\n",
3768 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3769 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3770 oc->loop_output = loop_output;
3771 oc->flags |= AVFMT_FLAG_NONBLOCK;
3773 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3775 av_freep(&forced_key_frames);
3778 /* same option as mencoder */
3779 static void opt_pass(const char *pass_str)
3782 pass = atoi(pass_str);
3783 if (pass != 1 && pass != 2) {
3784 fprintf(stderr, "pass number can be only 1 or 2\n");
3790 static int64_t getutime(void)
3793 struct rusage rusage;
3795 getrusage(RUSAGE_SELF, &rusage);
3796 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3797 #elif HAVE_GETPROCESSTIMES
3799 FILETIME c, e, k, u;
3800 proc = GetCurrentProcess();
3801 GetProcessTimes(proc, &c, &e, &k, &u);
3802 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3804 return av_gettime();
3808 static int64_t getmaxrss(void)
3810 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3811 struct rusage rusage;
3812 getrusage(RUSAGE_SELF, &rusage);
3813 return (int64_t)rusage.ru_maxrss * 1024;
3814 #elif HAVE_GETPROCESSMEMORYINFO
3816 PROCESS_MEMORY_COUNTERS memcounters;
3817 proc = GetCurrentProcess();
3818 memcounters.cb = sizeof(memcounters);
3819 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3820 return memcounters.PeakPagefileUsage;
3826 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3829 const char *p = str;
3836 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3843 static void opt_inter_matrix(const char *arg)
3845 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3846 parse_matrix_coeffs(inter_matrix, arg);
3849 static void opt_intra_matrix(const char *arg)
3851 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3852 parse_matrix_coeffs(intra_matrix, arg);
3855 static void show_usage(void)
3857 printf("Hyper fast Audio and Video encoder\n");
3858 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3862 static void show_help(void)
3865 AVOutputFormat *oformat = NULL;
3867 av_log_set_callback(log_callback_help);
3869 show_help_options(options, "Main options:\n",
3870 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3871 show_help_options(options, "\nAdvanced options:\n",
3872 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3874 show_help_options(options, "\nVideo options:\n",
3875 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3877 show_help_options(options, "\nAdvanced Video options:\n",
3878 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3879 OPT_VIDEO | OPT_EXPERT);
3880 show_help_options(options, "\nAudio options:\n",
3881 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3883 show_help_options(options, "\nAdvanced Audio options:\n",
3884 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3885 OPT_AUDIO | OPT_EXPERT);
3886 show_help_options(options, "\nSubtitle options:\n",
3887 OPT_SUBTITLE | OPT_GRAB,
3889 show_help_options(options, "\nAudio/Video grab options:\n",
3893 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3896 /* individual codec options */
3898 while ((c = av_codec_next(c))) {
3899 if (c->priv_class) {
3900 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3905 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3908 /* individual muxer options */
3909 while ((oformat = av_oformat_next(oformat))) {
3910 if (oformat->priv_class) {
3911 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3916 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3919 static void opt_target(const char *arg)
3921 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3922 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3924 if(!strncmp(arg, "pal-", 4)) {
3927 } else if(!strncmp(arg, "ntsc-", 5)) {
3930 } else if(!strncmp(arg, "film-", 5)) {
3935 /* Calculate FR via float to avoid int overflow */
3936 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3939 } else if((fr == 29970) || (fr == 23976)) {
3942 /* Try to determine PAL/NTSC by peeking in the input files */
3943 if(nb_input_files) {
3945 for(j = 0; j < nb_input_files; j++) {
3946 for(i = 0; i < input_files[j]->nb_streams; i++) {
3947 AVCodecContext *c = input_files[j]->streams[i]->codec;
3948 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3950 fr = c->time_base.den * 1000 / c->time_base.num;
3954 } else if((fr == 29970) || (fr == 23976)) {
3964 if(verbose && norm != UNKNOWN)
3965 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3968 if(norm == UNKNOWN) {
3969 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3970 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3971 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3975 if(!strcmp(arg, "vcd")) {
3977 opt_video_codec("mpeg1video");
3978 opt_audio_codec("mp2");
3981 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3982 opt_frame_rate(NULL, frame_rates[norm]);
3983 opt_default("g", norm == PAL ? "15" : "18");
3985 opt_default("b", "1150000");
3986 opt_default("maxrate", "1150000");
3987 opt_default("minrate", "1150000");
3988 opt_default("bufsize", "327680"); // 40*1024*8;
3990 opt_default("ab", "224000");
3991 audio_sample_rate = 44100;
3994 opt_default("packetsize", "2324");
3995 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3997 /* We have to offset the PTS, so that it is consistent with the SCR.
3998 SCR starts at 36000, but the first two packs contain only padding
3999 and the first pack from the other stream, respectively, may also have
4000 been written before.
4001 So the real data starts at SCR 36000+3*1200. */
4002 mux_preload= (36000+3*1200) / 90000.0; //0.44
4003 } else if(!strcmp(arg, "svcd")) {
4005 opt_video_codec("mpeg2video");
4006 opt_audio_codec("mp2");
4009 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4010 opt_frame_rate(NULL, frame_rates[norm]);
4011 opt_default("g", norm == PAL ? "15" : "18");
4013 opt_default("b", "2040000");
4014 opt_default("maxrate", "2516000");
4015 opt_default("minrate", "0"); //1145000;
4016 opt_default("bufsize", "1835008"); //224*1024*8;
4017 opt_default("flags", "+scan_offset");
4020 opt_default("ab", "224000");
4021 audio_sample_rate = 44100;
4023 opt_default("packetsize", "2324");
4025 } else if(!strcmp(arg, "dvd")) {
4027 opt_video_codec("mpeg2video");
4028 opt_audio_codec("ac3");
4031 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4032 opt_frame_rate(NULL, frame_rates[norm]);
4033 opt_default("g", norm == PAL ? "15" : "18");
4035 opt_default("b", "6000000");
4036 opt_default("maxrate", "9000000");
4037 opt_default("minrate", "0"); //1500000;
4038 opt_default("bufsize", "1835008"); //224*1024*8;
4040 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4041 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4043 opt_default("ab", "448000");
4044 audio_sample_rate = 48000;
4046 } else if(!strncmp(arg, "dv", 2)) {
4050 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4051 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4052 (norm == PAL ? "yuv420p" : "yuv411p"));
4053 opt_frame_rate(NULL, frame_rates[norm]);
4055 audio_sample_rate = 48000;
4059 fprintf(stderr, "Unknown target: %s\n", arg);
4064 static void opt_vstats_file (const char *arg)
4066 av_free (vstats_filename);
4067 vstats_filename=av_strdup (arg);
4070 static void opt_vstats (void)
4073 time_t today2 = time(NULL);
4074 struct tm *today = localtime(&today2);
4076 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4078 opt_vstats_file(filename);
4081 static int opt_bsf(const char *opt, const char *arg)
4083 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4084 AVBitStreamFilterContext **bsfp;
4087 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4091 bsfp= *opt == 'v' ? &video_bitstream_filters :
4092 *opt == 'a' ? &audio_bitstream_filters :
4093 &subtitle_bitstream_filters;
4095 bsfp= &(*bsfp)->next;
4102 static int opt_preset(const char *opt, const char *arg)
4105 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4106 char *codec_name = *opt == 'v' ? video_codec_name :
4107 *opt == 'a' ? audio_codec_name :
4108 subtitle_codec_name;
4110 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4111 fprintf(stderr, "File for preset '%s' not found\n", arg);
4116 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4117 if(line[0] == '#' && !e)
4119 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4121 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4124 if(!strcmp(tmp, "acodec")){
4125 opt_audio_codec(tmp2);
4126 }else if(!strcmp(tmp, "vcodec")){
4127 opt_video_codec(tmp2);
4128 }else if(!strcmp(tmp, "scodec")){
4129 opt_subtitle_codec(tmp2);
4130 }else if(opt_default(tmp, tmp2) < 0){
4131 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4141 static const OptionDef options[] = {
4143 #include "cmdutils_common_opts.h"
4144 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4145 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4146 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4147 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4148 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4149 "outfile[,metadata]:infile[,metadata]" },
4150 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4151 "outfile[,metadata]:infile[,metadata]" },
4152 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4153 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4154 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4155 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4156 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4157 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4158 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4159 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4160 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4161 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4162 "add timings for benchmarking" },
4163 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4164 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4165 "dump each input packet" },
4166 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4167 "when dumping packets, also dump the payload" },
4168 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4169 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4170 { "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)", "" },
4171 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4172 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4173 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4174 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4175 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4176 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4177 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4178 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4179 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4180 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4181 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4182 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4183 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4184 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4187 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4188 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4189 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4190 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4191 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4192 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4193 { "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" },
4194 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4195 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4196 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4197 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4198 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4199 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4200 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4201 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4202 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4203 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4204 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4205 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4206 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4207 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4208 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4209 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4210 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4211 "use same quantizer as source (implies VBR)" },
4212 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4213 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4214 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4215 "deinterlace pictures" },
4216 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4217 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4218 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4220 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4222 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4223 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4224 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4225 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4226 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4227 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4228 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4229 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4230 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4231 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4232 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4235 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4236 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4237 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4238 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4239 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4240 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4241 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4242 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4243 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4244 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4245 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4246 { "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" },
4248 /* subtitle options */
4249 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4250 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4251 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4252 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4253 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4256 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4257 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4258 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4261 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4262 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4264 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4265 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4266 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4268 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4269 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4270 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4271 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4273 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4277 int main(int argc, char **argv)
4281 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4283 avcodec_register_all();
4285 avdevice_register_all();
4288 avfilter_register_all();
4293 if(isatty(STDIN_FILENO))
4294 avio_set_interrupt_cb(decode_interrupt_cb);
4302 parse_options(argc, argv, options, opt_output_file);
4304 if(nb_output_files <= 0 && nb_input_files == 0) {
4306 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4310 /* file converter / grab */
4311 if (nb_output_files <= 0) {
4312 fprintf(stderr, "At least one output file must be specified\n");
4316 if (nb_input_files == 0) {
4317 fprintf(stderr, "At least one input file must be specified\n");
4322 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4323 stream_maps, nb_stream_maps) < 0)
4325 ti = getutime() - ti;
4327 int maxrss = getmaxrss() / 1024;
4328 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4331 return ffmpeg_exit(0);