3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavcore/audioconvert.h"
40 #include "libavcore/parseutils.h"
41 #include "libavcore/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
74 #include <sys/ioctl.h>
84 #include "libavutil/avassert.h"
86 const char program_name[] = "FFmpeg";
87 const int program_birth_year = 2000;
89 /* select an input stream for an output stream */
90 typedef struct AVStreamMap {
94 int sync_stream_index;
98 * select an input file for an output file
100 typedef struct AVMetaDataMap {
101 int file; //< file index
102 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
103 int index; //< stream/chapter/program number
106 typedef struct AVChapterMap {
111 static const OptionDef options[];
113 #define MAX_FILES 100
114 #if !FF_API_MAX_STREAMS
115 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
118 static const char *last_asked_format = NULL;
119 static AVFormatContext *input_files[MAX_FILES];
120 static int64_t input_files_ts_offset[MAX_FILES];
121 static double *input_files_ts_scale[MAX_FILES] = {NULL};
122 static AVCodec **input_codecs = NULL;
123 static int nb_input_files = 0;
124 static int nb_input_codecs = 0;
125 static int nb_input_files_ts_scale[MAX_FILES] = {0};
127 static AVFormatContext *output_files[MAX_FILES];
128 static AVCodec **output_codecs = NULL;
129 static int nb_output_files = 0;
130 static int nb_output_codecs = 0;
132 static AVStreamMap *stream_maps = NULL;
133 static int nb_stream_maps;
135 /* first item specifies output metadata, second is input */
136 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
137 static int nb_meta_data_maps;
138 static int metadata_streams_autocopy = 1;
139 static int metadata_chapters_autocopy = 1;
141 static AVChapterMap *chapter_maps = NULL;
142 static int nb_chapter_maps;
144 /* indexed by output file stream index */
145 static int *streamid_map = NULL;
146 static int nb_streamid_map = 0;
148 static int frame_width = 0;
149 static int frame_height = 0;
150 static float frame_aspect_ratio = 0;
151 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
152 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
153 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
154 static AVRational frame_rate;
155 static float video_qscale = 0;
156 static uint16_t *intra_matrix = NULL;
157 static uint16_t *inter_matrix = NULL;
158 static const char *video_rc_override_string=NULL;
159 static int video_disable = 0;
160 static int video_discard = 0;
161 static char *video_codec_name = NULL;
162 static unsigned int video_codec_tag = 0;
163 static char *video_language = NULL;
164 static int same_quality = 0;
165 static int do_deinterlace = 0;
166 static int top_field_first = -1;
167 static int me_threshold = 0;
168 static int intra_dc_precision = 8;
169 static int loop_input = 0;
170 static int loop_output = AVFMT_NOOUTPUTLOOP;
171 static int qp_hist = 0;
173 static char *vfilters = NULL;
174 AVFilterGraph *graph = NULL;
177 static int intra_only = 0;
178 static int audio_sample_rate = 44100;
179 static int64_t channel_layout = 0;
180 #define QSCALE_NONE -99999
181 static float audio_qscale = QSCALE_NONE;
182 static int audio_disable = 0;
183 static int audio_channels = 1;
184 static char *audio_codec_name = NULL;
185 static unsigned int audio_codec_tag = 0;
186 static char *audio_language = NULL;
188 static int subtitle_disable = 0;
189 static char *subtitle_codec_name = NULL;
190 static char *subtitle_language = NULL;
191 static unsigned int subtitle_codec_tag = 0;
193 static float mux_preload= 0.5;
194 static float mux_max_delay= 0.7;
196 static int64_t recording_time = INT64_MAX;
197 static int64_t start_time = 0;
198 static int64_t recording_timestamp = 0;
199 static int64_t input_ts_offset = 0;
200 static int file_overwrite = 0;
201 static AVMetadata *metadata;
202 static int do_benchmark = 0;
203 static int do_hex_dump = 0;
204 static int do_pkt_dump = 0;
205 static int do_psnr = 0;
206 static int do_pass = 0;
207 static char *pass_logfilename_prefix = NULL;
208 static int audio_stream_copy = 0;
209 static int video_stream_copy = 0;
210 static int subtitle_stream_copy = 0;
211 static int video_sync_method= -1;
212 static int audio_sync_method= 0;
213 static float audio_drift_threshold= 0.1;
214 static int copy_ts= 0;
215 static int opt_shortest = 0;
216 static int video_global_header = 0;
217 static char *vstats_filename;
218 static FILE *vstats_file;
219 static int opt_programid = 0;
220 static int copy_initial_nonkeyframes = 0;
222 static int rate_emu = 0;
224 static int video_channel = 0;
225 static char *video_standard;
227 static int audio_volume = 256;
229 static int exit_on_error = 0;
230 static int using_stdin = 0;
231 static int verbose = 1;
232 static int thread_count= 1;
233 static int q_pressed = 0;
234 static int64_t video_size = 0;
235 static int64_t audio_size = 0;
236 static int64_t extra_size = 0;
237 static int nb_frames_dup = 0;
238 static int nb_frames_drop = 0;
239 static int input_sync;
240 static uint64_t limit_filesize = 0;
241 static int force_fps = 0;
242 static char *forced_key_frames = NULL;
244 static float dts_delta_threshold = 10;
246 static unsigned int sws_flags = SWS_BICUBIC;
248 static int64_t timer_start;
250 static uint8_t *audio_buf;
251 static uint8_t *audio_out;
252 unsigned int allocated_audio_out_size, allocated_audio_buf_size;
254 static short *samples;
256 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
257 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
258 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
260 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
262 struct AVInputStream;
264 typedef struct AVOutputStream {
265 int file_index; /* file index */
266 int index; /* stream index in the output file */
267 int source_index; /* AVInputStream index */
268 AVStream *st; /* stream in the output file */
269 int encoding_needed; /* true if encoding needed for this stream */
271 /* input pts and corresponding output pts
273 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
274 struct AVInputStream *sync_ist; /* input stream to sync against */
275 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
276 AVBitStreamFilterContext *bitstream_filters;
279 AVFrame pict_tmp; /* temporary image for resampling */
280 struct SwsContext *img_resample_ctx; /* for image resampling */
283 int resample_pix_fmt;
285 /* full frame size of first frame */
289 /* forced key frames */
290 int64_t *forced_kf_pts;
296 ReSampleContext *resample; /* for audio resampling */
298 AVAudioConvert *reformat_ctx;
299 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
303 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
304 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
306 typedef struct AVInputStream {
310 int discard; /* true if stream data should be discarded */
311 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
312 int64_t sample_index; /* current sample */
314 int64_t start; /* time when read started */
315 int64_t next_pts; /* synthetic pts for cases where pkt.pts
317 int64_t pts; /* current pts */
318 PtsCorrectionContext pts_ctx;
319 int is_start; /* is 1 at the start and after a discontinuity */
320 int showed_multi_packet_warning;
321 int is_past_recording_time;
323 AVFilterContext *output_video_filter;
324 AVFilterContext *input_video_filter;
325 AVFrame *filter_frame;
326 int has_filter_frame;
327 AVFilterBufferRef *picref;
331 typedef struct AVInputFile {
332 int eof_reached; /* true if eof reached */
333 int ist_index; /* index of first stream in ist_table */
334 int buffer_size; /* current total buffer size */
335 int nb_streams; /* nb streams we are aware of */
340 /* init terminal so that we can grab keys */
341 static struct termios oldtty;
346 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
348 AVFilterContext *last_filter, *filter;
349 /** filter graph containing all filters including input & output */
350 AVCodecContext *codec = ost->st->codec;
351 AVCodecContext *icodec = ist->st->codec;
352 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
356 graph = avfilter_graph_alloc();
358 if ((ret = avfilter_open(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src")) < 0)
360 if ((ret = avfilter_open(&ist->output_video_filter, &ffsink, "out")) < 0)
363 snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
364 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE);
365 if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0)
367 if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &ffsink_ctx)) < 0)
370 /* add input and output filters to the overall graph */
371 avfilter_graph_add_filter(graph, ist->input_video_filter);
372 avfilter_graph_add_filter(graph, ist->output_video_filter);
374 last_filter = ist->input_video_filter;
376 if (codec->width != icodec->width || codec->height != icodec->height) {
377 snprintf(args, 255, "%d:%d:flags=0x%X",
380 (int)av_get_int(sws_opts, "sws_flags", NULL));
381 if ((ret = avfilter_open(&filter, avfilter_get_by_name("scale"), NULL)) < 0)
383 if ((ret = avfilter_init_filter(filter, args, NULL)) < 0)
385 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
387 last_filter = filter;
388 avfilter_graph_add_filter(graph, last_filter);
391 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
392 graph->scale_sws_opts = av_strdup(args);
395 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
396 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
398 outputs->name = av_strdup("in");
399 outputs->filter_ctx = last_filter;
400 outputs->pad_idx = 0;
401 outputs->next = NULL;
403 inputs->name = av_strdup("out");
404 inputs->filter_ctx = ist->output_video_filter;
408 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
412 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
416 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
419 codec->width = ist->output_video_filter->inputs[0]->w;
420 codec->height = ist->output_video_filter->inputs[0]->h;
424 #endif /* CONFIG_AVFILTER */
426 static void term_exit(void)
428 av_log(NULL, AV_LOG_QUIET, "");
430 tcsetattr (0, TCSANOW, &oldtty);
434 static volatile int received_sigterm = 0;
437 sigterm_handler(int sig)
439 received_sigterm = sig;
443 static void term_init(void)
452 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
453 |INLCR|IGNCR|ICRNL|IXON);
454 tty.c_oflag |= OPOST;
455 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
456 tty.c_cflag &= ~(CSIZE|PARENB);
461 tcsetattr (0, TCSANOW, &tty);
462 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
465 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
466 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
468 signal(SIGXCPU, sigterm_handler);
472 /* read a key without blocking */
473 static int read_key(void)
485 n = select(1, &rfds, NULL, NULL, &tv);
500 static int decode_interrupt_cb(void)
502 return q_pressed || (q_pressed = read_key() == 'q');
505 static int ffmpeg_exit(int ret)
510 for(i=0;i<nb_output_files;i++) {
511 /* maybe av_close_output_file ??? */
512 AVFormatContext *s = output_files[i];
514 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
516 for(j=0;j<s->nb_streams;j++) {
517 av_metadata_free(&s->streams[j]->metadata);
518 av_free(s->streams[j]->codec);
519 av_free(s->streams[j]->info);
520 av_free(s->streams[j]);
522 for(j=0;j<s->nb_programs;j++) {
523 av_metadata_free(&s->programs[j]->metadata);
525 for(j=0;j<s->nb_chapters;j++) {
526 av_metadata_free(&s->chapters[j]->metadata);
528 av_metadata_free(&s->metadata);
530 av_free(output_streams_for_file[i]);
532 for(i=0;i<nb_input_files;i++) {
533 av_close_input_file(input_files[i]);
534 av_free(input_files_ts_scale[i]);
537 av_free(intra_matrix);
538 av_free(inter_matrix);
542 av_free(vstats_filename);
545 av_free(streamid_map);
546 av_free(input_codecs);
547 av_free(output_codecs);
548 av_free(stream_maps);
549 av_free(meta_data_maps);
551 av_free(video_codec_name);
552 av_free(audio_codec_name);
553 av_free(subtitle_codec_name);
555 av_free(video_standard);
560 allocated_audio_buf_size= allocated_audio_out_size= 0;
567 if (received_sigterm) {
569 "Received signal %d: terminating.\n",
570 (int) received_sigterm);
574 exit(ret); /* not all OS-es handle main() return value */
578 /* similar to ff_dynarray_add() and av_fast_realloc() */
579 static void *grow_array(void *array, int elem_size, int *size, int new_size)
581 if (new_size >= INT_MAX / elem_size) {
582 fprintf(stderr, "Array too big.\n");
585 if (*size < new_size) {
586 uint8_t *tmp = av_realloc(array, new_size*elem_size);
588 fprintf(stderr, "Could not alloc buffer.\n");
591 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
598 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
600 if(codec && codec->sample_fmts){
601 const enum AVSampleFormat *p= codec->sample_fmts;
603 if(*p == st->codec->sample_fmt)
607 st->codec->sample_fmt = codec->sample_fmts[0];
611 static void choose_sample_rate(AVStream *st, AVCodec *codec)
613 if(codec && codec->supported_samplerates){
614 const int *p= codec->supported_samplerates;
616 int best_dist=INT_MAX;
618 int dist= abs(st->codec->sample_rate - *p);
619 if(dist < best_dist){
625 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
627 st->codec->sample_rate= best;
631 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
633 if(codec && codec->pix_fmts){
634 const enum PixelFormat *p= codec->pix_fmts;
636 if(*p == st->codec->pix_fmt)
640 && !( st->codec->codec_id==CODEC_ID_MJPEG
641 && st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL
642 && ( st->codec->pix_fmt == PIX_FMT_YUV420P
643 || st->codec->pix_fmt == PIX_FMT_YUV422P)))
644 st->codec->pix_fmt = codec->pix_fmts[0];
648 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
650 int idx = oc->nb_streams - 1;
653 output_streams_for_file[file_idx] =
654 grow_array(output_streams_for_file[file_idx],
655 sizeof(*output_streams_for_file[file_idx]),
656 &nb_output_streams_for_file[file_idx],
658 ost = output_streams_for_file[file_idx][idx] =
659 av_mallocz(sizeof(AVOutputStream));
661 fprintf(stderr, "Could not alloc output stream\n");
664 ost->file_index = file_idx;
669 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
675 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
678 /* copy stream format */
680 for(i=0;i<ic->nb_streams;i++) {
686 // FIXME: a more elegant solution is needed
687 st = av_mallocz(sizeof(AVStream));
688 memcpy(st, ic->streams[i], sizeof(AVStream));
689 st->codec = avcodec_alloc_context();
691 print_error(filename, AVERROR(ENOMEM));
694 avcodec_copy_context(st->codec, ic->streams[i]->codec);
697 codec = avcodec_find_encoder(st->codec->codec_id);
698 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
699 if (audio_stream_copy) {
702 choose_sample_fmt(st, codec);
703 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
704 if (video_stream_copy) {
707 choose_pixel_fmt(st, codec);
710 if(!st->codec->thread_count)
711 st->codec->thread_count = 1;
712 if(st->codec->thread_count>1)
713 avcodec_thread_init(st->codec, st->codec->thread_count);
715 if(st->codec->flags & CODEC_FLAG_BITEXACT)
718 new_output_stream(s, nb_output_files);
722 s->timestamp = av_gettime();
724 av_close_input_file(ic);
729 get_sync_ipts(const AVOutputStream *ost)
731 const AVInputStream *ist = ost->sync_ist;
732 return (double)(ist->pts - start_time)/AV_TIME_BASE;
735 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
739 AVPacket new_pkt= *pkt;
740 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
741 &new_pkt.data, &new_pkt.size,
742 pkt->data, pkt->size,
743 pkt->flags & AV_PKT_FLAG_KEY);
746 new_pkt.destruct= av_destruct_packet;
748 fprintf(stderr, "%s failed for stream %d, codec %s",
749 bsfc->filter->name, pkt->stream_index,
750 avctx->codec ? avctx->codec->name : "copy");
760 ret= av_interleaved_write_frame(s, pkt);
762 print_error("av_interleaved_write_frame()", ret);
767 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
769 static void do_audio_out(AVFormatContext *s,
772 unsigned char *buf, int size)
775 int64_t audio_out_size, audio_buf_size;
776 int64_t allocated_for_size= size;
778 int size_out, frame_bytes, ret;
779 AVCodecContext *enc= ost->st->codec;
780 AVCodecContext *dec= ist->st->codec;
781 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
782 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
783 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
786 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
787 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
788 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
789 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
790 audio_buf_size*= osize*enc->channels;
792 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
793 if(coded_bps > 8*osize)
794 audio_out_size= audio_out_size * coded_bps / (8*osize);
795 audio_out_size += FF_MIN_BUFFER_SIZE;
797 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
798 fprintf(stderr, "Buffer sizes too large\n");
802 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
803 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
804 if (!audio_buf || !audio_out){
805 fprintf(stderr, "Out of memory in do_audio_out\n");
809 if (enc->channels != dec->channels)
810 ost->audio_resample = 1;
812 if (ost->audio_resample && !ost->resample) {
813 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
814 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
815 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
816 enc->sample_rate, dec->sample_rate,
817 enc->sample_fmt, dec->sample_fmt,
819 if (!ost->resample) {
820 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
821 dec->channels, dec->sample_rate,
822 enc->channels, enc->sample_rate);
827 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
828 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
829 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
830 if (ost->reformat_ctx)
831 av_audio_convert_free(ost->reformat_ctx);
832 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
833 dec->sample_fmt, 1, NULL, 0);
834 if (!ost->reformat_ctx) {
835 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
836 av_get_sample_fmt_name(dec->sample_fmt),
837 av_get_sample_fmt_name(enc->sample_fmt));
840 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
843 if(audio_sync_method){
844 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
845 - av_fifo_size(ost->fifo)/(enc->channels * 2);
846 double idelta= delta*dec->sample_rate / enc->sample_rate;
847 int byte_delta= ((int)idelta)*2*dec->channels;
849 //FIXME resample delay
850 if(fabs(delta) > 50){
851 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
853 byte_delta= FFMAX(byte_delta, -size);
857 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
862 static uint8_t *input_tmp= NULL;
863 input_tmp= av_realloc(input_tmp, byte_delta + size);
865 if(byte_delta > allocated_for_size - size){
866 allocated_for_size= byte_delta + (int64_t)size;
871 memset(input_tmp, 0, byte_delta);
872 memcpy(input_tmp + byte_delta, buf, size);
876 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
878 }else if(audio_sync_method>1){
879 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
880 av_assert0(ost->audio_resample);
882 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
883 // 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));
884 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
888 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
889 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
891 if (ost->audio_resample) {
893 size_out = audio_resample(ost->resample,
894 (short *)buftmp, (short *)buf,
895 size / (dec->channels * isize));
896 size_out = size_out * enc->channels * osize;
902 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
903 const void *ibuf[6]= {buftmp};
904 void *obuf[6]= {audio_buf};
905 int istride[6]= {isize};
906 int ostride[6]= {osize};
907 int len= size_out/istride[0];
908 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
909 printf("av_audio_convert() failed\n");
915 size_out = len*osize;
918 /* now encode as many frames as possible */
919 if (enc->frame_size > 1) {
920 /* output resampled raw samples */
921 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
922 fprintf(stderr, "av_fifo_realloc2() failed\n");
925 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
927 frame_bytes = enc->frame_size * osize * enc->channels;
929 while (av_fifo_size(ost->fifo) >= frame_bytes) {
931 av_init_packet(&pkt);
933 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
935 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
937 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
940 fprintf(stderr, "Audio encoding failed\n");
944 pkt.stream_index= ost->index;
947 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
948 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
949 pkt.flags |= AV_PKT_FLAG_KEY;
950 write_frame(s, &pkt, enc, ost->bitstream_filters);
952 ost->sync_opts += enc->frame_size;
956 av_init_packet(&pkt);
958 ost->sync_opts += size_out / (osize * enc->channels);
960 /* output a pcm frame */
961 /* determine the size of the coded buffer */
964 size_out = size_out*coded_bps/8;
966 if(size_out > audio_out_size){
967 fprintf(stderr, "Internal error, buffer size too small\n");
971 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
972 ret = avcodec_encode_audio(enc, audio_out, size_out,
975 fprintf(stderr, "Audio encoding failed\n");
979 pkt.stream_index= ost->index;
982 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
983 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
984 pkt.flags |= AV_PKT_FLAG_KEY;
985 write_frame(s, &pkt, enc, ost->bitstream_filters);
989 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
993 AVPicture picture_tmp;
996 dec = ist->st->codec;
998 /* deinterlace : must be done before any resize */
999 if (do_deinterlace) {
1002 /* create temporary picture */
1003 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1004 buf = av_malloc(size);
1008 picture2 = &picture_tmp;
1009 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1011 if(avpicture_deinterlace(picture2, picture,
1012 dec->pix_fmt, dec->width, dec->height) < 0) {
1013 /* if error, do not deinterlace */
1014 fprintf(stderr, "Deinterlacing failed\n");
1023 if (picture != picture2)
1024 *picture = *picture2;
1028 /* we begin to correct av delay at this threshold */
1029 #define AV_DELAY_MAX 0.100
1031 static void do_subtitle_out(AVFormatContext *s,
1032 AVOutputStream *ost,
1037 static uint8_t *subtitle_out = NULL;
1038 int subtitle_out_max_size = 1024 * 1024;
1039 int subtitle_out_size, nb, i;
1040 AVCodecContext *enc;
1043 if (pts == AV_NOPTS_VALUE) {
1044 fprintf(stderr, "Subtitle packets must have a pts\n");
1050 enc = ost->st->codec;
1052 if (!subtitle_out) {
1053 subtitle_out = av_malloc(subtitle_out_max_size);
1056 /* Note: DVB subtitle need one packet to draw them and one other
1057 packet to clear them */
1058 /* XXX: signal it in the codec context ? */
1059 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1064 for(i = 0; i < nb; i++) {
1065 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1066 // start_display_time is required to be 0
1067 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1068 sub->end_display_time -= sub->start_display_time;
1069 sub->start_display_time = 0;
1070 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1071 subtitle_out_max_size, sub);
1072 if (subtitle_out_size < 0) {
1073 fprintf(stderr, "Subtitle encoding failed\n");
1077 av_init_packet(&pkt);
1078 pkt.stream_index = ost->index;
1079 pkt.data = subtitle_out;
1080 pkt.size = subtitle_out_size;
1081 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1082 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1083 /* XXX: the pts correction is handled here. Maybe handling
1084 it in the codec would be better */
1086 pkt.pts += 90 * sub->start_display_time;
1088 pkt.pts += 90 * sub->end_display_time;
1090 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1094 static int bit_buffer_size= 1024*256;
1095 static uint8_t *bit_buffer= NULL;
1097 static void do_video_out(AVFormatContext *s,
1098 AVOutputStream *ost,
1100 AVFrame *in_picture,
1103 int nb_frames, i, ret;
1104 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1105 AVCodecContext *enc, *dec;
1108 enc = ost->st->codec;
1109 dec = ist->st->codec;
1111 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1113 /* by default, we output a single frame */
1118 if(video_sync_method){
1119 double vdelta = sync_ipts - ost->sync_opts;
1120 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1123 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1126 }else if(vdelta>0.6)
1127 ost->sync_opts= lrintf(sync_ipts);
1128 }else if (vdelta > 1.1)
1129 nb_frames = lrintf(vdelta);
1130 //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);
1131 if (nb_frames == 0){
1134 fprintf(stderr, "*** drop!\n");
1135 }else if (nb_frames > 1) {
1136 nb_frames_dup += nb_frames - 1;
1138 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1141 ost->sync_opts= lrintf(sync_ipts);
1143 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1147 formatted_picture = in_picture;
1148 final_picture = formatted_picture;
1149 padding_src = formatted_picture;
1150 resampling_dst = &ost->pict_tmp;
1152 if ( ost->resample_height != ist->st->codec->height
1153 || ost->resample_width != ist->st->codec->width
1154 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1156 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));
1157 if(!ost->video_resample)
1161 #if !CONFIG_AVFILTER
1162 if (ost->video_resample) {
1164 final_picture = &ost->pict_tmp;
1165 if( ost->resample_height != ist->st->codec->height
1166 || ost->resample_width != ist->st->codec->width
1167 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1169 /* initialize a new scaler context */
1170 sws_freeContext(ost->img_resample_ctx);
1171 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1172 ost->img_resample_ctx = sws_getContext(
1173 ist->st->codec->width,
1174 ist->st->codec->height,
1175 ist->st->codec->pix_fmt,
1176 ost->st->codec->width,
1177 ost->st->codec->height,
1178 ost->st->codec->pix_fmt,
1179 sws_flags, NULL, NULL, NULL);
1180 if (ost->img_resample_ctx == NULL) {
1181 fprintf(stderr, "Cannot get resampling context\n");
1185 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1186 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1190 /* duplicates frame if needed */
1191 for(i=0;i<nb_frames;i++) {
1193 av_init_packet(&pkt);
1194 pkt.stream_index= ost->index;
1196 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1197 /* raw pictures are written as AVPicture structure to
1198 avoid any copies. We support temorarily the older
1200 AVFrame* old_frame = enc->coded_frame;
1201 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1202 pkt.data= (uint8_t *)final_picture;
1203 pkt.size= sizeof(AVPicture);
1204 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1205 pkt.flags |= AV_PKT_FLAG_KEY;
1207 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1208 enc->coded_frame = old_frame;
1210 AVFrame big_picture;
1212 big_picture= *final_picture;
1213 /* better than nothing: use input picture interlaced
1215 big_picture.interlaced_frame = in_picture->interlaced_frame;
1216 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1217 if(top_field_first == -1)
1218 big_picture.top_field_first = in_picture->top_field_first;
1220 big_picture.top_field_first = top_field_first;
1223 /* handles sameq here. This is not correct because it may
1224 not be a global option */
1225 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1227 big_picture.pict_type = 0;
1228 // big_picture.pts = AV_NOPTS_VALUE;
1229 big_picture.pts= ost->sync_opts;
1230 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1231 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1232 if (ost->forced_kf_index < ost->forced_kf_count &&
1233 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1234 big_picture.pict_type = FF_I_TYPE;
1235 ost->forced_kf_index++;
1237 ret = avcodec_encode_video(enc,
1238 bit_buffer, bit_buffer_size,
1241 fprintf(stderr, "Video encoding failed\n");
1246 pkt.data= bit_buffer;
1248 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1249 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1250 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1251 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1252 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1254 if(enc->coded_frame->key_frame)
1255 pkt.flags |= AV_PKT_FLAG_KEY;
1256 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1259 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1260 // enc->frame_number-1, ret, enc->pict_type);
1261 /* if two pass, output log */
1262 if (ost->logfile && enc->stats_out) {
1263 fprintf(ost->logfile, "%s", enc->stats_out);
1268 ost->frame_number++;
1272 static double psnr(double d){
1273 return -10.0*log(d)/log(10.0);
1276 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1279 AVCodecContext *enc;
1281 double ti1, bitrate, avg_bitrate;
1283 /* this is executed just the first time do_video_stats is called */
1285 vstats_file = fopen(vstats_filename, "w");
1292 enc = ost->st->codec;
1293 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1294 frame_number = ost->frame_number;
1295 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1296 if (enc->flags&CODEC_FLAG_PSNR)
1297 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1299 fprintf(vstats_file,"f_size= %6d ", frame_size);
1300 /* compute pts value */
1301 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1305 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1306 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1307 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1308 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1309 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1313 static void print_report(AVFormatContext **output_files,
1314 AVOutputStream **ost_table, int nb_ostreams,
1318 AVOutputStream *ost;
1319 AVFormatContext *oc;
1321 AVCodecContext *enc;
1322 int frame_number, vid, i;
1323 double bitrate, ti1, pts;
1324 static int64_t last_time = -1;
1325 static int qp_histogram[52];
1327 if (!is_last_report) {
1329 /* display the report every 0.5 seconds */
1330 cur_time = av_gettime();
1331 if (last_time == -1) {
1332 last_time = cur_time;
1335 if ((cur_time - last_time) < 500000)
1337 last_time = cur_time;
1341 oc = output_files[0];
1343 total_size = url_fsize(oc->pb);
1344 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1345 total_size= url_ftell(oc->pb);
1350 for(i=0;i<nb_ostreams;i++) {
1352 enc = ost->st->codec;
1353 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1354 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1355 !ost->st->stream_copy ?
1356 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1358 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1359 float t = (av_gettime()-timer_start) / 1000000.0;
1361 frame_number = ost->frame_number;
1362 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1363 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1364 !ost->st->stream_copy ?
1365 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1367 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1370 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1371 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1376 if (enc->flags&CODEC_FLAG_PSNR){
1378 double error, error_sum=0;
1379 double scale, scale_sum=0;
1380 char type[3]= {'Y','U','V'};
1381 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1384 error= enc->error[j];
1385 scale= enc->width*enc->height*255.0*255.0*frame_number;
1387 error= enc->coded_frame->error[j];
1388 scale= enc->width*enc->height*255.0*255.0;
1393 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1395 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1399 /* compute min output value */
1400 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1401 if ((pts < ti1) && (pts > 0))
1407 if (verbose || is_last_report) {
1408 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1410 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1411 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1412 (double)total_size / 1024, ti1, bitrate);
1414 if (nb_frames_dup || nb_frames_drop)
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1416 nb_frames_dup, nb_frames_drop);
1419 fprintf(stderr, "%s \r", buf);
1424 if (is_last_report && verbose >= 0){
1425 int64_t raw= audio_size + video_size + extra_size;
1426 fprintf(stderr, "\n");
1427 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1431 100.0*(total_size - raw)/raw
1436 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1437 static int output_packet(AVInputStream *ist, int ist_index,
1438 AVOutputStream **ost_table, int nb_ostreams,
1439 const AVPacket *pkt)
1441 AVFormatContext *os;
1442 AVOutputStream *ost;
1446 void *buffer_to_free;
1447 static unsigned int samples_size= 0;
1448 AVSubtitle subtitle, *subtitle_to_free;
1449 int64_t pkt_pts = AV_NOPTS_VALUE;
1451 int frame_available;
1455 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1457 if(ist->next_pts == AV_NOPTS_VALUE)
1458 ist->next_pts= ist->pts;
1462 av_init_packet(&avpkt);
1470 if(pkt->dts != AV_NOPTS_VALUE)
1471 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1472 if(pkt->pts != AV_NOPTS_VALUE)
1473 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1475 //while we have more to decode or while the decoder did output something on EOF
1476 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1477 uint8_t *data_buf, *decoded_data_buf;
1478 int data_size, decoded_data_size;
1480 ist->pts= ist->next_pts;
1482 if(avpkt.size && avpkt.size != pkt->size &&
1483 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1484 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1485 ist->showed_multi_packet_warning=1;
1488 /* decode the packet if needed */
1489 decoded_data_buf = NULL; /* fail safe */
1490 decoded_data_size= 0;
1491 data_buf = avpkt.data;
1492 data_size = avpkt.size;
1493 subtitle_to_free = NULL;
1494 if (ist->decoding_needed) {
1495 switch(ist->st->codec->codec_type) {
1496 case AVMEDIA_TYPE_AUDIO:{
1497 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1498 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1500 samples= av_malloc(samples_size);
1502 decoded_data_size= samples_size;
1503 /* XXX: could avoid copy if PCM 16 bits with same
1504 endianness as CPU */
1505 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1512 /* Some bug in mpeg audio decoder gives */
1513 /* decoded_data_size < 0, it seems they are overflows */
1514 if (decoded_data_size <= 0) {
1515 /* no audio frame */
1518 decoded_data_buf = (uint8_t *)samples;
1519 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1520 (ist->st->codec->sample_rate * ist->st->codec->channels);
1522 case AVMEDIA_TYPE_VIDEO:
1523 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1524 /* XXX: allocate picture correctly */
1525 avcodec_get_frame_defaults(&picture);
1526 ist->st->codec->reordered_opaque = pkt_pts;
1527 pkt_pts = AV_NOPTS_VALUE;
1529 ret = avcodec_decode_video2(ist->st->codec,
1530 &picture, &got_picture, &avpkt);
1531 ist->st->quality= picture.quality;
1535 /* no picture yet */
1536 goto discard_packet;
1538 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.reordered_opaque, ist->pts);
1539 if (ist->st->codec->time_base.num != 0) {
1540 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1541 ist->next_pts += ((int64_t)AV_TIME_BASE *
1542 ist->st->codec->time_base.num * ticks) /
1543 ist->st->codec->time_base.den;
1547 case AVMEDIA_TYPE_SUBTITLE:
1548 ret = avcodec_decode_subtitle2(ist->st->codec,
1549 &subtitle, &got_picture, &avpkt);
1553 goto discard_packet;
1555 subtitle_to_free = &subtitle;
1562 switch(ist->st->codec->codec_type) {
1563 case AVMEDIA_TYPE_AUDIO:
1564 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1565 ist->st->codec->sample_rate;
1567 case AVMEDIA_TYPE_VIDEO:
1568 if (ist->st->codec->time_base.num != 0) {
1569 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1570 ist->next_pts += ((int64_t)AV_TIME_BASE *
1571 ist->st->codec->time_base.num * ticks) /
1572 ist->st->codec->time_base.den;
1580 buffer_to_free = NULL;
1581 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1582 pre_process_video_frame(ist, (AVPicture *)&picture,
1587 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1588 // add it to be filtered
1589 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1591 ist->st->codec->sample_aspect_ratio);
1595 // preprocess audio (volume)
1596 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1597 if (audio_volume != 256) {
1600 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1601 int v = ((*volp) * audio_volume + 128) >> 8;
1602 if (v < -32768) v = -32768;
1603 if (v > 32767) v = 32767;
1609 /* frame rate emulation */
1611 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1612 int64_t now = av_gettime() - ist->start;
1617 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1618 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1620 /* if output time reached then transcode raw format,
1621 encode packets and output them */
1622 if (start_time == 0 || ist->pts >= start_time)
1624 while (frame_available) {
1625 AVRational ist_pts_tb;
1626 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1627 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1629 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1631 for(i=0;i<nb_ostreams;i++) {
1635 if (ost->source_index == ist_index) {
1636 os = output_files[ost->file_index];
1638 /* set the input output pts pairs */
1639 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1641 if (ost->encoding_needed) {
1642 av_assert0(ist->decoding_needed);
1643 switch(ost->st->codec->codec_type) {
1644 case AVMEDIA_TYPE_AUDIO:
1645 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1647 case AVMEDIA_TYPE_VIDEO:
1649 if (ist->picref->video)
1650 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1652 do_video_out(os, ost, ist, &picture, &frame_size);
1653 if (vstats_filename && frame_size)
1654 do_video_stats(os, ost, frame_size);
1656 case AVMEDIA_TYPE_SUBTITLE:
1657 do_subtitle_out(os, ost, ist, &subtitle,
1664 AVFrame avframe; //FIXME/XXX remove this
1666 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1668 av_init_packet(&opkt);
1670 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1673 /* no reencoding needed : output the packet directly */
1674 /* force the input stream PTS */
1676 avcodec_get_frame_defaults(&avframe);
1677 ost->st->codec->coded_frame= &avframe;
1678 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1680 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1681 audio_size += data_size;
1682 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1683 video_size += data_size;
1687 opkt.stream_index= ost->index;
1688 if(pkt->pts != AV_NOPTS_VALUE)
1689 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1691 opkt.pts= AV_NOPTS_VALUE;
1693 if (pkt->dts == AV_NOPTS_VALUE)
1694 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1696 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1697 opkt.dts -= ost_tb_start_time;
1699 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1700 opkt.flags= pkt->flags;
1702 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1703 if( ost->st->codec->codec_id != CODEC_ID_H264
1704 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1705 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1707 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1708 opkt.destruct= av_destruct_packet;
1710 opkt.data = data_buf;
1711 opkt.size = data_size;
1714 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1715 ost->st->codec->frame_number++;
1716 ost->frame_number++;
1717 av_free_packet(&opkt);
1723 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1724 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1726 avfilter_unref_buffer(ist->picref);
1729 av_free(buffer_to_free);
1730 /* XXX: allocate the subtitles in the codec ? */
1731 if (subtitle_to_free) {
1732 if (subtitle_to_free->rects != NULL) {
1733 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1734 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1735 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1736 av_freep(&subtitle_to_free->rects[i]);
1738 av_freep(&subtitle_to_free->rects);
1740 subtitle_to_free->num_rects = 0;
1741 subtitle_to_free = NULL;
1748 for(i=0;i<nb_ostreams;i++) {
1750 if (ost->source_index == ist_index) {
1751 AVCodecContext *enc= ost->st->codec;
1752 os = output_files[ost->file_index];
1754 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1756 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1759 if (ost->encoding_needed) {
1763 av_init_packet(&pkt);
1764 pkt.stream_index= ost->index;
1766 switch(ost->st->codec->codec_type) {
1767 case AVMEDIA_TYPE_AUDIO:
1768 fifo_bytes = av_fifo_size(ost->fifo);
1770 /* encode any samples remaining in fifo */
1771 if (fifo_bytes > 0) {
1772 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1773 int fs_tmp = enc->frame_size;
1775 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1776 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1777 enc->frame_size = fifo_bytes / (osize * enc->channels);
1779 int frame_bytes = enc->frame_size*osize*enc->channels;
1780 if (allocated_audio_buf_size < frame_bytes)
1782 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1785 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1786 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1787 ost->st->time_base.num, enc->sample_rate);
1788 enc->frame_size = fs_tmp;
1791 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1794 fprintf(stderr, "Audio encoding failed\n");
1798 pkt.flags |= AV_PKT_FLAG_KEY;
1800 case AVMEDIA_TYPE_VIDEO:
1801 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1803 fprintf(stderr, "Video encoding failed\n");
1807 if(enc->coded_frame && enc->coded_frame->key_frame)
1808 pkt.flags |= AV_PKT_FLAG_KEY;
1809 if (ost->logfile && enc->stats_out) {
1810 fprintf(ost->logfile, "%s", enc->stats_out);
1819 pkt.data= bit_buffer;
1821 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1822 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1823 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1835 static void print_sdp(AVFormatContext **avc, int n)
1839 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1840 printf("SDP:\n%s\n", sdp);
1844 static int copy_chapters(int infile, int outfile)
1846 AVFormatContext *is = input_files[infile];
1847 AVFormatContext *os = output_files[outfile];
1850 for (i = 0; i < is->nb_chapters; i++) {
1851 AVChapter *in_ch = is->chapters[i], *out_ch;
1852 AVMetadataTag *t = NULL;
1853 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1854 AV_TIME_BASE_Q, in_ch->time_base);
1855 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1856 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1859 if (in_ch->end < ts_off)
1861 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1864 out_ch = av_mallocz(sizeof(AVChapter));
1866 return AVERROR(ENOMEM);
1868 out_ch->id = in_ch->id;
1869 out_ch->time_base = in_ch->time_base;
1870 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1871 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1873 if (metadata_chapters_autocopy)
1874 while ((t = av_metadata_get(in_ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
1875 av_metadata_set2(&out_ch->metadata, t->key, t->value, 0);
1878 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1880 return AVERROR(ENOMEM);
1881 os->chapters[os->nb_chapters - 1] = out_ch;
1886 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1887 AVCodecContext *avctx)
1893 for (p = kf; *p; p++)
1896 ost->forced_kf_count = n;
1897 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1898 if (!ost->forced_kf_pts) {
1899 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1902 for (i = 0; i < n; i++) {
1903 p = i ? strchr(p, ',') + 1 : kf;
1904 t = parse_time_or_die("force_key_frames", p, 1);
1905 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1910 * The following code is the main loop of the file converter
1912 static int transcode(AVFormatContext **output_files,
1913 int nb_output_files,
1914 AVFormatContext **input_files,
1916 AVStreamMap *stream_maps, int nb_stream_maps)
1918 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1919 AVFormatContext *is, *os;
1920 AVCodecContext *codec, *icodec;
1921 AVOutputStream *ost, **ost_table = NULL;
1922 AVInputStream *ist, **ist_table = NULL;
1923 AVInputFile *file_table;
1927 uint8_t no_packet[MAX_FILES]={0};
1928 int no_packet_count=0;
1930 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1934 /* input stream init */
1936 for(i=0;i<nb_input_files;i++) {
1937 is = input_files[i];
1938 file_table[i].ist_index = j;
1939 file_table[i].nb_streams = is->nb_streams;
1940 j += is->nb_streams;
1944 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1948 for(i=0;i<nb_istreams;i++) {
1949 ist = av_mallocz(sizeof(AVInputStream));
1955 for(i=0;i<nb_input_files;i++) {
1956 is = input_files[i];
1957 for(k=0;k<is->nb_streams;k++) {
1958 ist = ist_table[j++];
1959 ist->st = is->streams[k];
1960 ist->file_index = i;
1962 ist->discard = 1; /* the stream is discarded by default
1966 ist->start = av_gettime();
1971 /* output stream init */
1973 for(i=0;i<nb_output_files;i++) {
1974 os = output_files[i];
1975 if (!os->nb_streams) {
1976 dump_format(output_files[i], i, output_files[i]->filename, 1);
1977 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1978 ret = AVERROR(EINVAL);
1981 nb_ostreams += os->nb_streams;
1983 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1984 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1985 ret = AVERROR(EINVAL);
1989 /* Sanity check the mapping args -- do the input files & streams exist? */
1990 for(i=0;i<nb_stream_maps;i++) {
1991 int fi = stream_maps[i].file_index;
1992 int si = stream_maps[i].stream_index;
1994 if (fi < 0 || fi > nb_input_files - 1 ||
1995 si < 0 || si > file_table[fi].nb_streams - 1) {
1996 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1997 ret = AVERROR(EINVAL);
2000 fi = stream_maps[i].sync_file_index;
2001 si = stream_maps[i].sync_stream_index;
2002 if (fi < 0 || fi > nb_input_files - 1 ||
2003 si < 0 || si > file_table[fi].nb_streams - 1) {
2004 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2005 ret = AVERROR(EINVAL);
2010 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2014 for(k=0;k<nb_output_files;k++) {
2015 os = output_files[k];
2016 for(i=0;i<os->nb_streams;i++,n++) {
2018 ost = ost_table[n] = output_streams_for_file[k][i];
2019 ost->st = os->streams[i];
2020 if (nb_stream_maps > 0) {
2021 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2022 stream_maps[n].stream_index;
2024 /* Sanity check that the stream types match */
2025 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2026 int i= ost->file_index;
2027 dump_format(output_files[i], i, output_files[i]->filename, 1);
2028 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2029 stream_maps[n].file_index, stream_maps[n].stream_index,
2030 ost->file_index, ost->index);
2035 int best_nb_frames=-1;
2036 /* get corresponding input stream index : we select the first one with the right type */
2038 for(j=0;j<nb_istreams;j++) {
2043 AVFormatContext *f= input_files[ ist->file_index ];
2045 for(pi=0; pi<f->nb_programs; pi++){
2046 AVProgram *p= f->programs[pi];
2047 if(p->id == opt_programid)
2048 for(si=0; si<p->nb_stream_indexes; si++){
2049 if(f->streams[ p->stream_index[si] ] == ist->st)
2054 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2055 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2056 if(best_nb_frames < ist->st->codec_info_nb_frames){
2057 best_nb_frames= ist->st->codec_info_nb_frames;
2058 ost->source_index = j;
2065 if(! opt_programid) {
2066 /* try again and reuse existing stream */
2067 for(j=0;j<nb_istreams;j++) {
2069 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2070 && ist->st->discard != AVDISCARD_ALL) {
2071 ost->source_index = j;
2077 int i= ost->file_index;
2078 dump_format(output_files[i], i, output_files[i]->filename, 1);
2079 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2080 ost->file_index, ost->index);
2085 ist = ist_table[ost->source_index];
2087 ost->sync_ist = (nb_stream_maps > 0) ?
2088 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2089 stream_maps[n].sync_stream_index] : ist;
2093 /* for each output stream, we compute the right encoding parameters */
2094 for(i=0;i<nb_ostreams;i++) {
2095 AVMetadataTag *t = NULL;
2097 os = output_files[ost->file_index];
2098 ist = ist_table[ost->source_index];
2100 codec = ost->st->codec;
2101 icodec = ist->st->codec;
2103 if (metadata_streams_autocopy)
2104 while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
2105 av_metadata_set2(&ost->st->metadata, t->key, t->value, AV_METADATA_DONT_OVERWRITE);
2108 ost->st->disposition = ist->st->disposition;
2109 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2110 codec->chroma_sample_location = icodec->chroma_sample_location;
2112 if (ost->st->stream_copy) {
2113 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2115 if (extra_size > INT_MAX)
2118 /* if stream_copy is selected, no need to decode or encode */
2119 codec->codec_id = icodec->codec_id;
2120 codec->codec_type = icodec->codec_type;
2122 if(!codec->codec_tag){
2123 if( !os->oformat->codec_tag
2124 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2125 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2126 codec->codec_tag = icodec->codec_tag;
2129 codec->bit_rate = icodec->bit_rate;
2130 codec->rc_max_rate = icodec->rc_max_rate;
2131 codec->rc_buffer_size = icodec->rc_buffer_size;
2132 codec->extradata= av_mallocz(extra_size);
2133 if (!codec->extradata)
2135 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2136 codec->extradata_size= icodec->extradata_size;
2137 if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
2138 codec->time_base = icodec->time_base;
2139 codec->time_base.num *= icodec->ticks_per_frame;
2140 av_reduce(&codec->time_base.num, &codec->time_base.den,
2141 codec->time_base.num, codec->time_base.den, INT_MAX);
2143 codec->time_base = ist->st->time_base;
2144 switch(codec->codec_type) {
2145 case AVMEDIA_TYPE_AUDIO:
2146 if(audio_volume != 256) {
2147 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2150 codec->channel_layout = icodec->channel_layout;
2151 codec->sample_rate = icodec->sample_rate;
2152 codec->channels = icodec->channels;
2153 codec->frame_size = icodec->frame_size;
2154 codec->block_align= icodec->block_align;
2155 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2156 codec->block_align= 0;
2157 if(codec->codec_id == CODEC_ID_AC3)
2158 codec->block_align= 0;
2160 case AVMEDIA_TYPE_VIDEO:
2161 codec->pix_fmt = icodec->pix_fmt;
2162 codec->width = icodec->width;
2163 codec->height = icodec->height;
2164 codec->has_b_frames = icodec->has_b_frames;
2166 case AVMEDIA_TYPE_SUBTITLE:
2167 codec->width = icodec->width;
2168 codec->height = icodec->height;
2174 switch(codec->codec_type) {
2175 case AVMEDIA_TYPE_AUDIO:
2176 ost->fifo= av_fifo_alloc(1024);
2179 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2180 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2181 icodec->request_channels = codec->channels;
2182 ist->decoding_needed = 1;
2183 ost->encoding_needed = 1;
2185 case AVMEDIA_TYPE_VIDEO:
2186 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2187 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2190 ost->video_resample = (codec->width != icodec->width ||
2191 codec->height != icodec->height ||
2192 (codec->pix_fmt != icodec->pix_fmt));
2193 if (ost->video_resample) {
2194 avcodec_get_frame_defaults(&ost->pict_tmp);
2195 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2196 codec->width, codec->height)) {
2197 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2200 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2201 ost->img_resample_ctx = sws_getContext(
2208 sws_flags, NULL, NULL, NULL);
2209 if (ost->img_resample_ctx == NULL) {
2210 fprintf(stderr, "Cannot get resampling context\n");
2214 #if !CONFIG_AVFILTER
2215 ost->original_height = icodec->height;
2216 ost->original_width = icodec->width;
2218 codec->bits_per_raw_sample= 0;
2220 ost->resample_height = icodec->height;
2221 ost->resample_width = icodec->width;
2222 ost->resample_pix_fmt= icodec->pix_fmt;
2223 ost->encoding_needed = 1;
2224 ist->decoding_needed = 1;
2227 if (configure_filters(ist, ost)) {
2228 fprintf(stderr, "Error opening filters!\n");
2233 case AVMEDIA_TYPE_SUBTITLE:
2234 ost->encoding_needed = 1;
2235 ist->decoding_needed = 1;
2242 if (ost->encoding_needed &&
2243 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2244 char logfilename[1024];
2247 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2248 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2250 if (codec->flags & CODEC_FLAG_PASS1) {
2251 f = fopen(logfilename, "wb");
2253 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2259 size_t logbuffer_size;
2260 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2261 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2264 codec->stats_in = logbuffer;
2268 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2269 int size= codec->width * codec->height;
2270 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2275 bit_buffer = av_malloc(bit_buffer_size);
2277 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2279 ret = AVERROR(ENOMEM);
2283 /* open each encoder */
2284 for(i=0;i<nb_ostreams;i++) {
2286 if (ost->encoding_needed) {
2287 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2288 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2290 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2292 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2293 ost->st->codec->codec_id, ost->file_index, ost->index);
2294 ret = AVERROR(EINVAL);
2297 if (dec->subtitle_header) {
2298 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2299 if (!ost->st->codec->subtitle_header) {
2300 ret = AVERROR(ENOMEM);
2303 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2304 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2306 if (avcodec_open(ost->st->codec, codec) < 0) {
2307 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2308 ost->file_index, ost->index);
2309 ret = AVERROR(EINVAL);
2312 extra_size += ost->st->codec->extradata_size;
2316 /* open each decoder */
2317 for(i=0;i<nb_istreams;i++) {
2319 if (ist->decoding_needed) {
2320 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2322 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2324 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2325 ist->st->codec->codec_id, ist->file_index, ist->index);
2326 ret = AVERROR(EINVAL);
2329 if (avcodec_open(ist->st->codec, codec) < 0) {
2330 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2331 ist->file_index, ist->index);
2332 ret = AVERROR(EINVAL);
2335 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2336 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2341 for(i=0;i<nb_istreams;i++) {
2345 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2346 ist->next_pts = AV_NOPTS_VALUE;
2347 init_pts_correction(&ist->pts_ctx);
2351 /* set meta data information from input file if required */
2352 for (i=0;i<nb_meta_data_maps;i++) {
2353 AVFormatContext *files[2];
2354 AVMetadata **meta[2];
2355 AVMetadataTag *mtag;
2358 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2359 if ((index) < 0 || (index) >= (nb_elems)) {\
2360 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2362 ret = AVERROR(EINVAL);\
2366 int out_file_index = meta_data_maps[i][0].file;
2367 int in_file_index = meta_data_maps[i][1].file;
2368 if (in_file_index < 0 || out_file_index < 0)
2370 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2371 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2373 files[0] = output_files[out_file_index];
2374 files[1] = input_files[in_file_index];
2376 for (j = 0; j < 2; j++) {
2377 AVMetaDataMap *map = &meta_data_maps[i][j];
2379 switch (map->type) {
2381 meta[j] = &files[j]->metadata;
2384 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2385 meta[j] = &files[j]->streams[map->index]->metadata;
2388 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2389 meta[j] = &files[j]->chapters[map->index]->metadata;
2392 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2393 meta[j] = &files[j]->programs[map->index]->metadata;
2399 while((mtag=av_metadata_get(*meta[1], "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2400 av_metadata_set2(meta[0], mtag->key, mtag->value, AV_METADATA_DONT_OVERWRITE);
2403 /* copy chapters according to chapter maps */
2404 for (i = 0; i < nb_chapter_maps; i++) {
2405 int infile = chapter_maps[i].in_file;
2406 int outfile = chapter_maps[i].out_file;
2408 if (infile < 0 || outfile < 0)
2410 if (infile >= nb_input_files) {
2411 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2412 ret = AVERROR(EINVAL);
2415 if (outfile >= nb_output_files) {
2416 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2417 ret = AVERROR(EINVAL);
2420 copy_chapters(infile, outfile);
2423 /* copy chapters from the first input file that has them*/
2424 if (!nb_chapter_maps)
2425 for (i = 0; i < nb_input_files; i++) {
2426 if (!input_files[i]->nb_chapters)
2429 for (j = 0; j < nb_output_files; j++)
2430 if ((ret = copy_chapters(i, j)) < 0)
2435 /* open files and write file headers */
2436 for(i=0;i<nb_output_files;i++) {
2437 os = output_files[i];
2438 if (av_write_header(os) < 0) {
2439 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2440 ret = AVERROR(EINVAL);
2443 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2449 /* dump the file output parameters - cannot be done before in case
2451 for(i=0;i<nb_output_files;i++) {
2452 dump_format(output_files[i], i, output_files[i]->filename, 1);
2455 /* dump the stream mapping */
2457 fprintf(stderr, "Stream mapping:\n");
2458 for(i=0;i<nb_ostreams;i++) {
2460 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2461 ist_table[ost->source_index]->file_index,
2462 ist_table[ost->source_index]->index,
2465 if (ost->sync_ist != ist_table[ost->source_index])
2466 fprintf(stderr, " [sync #%d.%d]",
2467 ost->sync_ist->file_index,
2468 ost->sync_ist->index);
2469 fprintf(stderr, "\n");
2474 fprintf(stderr, "%s\n", error);
2479 print_sdp(output_files, nb_output_files);
2482 if (!using_stdin && verbose >= 0) {
2483 fprintf(stderr, "Press [q] to stop encoding\n");
2484 url_set_interrupt_cb(decode_interrupt_cb);
2488 timer_start = av_gettime();
2490 for(; received_sigterm == 0;) {
2491 int file_index, ist_index;
2499 /* if 'q' pressed, exits */
2503 /* read_key() returns 0 on EOF */
2509 /* select the stream that we must read now by looking at the
2510 smallest output pts */
2512 for(i=0;i<nb_ostreams;i++) {
2515 os = output_files[ost->file_index];
2516 ist = ist_table[ost->source_index];
2517 if(ist->is_past_recording_time || no_packet[ist->file_index])
2519 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2520 ipts = (double)ist->pts;
2521 if (!file_table[ist->file_index].eof_reached){
2522 if(ipts < ipts_min) {
2524 if(input_sync ) file_index = ist->file_index;
2526 if(opts < opts_min) {
2528 if(!input_sync) file_index = ist->file_index;
2531 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2536 /* if none, if is finished */
2537 if (file_index < 0) {
2538 if(no_packet_count){
2540 memset(no_packet, 0, sizeof(no_packet));
2547 /* finish if limit size exhausted */
2548 if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb))
2551 /* read a frame from it and output it in the fifo */
2552 is = input_files[file_index];
2553 ret= av_read_frame(is, &pkt);
2554 if(ret == AVERROR(EAGAIN)){
2555 no_packet[file_index]=1;
2560 file_table[file_index].eof_reached = 1;
2568 memset(no_packet, 0, sizeof(no_packet));
2571 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2573 /* the following test is needed in case new streams appear
2574 dynamically in stream : we ignore them */
2575 if (pkt.stream_index >= file_table[file_index].nb_streams)
2576 goto discard_packet;
2577 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2578 ist = ist_table[ist_index];
2580 goto discard_packet;
2582 if (pkt.dts != AV_NOPTS_VALUE)
2583 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2584 if (pkt.pts != AV_NOPTS_VALUE)
2585 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2587 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2588 && input_files_ts_scale[file_index][pkt.stream_index]){
2589 if(pkt.pts != AV_NOPTS_VALUE)
2590 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2591 if(pkt.dts != AV_NOPTS_VALUE)
2592 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2595 // 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);
2596 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2597 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2598 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2599 int64_t delta= pkt_dts - ist->next_pts;
2600 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2601 input_files_ts_offset[ist->file_index]-= delta;
2603 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2604 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2605 if(pkt.pts != AV_NOPTS_VALUE)
2606 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2610 /* finish if recording time exhausted */
2611 if (recording_time != INT64_MAX &&
2612 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2613 ist->is_past_recording_time = 1;
2614 goto discard_packet;
2617 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2618 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2621 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2622 ist->file_index, ist->index);
2625 av_free_packet(&pkt);
2630 av_free_packet(&pkt);
2632 /* dump report by using the output first video and audio streams */
2633 print_report(output_files, ost_table, nb_ostreams, 0);
2636 /* at the end of stream, we must flush the decoder buffers */
2637 for(i=0;i<nb_istreams;i++) {
2639 if (ist->decoding_needed) {
2640 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2646 /* write the trailer if needed and close file */
2647 for(i=0;i<nb_output_files;i++) {
2648 os = output_files[i];
2649 av_write_trailer(os);
2652 /* dump report by using the first video and audio streams */
2653 print_report(output_files, ost_table, nb_ostreams, 1);
2655 /* close each encoder */
2656 for(i=0;i<nb_ostreams;i++) {
2658 if (ost->encoding_needed) {
2659 av_freep(&ost->st->codec->stats_in);
2660 avcodec_close(ost->st->codec);
2664 /* close each decoder */
2665 for(i=0;i<nb_istreams;i++) {
2667 if (ist->decoding_needed) {
2668 avcodec_close(ist->st->codec);
2673 avfilter_graph_free(graph);
2682 av_freep(&bit_buffer);
2683 av_free(file_table);
2686 for(i=0;i<nb_istreams;i++) {
2693 for(i=0;i<nb_ostreams;i++) {
2696 if (ost->st->stream_copy)
2697 av_freep(&ost->st->codec->extradata);
2699 fclose(ost->logfile);
2700 ost->logfile = NULL;
2702 av_fifo_free(ost->fifo); /* works even if fifo is not
2703 initialized but set to zero */
2704 av_freep(&ost->st->codec->subtitle_header);
2705 av_free(ost->pict_tmp.data[0]);
2706 av_free(ost->forced_kf_pts);
2707 if (ost->video_resample)
2708 sws_freeContext(ost->img_resample_ctx);
2710 audio_resample_close(ost->resample);
2711 if (ost->reformat_ctx)
2712 av_audio_convert_free(ost->reformat_ctx);
2721 static void opt_format(const char *arg)
2723 last_asked_format = arg;
2726 static void opt_video_rc_override_string(const char *arg)
2728 video_rc_override_string = arg;
2731 static int opt_me_threshold(const char *opt, const char *arg)
2733 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2737 static int opt_verbose(const char *opt, const char *arg)
2739 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2743 static int opt_frame_rate(const char *opt, const char *arg)
2745 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2746 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2752 static int opt_bitrate(const char *opt, const char *arg)
2754 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2756 opt_default(opt, arg);
2758 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2759 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2764 static int opt_frame_crop(const char *opt, const char *arg)
2766 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2767 return AVERROR(EINVAL);
2770 static void opt_frame_size(const char *arg)
2772 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2773 fprintf(stderr, "Incorrect frame size\n");
2778 static int opt_pad(const char *opt, const char *arg) {
2779 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2783 static void opt_frame_pix_fmt(const char *arg)
2785 if (strcmp(arg, "list")) {
2786 frame_pix_fmt = av_get_pix_fmt(arg);
2787 if (frame_pix_fmt == PIX_FMT_NONE) {
2788 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2797 static void opt_frame_aspect_ratio(const char *arg)
2804 p = strchr(arg, ':');
2806 x = strtol(arg, &end, 10);
2808 y = strtol(end+1, &end, 10);
2810 ar = (double)x / (double)y;
2812 ar = strtod(arg, NULL);
2815 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2818 frame_aspect_ratio = ar;
2821 static int opt_metadata(const char *opt, const char *arg)
2823 char *mid= strchr(arg, '=');
2826 fprintf(stderr, "Missing =\n");
2831 av_metadata_set2(&metadata, arg, mid, 0);
2836 static void opt_qscale(const char *arg)
2838 video_qscale = atof(arg);
2839 if (video_qscale <= 0 ||
2840 video_qscale > 255) {
2841 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2846 static void opt_top_field_first(const char *arg)
2848 top_field_first= atoi(arg);
2851 static int opt_thread_count(const char *opt, const char *arg)
2853 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2856 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2861 static void opt_audio_sample_fmt(const char *arg)
2863 if (strcmp(arg, "list"))
2864 audio_sample_fmt = av_get_sample_fmt(arg);
2866 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2871 static int opt_audio_rate(const char *opt, const char *arg)
2873 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2877 static int opt_audio_channels(const char *opt, const char *arg)
2879 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2883 static void opt_video_channel(const char *arg)
2885 video_channel = strtol(arg, NULL, 0);
2888 static void opt_video_standard(const char *arg)
2890 video_standard = av_strdup(arg);
2893 static void opt_codec(int *pstream_copy, char **pcodec_name,
2894 int codec_type, const char *arg)
2896 av_freep(pcodec_name);
2897 if (!strcmp(arg, "copy")) {
2900 *pcodec_name = av_strdup(arg);
2904 static void opt_audio_codec(const char *arg)
2906 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2909 static void opt_video_codec(const char *arg)
2911 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2914 static void opt_subtitle_codec(const char *arg)
2916 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2919 static int opt_codec_tag(const char *opt, const char *arg)
2922 uint32_t *codec_tag;
2924 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2925 !strcmp(opt, "vtag") ? &video_codec_tag :
2926 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2930 *codec_tag = strtol(arg, &tail, 0);
2932 *codec_tag = AV_RL32(arg);
2937 static void opt_map(const char *arg)
2942 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2943 m = &stream_maps[nb_stream_maps-1];
2945 m->file_index = strtol(arg, &p, 0);
2949 m->stream_index = strtol(p, &p, 0);
2952 m->sync_file_index = strtol(p, &p, 0);
2955 m->sync_stream_index = strtol(p, &p, 0);
2957 m->sync_file_index = m->file_index;
2958 m->sync_stream_index = m->stream_index;
2962 static void parse_meta_type(const char *arg, char *type, int *index, char **endptr)
2973 *index = strtol(++arg, endptr, 0);
2976 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2983 static void opt_map_meta_data(const char *arg)
2985 AVMetaDataMap *m, *m1;
2988 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2989 &nb_meta_data_maps, nb_meta_data_maps + 1);
2991 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2992 m->file = strtol(arg, &p, 0);
2993 parse_meta_type(p, &m->type, &m->index, &p);
2997 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
2998 m1->file = strtol(p, &p, 0);
2999 parse_meta_type(p, &m1->type, &m1->index, &p);
3001 if (m->type == 's' || m1->type == 's')
3002 metadata_streams_autocopy = 0;
3003 if (m->type == 'c' || m1->type == 'c')
3004 metadata_chapters_autocopy = 0;
3007 static void opt_map_chapters(const char *arg)
3012 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3013 nb_chapter_maps + 1);
3014 c = &chapter_maps[nb_chapter_maps - 1];
3015 c->out_file = strtol(arg, &p, 0);
3019 c->in_file = strtol(p, &p, 0);
3022 static void opt_input_ts_scale(const char *arg)
3024 unsigned int stream;
3028 stream = strtol(arg, &p, 0);
3031 scale= strtod(p, &p);
3033 if(stream >= MAX_STREAMS)
3036 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);
3037 input_files_ts_scale[nb_input_files][stream]= scale;
3040 static int opt_recording_time(const char *opt, const char *arg)
3042 recording_time = parse_time_or_die(opt, arg, 1);
3046 static int opt_start_time(const char *opt, const char *arg)
3048 start_time = parse_time_or_die(opt, arg, 1);
3052 static int opt_recording_timestamp(const char *opt, const char *arg)
3054 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3058 static int opt_input_ts_offset(const char *opt, const char *arg)
3060 input_ts_offset = parse_time_or_die(opt, arg, 1);
3064 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3066 const char *codec_string = encoder ? "encoder" : "decoder";
3070 return CODEC_ID_NONE;
3072 avcodec_find_encoder_by_name(name) :
3073 avcodec_find_decoder_by_name(name);
3075 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3078 if(codec->type != type) {
3079 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3082 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3083 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3084 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3085 "results.\nAdd '-strict experimental' if you want to use it.\n",
3086 codec_string, codec->name);
3088 avcodec_find_encoder(codec->id) :
3089 avcodec_find_decoder(codec->id);
3090 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3091 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3092 codec_string, codec->name);
3098 static void opt_input_file(const char *filename)
3100 AVFormatContext *ic;
3101 AVFormatParameters params, *ap = ¶ms;
3102 AVInputFormat *file_iformat = NULL;
3103 int err, i, ret, rfps, rfps_base;
3106 if (last_asked_format) {
3107 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3108 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3111 last_asked_format = NULL;
3114 if (!strcmp(filename, "-"))
3117 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3118 !strcmp(filename, "/dev/stdin");
3120 /* get default parameters from command line */
3121 ic = avformat_alloc_context();
3123 print_error(filename, AVERROR(ENOMEM));
3127 memset(ap, 0, sizeof(*ap));
3128 ap->prealloced_context = 1;
3129 ap->sample_rate = audio_sample_rate;
3130 ap->channels = audio_channels;
3131 ap->time_base.den = frame_rate.num;
3132 ap->time_base.num = frame_rate.den;
3133 ap->width = frame_width;
3134 ap->height = frame_height;
3135 ap->pix_fmt = frame_pix_fmt;
3136 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3137 ap->channel = video_channel;
3138 ap->standard = video_standard;
3140 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3142 ic->video_codec_id =
3143 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3144 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3145 ic->audio_codec_id =
3146 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3147 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3148 ic->subtitle_codec_id=
3149 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3150 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3151 ic->flags |= AVFMT_FLAG_NONBLOCK;
3153 /* open the input file with generic libav function */
3154 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3156 print_error(filename, err);
3162 for(i=0; i<ic->nb_streams; i++){
3163 ic->streams[i]->discard= AVDISCARD_ALL;
3165 for(i=0; i<ic->nb_programs; i++){
3166 AVProgram *p= ic->programs[i];
3167 if(p->id != opt_programid){
3168 p->discard = AVDISCARD_ALL;
3171 for(j=0; j<p->nb_stream_indexes; j++){
3172 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3177 fprintf(stderr, "Specified program id not found\n");
3183 ic->loop_input = loop_input;
3185 /* If not enough info to get the stream parameters, we decode the
3186 first frames to get it. (used in mpeg case for example) */
3187 ret = av_find_stream_info(ic);
3188 if (ret < 0 && verbose >= 0) {
3189 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3190 av_close_input_file(ic);
3194 timestamp = start_time;
3195 /* add the stream start time */
3196 if (ic->start_time != AV_NOPTS_VALUE)
3197 timestamp += ic->start_time;
3199 /* if seeking requested, we execute it */
3200 if (start_time != 0) {
3201 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3203 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3204 filename, (double)timestamp / AV_TIME_BASE);
3206 /* reset seek info */
3210 /* update the current parameters so that they match the one of the input stream */
3211 for(i=0;i<ic->nb_streams;i++) {
3212 AVStream *st = ic->streams[i];
3213 AVCodecContext *dec = st->codec;
3214 avcodec_thread_init(dec, thread_count);
3215 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3216 switch (dec->codec_type) {
3217 case AVMEDIA_TYPE_AUDIO:
3218 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3219 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]);
3220 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3221 channel_layout = dec->channel_layout;
3222 audio_channels = dec->channels;
3223 audio_sample_rate = dec->sample_rate;
3224 audio_sample_fmt = dec->sample_fmt;
3226 st->discard= AVDISCARD_ALL;
3227 /* Note that av_find_stream_info can add more streams, and we
3228 * currently have no chance of setting up lowres decoding
3229 * early enough for them. */
3231 audio_sample_rate >>= dec->lowres;
3233 case AVMEDIA_TYPE_VIDEO:
3234 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3235 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]);
3236 frame_height = dec->height;
3237 frame_width = dec->width;
3238 if(ic->streams[i]->sample_aspect_ratio.num)
3239 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3241 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3242 frame_aspect_ratio *= (float) dec->width / dec->height;
3243 frame_pix_fmt = dec->pix_fmt;
3244 rfps = ic->streams[i]->r_frame_rate.num;
3245 rfps_base = ic->streams[i]->r_frame_rate.den;
3247 dec->flags |= CODEC_FLAG_EMU_EDGE;
3248 frame_height >>= dec->lowres;
3249 frame_width >>= dec->lowres;
3252 dec->debug |= FF_DEBUG_MV;
3254 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3257 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3258 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3260 (float)rfps / rfps_base, rfps, rfps_base);
3262 /* update the current frame rate to match the stream frame rate */
3263 frame_rate.num = rfps;
3264 frame_rate.den = rfps_base;
3267 st->discard= AVDISCARD_ALL;
3268 else if(video_discard)
3269 st->discard= video_discard;
3271 case AVMEDIA_TYPE_DATA:
3273 case AVMEDIA_TYPE_SUBTITLE:
3274 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3275 if(subtitle_disable)
3276 st->discard = AVDISCARD_ALL;
3278 case AVMEDIA_TYPE_ATTACHMENT:
3279 case AVMEDIA_TYPE_UNKNOWN:
3286 input_files[nb_input_files] = ic;
3287 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3288 /* dump the file content */
3290 dump_format(ic, nb_input_files, filename, 0);
3296 av_freep(&video_codec_name);
3297 av_freep(&audio_codec_name);
3298 av_freep(&subtitle_codec_name);
3301 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3302 int *has_subtitle_ptr)
3304 int has_video, has_audio, has_subtitle, i, j;
3305 AVFormatContext *ic;
3310 for(j=0;j<nb_input_files;j++) {
3311 ic = input_files[j];
3312 for(i=0;i<ic->nb_streams;i++) {
3313 AVCodecContext *enc = ic->streams[i]->codec;
3314 switch(enc->codec_type) {
3315 case AVMEDIA_TYPE_AUDIO:
3318 case AVMEDIA_TYPE_VIDEO:
3321 case AVMEDIA_TYPE_SUBTITLE:
3324 case AVMEDIA_TYPE_DATA:
3325 case AVMEDIA_TYPE_ATTACHMENT:
3326 case AVMEDIA_TYPE_UNKNOWN:
3333 *has_video_ptr = has_video;
3334 *has_audio_ptr = has_audio;
3335 *has_subtitle_ptr = has_subtitle;
3338 static void new_video_stream(AVFormatContext *oc, int file_idx)
3341 AVOutputStream *ost;
3342 AVCodecContext *video_enc;
3343 enum CodecID codec_id;
3344 AVCodec *codec= NULL;
3346 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3348 fprintf(stderr, "Could not alloc stream\n");
3351 ost = new_output_stream(oc, file_idx);
3353 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3354 if(!video_stream_copy){
3355 if (video_codec_name) {
3356 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3357 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3358 codec = avcodec_find_encoder_by_name(video_codec_name);
3359 output_codecs[nb_output_codecs-1] = codec;
3361 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3362 codec = avcodec_find_encoder(codec_id);
3366 avcodec_get_context_defaults3(st->codec, codec);
3367 ost->bitstream_filters = video_bitstream_filters;
3368 video_bitstream_filters= NULL;
3370 avcodec_thread_init(st->codec, thread_count);
3372 video_enc = st->codec;
3375 video_enc->codec_tag= video_codec_tag;
3377 if( (video_global_header&1)
3378 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3379 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3380 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3382 if(video_global_header&2){
3383 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3384 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3387 if (video_stream_copy) {
3388 st->stream_copy = 1;
3389 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3390 video_enc->sample_aspect_ratio =
3391 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3395 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3397 video_enc->codec_id = codec_id;
3398 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3400 if (codec && codec->supported_framerates && !force_fps)
3401 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3402 video_enc->time_base.den = fps.num;
3403 video_enc->time_base.num = fps.den;
3405 video_enc->width = frame_width;
3406 video_enc->height = frame_height;
3407 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3408 video_enc->pix_fmt = frame_pix_fmt;
3409 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3411 choose_pixel_fmt(st, codec);
3414 video_enc->gop_size = 0;
3415 if (video_qscale || same_quality) {
3416 video_enc->flags |= CODEC_FLAG_QSCALE;
3417 video_enc->global_quality=
3418 st->quality = FF_QP2LAMBDA * video_qscale;
3422 video_enc->intra_matrix = intra_matrix;
3424 video_enc->inter_matrix = inter_matrix;
3426 p= video_rc_override_string;
3429 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3431 fprintf(stderr, "error parsing rc_override\n");
3434 video_enc->rc_override=
3435 av_realloc(video_enc->rc_override,
3436 sizeof(RcOverride)*(i+1));
3437 video_enc->rc_override[i].start_frame= start;
3438 video_enc->rc_override[i].end_frame = end;
3440 video_enc->rc_override[i].qscale= q;
3441 video_enc->rc_override[i].quality_factor= 1.0;
3444 video_enc->rc_override[i].qscale= 0;
3445 video_enc->rc_override[i].quality_factor= -q/100.0;
3450 video_enc->rc_override_count=i;
3451 if (!video_enc->rc_initial_buffer_occupancy)
3452 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3453 video_enc->me_threshold= me_threshold;
3454 video_enc->intra_dc_precision= intra_dc_precision - 8;
3457 video_enc->flags|= CODEC_FLAG_PSNR;
3462 video_enc->flags |= CODEC_FLAG_PASS1;
3464 video_enc->flags |= CODEC_FLAG_PASS2;
3468 if (forced_key_frames)
3469 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3471 if (video_language) {
3472 av_metadata_set2(&st->metadata, "language", video_language, 0);
3473 av_freep(&video_language);
3476 /* reset some key parameters */
3478 av_freep(&video_codec_name);
3479 av_freep(&forced_key_frames);
3480 video_stream_copy = 0;
3481 frame_pix_fmt = PIX_FMT_NONE;
3484 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3487 AVOutputStream *ost;
3488 AVCodec *codec= NULL;
3489 AVCodecContext *audio_enc;
3490 enum CodecID codec_id;
3492 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3494 fprintf(stderr, "Could not alloc stream\n");
3497 ost = new_output_stream(oc, file_idx);
3499 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3500 if(!audio_stream_copy){
3501 if (audio_codec_name) {
3502 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3503 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3504 codec = avcodec_find_encoder_by_name(audio_codec_name);
3505 output_codecs[nb_output_codecs-1] = codec;
3507 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3508 codec = avcodec_find_encoder(codec_id);
3512 avcodec_get_context_defaults3(st->codec, codec);
3514 ost->bitstream_filters = audio_bitstream_filters;
3515 audio_bitstream_filters= NULL;
3517 avcodec_thread_init(st->codec, thread_count);
3519 audio_enc = st->codec;
3520 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3523 audio_enc->codec_tag= audio_codec_tag;
3525 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3526 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3527 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3529 if (audio_stream_copy) {
3530 st->stream_copy = 1;
3531 audio_enc->channels = audio_channels;
3532 audio_enc->sample_rate = audio_sample_rate;
3534 audio_enc->codec_id = codec_id;
3535 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3537 if (audio_qscale > QSCALE_NONE) {
3538 audio_enc->flags |= CODEC_FLAG_QSCALE;
3539 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3541 audio_enc->channels = audio_channels;
3542 audio_enc->sample_fmt = audio_sample_fmt;
3543 audio_enc->sample_rate = audio_sample_rate;
3544 audio_enc->channel_layout = channel_layout;
3545 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3546 audio_enc->channel_layout = 0;
3547 choose_sample_fmt(st, codec);
3548 choose_sample_rate(st, codec);
3550 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3551 if (audio_language) {
3552 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3553 av_freep(&audio_language);
3556 /* reset some key parameters */
3558 av_freep(&audio_codec_name);
3559 audio_stream_copy = 0;
3562 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3565 AVOutputStream *ost;
3566 AVCodec *codec=NULL;
3567 AVCodecContext *subtitle_enc;
3569 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3571 fprintf(stderr, "Could not alloc stream\n");
3574 ost = new_output_stream(oc, file_idx);
3575 subtitle_enc = st->codec;
3576 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3577 if(!subtitle_stream_copy){
3578 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3579 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3580 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3582 avcodec_get_context_defaults3(st->codec, codec);
3584 ost->bitstream_filters = subtitle_bitstream_filters;
3585 subtitle_bitstream_filters= NULL;
3587 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3589 if(subtitle_codec_tag)
3590 subtitle_enc->codec_tag= subtitle_codec_tag;
3592 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3593 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3594 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3596 if (subtitle_stream_copy) {
3597 st->stream_copy = 1;
3599 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3602 if (subtitle_language) {
3603 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3604 av_freep(&subtitle_language);
3607 subtitle_disable = 0;
3608 av_freep(&subtitle_codec_name);
3609 subtitle_stream_copy = 0;
3612 static int opt_new_stream(const char *opt, const char *arg)
3614 AVFormatContext *oc;
3615 int file_idx = nb_output_files - 1;
3616 if (nb_output_files <= 0) {
3617 fprintf(stderr, "At least one output file must be specified\n");
3620 oc = output_files[file_idx];
3622 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3623 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3624 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3629 /* arg format is "output-stream-index:streamid-value". */
3630 static int opt_streamid(const char *opt, const char *arg)
3636 strncpy(idx_str, arg, sizeof(idx_str));
3637 idx_str[sizeof(idx_str)-1] = '\0';
3638 p = strchr(idx_str, ':');
3641 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3646 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3647 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3648 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3652 static void opt_output_file(const char *filename)
3654 AVFormatContext *oc;
3655 int err, use_video, use_audio, use_subtitle;
3656 int input_has_video, input_has_audio, input_has_subtitle;
3657 AVFormatParameters params, *ap = ¶ms;
3658 AVOutputFormat *file_oformat;
3659 AVMetadataTag *tag = NULL;
3661 if (!strcmp(filename, "-"))
3664 oc = avformat_alloc_context();
3666 print_error(filename, AVERROR(ENOMEM));
3670 if (last_asked_format) {
3671 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3672 if (!file_oformat) {
3673 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3676 last_asked_format = NULL;
3678 file_oformat = av_guess_format(NULL, filename, NULL);
3679 if (!file_oformat) {
3680 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3686 oc->oformat = file_oformat;
3687 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3689 if (!strcmp(file_oformat->name, "ffm") &&
3690 av_strstart(filename, "http:", NULL)) {
3691 /* special case for files sent to ffserver: we get the stream
3692 parameters from ffserver */
3693 int err = read_ffserver_streams(oc, filename);
3695 print_error(filename, err);
3699 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3700 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3701 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3703 /* disable if no corresponding type found and at least one
3705 if (nb_input_files > 0) {
3706 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3707 &input_has_subtitle);
3708 if (!input_has_video)
3710 if (!input_has_audio)
3712 if (!input_has_subtitle)
3716 /* manual disable */
3717 if (audio_disable) use_audio = 0;
3718 if (video_disable) use_video = 0;
3719 if (subtitle_disable) use_subtitle = 0;
3721 if (use_video) new_video_stream(oc, nb_output_files);
3722 if (use_audio) new_audio_stream(oc, nb_output_files);
3723 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3725 oc->timestamp = recording_timestamp;
3727 while ((tag = av_metadata_get(metadata, "", tag, AV_METADATA_IGNORE_SUFFIX)))
3728 av_metadata_set2(&oc->metadata, tag->key, tag->value, 0);
3729 av_metadata_free(&metadata);
3732 output_files[nb_output_files++] = oc;
3734 /* check filename in case of an image number is expected */
3735 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3736 if (!av_filename_number_test(oc->filename)) {
3737 print_error(oc->filename, AVERROR_NUMEXPECTED);
3742 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3743 /* test if it already exists to avoid loosing precious files */
3744 if (!file_overwrite &&
3745 (strchr(filename, ':') == NULL ||
3746 filename[1] == ':' ||
3747 av_strstart(filename, "file:", NULL))) {
3748 if (url_exist(filename)) {
3750 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3752 if (!read_yesno()) {
3753 fprintf(stderr, "Not overwriting - exiting\n");
3758 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3765 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3766 print_error(filename, err);
3771 memset(ap, 0, sizeof(*ap));
3772 if (av_set_parameters(oc, ap) < 0) {
3773 fprintf(stderr, "%s: Invalid encoding parameters\n",
3778 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3779 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3780 oc->loop_output = loop_output;
3781 oc->flags |= AVFMT_FLAG_NONBLOCK;
3783 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3785 nb_streamid_map = 0;
3786 av_freep(&forced_key_frames);
3789 /* same option as mencoder */
3790 static void opt_pass(const char *pass_str)
3793 pass = atoi(pass_str);
3794 if (pass != 1 && pass != 2) {
3795 fprintf(stderr, "pass number can be only 1 or 2\n");
3801 static int64_t getutime(void)
3804 struct rusage rusage;
3806 getrusage(RUSAGE_SELF, &rusage);
3807 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3808 #elif HAVE_GETPROCESSTIMES
3810 FILETIME c, e, k, u;
3811 proc = GetCurrentProcess();
3812 GetProcessTimes(proc, &c, &e, &k, &u);
3813 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3815 return av_gettime();
3819 static int64_t getmaxrss(void)
3821 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3822 struct rusage rusage;
3823 getrusage(RUSAGE_SELF, &rusage);
3824 return (int64_t)rusage.ru_maxrss * 1024;
3825 #elif HAVE_GETPROCESSMEMORYINFO
3827 PROCESS_MEMORY_COUNTERS memcounters;
3828 proc = GetCurrentProcess();
3829 memcounters.cb = sizeof(memcounters);
3830 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3831 return memcounters.PeakPagefileUsage;
3837 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3840 const char *p = str;
3847 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3854 static void opt_inter_matrix(const char *arg)
3856 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3857 parse_matrix_coeffs(inter_matrix, arg);
3860 static void opt_intra_matrix(const char *arg)
3862 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3863 parse_matrix_coeffs(intra_matrix, arg);
3866 static void show_usage(void)
3868 printf("Hyper fast Audio and Video encoder\n");
3869 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3873 static void show_help(void)
3875 av_log_set_callback(log_callback_help);
3877 show_help_options(options, "Main options:\n",
3878 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3879 show_help_options(options, "\nAdvanced options:\n",
3880 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3882 show_help_options(options, "\nVideo options:\n",
3883 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3885 show_help_options(options, "\nAdvanced Video options:\n",
3886 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3887 OPT_VIDEO | OPT_EXPERT);
3888 show_help_options(options, "\nAudio options:\n",
3889 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3891 show_help_options(options, "\nAdvanced Audio options:\n",
3892 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3893 OPT_AUDIO | OPT_EXPERT);
3894 show_help_options(options, "\nSubtitle options:\n",
3895 OPT_SUBTITLE | OPT_GRAB,
3897 show_help_options(options, "\nAudio/Video grab options:\n",
3901 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3903 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3905 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3908 static void opt_target(const char *arg)
3910 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3911 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3913 if(!strncmp(arg, "pal-", 4)) {
3916 } else if(!strncmp(arg, "ntsc-", 5)) {
3919 } else if(!strncmp(arg, "film-", 5)) {
3924 /* Calculate FR via float to avoid int overflow */
3925 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3928 } else if((fr == 29970) || (fr == 23976)) {
3931 /* Try to determine PAL/NTSC by peeking in the input files */
3932 if(nb_input_files) {
3934 for(j = 0; j < nb_input_files; j++) {
3935 for(i = 0; i < input_files[j]->nb_streams; i++) {
3936 AVCodecContext *c = input_files[j]->streams[i]->codec;
3937 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3939 fr = c->time_base.den * 1000 / c->time_base.num;
3943 } else if((fr == 29970) || (fr == 23976)) {
3953 if(verbose && norm != UNKNOWN)
3954 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3957 if(norm == UNKNOWN) {
3958 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3959 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3960 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3964 if(!strcmp(arg, "vcd")) {
3966 opt_video_codec("mpeg1video");
3967 opt_audio_codec("mp2");
3970 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3971 opt_frame_rate(NULL, frame_rates[norm]);
3972 opt_default("g", norm == PAL ? "15" : "18");
3974 opt_default("b", "1150000");
3975 opt_default("maxrate", "1150000");
3976 opt_default("minrate", "1150000");
3977 opt_default("bufsize", "327680"); // 40*1024*8;
3979 opt_default("ab", "224000");
3980 audio_sample_rate = 44100;
3983 opt_default("packetsize", "2324");
3984 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3986 /* We have to offset the PTS, so that it is consistent with the SCR.
3987 SCR starts at 36000, but the first two packs contain only padding
3988 and the first pack from the other stream, respectively, may also have
3989 been written before.
3990 So the real data starts at SCR 36000+3*1200. */
3991 mux_preload= (36000+3*1200) / 90000.0; //0.44
3992 } else if(!strcmp(arg, "svcd")) {
3994 opt_video_codec("mpeg2video");
3995 opt_audio_codec("mp2");
3998 opt_frame_size(norm == PAL ? "480x576" : "480x480");
3999 opt_frame_rate(NULL, frame_rates[norm]);
4000 opt_default("g", norm == PAL ? "15" : "18");
4002 opt_default("b", "2040000");
4003 opt_default("maxrate", "2516000");
4004 opt_default("minrate", "0"); //1145000;
4005 opt_default("bufsize", "1835008"); //224*1024*8;
4006 opt_default("flags", "+scan_offset");
4009 opt_default("ab", "224000");
4010 audio_sample_rate = 44100;
4012 opt_default("packetsize", "2324");
4014 } else if(!strcmp(arg, "dvd")) {
4016 opt_video_codec("mpeg2video");
4017 opt_audio_codec("ac3");
4020 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4021 opt_frame_rate(NULL, frame_rates[norm]);
4022 opt_default("g", norm == PAL ? "15" : "18");
4024 opt_default("b", "6000000");
4025 opt_default("maxrate", "9000000");
4026 opt_default("minrate", "0"); //1500000;
4027 opt_default("bufsize", "1835008"); //224*1024*8;
4029 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4030 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4032 opt_default("ab", "448000");
4033 audio_sample_rate = 48000;
4035 } else if(!strncmp(arg, "dv", 2)) {
4039 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4040 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4041 (norm == PAL ? "yuv420p" : "yuv411p"));
4042 opt_frame_rate(NULL, frame_rates[norm]);
4044 audio_sample_rate = 48000;
4048 fprintf(stderr, "Unknown target: %s\n", arg);
4053 static void opt_vstats_file (const char *arg)
4055 av_free (vstats_filename);
4056 vstats_filename=av_strdup (arg);
4059 static void opt_vstats (void)
4062 time_t today2 = time(NULL);
4063 struct tm *today = localtime(&today2);
4065 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4067 opt_vstats_file(filename);
4070 static int opt_bsf(const char *opt, const char *arg)
4072 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4073 AVBitStreamFilterContext **bsfp;
4076 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4080 bsfp= *opt == 'v' ? &video_bitstream_filters :
4081 *opt == 'a' ? &audio_bitstream_filters :
4082 &subtitle_bitstream_filters;
4084 bsfp= &(*bsfp)->next;
4091 static int opt_preset(const char *opt, const char *arg)
4094 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4095 char *codec_name = *opt == 'v' ? video_codec_name :
4096 *opt == 'a' ? audio_codec_name :
4097 subtitle_codec_name;
4099 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4100 fprintf(stderr, "File for preset '%s' not found\n", arg);
4105 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4106 if(line[0] == '#' && !e)
4108 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4110 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4113 if(!strcmp(tmp, "acodec")){
4114 opt_audio_codec(tmp2);
4115 }else if(!strcmp(tmp, "vcodec")){
4116 opt_video_codec(tmp2);
4117 }else if(!strcmp(tmp, "scodec")){
4118 opt_subtitle_codec(tmp2);
4119 }else if(opt_default(tmp, tmp2) < 0){
4120 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4130 static const OptionDef options[] = {
4132 #include "cmdutils_common_opts.h"
4133 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4134 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4135 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4136 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4137 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile[,metadata]:infile[,metadata]" },
4138 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4139 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4140 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4141 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4142 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4143 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4144 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4145 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4146 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4147 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4148 "add timings for benchmarking" },
4149 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4150 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4151 "dump each input packet" },
4152 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4153 "when dumping packets, also dump the payload" },
4154 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4155 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4156 { "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)", "" },
4157 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4158 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4159 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4160 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4161 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4162 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4163 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4164 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4165 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4166 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4167 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4168 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4169 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4172 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4173 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4174 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4175 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4176 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4177 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4178 { "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" },
4179 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4180 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4181 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4182 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4183 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4184 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4185 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4186 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4187 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4188 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4189 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4190 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4191 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4192 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4193 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4194 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4195 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4196 "use same video quality as source (implies VBR)" },
4197 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4198 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4199 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4200 "deinterlace pictures" },
4201 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4202 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4203 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4205 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4207 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4208 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4209 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4210 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4211 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4212 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4213 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4214 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4215 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4216 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4217 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4220 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4221 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4222 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4223 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4224 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4225 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4226 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4227 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4228 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4229 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4230 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4231 { "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" },
4233 /* subtitle options */
4234 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4235 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4236 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4237 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4238 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4241 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4242 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4243 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4246 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4247 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4249 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4250 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4251 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4253 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4254 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4255 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4256 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4258 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4262 int main(int argc, char **argv)
4266 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4268 avcodec_register_all();
4270 avdevice_register_all();
4273 avfilter_register_all();
4278 if(isatty(STDIN_FILENO))
4279 url_set_interrupt_cb(decode_interrupt_cb);
4287 parse_options(argc, argv, options, opt_output_file);
4289 if(nb_output_files <= 0 && nb_input_files == 0) {
4291 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4295 /* file converter / grab */
4296 if (nb_output_files <= 0) {
4297 fprintf(stderr, "At least one output file must be specified\n");
4301 if (nb_input_files == 0) {
4302 fprintf(stderr, "At least one input file must be specified\n");
4307 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4308 stream_maps, nb_stream_maps) < 0)
4310 ti = getutime() - ti;
4312 int maxrss = getmaxrss() / 1024;
4313 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4316 return ffmpeg_exit(0);