]> git.sesse.net Git - ffmpeg/blob - avconv.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / avconv.c
1 /*
2  * ffmpeg main
3  * Copyright (c) 2000-2003 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21
22 #include "config.h"
23 #include <ctype.h>
24 #include <string.h>
25 #include <math.h>
26 #include <stdlib.h>
27 #include <errno.h>
28 #include <signal.h>
29 #include <limits.h>
30 #include <unistd.h>
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
48
49 #include "libavformat/ffm.h" // not public API
50
51 #if CONFIG_AVFILTER
52 # include "libavfilter/avcodec.h"
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/buffersink.h"
56 # include "libavfilter/vsrc_buffer.h"
57 #endif
58
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
61 #include <sys/time.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
64 #include <windows.h>
65 #endif
66 #if HAVE_GETPROCESSMEMORYINFO
67 #include <windows.h>
68 #include <psapi.h>
69 #endif
70
71 #if HAVE_SYS_SELECT_H
72 #include <sys/select.h>
73 #endif
74
75 #if HAVE_TERMIOS_H
76 #include <fcntl.h>
77 #include <sys/ioctl.h>
78 #include <sys/time.h>
79 #include <termios.h>
80 #elif HAVE_KBHIT
81 #include <conio.h>
82 #endif
83 #include <time.h>
84
85 #include "cmdutils.h"
86
87 #include "libavutil/avassert.h"
88
89 const char program_name[] = "avconv";
90 const int program_birth_year = 2000;
91
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94     int disabled;           /** 1 is this mapping is disabled by a negative map */
95     int file_index;
96     int stream_index;
97     int sync_file_index;
98     int sync_stream_index;
99 } StreamMap;
100
101 /**
102  * select an input file for an output file
103  */
104 typedef struct MetadataMap {
105     int  file;      ///< file index
106     char type;      ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107     int  index;     ///< stream/chapter/program number
108 } MetadataMap;
109
110 static const OptionDef options[];
111
112 #define MAX_STREAMS 1024    /* arbitrary sanity check value */
113
114 static int frame_bits_per_raw_sample = 0;
115 static int video_discard = 0;
116 static int same_quant = 0;
117 static int do_deinterlace = 0;
118 static int intra_dc_precision = 8;
119 static int qp_hist = 0;
120
121 static int file_overwrite = 0;
122 static int do_benchmark = 0;
123 static int do_hex_dump = 0;
124 static int do_pkt_dump = 0;
125 static int do_pass = 0;
126 static const char *pass_logfilename_prefix;
127 static int video_sync_method= -1;
128 static int audio_sync_method= 0;
129 static float audio_drift_threshold= 0.1;
130 static int copy_ts= 0;
131 static int copy_tb= 0;
132 static int opt_shortest = 0;
133 static char *vstats_filename;
134 static FILE *vstats_file;
135 static int copy_initial_nonkeyframes = 0;
136
137 static int audio_volume = 256;
138
139 static int exit_on_error = 0;
140 static int using_stdin = 0;
141 static int verbose = 1;
142 static int run_as_daemon  = 0;
143 static int q_pressed = 0;
144 static int64_t video_size = 0;
145 static int64_t audio_size = 0;
146 static int64_t extra_size = 0;
147 static int nb_frames_dup = 0;
148 static int nb_frames_drop = 0;
149 static int input_sync;
150
151 static float dts_delta_threshold = 10;
152
153 static uint8_t *audio_buf;
154 static uint8_t *audio_out;
155 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
156
157 static short *samples;
158
159 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
160
161 typedef struct InputStream {
162     int file_index;
163     AVStream *st;
164     int discard;             /* true if stream data should be discarded */
165     int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */
166     AVCodec *dec;
167
168     int64_t       start;     /* time when read started */
169     int64_t       next_pts;  /* synthetic pts for cases where pkt.pts
170                                 is not defined */
171     int64_t       pts;       /* current pts */
172     double ts_scale;
173     int is_start;            /* is 1 at the start and after a discontinuity */
174     int showed_multi_packet_warning;
175     AVDictionary *opts;
176 } InputStream;
177
178 typedef struct InputFile {
179     AVFormatContext *ctx;
180     int eof_reached;      /* true if eof reached */
181     int ist_index;        /* index of first stream in ist_table */
182     int buffer_size;      /* current total buffer size */
183     int64_t ts_offset;
184     int nb_streams;       /* number of stream that avconv is aware of; may be different
185                              from ctx.nb_streams if new streams appear during av_read_frame() */
186     int rate_emu;
187 } InputFile;
188
189 typedef struct OutputStream {
190     int file_index;          /* file index */
191     int index;               /* stream index in the output file */
192     int source_index;        /* InputStream index */
193     AVStream *st;            /* stream in the output file */
194     int encoding_needed;     /* true if encoding needed for this stream */
195     int frame_number;
196     /* input pts and corresponding output pts
197        for A/V sync */
198     //double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
199     struct InputStream *sync_ist; /* input stream to sync against */
200     int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
201     AVBitStreamFilterContext *bitstream_filters;
202     AVCodec *enc;
203     int64_t max_frames;
204
205     /* video only */
206     int video_resample;
207     AVFrame resample_frame;              /* temporary frame for image resampling */
208     struct SwsContext *img_resample_ctx; /* for image resampling */
209     int resample_height;
210     int resample_width;
211     int resample_pix_fmt;
212     AVRational frame_rate;
213     int force_fps;
214     int top_field_first;
215
216     float frame_aspect_ratio;
217
218     /* forced key frames */
219     int64_t *forced_kf_pts;
220     int forced_kf_count;
221     int forced_kf_index;
222
223     /* audio only */
224     int audio_resample;
225     ReSampleContext *resample; /* for audio resampling */
226     int resample_sample_fmt;
227     int resample_channels;
228     int resample_sample_rate;
229     int reformat_pair;
230     AVAudioConvert *reformat_ctx;
231     AVFifoBuffer *fifo;     /* for compression: one audio fifo per codec */
232     FILE *logfile;
233
234 #if CONFIG_AVFILTER
235     AVFilterContext *output_video_filter;
236     AVFilterContext *input_video_filter;
237     AVFilterBufferRef *picref;
238     char *avfilter;
239     AVFilterGraph *graph;
240 #endif
241
242    int sws_flags;
243    AVDictionary *opts;
244    int is_past_recording_time;
245 } OutputStream;
246
247 #if HAVE_TERMIOS_H
248
249 /* init terminal so that we can grab keys */
250 static struct termios oldtty;
251 #endif
252
253 typedef struct OutputFile {
254     AVFormatContext *ctx;
255     AVDictionary *opts;
256     int ost_index;       /* index of the first stream in output_streams */
257     int64_t recording_time; /* desired length of the resulting file in microseconds */
258     int64_t start_time;     /* start time in microseconds */
259     uint64_t limit_filesize;
260 } OutputFile;
261
262 static InputStream *input_streams = NULL;
263 static int         nb_input_streams = 0;
264 static InputFile   *input_files   = NULL;
265 static int         nb_input_files   = 0;
266
267 static OutputStream *output_streams = NULL;
268 static int        nb_output_streams = 0;
269 static OutputFile   *output_files   = NULL;
270 static int        nb_output_files   = 0;
271
272 typedef struct OptionsContext {
273     /* input/output options */
274     int64_t start_time;
275     const char *format;
276
277     SpecifierOpt *codec_names;
278     int        nb_codec_names;
279     SpecifierOpt *audio_channels;
280     int        nb_audio_channels;
281     SpecifierOpt *audio_sample_rate;
282     int        nb_audio_sample_rate;
283     SpecifierOpt *frame_rates;
284     int        nb_frame_rates;
285     SpecifierOpt *frame_sizes;
286     int        nb_frame_sizes;
287     SpecifierOpt *frame_pix_fmts;
288     int        nb_frame_pix_fmts;
289
290     /* input options */
291     int64_t input_ts_offset;
292     int rate_emu;
293
294     SpecifierOpt *ts_scale;
295     int        nb_ts_scale;
296
297     /* output options */
298     StreamMap *stream_maps;
299     int     nb_stream_maps;
300     /* first item specifies output metadata, second is input */
301     MetadataMap (*meta_data_maps)[2];
302     int nb_meta_data_maps;
303     int metadata_global_manual;
304     int metadata_streams_manual;
305     int metadata_chapters_manual;
306
307     int chapters_input_file;
308
309     int64_t recording_time;
310     uint64_t limit_filesize;
311     float mux_preload;
312     float mux_max_delay;
313
314     int video_disable;
315     int audio_disable;
316     int subtitle_disable;
317     int data_disable;
318
319     /* indexed by output file stream index */
320     int   *streamid_map;
321     int nb_streamid_map;
322
323     SpecifierOpt *metadata;
324     int        nb_metadata;
325     SpecifierOpt *max_frames;
326     int        nb_max_frames;
327     SpecifierOpt *bitstream_filters;
328     int        nb_bitstream_filters;
329     SpecifierOpt *codec_tags;
330     int        nb_codec_tags;
331     SpecifierOpt *sample_fmts;
332     int        nb_sample_fmts;
333     SpecifierOpt *qscale;
334     int        nb_qscale;
335     SpecifierOpt *forced_key_frames;
336     int        nb_forced_key_frames;
337     SpecifierOpt *force_fps;
338     int        nb_force_fps;
339     SpecifierOpt *frame_aspect_ratios;
340     int        nb_frame_aspect_ratios;
341     SpecifierOpt *rc_overrides;
342     int        nb_rc_overrides;
343     SpecifierOpt *intra_matrices;
344     int        nb_intra_matrices;
345     SpecifierOpt *inter_matrices;
346     int        nb_inter_matrices;
347     SpecifierOpt *top_field_first;
348     int        nb_top_field_first;
349 #if CONFIG_AVFILTER
350     SpecifierOpt *filters;
351     int        nb_filters;
352 #endif
353 } OptionsContext;
354
355 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
356 {\
357     int i, ret;\
358     for (i = 0; i < o->nb_ ## name; i++) {\
359         char *spec = o->name[i].specifier;\
360         if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
361             outvar = o->name[i].u.type;\
362         else if (ret < 0)\
363             exit_program(1);\
364     }\
365 }
366
367 static void reset_options(OptionsContext *o)
368 {
369     const OptionDef *po = options;
370
371     /* all OPT_SPEC and OPT_STRING can be freed in generic way */
372     while (po->name) {
373         void *dst = (uint8_t*)o + po->u.off;
374
375         if (po->flags & OPT_SPEC) {
376             SpecifierOpt **so = dst;
377             int i, *count = (int*)(so + 1);
378             for (i = 0; i < *count; i++) {
379                 av_freep(&(*so)[i].specifier);
380                 if (po->flags & OPT_STRING)
381                     av_freep(&(*so)[i].u.str);
382             }
383             av_freep(so);
384             *count = 0;
385         } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
386             av_freep(dst);
387         po++;
388     }
389
390     av_freep(&o->stream_maps);
391     av_freep(&o->meta_data_maps);
392     av_freep(&o->streamid_map);
393
394     memset(o, 0, sizeof(*o));
395
396     o->mux_preload    = 0.5;
397     o->mux_max_delay  = 0.7;
398     o->recording_time = INT64_MAX;
399     o->limit_filesize = UINT64_MAX;
400     o->chapters_input_file = INT_MAX;
401
402     uninit_opts();
403     init_opts();
404 }
405
406 #if CONFIG_AVFILTER
407
408 static int configure_video_filters(InputStream *ist, OutputStream *ost)
409 {
410     AVFilterContext *last_filter, *filter;
411     /** filter graph containing all filters including input & output */
412     AVCodecContext *codec = ost->st->codec;
413     AVCodecContext *icodec = ist->st->codec;
414     enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
415     AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
416     AVRational sample_aspect_ratio;
417     char args[255];
418     int ret;
419
420     ost->graph = avfilter_graph_alloc();
421
422     if (ist->st->sample_aspect_ratio.num){
423         sample_aspect_ratio = ist->st->sample_aspect_ratio;
424     }else
425         sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
426
427     snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
428              ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
429              sample_aspect_ratio.num, sample_aspect_ratio.den);
430
431     ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
432                                        "src", args, NULL, ost->graph);
433     if (ret < 0)
434         return ret;
435 #if FF_API_OLD_VSINK_API
436     ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
437                                        "out", NULL, pix_fmts, ost->graph);
438 #else
439     buffersink_params->pixel_fmts = pix_fmts;
440     ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
441                                        "out", NULL, buffersink_params, ost->graph);
442 #endif
443     av_freep(&buffersink_params);
444     if (ret < 0)
445         return ret;
446     last_filter = ost->input_video_filter;
447
448     if (codec->width  != icodec->width || codec->height != icodec->height) {
449         snprintf(args, 255, "%d:%d:flags=0x%X",
450                  codec->width,
451                  codec->height,
452                  ost->sws_flags);
453         if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
454                                                 NULL, args, NULL, ost->graph)) < 0)
455             return ret;
456         if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
457             return ret;
458         last_filter = filter;
459     }
460
461     snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
462     ost->graph->scale_sws_opts = av_strdup(args);
463
464     if (ost->avfilter) {
465         AVFilterInOut *outputs = avfilter_inout_alloc();
466         AVFilterInOut *inputs  = avfilter_inout_alloc();
467
468         outputs->name    = av_strdup("in");
469         outputs->filter_ctx = last_filter;
470         outputs->pad_idx = 0;
471         outputs->next    = NULL;
472
473         inputs->name    = av_strdup("out");
474         inputs->filter_ctx = ost->output_video_filter;
475         inputs->pad_idx = 0;
476         inputs->next    = NULL;
477
478         if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
479             return ret;
480         av_freep(&ost->avfilter);
481     } else {
482         if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
483             return ret;
484     }
485
486     if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
487         return ret;
488
489     codec->width  = ost->output_video_filter->inputs[0]->w;
490     codec->height = ost->output_video_filter->inputs[0]->h;
491     codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
492         ost->frame_aspect_ratio ? // overridden by the -aspect cli option
493         av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
494         ost->output_video_filter->inputs[0]->sample_aspect_ratio;
495
496     return 0;
497 }
498 #endif /* CONFIG_AVFILTER */
499
500 static void term_exit(void)
501 {
502     av_log(NULL, AV_LOG_QUIET, "%s", "");
503 #if HAVE_TERMIOS_H
504     if(!run_as_daemon)
505         tcsetattr (0, TCSANOW, &oldtty);
506 #endif
507 }
508
509 static volatile int received_sigterm = 0;
510
511 static void
512 sigterm_handler(int sig)
513 {
514     received_sigterm = sig;
515     q_pressed++;
516     term_exit();
517 }
518
519 static void term_init(void)
520 {
521 #if HAVE_TERMIOS_H
522     if(!run_as_daemon){
523     struct termios tty;
524
525     tcgetattr (0, &tty);
526     oldtty = tty;
527     atexit(term_exit);
528
529     tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
530                           |INLCR|IGNCR|ICRNL|IXON);
531     tty.c_oflag |= OPOST;
532     tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
533     tty.c_cflag &= ~(CSIZE|PARENB);
534     tty.c_cflag |= CS8;
535     tty.c_cc[VMIN] = 1;
536     tty.c_cc[VTIME] = 0;
537
538     tcsetattr (0, TCSANOW, &tty);
539     signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
540     }
541 #endif
542
543     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */
544     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
545 #ifdef SIGXCPU
546     signal(SIGXCPU, sigterm_handler);
547 #endif
548 }
549
550 /* read a key without blocking */
551 static int read_key(void)
552 {
553 #if HAVE_TERMIOS_H
554     int n = 1;
555     unsigned char ch;
556     struct timeval tv;
557     fd_set rfds;
558
559     if(run_as_daemon)
560         return -1;
561
562     FD_ZERO(&rfds);
563     FD_SET(0, &rfds);
564     tv.tv_sec = 0;
565     tv.tv_usec = 0;
566     n = select(1, &rfds, NULL, NULL, &tv);
567     if (n > 0) {
568         n = read(0, &ch, 1);
569         if (n == 1)
570             return ch;
571
572         return n;
573     }
574 #elif HAVE_KBHIT
575     if(kbhit())
576         return(getch());
577 #endif
578     return -1;
579 }
580
581 static int decode_interrupt_cb(void)
582 {
583     q_pressed += read_key() == 'q';
584     return q_pressed > 1;
585 }
586
587 void exit_program(int ret)
588 {
589     int i;
590
591     /* close files */
592     for(i=0;i<nb_output_files;i++) {
593         AVFormatContext *s = output_files[i].ctx;
594         if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
595             avio_close(s->pb);
596         avformat_free_context(s);
597         av_dict_free(&output_files[i].opts);
598     }
599     for(i=0;i<nb_input_files;i++) {
600         av_close_input_file(input_files[i].ctx);
601     }
602     for (i = 0; i < nb_input_streams; i++)
603         av_dict_free(&input_streams[i].opts);
604
605     if (vstats_file)
606         fclose(vstats_file);
607     av_free(vstats_filename);
608
609     av_freep(&input_streams);
610     av_freep(&input_files);
611     av_freep(&output_streams);
612     av_freep(&output_files);
613
614     uninit_opts();
615     av_free(audio_buf);
616     av_free(audio_out);
617     allocated_audio_buf_size= allocated_audio_out_size= 0;
618     av_free(samples);
619
620 #if CONFIG_AVFILTER
621     avfilter_uninit();
622 #endif
623
624     if (received_sigterm) {
625         fprintf(stderr,
626             "Received signal %d: terminating.\n",
627             (int) received_sigterm);
628         exit (255);
629     }
630
631     exit(ret); /* not all OS-es handle main() return value */
632 }
633
634 static void assert_avoptions(AVDictionary *m)
635 {
636     AVDictionaryEntry *t;
637     if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
638         av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
639         exit_program(1);
640     }
641 }
642
643 static void assert_codec_experimental(AVCodecContext *c, int encoder)
644 {
645     const char *codec_string = encoder ? "encoder" : "decoder";
646     AVCodec *codec;
647     if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
648         c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
649         av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
650                 "results.\nAdd '-strict experimental' if you want to use it.\n",
651                 codec_string, c->codec->name);
652         codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
653         if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
654             av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
655                    codec_string, codec->name);
656         exit_program(1);
657     }
658 }
659
660 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
661 {
662     if(codec && codec->sample_fmts){
663         const enum AVSampleFormat *p= codec->sample_fmts;
664         for(; *p!=-1; p++){
665             if(*p == st->codec->sample_fmt)
666                 break;
667         }
668         if (*p == -1) {
669             if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
670                 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
671             if(av_get_sample_fmt_name(st->codec->sample_fmt))
672             av_log(NULL, AV_LOG_WARNING,
673                    "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
674                    av_get_sample_fmt_name(st->codec->sample_fmt),
675                    codec->name,
676                    av_get_sample_fmt_name(codec->sample_fmts[0]));
677             st->codec->sample_fmt = codec->sample_fmts[0];
678         }
679     }
680 }
681
682 static void choose_sample_rate(AVStream *st, AVCodec *codec)
683 {
684     if(codec && codec->supported_samplerates){
685         const int *p= codec->supported_samplerates;
686         int best=0;
687         int best_dist=INT_MAX;
688         for(; *p; p++){
689             int dist= abs(st->codec->sample_rate - *p);
690             if(dist < best_dist){
691                 best_dist= dist;
692                 best= *p;
693             }
694         }
695         if(best_dist){
696             av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
697         }
698         st->codec->sample_rate= best;
699     }
700 }
701
702 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
703 {
704     if(codec && codec->pix_fmts){
705         const enum PixelFormat *p= codec->pix_fmts;
706         if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
707             if(st->codec->codec_id==CODEC_ID_MJPEG){
708                 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
709             }else if(st->codec->codec_id==CODEC_ID_LJPEG){
710                 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
711             }
712         }
713         for(; *p!=-1; p++){
714             if(*p == st->codec->pix_fmt)
715                 break;
716         }
717         if (*p == -1) {
718             if(st->codec->pix_fmt != PIX_FMT_NONE)
719                 av_log(NULL, AV_LOG_WARNING,
720                         "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
721                         av_pix_fmt_descriptors[st->codec->pix_fmt].name,
722                         codec->name,
723                         av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
724             st->codec->pix_fmt = codec->pix_fmts[0];
725         }
726     }
727 }
728
729 static double
730 get_sync_ipts(const OutputStream *ost)
731 {
732     const InputStream *ist = ost->sync_ist;
733     OutputFile *of = &output_files[ost->file_index];
734     return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
735 }
736
737 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
738     int ret;
739
740     while(bsfc){
741         AVPacket new_pkt= *pkt;
742         int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
743                                           &new_pkt.data, &new_pkt.size,
744                                           pkt->data, pkt->size,
745                                           pkt->flags & AV_PKT_FLAG_KEY);
746         if(a>0){
747             av_free_packet(pkt);
748             new_pkt.destruct= av_destruct_packet;
749         } else if(a<0){
750             fprintf(stderr, "%s failed for stream %d, codec %s",
751                     bsfc->filter->name, pkt->stream_index,
752                     avctx->codec ? avctx->codec->name : "copy");
753             print_error("", a);
754             if (exit_on_error)
755                 exit_program(1);
756         }
757         *pkt= new_pkt;
758
759         bsfc= bsfc->next;
760     }
761
762     ret= av_interleaved_write_frame(s, pkt);
763     if(ret < 0){
764         print_error("av_interleaved_write_frame()", ret);
765         exit_program(1);
766     }
767 }
768
769 static void do_audio_out(AVFormatContext *s,
770                          OutputStream *ost,
771                          InputStream *ist,
772                          unsigned char *buf, int size)
773 {
774     uint8_t *buftmp;
775     int64_t audio_out_size, audio_buf_size;
776     int64_t allocated_for_size= size;
777
778     int size_out, frame_bytes, ret, resample_changed;
779     AVCodecContext *enc= ost->st->codec;
780     AVCodecContext *dec= ist->st->codec;
781     int osize = av_get_bytes_per_sample(enc->sample_fmt);
782     int isize = av_get_bytes_per_sample(dec->sample_fmt);
783     const int coded_bps = av_get_bits_per_sample(enc->codec->id);
784
785 need_realloc:
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;
791
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;
796
797     if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
798         fprintf(stderr, "Buffer sizes too large\n");
799         exit_program(1);
800     }
801
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");
806         exit_program(1);
807     }
808
809     if (enc->channels != dec->channels)
810         ost->audio_resample = 1;
811
812     resample_changed = ost->resample_sample_fmt  != dec->sample_fmt ||
813                        ost->resample_channels    != dec->channels   ||
814                        ost->resample_sample_rate != dec->sample_rate;
815
816     if ((ost->audio_resample && !ost->resample) || resample_changed) {
817         if (resample_changed) {
818             av_log(NULL, AV_LOG_INFO, "Input stream #%d.%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
819                    ist->file_index, ist->st->index,
820                    ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
821                    dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
822             ost->resample_sample_fmt  = dec->sample_fmt;
823             ost->resample_channels    = dec->channels;
824             ost->resample_sample_rate = dec->sample_rate;
825             if (ost->resample)
826                 audio_resample_close(ost->resample);
827         }
828         /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
829         if (audio_sync_method <= 1 &&
830             ost->resample_sample_fmt  == enc->sample_fmt &&
831             ost->resample_channels    == enc->channels   &&
832             ost->resample_sample_rate == enc->sample_rate) {
833             ost->resample = NULL;
834             ost->audio_resample = 0;
835         } else {
836             if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
837                 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
838             ost->resample = av_audio_resample_init(enc->channels,    dec->channels,
839                                                    enc->sample_rate, dec->sample_rate,
840                                                    enc->sample_fmt,  dec->sample_fmt,
841                                                    16, 10, 0, 0.8);
842             if (!ost->resample) {
843                 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
844                         dec->channels, dec->sample_rate,
845                         enc->channels, enc->sample_rate);
846                 exit_program(1);
847             }
848         }
849     }
850
851 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
852     if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
853         MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
854         if (ost->reformat_ctx)
855             av_audio_convert_free(ost->reformat_ctx);
856         ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
857                                                    dec->sample_fmt, 1, NULL, 0);
858         if (!ost->reformat_ctx) {
859             fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
860                 av_get_sample_fmt_name(dec->sample_fmt),
861                 av_get_sample_fmt_name(enc->sample_fmt));
862             exit_program(1);
863         }
864         ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
865     }
866
867     if(audio_sync_method){
868         double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
869                 - av_fifo_size(ost->fifo)/(enc->channels * 2);
870         double idelta= delta*dec->sample_rate / enc->sample_rate;
871         int byte_delta= ((int)idelta)*2*dec->channels;
872
873         //FIXME resample delay
874         if(fabs(delta) > 50){
875             if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
876                 if(byte_delta < 0){
877                     byte_delta= FFMAX(byte_delta, -size);
878                     size += byte_delta;
879                     buf  -= byte_delta;
880                     if(verbose > 2)
881                         fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
882                     if(!size)
883                         return;
884                     ist->is_start=0;
885                 }else{
886                     static uint8_t *input_tmp= NULL;
887                     input_tmp= av_realloc(input_tmp, byte_delta + size);
888
889                     if(byte_delta > allocated_for_size - size){
890                         allocated_for_size= byte_delta + (int64_t)size;
891                         goto need_realloc;
892                     }
893                     ist->is_start=0;
894
895                     memset(input_tmp, 0, byte_delta);
896                     memcpy(input_tmp + byte_delta, buf, size);
897                     buf= input_tmp;
898                     size += byte_delta;
899                     if(verbose > 2)
900                         fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
901                 }
902             }else if(audio_sync_method>1){
903                 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
904                 av_assert0(ost->audio_resample);
905                 if(verbose > 2)
906                     fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
907 //                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));
908                 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
909             }
910         }
911     }else
912         ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
913                         - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
914
915     if (ost->audio_resample) {
916         buftmp = audio_buf;
917         size_out = audio_resample(ost->resample,
918                                   (short *)buftmp, (short *)buf,
919                                   size / (dec->channels * isize));
920         size_out = size_out * enc->channels * osize;
921     } else {
922         buftmp = buf;
923         size_out = size;
924     }
925
926     if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
927         const void *ibuf[6]= {buftmp};
928         void *obuf[6]= {audio_buf};
929         int istride[6]= {isize};
930         int ostride[6]= {osize};
931         int len= size_out/istride[0];
932         if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
933             printf("av_audio_convert() failed\n");
934             if (exit_on_error)
935                 exit_program(1);
936             return;
937         }
938         buftmp = audio_buf;
939         size_out = len*osize;
940     }
941
942     /* now encode as many frames as possible */
943     if (enc->frame_size > 1) {
944         /* output resampled raw samples */
945         if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
946             fprintf(stderr, "av_fifo_realloc2() failed\n");
947             exit_program(1);
948         }
949         av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
950
951         frame_bytes = enc->frame_size * osize * enc->channels;
952
953         while (av_fifo_size(ost->fifo) >= frame_bytes) {
954             AVPacket pkt;
955             av_init_packet(&pkt);
956
957             av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
958
959             //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
960
961             ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
962                                        (short *)audio_buf);
963             if (ret < 0) {
964                 fprintf(stderr, "Audio encoding failed\n");
965                 exit_program(1);
966             }
967             audio_size += ret;
968             pkt.stream_index= ost->index;
969             pkt.data= audio_out;
970             pkt.size= ret;
971             if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
972                 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
973             pkt.flags |= AV_PKT_FLAG_KEY;
974             write_frame(s, &pkt, enc, ost->bitstream_filters);
975
976             ost->sync_opts += enc->frame_size;
977         }
978     } else {
979         AVPacket pkt;
980         av_init_packet(&pkt);
981
982         ost->sync_opts += size_out / (osize * enc->channels);
983
984         /* output a pcm frame */
985         /* determine the size of the coded buffer */
986         size_out /= osize;
987         if (coded_bps)
988             size_out = size_out*coded_bps/8;
989
990         if(size_out > audio_out_size){
991             fprintf(stderr, "Internal error, buffer size too small\n");
992             exit_program(1);
993         }
994
995         //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
996         ret = avcodec_encode_audio(enc, audio_out, size_out,
997                                    (short *)buftmp);
998         if (ret < 0) {
999             fprintf(stderr, "Audio encoding failed\n");
1000             exit_program(1);
1001         }
1002         audio_size += ret;
1003         pkt.stream_index= ost->index;
1004         pkt.data= audio_out;
1005         pkt.size= ret;
1006         if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1007             pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1008         pkt.flags |= AV_PKT_FLAG_KEY;
1009         write_frame(s, &pkt, enc, ost->bitstream_filters);
1010     }
1011 }
1012
1013 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1014 {
1015     AVCodecContext *dec;
1016     AVPicture *picture2;
1017     AVPicture picture_tmp;
1018     uint8_t *buf = 0;
1019
1020     dec = ist->st->codec;
1021
1022     /* deinterlace : must be done before any resize */
1023     if (do_deinterlace) {
1024         int size;
1025
1026         /* create temporary picture */
1027         size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1028         buf = av_malloc(size);
1029         if (!buf)
1030             return;
1031
1032         picture2 = &picture_tmp;
1033         avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1034
1035         if(avpicture_deinterlace(picture2, picture,
1036                                  dec->pix_fmt, dec->width, dec->height) < 0) {
1037             /* if error, do not deinterlace */
1038             fprintf(stderr, "Deinterlacing failed\n");
1039             av_free(buf);
1040             buf = NULL;
1041             picture2 = picture;
1042         }
1043     } else {
1044         picture2 = picture;
1045     }
1046
1047     if (picture != picture2)
1048         *picture = *picture2;
1049     *bufp = buf;
1050 }
1051
1052 static void do_subtitle_out(AVFormatContext *s,
1053                             OutputStream *ost,
1054                             InputStream *ist,
1055                             AVSubtitle *sub,
1056                             int64_t pts)
1057 {
1058     static uint8_t *subtitle_out = NULL;
1059     int subtitle_out_max_size = 1024 * 1024;
1060     int subtitle_out_size, nb, i;
1061     AVCodecContext *enc;
1062     AVPacket pkt;
1063
1064     if (pts == AV_NOPTS_VALUE) {
1065         fprintf(stderr, "Subtitle packets must have a pts\n");
1066         if (exit_on_error)
1067             exit_program(1);
1068         return;
1069     }
1070
1071     enc = ost->st->codec;
1072
1073     if (!subtitle_out) {
1074         subtitle_out = av_malloc(subtitle_out_max_size);
1075     }
1076
1077     /* Note: DVB subtitle need one packet to draw them and one other
1078        packet to clear them */
1079     /* XXX: signal it in the codec context ? */
1080     if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1081         nb = 2;
1082     else
1083         nb = 1;
1084
1085     for(i = 0; i < nb; i++) {
1086         sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1087         // start_display_time is required to be 0
1088         sub->pts              += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1089         sub->end_display_time -= sub->start_display_time;
1090         sub->start_display_time = 0;
1091         subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1092                                                     subtitle_out_max_size, sub);
1093         if (subtitle_out_size < 0) {
1094             fprintf(stderr, "Subtitle encoding failed\n");
1095             exit_program(1);
1096         }
1097
1098         av_init_packet(&pkt);
1099         pkt.stream_index = ost->index;
1100         pkt.data = subtitle_out;
1101         pkt.size = subtitle_out_size;
1102         pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1103         if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1104             /* XXX: the pts correction is handled here. Maybe handling
1105                it in the codec would be better */
1106             if (i == 0)
1107                 pkt.pts += 90 * sub->start_display_time;
1108             else
1109                 pkt.pts += 90 * sub->end_display_time;
1110         }
1111         write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1112     }
1113 }
1114
1115 static int bit_buffer_size= 1024*256;
1116 static uint8_t *bit_buffer= NULL;
1117
1118 static void do_video_resample(OutputStream *ost,
1119                               InputStream *ist,
1120                               AVFrame *in_picture,
1121                               AVFrame **out_picture)
1122 {
1123     int resample_changed = 0;
1124     AVCodecContext *dec = ist->st->codec;
1125     AVCodecContext *enc = ost->st->codec;
1126     *out_picture = in_picture;
1127
1128     resample_changed = ost->resample_width   != dec->width  ||
1129                        ost->resample_height  != dec->height ||
1130                        ost->resample_pix_fmt != dec->pix_fmt;
1131
1132 #if !CONFIG_AVFILTER
1133     if (resample_changed) {
1134         av_log(NULL, AV_LOG_INFO,
1135                "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1136                ist->file_index, ist->st->index,
1137                ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1138                dec->width         , dec->height         , av_get_pix_fmt_name(dec->pix_fmt));
1139         ost->resample_width   = dec->width;
1140         ost->resample_height  = dec->height;
1141         ost->resample_pix_fmt = dec->pix_fmt;
1142     }
1143
1144     ost->video_resample = dec->width   != enc->width  ||
1145                           dec->height  != enc->height ||
1146                           dec->pix_fmt != enc->pix_fmt;
1147
1148     if (ost->video_resample) {
1149         *out_picture = &ost->resample_frame;
1150         if (!ost->img_resample_ctx || resample_changed) {
1151             /* initialize the destination picture */
1152             if (!ost->resample_frame.data[0]) {
1153                 avcodec_get_frame_defaults(&ost->resample_frame);
1154                 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1155                                     enc->width, enc->height)) {
1156                     fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1157                     exit_program(1);
1158                 }
1159             }
1160             /* initialize a new scaler context */
1161             sws_freeContext(ost->img_resample_ctx);
1162             ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1163                                                    enc->width, enc->height, enc->pix_fmt,
1164                                                    ost->sws_flags, NULL, NULL, NULL);
1165             if (ost->img_resample_ctx == NULL) {
1166                 fprintf(stderr, "Cannot get resampling context\n");
1167                 exit_program(1);
1168             }
1169         }
1170         sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1171               0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1172     }
1173 #else
1174     if (resample_changed) {
1175         avfilter_graph_free(&ost->graph);
1176         if (configure_video_filters(ist, ost)) {
1177             fprintf(stderr, "Error reinitializing filters!\n");
1178             exit_program(1);
1179         }
1180     }
1181 #endif
1182     if (resample_changed) {
1183         ost->resample_width   = dec->width;
1184         ost->resample_height  = dec->height;
1185         ost->resample_pix_fmt = dec->pix_fmt;
1186     }
1187 }
1188
1189
1190 static void do_video_out(AVFormatContext *s,
1191                          OutputStream *ost,
1192                          InputStream *ist,
1193                          AVFrame *in_picture,
1194                          int *frame_size, float quality)
1195 {
1196     int nb_frames, i, ret, format_video_sync;
1197     AVFrame *final_picture;
1198     AVCodecContext *enc;
1199     double sync_ipts;
1200
1201     enc = ost->st->codec;
1202
1203     sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1204
1205     /* by default, we output a single frame */
1206     nb_frames = 1;
1207
1208     *frame_size = 0;
1209
1210     format_video_sync = video_sync_method;
1211     if (format_video_sync < 0)
1212         format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1213
1214     if (format_video_sync) {
1215         double vdelta = sync_ipts - ost->sync_opts;
1216         //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1217         if (vdelta < -1.1)
1218             nb_frames = 0;
1219         else if (format_video_sync == 2) {
1220             if(vdelta<=-0.6){
1221                 nb_frames=0;
1222             }else if(vdelta>0.6)
1223                 ost->sync_opts= lrintf(sync_ipts);
1224         }else if (vdelta > 1.1)
1225             nb_frames = lrintf(vdelta);
1226 //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);
1227         if (nb_frames == 0){
1228             ++nb_frames_drop;
1229             if (verbose>2)
1230                 fprintf(stderr, "*** drop!\n");
1231         }else if (nb_frames > 1) {
1232             nb_frames_dup += nb_frames - 1;
1233             if (verbose>2)
1234                 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1235         }
1236     }else
1237         ost->sync_opts= lrintf(sync_ipts);
1238
1239     nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1240     if (nb_frames <= 0)
1241         return;
1242
1243     do_video_resample(ost, ist, in_picture, &final_picture);
1244
1245     /* duplicates frame if needed */
1246     for(i=0;i<nb_frames;i++) {
1247         AVPacket pkt;
1248         av_init_packet(&pkt);
1249         pkt.stream_index= ost->index;
1250
1251         if (s->oformat->flags & AVFMT_RAWPICTURE) {
1252             /* raw pictures are written as AVPicture structure to
1253                avoid any copies. We support temporarily the older
1254                method. */
1255             enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1256             enc->coded_frame->top_field_first  = in_picture->top_field_first;
1257             pkt.data= (uint8_t *)final_picture;
1258             pkt.size=  sizeof(AVPicture);
1259             pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1260             pkt.flags |= AV_PKT_FLAG_KEY;
1261
1262             write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1263         } else {
1264             AVFrame big_picture;
1265
1266             big_picture= *final_picture;
1267             /* better than nothing: use input picture interlaced
1268                settings */
1269             big_picture.interlaced_frame = in_picture->interlaced_frame;
1270             if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1271                 if (ost->top_field_first == -1)
1272                     big_picture.top_field_first = in_picture->top_field_first;
1273                 else
1274                     big_picture.top_field_first = !!ost->top_field_first;
1275             }
1276
1277             /* handles same_quant here. This is not correct because it may
1278                not be a global option */
1279             big_picture.quality = quality;
1280             if (!enc->me_threshold)
1281                 big_picture.pict_type = 0;
1282 //            big_picture.pts = AV_NOPTS_VALUE;
1283             big_picture.pts= ost->sync_opts;
1284 //            big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1285 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1286             if (ost->forced_kf_index < ost->forced_kf_count &&
1287                 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1288                 big_picture.pict_type = AV_PICTURE_TYPE_I;
1289                 ost->forced_kf_index++;
1290             }
1291             ret = avcodec_encode_video(enc,
1292                                        bit_buffer, bit_buffer_size,
1293                                        &big_picture);
1294             if (ret < 0) {
1295                 fprintf(stderr, "Video encoding failed\n");
1296                 exit_program(1);
1297             }
1298
1299             if(ret>0){
1300                 pkt.data= bit_buffer;
1301                 pkt.size= ret;
1302                 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1303                     pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1304 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1305    pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1306    pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1307
1308                 if(enc->coded_frame->key_frame)
1309                     pkt.flags |= AV_PKT_FLAG_KEY;
1310                 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1311                 *frame_size = ret;
1312                 video_size += ret;
1313                 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1314                 //        enc->frame_number-1, ret, enc->pict_type);
1315                 /* if two pass, output log */
1316                 if (ost->logfile && enc->stats_out) {
1317                     fprintf(ost->logfile, "%s", enc->stats_out);
1318                 }
1319             }
1320         }
1321         ost->sync_opts++;
1322         ost->frame_number++;
1323     }
1324 }
1325
1326 static double psnr(double d){
1327     return -10.0*log(d)/log(10.0);
1328 }
1329
1330 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1331                            int frame_size)
1332 {
1333     AVCodecContext *enc;
1334     int frame_number;
1335     double ti1, bitrate, avg_bitrate;
1336
1337     /* this is executed just the first time do_video_stats is called */
1338     if (!vstats_file) {
1339         vstats_file = fopen(vstats_filename, "w");
1340         if (!vstats_file) {
1341             perror("fopen");
1342             exit_program(1);
1343         }
1344     }
1345
1346     enc = ost->st->codec;
1347     if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1348         frame_number = ost->frame_number;
1349         fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1350         if (enc->flags&CODEC_FLAG_PSNR)
1351             fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1352
1353         fprintf(vstats_file,"f_size= %6d ", frame_size);
1354         /* compute pts value */
1355         ti1 = ost->sync_opts * av_q2d(enc->time_base);
1356         if (ti1 < 0.01)
1357             ti1 = 0.01;
1358
1359         bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1360         avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1361         fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1362             (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1363         fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1364     }
1365 }
1366
1367 static void print_report(OutputFile *output_files,
1368                          OutputStream *ost_table, int nb_ostreams,
1369                          int is_last_report, int64_t timer_start)
1370 {
1371     char buf[1024];
1372     OutputStream *ost;
1373     AVFormatContext *oc;
1374     int64_t total_size;
1375     AVCodecContext *enc;
1376     int frame_number, vid, i;
1377     double bitrate;
1378     int64_t pts = INT64_MAX;
1379     static int64_t last_time = -1;
1380     static int qp_histogram[52];
1381
1382     if (!is_last_report) {
1383         int64_t cur_time;
1384         /* display the report every 0.5 seconds */
1385         cur_time = av_gettime();
1386         if (last_time == -1) {
1387             last_time = cur_time;
1388             return;
1389         }
1390         if ((cur_time - last_time) < 500000)
1391             return;
1392         last_time = cur_time;
1393     }
1394
1395
1396     oc = output_files[0].ctx;
1397
1398     total_size = avio_size(oc->pb);
1399     if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1400         total_size= avio_tell(oc->pb);
1401
1402     buf[0] = '\0';
1403     vid = 0;
1404     for(i=0;i<nb_ostreams;i++) {
1405         float q = -1;
1406         ost = &ost_table[i];
1407         enc = ost->st->codec;
1408         if (!ost->st->stream_copy && enc->coded_frame)
1409             q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1410         if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1411             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1412         }
1413         if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1414             float t = (av_gettime()-timer_start) / 1000000.0;
1415
1416             frame_number = ost->frame_number;
1417             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1418                      frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1419             if(is_last_report)
1420                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1421             if(qp_hist){
1422                 int j;
1423                 int qp = lrintf(q);
1424                 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1425                     qp_histogram[qp]++;
1426                 for(j=0; j<32; j++)
1427                     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1428             }
1429             if (enc->flags&CODEC_FLAG_PSNR){
1430                 int j;
1431                 double error, error_sum=0;
1432                 double scale, scale_sum=0;
1433                 char type[3]= {'Y','U','V'};
1434                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1435                 for(j=0; j<3; j++){
1436                     if(is_last_report){
1437                         error= enc->error[j];
1438                         scale= enc->width*enc->height*255.0*255.0*frame_number;
1439                     }else{
1440                         error= enc->coded_frame->error[j];
1441                         scale= enc->width*enc->height*255.0*255.0;
1442                     }
1443                     if(j) scale/=4;
1444                     error_sum += error;
1445                     scale_sum += scale;
1446                     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1447                 }
1448                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1449             }
1450             vid = 1;
1451         }
1452         /* compute min output value */
1453         pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1454                                       ost->st->time_base, AV_TIME_BASE_Q));
1455     }
1456
1457     if (verbose > 0 || is_last_report) {
1458         int hours, mins, secs, us;
1459         secs = pts / AV_TIME_BASE;
1460         us = pts % AV_TIME_BASE;
1461         mins = secs / 60;
1462         secs %= 60;
1463         hours = mins / 60;
1464         mins %= 60;
1465
1466         bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1467
1468         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1469                  "size=%8.0fkB time=", total_size / 1024.0);
1470         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1471                  "%02d:%02d:%02d.%02d ", hours, mins, secs,
1472                  (100 * us) / AV_TIME_BASE);
1473         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1474                  "bitrate=%6.1fkbits/s", bitrate);
1475
1476         if (nb_frames_dup || nb_frames_drop)
1477           snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1478                   nb_frames_dup, nb_frames_drop);
1479
1480         if (verbose >= 0)
1481             fprintf(stderr, "%s    \r", buf);
1482
1483         fflush(stderr);
1484     }
1485
1486     if (is_last_report && verbose >= 0){
1487         int64_t raw= audio_size + video_size + extra_size;
1488         fprintf(stderr, "\n");
1489         fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1490                 video_size/1024.0,
1491                 audio_size/1024.0,
1492                 extra_size/1024.0,
1493                 100.0*(total_size - raw)/raw
1494         );
1495     }
1496 }
1497
1498 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1499 {
1500     int fill_char = 0x00;
1501     if (sample_fmt == AV_SAMPLE_FMT_U8)
1502         fill_char = 0x80;
1503     memset(buf, fill_char, size);
1504 }
1505
1506 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1507 {
1508     int i, ret;
1509
1510     for (i = 0; i < nb_ostreams; i++) {
1511         OutputStream   *ost = &ost_table[i];
1512         AVCodecContext *enc = ost->st->codec;
1513         AVFormatContext *os = output_files[ost->file_index].ctx;
1514
1515         if (!ost->encoding_needed)
1516             continue;
1517
1518         if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1519             continue;
1520         if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1521             continue;
1522
1523         for(;;) {
1524             AVPacket pkt;
1525             int fifo_bytes;
1526             av_init_packet(&pkt);
1527             pkt.stream_index= ost->index;
1528
1529             switch (ost->st->codec->codec_type) {
1530             case AVMEDIA_TYPE_AUDIO:
1531                 fifo_bytes = av_fifo_size(ost->fifo);
1532                 ret = 0;
1533                 /* encode any samples remaining in fifo */
1534                 if (fifo_bytes > 0) {
1535                     int osize = av_get_bytes_per_sample(enc->sample_fmt);
1536                     int fs_tmp = enc->frame_size;
1537
1538                     av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1539                     if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1540                         enc->frame_size = fifo_bytes / (osize * enc->channels);
1541                     } else { /* pad */
1542                         int frame_bytes = enc->frame_size*osize*enc->channels;
1543                         if (allocated_audio_buf_size < frame_bytes)
1544                             exit_program(1);
1545                         generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1546                     }
1547
1548                     ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1549                     pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1550                                               ost->st->time_base.num, enc->sample_rate);
1551                     enc->frame_size = fs_tmp;
1552                 }
1553                 if (ret <= 0) {
1554                     ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1555                 }
1556                 if (ret < 0) {
1557                     fprintf(stderr, "Audio encoding failed\n");
1558                     exit_program(1);
1559                 }
1560                 audio_size += ret;
1561                 pkt.flags |= AV_PKT_FLAG_KEY;
1562                 break;
1563             case AVMEDIA_TYPE_VIDEO:
1564                 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1565                 if (ret < 0) {
1566                     fprintf(stderr, "Video encoding failed\n");
1567                     exit_program(1);
1568                 }
1569                 video_size += ret;
1570                 if(enc->coded_frame && enc->coded_frame->key_frame)
1571                     pkt.flags |= AV_PKT_FLAG_KEY;
1572                 if (ost->logfile && enc->stats_out) {
1573                     fprintf(ost->logfile, "%s", enc->stats_out);
1574                 }
1575                 break;
1576             default:
1577                 ret=-1;
1578             }
1579
1580             if (ret <= 0)
1581                 break;
1582             pkt.data = bit_buffer;
1583             pkt.size = ret;
1584             if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1585                 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1586             write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1587         }
1588     }
1589 }
1590
1591 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1592 static int output_packet(InputStream *ist, int ist_index,
1593                          OutputStream *ost_table, int nb_ostreams,
1594                          const AVPacket *pkt)
1595 {
1596     AVFormatContext *os;
1597     OutputStream *ost;
1598     int ret, i;
1599     int got_output;
1600     AVFrame picture;
1601     void *buffer_to_free = NULL;
1602     static unsigned int samples_size= 0;
1603     AVSubtitle subtitle, *subtitle_to_free;
1604     int64_t pkt_pts = AV_NOPTS_VALUE;
1605 #if CONFIG_AVFILTER
1606     int frame_available;
1607 #endif
1608     float quality;
1609
1610     AVPacket avpkt;
1611     int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1612
1613     if(ist->next_pts == AV_NOPTS_VALUE)
1614         ist->next_pts= ist->pts;
1615
1616     if (pkt == NULL) {
1617         /* EOF handling */
1618         av_init_packet(&avpkt);
1619         avpkt.data = NULL;
1620         avpkt.size = 0;
1621         goto handle_eof;
1622     } else {
1623         avpkt = *pkt;
1624     }
1625
1626     if(pkt->dts != AV_NOPTS_VALUE)
1627         ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1628     if(pkt->pts != AV_NOPTS_VALUE)
1629         pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1630
1631     //while we have more to decode or while the decoder did output something on EOF
1632     while (avpkt.size > 0 || (!pkt && got_output)) {
1633         uint8_t *data_buf, *decoded_data_buf;
1634         int data_size, decoded_data_size;
1635     handle_eof:
1636         ist->pts= ist->next_pts;
1637
1638         if(avpkt.size && avpkt.size != pkt->size &&
1639            ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1640             fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1641             ist->showed_multi_packet_warning=1;
1642         }
1643
1644         /* decode the packet if needed */
1645         decoded_data_buf = NULL; /* fail safe */
1646         decoded_data_size= 0;
1647         data_buf  = avpkt.data;
1648         data_size = avpkt.size;
1649         subtitle_to_free = NULL;
1650         if (ist->decoding_needed) {
1651             switch(ist->st->codec->codec_type) {
1652             case AVMEDIA_TYPE_AUDIO:{
1653                 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1654                     samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1655                     av_free(samples);
1656                     samples= av_malloc(samples_size);
1657                 }
1658                 decoded_data_size= samples_size;
1659                     /* XXX: could avoid copy if PCM 16 bits with same
1660                        endianness as CPU */
1661                 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1662                                             &avpkt);
1663                 if (ret < 0)
1664                     return ret;
1665                 avpkt.data += ret;
1666                 avpkt.size -= ret;
1667                 data_size   = ret;
1668                 got_output  = decoded_data_size > 0;
1669                 /* Some bug in mpeg audio decoder gives */
1670                 /* decoded_data_size < 0, it seems they are overflows */
1671                 if (!got_output) {
1672                     /* no audio frame */
1673                     continue;
1674                 }
1675                 decoded_data_buf = (uint8_t *)samples;
1676                 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1677                     (ist->st->codec->sample_rate * ist->st->codec->channels);
1678                 break;}
1679             case AVMEDIA_TYPE_VIDEO:
1680                     decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1681                     /* XXX: allocate picture correctly */
1682                     avcodec_get_frame_defaults(&picture);
1683                     avpkt.pts = pkt_pts;
1684                     avpkt.dts = ist->pts;
1685                     pkt_pts = AV_NOPTS_VALUE;
1686
1687                     ret = avcodec_decode_video2(ist->st->codec,
1688                                                 &picture, &got_output, &avpkt);
1689                     quality = same_quant ? picture.quality : 0;
1690                     if (ret < 0)
1691                         return ret;
1692                     if (!got_output) {
1693                         /* no picture yet */
1694                         goto discard_packet;
1695                     }
1696                     ist->next_pts = ist->pts = picture.best_effort_timestamp;
1697                     if (ist->st->codec->time_base.num != 0) {
1698                         int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1699                         ist->next_pts += ((int64_t)AV_TIME_BASE *
1700                                           ist->st->codec->time_base.num * ticks) /
1701                             ist->st->codec->time_base.den;
1702                     }
1703                     avpkt.size = 0;
1704                     buffer_to_free = NULL;
1705                     pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1706                     break;
1707             case AVMEDIA_TYPE_SUBTITLE:
1708                 ret = avcodec_decode_subtitle2(ist->st->codec,
1709                                                &subtitle, &got_output, &avpkt);
1710                 if (ret < 0)
1711                     return ret;
1712                 if (!got_output) {
1713                     goto discard_packet;
1714                 }
1715                 subtitle_to_free = &subtitle;
1716                 avpkt.size = 0;
1717                 break;
1718             default:
1719                 return -1;
1720             }
1721         } else {
1722             switch(ist->st->codec->codec_type) {
1723             case AVMEDIA_TYPE_AUDIO:
1724                 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1725                     ist->st->codec->sample_rate;
1726                 break;
1727             case AVMEDIA_TYPE_VIDEO:
1728                 if (ist->st->codec->time_base.num != 0) {
1729                     int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1730                     ist->next_pts += ((int64_t)AV_TIME_BASE *
1731                                       ist->st->codec->time_base.num * ticks) /
1732                         ist->st->codec->time_base.den;
1733                 }
1734                 break;
1735             }
1736             avpkt.size = 0;
1737         }
1738
1739         // preprocess audio (volume)
1740         if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1741             if (audio_volume != 256) {
1742                 short *volp;
1743                 volp = samples;
1744                 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1745                     int v = ((*volp) * audio_volume + 128) >> 8;
1746                     *volp++ = av_clip_int16(v);
1747                 }
1748             }
1749         }
1750
1751         /* frame rate emulation */
1752         if (input_files[ist->file_index].rate_emu) {
1753             int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1754             int64_t now = av_gettime() - ist->start;
1755             if (pts > now)
1756                 usleep(pts - now);
1757         }
1758         /* if output time reached then transcode raw format,
1759            encode packets and output them */
1760         for (i = 0; i < nb_ostreams; i++) {
1761             OutputFile *of = &output_files[ost_table[i].file_index];
1762             int frame_size;
1763
1764             ost = &ost_table[i];
1765             if (ost->source_index != ist_index)
1766                 continue;
1767
1768             if (of->start_time && ist->pts < of->start_time)
1769                 continue;
1770
1771             if (of->recording_time != INT64_MAX &&
1772                 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1773                               (AVRational){1, 1000000}) >= 0) {
1774                 ost->is_past_recording_time = 1;
1775                 continue;
1776             }
1777
1778 #if CONFIG_AVFILTER
1779             if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1780                 ost->input_video_filter) {
1781                 if (!picture.sample_aspect_ratio.num)
1782                     picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1783                 picture.pts = ist->pts;
1784
1785                 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1786             }
1787             frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1788                 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1789             while (frame_available) {
1790                 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1791                     AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1792                     if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1793                         goto cont;
1794                     if (ost->picref) {
1795                         avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1796                         ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1797                     }
1798                 }
1799 #endif
1800                 os = output_files[ost->file_index].ctx;
1801
1802                 /* set the input output pts pairs */
1803                 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1804
1805                 if (ost->encoding_needed) {
1806                     av_assert0(ist->decoding_needed);
1807                     switch(ost->st->codec->codec_type) {
1808                     case AVMEDIA_TYPE_AUDIO:
1809                         do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1810                         break;
1811                     case AVMEDIA_TYPE_VIDEO:
1812 #if CONFIG_AVFILTER
1813                         if (ost->picref->video && !ost->frame_aspect_ratio)
1814                             ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1815 #endif
1816                         do_video_out(os, ost, ist, &picture, &frame_size,
1817                                         same_quant ? quality : ost->st->codec->global_quality);
1818                         if (vstats_filename && frame_size)
1819                             do_video_stats(os, ost, frame_size);
1820                         break;
1821                     case AVMEDIA_TYPE_SUBTITLE:
1822                         do_subtitle_out(os, ost, ist, &subtitle,
1823                                         pkt->pts);
1824                         break;
1825                     default:
1826                         abort();
1827                     }
1828                 } else {
1829                     AVFrame avframe; //FIXME/XXX remove this
1830                     AVPicture pict;
1831                     AVPacket opkt;
1832                     int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1833                     av_init_packet(&opkt);
1834
1835                     if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1836 #if !CONFIG_AVFILTER
1837                         continue;
1838 #else
1839                         goto cont;
1840 #endif
1841
1842                     /* no reencoding needed : output the packet directly */
1843                     /* force the input stream PTS */
1844
1845                     avcodec_get_frame_defaults(&avframe);
1846                     ost->st->codec->coded_frame= &avframe;
1847                     avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1848
1849                     if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1850                         audio_size += data_size;
1851                     else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1852                         video_size += data_size;
1853                         ost->sync_opts++;
1854                     }
1855
1856                     opkt.stream_index= ost->index;
1857                     if(pkt->pts != AV_NOPTS_VALUE)
1858                         opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1859                     else
1860                         opkt.pts= AV_NOPTS_VALUE;
1861
1862                     if (pkt->dts == AV_NOPTS_VALUE)
1863                         opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1864                     else
1865                         opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1866                     opkt.dts -= ost_tb_start_time;
1867
1868                     opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1869                     opkt.flags= pkt->flags;
1870
1871                     //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1872                     if(   ost->st->codec->codec_id != CODEC_ID_H264
1873                        && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1874                        && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1875                        ) {
1876                         if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1877                             opkt.destruct= av_destruct_packet;
1878                     } else {
1879                         opkt.data = data_buf;
1880                         opkt.size = data_size;
1881                     }
1882
1883                     if (os->oformat->flags & AVFMT_RAWPICTURE) {
1884                         /* store AVPicture in AVPacket, as expected by the output format */
1885                         avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1886                         opkt.data = (uint8_t *)&pict;
1887                         opkt.size = sizeof(AVPicture);
1888                         opkt.flags |= AV_PKT_FLAG_KEY;
1889                     }
1890                     write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1891                     ost->st->codec->frame_number++;
1892                     ost->frame_number++;
1893                     av_free_packet(&opkt);
1894                 }
1895 #if CONFIG_AVFILTER
1896                 cont:
1897                 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1898                                    ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1899                 if (ost->picref)
1900                     avfilter_unref_buffer(ost->picref);
1901             }
1902 #endif
1903             }
1904
1905         av_free(buffer_to_free);
1906         /* XXX: allocate the subtitles in the codec ? */
1907         if (subtitle_to_free) {
1908             avsubtitle_free(subtitle_to_free);
1909             subtitle_to_free = NULL;
1910         }
1911     }
1912  discard_packet:
1913
1914     return 0;
1915 }
1916
1917 static void print_sdp(OutputFile *output_files, int n)
1918 {
1919     char sdp[2048];
1920     int i;
1921     AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1922
1923     if (!avc)
1924         exit_program(1);
1925     for (i = 0; i < n; i++)
1926         avc[i] = output_files[i].ctx;
1927
1928     av_sdp_create(avc, n, sdp, sizeof(sdp));
1929     printf("SDP:\n%s\n", sdp);
1930     fflush(stdout);
1931     av_freep(&avc);
1932 }
1933
1934 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1935                              char *error, int error_len)
1936 {
1937     int i;
1938     InputStream *ist = &input_streams[ist_index];
1939     if (ist->decoding_needed) {
1940         AVCodec *codec = ist->dec;
1941         if (!codec) {
1942             snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1943                     ist->st->codec->codec_id, ist->file_index, ist->st->index);
1944             return AVERROR(EINVAL);
1945         }
1946
1947         if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1948             snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1949                     ist->file_index, ist->st->index);
1950             return AVERROR(EINVAL);
1951         }
1952         assert_codec_experimental(ist->st->codec, 0);
1953         assert_avoptions(ist->opts);
1954     }
1955
1956     ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
1957     ist->next_pts = AV_NOPTS_VALUE;
1958     ist->is_start = 1;
1959
1960     return 0;
1961 }
1962
1963 static int transcode_init(OutputFile *output_files,
1964                           int nb_output_files,
1965                           InputFile *input_files,
1966                           int nb_input_files)
1967 {
1968     int ret = 0, i, j, k;
1969     AVFormatContext *os;
1970     AVCodecContext *codec, *icodec;
1971     OutputStream *ost;
1972     InputStream *ist;
1973     char error[1024];
1974     int want_sdp = 1;
1975
1976     /* init framerate emulation */
1977     for (i = 0; i < nb_input_files; i++) {
1978         InputFile *ifile = &input_files[i];
1979         if (ifile->rate_emu)
1980             for (j = 0; j < ifile->nb_streams; j++)
1981                 input_streams[j + ifile->ist_index].start = av_gettime();
1982     }
1983
1984     /* output stream init */
1985     for(i=0;i<nb_output_files;i++) {
1986         os = output_files[i].ctx;
1987         if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1988             av_dump_format(os, i, os->filename, 1);
1989             fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1990             return AVERROR(EINVAL);
1991         }
1992     }
1993
1994     /* for each output stream, we compute the right encoding parameters */
1995     for (i = 0; i < nb_output_streams; i++) {
1996         ost = &output_streams[i];
1997         os = output_files[ost->file_index].ctx;
1998         ist = &input_streams[ost->source_index];
1999
2000         codec = ost->st->codec;
2001         icodec = ist->st->codec;
2002
2003         ost->st->disposition = ist->st->disposition;
2004         codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2005         codec->chroma_sample_location = icodec->chroma_sample_location;
2006
2007         if (ost->st->stream_copy) {
2008             uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2009
2010             if (extra_size > INT_MAX) {
2011                 return AVERROR(EINVAL);
2012             }
2013
2014             /* if stream_copy is selected, no need to decode or encode */
2015             codec->codec_id = icodec->codec_id;
2016             codec->codec_type = icodec->codec_type;
2017
2018             if(!codec->codec_tag){
2019                 if(   !os->oformat->codec_tag
2020                    || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2021                    || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2022                     codec->codec_tag = icodec->codec_tag;
2023             }
2024
2025             codec->bit_rate = icodec->bit_rate;
2026             codec->rc_max_rate    = icodec->rc_max_rate;
2027             codec->rc_buffer_size = icodec->rc_buffer_size;
2028             codec->extradata= av_mallocz(extra_size);
2029             if (!codec->extradata) {
2030                 return AVERROR(ENOMEM);
2031             }
2032             memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2033             codec->extradata_size= icodec->extradata_size;
2034
2035             codec->time_base = ist->st->time_base;
2036             if(!strcmp(os->oformat->name, "avi")) {
2037                 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2038                     codec->time_base = icodec->time_base;
2039                     codec->time_base.num *= icodec->ticks_per_frame;
2040                     codec->time_base.den *= 2;
2041                 }
2042             } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2043                 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2044                     codec->time_base = icodec->time_base;
2045                     codec->time_base.num *= icodec->ticks_per_frame;
2046                 }
2047             }
2048             av_reduce(&codec->time_base.num, &codec->time_base.den,
2049                         codec->time_base.num, codec->time_base.den, INT_MAX);
2050
2051             switch(codec->codec_type) {
2052             case AVMEDIA_TYPE_AUDIO:
2053                 if(audio_volume != 256) {
2054                     fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2055                     exit_program(1);
2056                 }
2057                 codec->channel_layout = icodec->channel_layout;
2058                 codec->sample_rate = icodec->sample_rate;
2059                 codec->channels = icodec->channels;
2060                 codec->frame_size = icodec->frame_size;
2061                 codec->audio_service_type = icodec->audio_service_type;
2062                 codec->block_align= icodec->block_align;
2063                 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2064                     codec->block_align= 0;
2065                 if(codec->codec_id == CODEC_ID_AC3)
2066                     codec->block_align= 0;
2067                 break;
2068             case AVMEDIA_TYPE_VIDEO:
2069                 codec->pix_fmt = icodec->pix_fmt;
2070                 codec->width = icodec->width;
2071                 codec->height = icodec->height;
2072                 codec->has_b_frames = icodec->has_b_frames;
2073                 if (!codec->sample_aspect_ratio.num) {
2074                     codec->sample_aspect_ratio =
2075                     ost->st->sample_aspect_ratio =
2076                         ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2077                         ist->st->codec->sample_aspect_ratio.num ?
2078                         ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2079                 }
2080                 break;
2081             case AVMEDIA_TYPE_SUBTITLE:
2082                 codec->width = icodec->width;
2083                 codec->height = icodec->height;
2084                 break;
2085             case AVMEDIA_TYPE_DATA:
2086                 break;
2087             default:
2088                 abort();
2089             }
2090         } else {
2091             if (!ost->enc)
2092                 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2093             switch(codec->codec_type) {
2094             case AVMEDIA_TYPE_AUDIO:
2095                 ost->fifo= av_fifo_alloc(1024);
2096                 if (!ost->fifo) {
2097                     return AVERROR(ENOMEM);
2098                 }
2099                 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2100                 if (!codec->sample_rate) {
2101                     codec->sample_rate = icodec->sample_rate;
2102                 }
2103                 choose_sample_rate(ost->st, ost->enc);
2104                 codec->time_base = (AVRational){1, codec->sample_rate};
2105                 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2106                     codec->sample_fmt = icodec->sample_fmt;
2107                 choose_sample_fmt(ost->st, ost->enc);
2108                 if (!codec->channels) {
2109                     codec->channels = icodec->channels;
2110                     codec->channel_layout = icodec->channel_layout;
2111                 }
2112                 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2113                     codec->channel_layout = 0;
2114                 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2115                 icodec->request_channels = codec->channels;
2116                 ist->decoding_needed = 1;
2117                 ost->encoding_needed = 1;
2118                 ost->resample_sample_fmt  = icodec->sample_fmt;
2119                 ost->resample_sample_rate = icodec->sample_rate;
2120                 ost->resample_channels    = icodec->channels;
2121                 break;
2122             case AVMEDIA_TYPE_VIDEO:
2123                 if (codec->pix_fmt == PIX_FMT_NONE)
2124                     codec->pix_fmt = icodec->pix_fmt;
2125                 choose_pixel_fmt(ost->st, ost->enc);
2126
2127                 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2128                     fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2129                     exit_program(1);
2130                 }
2131
2132                 if (!codec->width || !codec->height) {
2133                     codec->width  = icodec->width;
2134                     codec->height = icodec->height;
2135                 }
2136
2137                 ost->video_resample = codec->width   != icodec->width  ||
2138                                       codec->height  != icodec->height ||
2139                                       codec->pix_fmt != icodec->pix_fmt;
2140                 if (ost->video_resample) {
2141                     codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2142                 }
2143
2144                 ost->resample_height = icodec->height;
2145                 ost->resample_width  = icodec->width;
2146                 ost->resample_pix_fmt= icodec->pix_fmt;
2147                 ost->encoding_needed = 1;
2148                 ist->decoding_needed = 1;
2149
2150                 if (!ost->frame_rate.num)
2151                     ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2152                 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2153                     int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2154                     ost->frame_rate = ost->enc->supported_framerates[idx];
2155                 }
2156                 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2157                 if(   av_q2d(codec->time_base) < 0.001 && video_sync_method
2158                    && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2159                     av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2160                                                "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2161                 }
2162
2163 #if CONFIG_AVFILTER
2164                 if (configure_video_filters(ist, ost)) {
2165                     fprintf(stderr, "Error opening filters!\n");
2166                     exit(1);
2167                 }
2168 #endif
2169                 break;
2170             case AVMEDIA_TYPE_SUBTITLE:
2171                 ost->encoding_needed = 1;
2172                 ist->decoding_needed = 1;
2173                 break;
2174             default:
2175                 abort();
2176                 break;
2177             }
2178             /* two pass mode */
2179             if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2180                 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2181                 char logfilename[1024];
2182                 FILE *f;
2183
2184                 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2185                          pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2186                          i);
2187                 if (codec->flags & CODEC_FLAG_PASS1) {
2188                     f = fopen(logfilename, "wb");
2189                     if (!f) {
2190                         fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2191                         exit_program(1);
2192                     }
2193                     ost->logfile = f;
2194                 } else {
2195                     char  *logbuffer;
2196                     size_t logbuffer_size;
2197                     if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2198                         fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2199                         exit_program(1);
2200                     }
2201                     codec->stats_in = logbuffer;
2202                 }
2203             }
2204         }
2205         if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2206             /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2207             int size= codec->width * codec->height;
2208             bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2209         }
2210     }
2211
2212     if (!bit_buffer)
2213         bit_buffer = av_malloc(bit_buffer_size);
2214     if (!bit_buffer) {
2215         fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2216                 bit_buffer_size);
2217         return AVERROR(ENOMEM);
2218     }
2219
2220     /* open each encoder */
2221     for (i = 0; i < nb_output_streams; i++) {
2222         ost = &output_streams[i];
2223         if (ost->encoding_needed) {
2224             AVCodec *codec = ost->enc;
2225             AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2226             if (!codec) {
2227                 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2228                          ost->st->codec->codec_id, ost->file_index, ost->index);
2229                 ret = AVERROR(EINVAL);
2230                 goto dump_format;
2231             }
2232             if (dec->subtitle_header) {
2233                 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2234                 if (!ost->st->codec->subtitle_header) {
2235                     ret = AVERROR(ENOMEM);
2236                     goto dump_format;
2237                 }
2238                 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2239                 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2240             }
2241             if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2242                 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2243                         ost->file_index, ost->index);
2244                 ret = AVERROR(EINVAL);
2245                 goto dump_format;
2246             }
2247             assert_codec_experimental(ost->st->codec, 1);
2248             assert_avoptions(ost->opts);
2249             if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2250                 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2251                                              "It takes bits/s as argument, not kbits/s\n");
2252             extra_size += ost->st->codec->extradata_size;
2253
2254             if (ost->st->codec->me_threshold)
2255                 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2256         }
2257     }
2258
2259     /* init input streams */
2260     for (i = 0; i < nb_input_streams; i++)
2261         if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2262             goto dump_format;
2263
2264     /* discard unused programs */
2265     for (i = 0; i < nb_input_files; i++) {
2266         InputFile *ifile = &input_files[i];
2267         for (j = 0; j < ifile->ctx->nb_programs; j++) {
2268             AVProgram *p = ifile->ctx->programs[j];
2269             int discard  = AVDISCARD_ALL;
2270
2271             for (k = 0; k < p->nb_stream_indexes; k++)
2272                 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2273                     discard = AVDISCARD_DEFAULT;
2274                     break;
2275                 }
2276             p->discard = discard;
2277         }
2278     }
2279
2280     /* open files and write file headers */
2281     for (i = 0; i < nb_output_files; i++) {
2282         os = output_files[i].ctx;
2283         if (avformat_write_header(os, &output_files[i].opts) < 0) {
2284             snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2285             ret = AVERROR(EINVAL);
2286             goto dump_format;
2287         }
2288 //        assert_avoptions(output_files[i].opts);
2289         if (strcmp(os->oformat->name, "rtp")) {
2290             want_sdp = 0;
2291         }
2292     }
2293
2294  dump_format:
2295     /* dump the file output parameters - cannot be done before in case
2296        of stream copy */
2297     for(i=0;i<nb_output_files;i++) {
2298         av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2299     }
2300
2301     /* dump the stream mapping */
2302     if (verbose >= 0) {
2303         fprintf(stderr, "Stream mapping:\n");
2304         for (i = 0; i < nb_output_streams;i ++) {
2305             ost = &output_streams[i];
2306             fprintf(stderr, "  Stream #%d.%d -> #%d.%d",
2307                     input_streams[ost->source_index].file_index,
2308                     input_streams[ost->source_index].st->index,
2309                     ost->file_index,
2310                     ost->index);
2311             if (ost->sync_ist != &input_streams[ost->source_index])
2312                 fprintf(stderr, " [sync #%d.%d]",
2313                         ost->sync_ist->file_index,
2314                         ost->sync_ist->st->index);
2315             if (ost->st->stream_copy)
2316                 fprintf(stderr, " (copy)");
2317             else
2318                 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2319                         input_streams[ost->source_index].dec->name : "?",
2320                         ost->enc ? ost->enc->name : "?");
2321             fprintf(stderr, "\n");
2322         }
2323     }
2324
2325     if (ret) {
2326         fprintf(stderr, "%s\n", error);
2327         return ret;
2328     }
2329
2330     if (want_sdp) {
2331         print_sdp(output_files, nb_output_files);
2332     }
2333
2334     return 0;
2335 }
2336
2337 /*
2338  * The following code is the main loop of the file converter
2339  */
2340 static int transcode(OutputFile *output_files,
2341                      int nb_output_files,
2342                      InputFile *input_files,
2343                      int nb_input_files)
2344 {
2345     int ret, i;
2346     AVFormatContext *is, *os;
2347     OutputStream *ost;
2348     InputStream *ist;
2349     uint8_t *no_packet;
2350     int no_packet_count=0;
2351     int64_t timer_start;
2352     int key;
2353
2354     if (!(no_packet = av_mallocz(nb_input_files)))
2355         exit_program(1);
2356
2357     ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2358     if (ret < 0)
2359         goto fail;
2360
2361     if (!using_stdin) {
2362         if(verbose >= 0)
2363             fprintf(stderr, "Press [q] to stop, [?] for help\n");
2364         avio_set_interrupt_cb(decode_interrupt_cb);
2365     }
2366     term_init();
2367
2368     timer_start = av_gettime();
2369
2370     for(; received_sigterm == 0;) {
2371         int file_index, ist_index;
2372         AVPacket pkt;
2373         int64_t ipts_min;
2374         double opts_min;
2375
2376         ipts_min = INT64_MAX;
2377         opts_min= 1e100;
2378         /* if 'q' pressed, exits */
2379         if (!using_stdin) {
2380             if (q_pressed)
2381                 break;
2382             /* read_key() returns 0 on EOF */
2383             key = read_key();
2384             if (key == 'q')
2385                 break;
2386             if (key == '+') verbose++;
2387             if (key == '-') verbose--;
2388             if (key == 's') qp_hist     ^= 1;
2389             if (key == 'h'){
2390                 if (do_hex_dump){
2391                     do_hex_dump = do_pkt_dump = 0;
2392                 } else if(do_pkt_dump){
2393                     do_hex_dump = 1;
2394                 } else
2395                     do_pkt_dump = 1;
2396                 av_log_set_level(AV_LOG_DEBUG);
2397             }
2398             if (key == 'd' || key == 'D'){
2399                 int debug=0;
2400                 if(key == 'D') {
2401                     debug = input_streams[0].st->codec->debug<<1;
2402                     if(!debug) debug = 1;
2403                     while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2404                         debug += debug;
2405                 }else
2406                     scanf("%d", &debug);
2407                 for(i=0;i<nb_input_streams;i++) {
2408                     input_streams[i].st->codec->debug = debug;
2409                 }
2410                 for(i=0;i<nb_output_streams;i++) {
2411                     ost = &output_streams[i];
2412                     ost->st->codec->debug = debug;
2413                 }
2414                 if(debug) av_log_set_level(AV_LOG_DEBUG);
2415                 fprintf(stderr,"debug=%d\n", debug);
2416             }
2417             if (key == '?'){
2418                 fprintf(stderr, "key    function\n"
2419                                 "?      show this help\n"
2420                                 "+      increase verbosity\n"
2421                                 "-      decrease verbosity\n"
2422                                 "D      cycle through available debug modes\n"
2423                                 "h      dump packets/hex press to cycle through the 3 states\n"
2424                                 "q      quit\n"
2425                                 "s      Show QP histogram\n"
2426                 );
2427             }
2428         }
2429
2430         /* select the stream that we must read now by looking at the
2431            smallest output pts */
2432         file_index = -1;
2433         for (i = 0; i < nb_output_streams; i++) {
2434             OutputFile *of;
2435             int64_t ipts;
2436             double  opts;
2437             ost = &output_streams[i];
2438             of = &output_files[ost->file_index];
2439             os = output_files[ost->file_index].ctx;
2440             ist = &input_streams[ost->source_index];
2441             if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2442                 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2443                 continue;
2444             opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2445             ipts = ist->pts;
2446             if (!input_files[ist->file_index].eof_reached){
2447                 if(ipts < ipts_min) {
2448                     ipts_min = ipts;
2449                     if(input_sync ) file_index = ist->file_index;
2450                 }
2451                 if(opts < opts_min) {
2452                     opts_min = opts;
2453                     if(!input_sync) file_index = ist->file_index;
2454                 }
2455             }
2456             if (ost->frame_number >= ost->max_frames) {
2457                 int j;
2458                 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2459                     output_streams[j].is_past_recording_time = 1;
2460                 continue;
2461             }
2462         }
2463         /* if none, if is finished */
2464         if (file_index < 0) {
2465             if(no_packet_count){
2466                 no_packet_count=0;
2467                 memset(no_packet, 0, nb_input_files);
2468                 usleep(10000);
2469                 continue;
2470             }
2471             break;
2472         }
2473
2474         /* read a frame from it and output it in the fifo */
2475         is = input_files[file_index].ctx;
2476         ret= av_read_frame(is, &pkt);
2477         if(ret == AVERROR(EAGAIN)){
2478             no_packet[file_index]=1;
2479             no_packet_count++;
2480             continue;
2481         }
2482         if (ret < 0) {
2483             input_files[file_index].eof_reached = 1;
2484             if (opt_shortest)
2485                 break;
2486             else
2487                 continue;
2488         }
2489
2490         no_packet_count=0;
2491         memset(no_packet, 0, nb_input_files);
2492
2493         if (do_pkt_dump) {
2494             av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2495                              is->streams[pkt.stream_index]);
2496         }
2497         /* the following test is needed in case new streams appear
2498            dynamically in stream : we ignore them */
2499         if (pkt.stream_index >= input_files[file_index].nb_streams)
2500             goto discard_packet;
2501         ist_index = input_files[file_index].ist_index + pkt.stream_index;
2502         ist = &input_streams[ist_index];
2503         if (ist->discard)
2504             goto discard_packet;
2505
2506         if (pkt.dts != AV_NOPTS_VALUE)
2507             pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2508         if (pkt.pts != AV_NOPTS_VALUE)
2509             pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2510
2511         if(pkt.pts != AV_NOPTS_VALUE)
2512             pkt.pts *= ist->ts_scale;
2513         if(pkt.dts != AV_NOPTS_VALUE)
2514             pkt.dts *= ist->ts_scale;
2515
2516 //        fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2517         if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2518             && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2519             int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2520             int64_t delta= pkt_dts - ist->next_pts;
2521             if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2522                 input_files[ist->file_index].ts_offset -= delta;
2523                 if (verbose > 2)
2524                     fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2525                             delta, input_files[ist->file_index].ts_offset);
2526                 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2527                 if(pkt.pts != AV_NOPTS_VALUE)
2528                     pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2529             }
2530         }
2531
2532         //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2533         if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2534
2535             if (verbose >= 0)
2536                 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2537                         ist->file_index, ist->st->index);
2538             if (exit_on_error)
2539                 exit_program(1);
2540             av_free_packet(&pkt);
2541             continue;
2542         }
2543
2544     discard_packet:
2545         av_free_packet(&pkt);
2546
2547         /* dump report by using the output first video and audio streams */
2548         print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2549     }
2550
2551     /* at the end of stream, we must flush the decoder buffers */
2552     for (i = 0; i < nb_input_streams; i++) {
2553         ist = &input_streams[i];
2554         if (ist->decoding_needed) {
2555             output_packet(ist, i, output_streams, nb_output_streams, NULL);
2556         }
2557     }
2558     flush_encoders(output_streams, nb_output_streams);
2559
2560     term_exit();
2561
2562     /* write the trailer if needed and close file */
2563     for(i=0;i<nb_output_files;i++) {
2564         os = output_files[i].ctx;
2565         av_write_trailer(os);
2566     }
2567
2568     /* dump report by using the first video and audio streams */
2569     print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2570
2571     /* close each encoder */
2572     for (i = 0; i < nb_output_streams; i++) {
2573         ost = &output_streams[i];
2574         if (ost->encoding_needed) {
2575             av_freep(&ost->st->codec->stats_in);
2576             avcodec_close(ost->st->codec);
2577         }
2578 #if CONFIG_AVFILTER
2579         avfilter_graph_free(&ost->graph);
2580 #endif
2581     }
2582
2583     /* close each decoder */
2584     for (i = 0; i < nb_input_streams; i++) {
2585         ist = &input_streams[i];
2586         if (ist->decoding_needed) {
2587             avcodec_close(ist->st->codec);
2588         }
2589     }
2590
2591     /* finished ! */
2592     ret = 0;
2593
2594  fail:
2595     av_freep(&bit_buffer);
2596     av_freep(&no_packet);
2597
2598     if (output_streams) {
2599         for (i = 0; i < nb_output_streams; i++) {
2600             ost = &output_streams[i];
2601             if (ost) {
2602                 if (ost->st->stream_copy)
2603                     av_freep(&ost->st->codec->extradata);
2604                 if (ost->logfile) {
2605                     fclose(ost->logfile);
2606                     ost->logfile = NULL;
2607                 }
2608                 av_fifo_free(ost->fifo); /* works even if fifo is not
2609                                              initialized but set to zero */
2610                 av_freep(&ost->st->codec->subtitle_header);
2611                 av_free(ost->resample_frame.data[0]);
2612                 av_free(ost->forced_kf_pts);
2613                 if (ost->video_resample)
2614                     sws_freeContext(ost->img_resample_ctx);
2615                 if (ost->resample)
2616                     audio_resample_close(ost->resample);
2617                 if (ost->reformat_ctx)
2618                     av_audio_convert_free(ost->reformat_ctx);
2619                 av_dict_free(&ost->opts);
2620             }
2621         }
2622     }
2623     return ret;
2624 }
2625
2626 static int opt_verbose(const char *opt, const char *arg)
2627 {
2628     verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2629     return 0;
2630 }
2631
2632 static double parse_frame_aspect_ratio(const char *arg)
2633 {
2634     int x = 0, y = 0;
2635     double ar = 0;
2636     const char *p;
2637     char *end;
2638
2639     p = strchr(arg, ':');
2640     if (p) {
2641         x = strtol(arg, &end, 10);
2642         if (end == p)
2643             y = strtol(end+1, &end, 10);
2644         if (x > 0 && y > 0)
2645             ar = (double)x / (double)y;
2646     } else
2647         ar = strtod(arg, NULL);
2648
2649     if (!ar) {
2650         fprintf(stderr, "Incorrect aspect ratio specification.\n");
2651         exit_program(1);
2652     }
2653     return ar;
2654 }
2655
2656 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2657 {
2658     return parse_option(o, "codec:a", arg, options);
2659 }
2660
2661 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2662 {
2663     return parse_option(o, "codec:v", arg, options);
2664 }
2665
2666 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2667 {
2668     return parse_option(o, "codec:s", arg, options);
2669 }
2670
2671 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2672 {
2673     return parse_option(o, "codec:d", arg, options);
2674 }
2675
2676 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2677 {
2678     StreamMap *m = NULL;
2679     int i, negative = 0, file_idx;
2680     int sync_file_idx = -1, sync_stream_idx;
2681     char *p, *sync;
2682     char *map;
2683
2684     if (*arg == '-') {
2685         negative = 1;
2686         arg++;
2687     }
2688     map = av_strdup(arg);
2689
2690     /* parse sync stream first, just pick first matching stream */
2691     if (sync = strchr(map, ',')) {
2692         *sync = 0;
2693         sync_file_idx = strtol(sync + 1, &sync, 0);
2694         if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2695             av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2696             exit_program(1);
2697         }
2698         if (*sync)
2699             sync++;
2700         for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2701             if (check_stream_specifier(input_files[sync_file_idx].ctx,
2702                                        input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2703                 sync_stream_idx = i;
2704                 break;
2705             }
2706         if (i == input_files[sync_file_idx].nb_streams) {
2707             av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2708                                        "match any streams.\n", arg);
2709             exit_program(1);
2710         }
2711     }
2712
2713
2714     file_idx = strtol(map, &p, 0);
2715     if (file_idx >= nb_input_files || file_idx < 0) {
2716         av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2717         exit_program(1);
2718     }
2719     if (negative)
2720         /* disable some already defined maps */
2721         for (i = 0; i < o->nb_stream_maps; i++) {
2722             m = &o->stream_maps[i];
2723             if (check_stream_specifier(input_files[m->file_index].ctx,
2724                                        input_files[m->file_index].ctx->streams[m->stream_index],
2725                                        *p == ':' ? p + 1 : p) > 0)
2726                 m->disabled = 1;
2727         }
2728     else
2729         for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2730             if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2731                         *p == ':' ? p + 1 : p) <= 0)
2732                 continue;
2733             o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2734                                         &o->nb_stream_maps, o->nb_stream_maps + 1);
2735             m = &o->stream_maps[o->nb_stream_maps - 1];
2736
2737             m->file_index   = file_idx;
2738             m->stream_index = i;
2739
2740             if (sync_file_idx >= 0) {
2741                 m->sync_file_index   = sync_file_idx;
2742                 m->sync_stream_index = sync_stream_idx;
2743             } else {
2744                 m->sync_file_index   = file_idx;
2745                 m->sync_stream_index = i;
2746             }
2747         }
2748
2749     if (!m) {
2750         av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2751         exit_program(1);
2752     }
2753
2754     av_freep(&map);
2755     return 0;
2756 }
2757
2758 static void parse_meta_type(char *arg, char *type, int *index)
2759 {
2760     if (*arg) {
2761         *type = *arg;
2762         switch (*arg) {
2763         case 'g':
2764             break;
2765         case 's':
2766         case 'c':
2767         case 'p':
2768             if (*(++arg) == ':')
2769                 *index = strtol(++arg, NULL, 0);
2770             break;
2771         default:
2772             fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2773             exit_program(1);
2774         }
2775     } else
2776         *type = 'g';
2777 }
2778
2779 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2780 {
2781     MetadataMap *m, *m1;
2782     char *p;
2783
2784     o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2785                                    &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2786
2787     m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2788     m->file = strtol(arg, &p, 0);
2789     parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2790
2791     m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2792     if (p = strchr(opt, ':'))
2793         parse_meta_type(p + 1, &m1->type, &m1->index);
2794     else
2795         m1->type = 'g';
2796
2797     if (m->type == 'g' || m1->type == 'g')
2798         o->metadata_global_manual = 1;
2799     if (m->type == 's' || m1->type == 's')
2800         o->metadata_streams_manual = 1;
2801     if (m->type == 'c' || m1->type == 'c')
2802         o->metadata_chapters_manual = 1;
2803
2804     return 0;
2805 }
2806
2807 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2808 {
2809     const char *codec_string = encoder ? "encoder" : "decoder";
2810     AVCodec *codec;
2811
2812     if(!name)
2813         return CODEC_ID_NONE;
2814     codec = encoder ?
2815         avcodec_find_encoder_by_name(name) :
2816         avcodec_find_decoder_by_name(name);
2817     if(!codec) {
2818         av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2819         exit_program(1);
2820     }
2821     if(codec->type != type) {
2822         av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2823         exit_program(1);
2824     }
2825     return codec->id;
2826 }
2827
2828 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2829 {
2830     char *codec_name = NULL;
2831
2832     MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2833
2834     if (!codec_name) {
2835         if (s->oformat) {
2836             st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2837             return avcodec_find_encoder(st->codec->codec_id);
2838         }
2839     } else if (!strcmp(codec_name, "copy"))
2840         st->stream_copy = 1;
2841     else {
2842         st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2843         return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2844                             avcodec_find_decoder_by_name(codec_name);
2845     }
2846
2847     return NULL;
2848 }
2849
2850 /**
2851  * Add all the streams from the given input file to the global
2852  * list of input streams.
2853  */
2854 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2855 {
2856     int i, rfps, rfps_base;
2857
2858     for (i = 0; i < ic->nb_streams; i++) {
2859         AVStream *st = ic->streams[i];
2860         AVCodecContext *dec = st->codec;
2861         InputStream *ist;
2862         double scale = 1.0;
2863
2864         input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2865         ist = &input_streams[nb_input_streams - 1];
2866         ist->st = st;
2867         ist->file_index = nb_input_files;
2868         ist->discard = 1;
2869         ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2870
2871         MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2872         ist->ts_scale = scale;
2873
2874         ist->dec = choose_codec(o, ic, st, dec->codec_type);
2875         if (!ist->dec)
2876             ist->dec = avcodec_find_decoder(dec->codec_id);
2877
2878         switch (dec->codec_type) {
2879         case AVMEDIA_TYPE_AUDIO:
2880             if(!ist->dec)
2881                 ist->dec = avcodec_find_decoder(dec->codec_id);
2882             if(o->audio_disable)
2883                 st->discard= AVDISCARD_ALL;
2884             break;
2885         case AVMEDIA_TYPE_VIDEO:
2886             if(!ist->dec)
2887                 ist->dec = avcodec_find_decoder(dec->codec_id);
2888             rfps      = ic->streams[i]->r_frame_rate.num;
2889             rfps_base = ic->streams[i]->r_frame_rate.den;
2890             if (dec->lowres) {
2891                 dec->flags |= CODEC_FLAG_EMU_EDGE;
2892             }
2893
2894             if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2895
2896                 if (verbose >= 0)
2897                     fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2898                             i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2899
2900                     (float)rfps / rfps_base, rfps, rfps_base);
2901             }
2902
2903             if (o->video_disable)
2904                 st->discard= AVDISCARD_ALL;
2905             else if(video_discard)
2906                 st->discard= video_discard;
2907             break;
2908         case AVMEDIA_TYPE_DATA:
2909             break;
2910         case AVMEDIA_TYPE_SUBTITLE:
2911             if(!ist->dec)
2912                 ist->dec = avcodec_find_decoder(dec->codec_id);
2913             if(o->subtitle_disable)
2914                 st->discard = AVDISCARD_ALL;
2915             break;
2916         case AVMEDIA_TYPE_ATTACHMENT:
2917         case AVMEDIA_TYPE_UNKNOWN:
2918             break;
2919         default:
2920             abort();
2921         }
2922     }
2923 }
2924
2925 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2926 {
2927     AVFormatContext *ic;
2928     AVInputFormat *file_iformat = NULL;
2929     int err, i, ret;
2930     int64_t timestamp;
2931     uint8_t buf[128];
2932     AVDictionary **opts;
2933     int orig_nb_streams;                     // number of streams before avformat_find_stream_info
2934
2935     if (o->format) {
2936         if (!(file_iformat = av_find_input_format(o->format))) {
2937             fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2938             exit_program(1);
2939         }
2940     }
2941
2942     if (!strcmp(filename, "-"))
2943         filename = "pipe:";
2944
2945     using_stdin |= !strncmp(filename, "pipe:", 5) ||
2946                     !strcmp(filename, "/dev/stdin");
2947
2948     /* get default parameters from command line */
2949     ic = avformat_alloc_context();
2950     if (!ic) {
2951         print_error(filename, AVERROR(ENOMEM));
2952         exit_program(1);
2953     }
2954     if (o->nb_audio_sample_rate) {
2955         snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2956         av_dict_set(&format_opts, "sample_rate", buf, 0);
2957     }
2958     if (o->nb_audio_channels) {
2959         snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2960         av_dict_set(&format_opts, "channels", buf, 0);
2961     }
2962     if (o->nb_frame_rates) {
2963         av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2964     }
2965     if (o->nb_frame_sizes) {
2966         av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2967     }
2968     if (o->nb_frame_pix_fmts)
2969         av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2970
2971     ic->flags |= AVFMT_FLAG_NONBLOCK;
2972
2973     /* open the input file with generic libav function */
2974     err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2975     if (err < 0) {
2976         print_error(filename, err);
2977         exit_program(1);
2978     }
2979     assert_avoptions(format_opts);
2980
2981     /* apply forced codec ids */
2982     for (i = 0; i < ic->nb_streams; i++)
2983         choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2984
2985     /* Set AVCodecContext options for avformat_find_stream_info */
2986     opts = setup_find_stream_info_opts(ic, codec_opts);
2987     orig_nb_streams = ic->nb_streams;
2988
2989     /* If not enough info to get the stream parameters, we decode the
2990        first frames to get it. (used in mpeg case for example) */
2991     ret = avformat_find_stream_info(ic, opts);
2992     if (ret < 0 && verbose >= 0) {
2993         fprintf(stderr, "%s: could not find codec parameters\n", filename);
2994         av_close_input_file(ic);
2995         exit_program(1);
2996     }
2997
2998     timestamp = o->start_time;
2999     /* add the stream start time */
3000     if (ic->start_time != AV_NOPTS_VALUE)
3001         timestamp += ic->start_time;
3002
3003     /* if seeking requested, we execute it */
3004     if (o->start_time != 0) {
3005         ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3006         if (ret < 0) {
3007             fprintf(stderr, "%s: could not seek to position %0.3f\n",
3008                     filename, (double)timestamp / AV_TIME_BASE);
3009         }
3010     }
3011
3012     /* update the current parameters so that they match the one of the input stream */
3013     add_input_streams(o, ic);
3014
3015     /* dump the file content */
3016     if (verbose >= 0)
3017         av_dump_format(ic, nb_input_files, filename, 0);
3018
3019     input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3020     input_files[nb_input_files - 1].ctx        = ic;
3021     input_files[nb_input_files - 1].ist_index  = nb_input_streams - ic->nb_streams;
3022     input_files[nb_input_files - 1].ts_offset  = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3023     input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3024     input_files[nb_input_files - 1].rate_emu   = o->rate_emu;
3025
3026     for (i = 0; i < orig_nb_streams; i++)
3027         av_dict_free(&opts[i]);
3028     av_freep(&opts);
3029
3030     reset_options(o);
3031     return 0;
3032 }
3033
3034 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3035                                     AVCodecContext *avctx)
3036 {
3037     char *p;
3038     int n = 1, i;
3039     int64_t t;
3040
3041     for (p = kf; *p; p++)
3042         if (*p == ',')
3043             n++;
3044     ost->forced_kf_count = n;
3045     ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3046     if (!ost->forced_kf_pts) {
3047         av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3048         exit_program(1);
3049     }
3050     for (i = 0; i < n; i++) {
3051         p = i ? strchr(p, ',') + 1 : kf;
3052         t = parse_time_or_die("force_key_frames", p, 1);
3053         ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3054     }
3055 }
3056
3057 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3058 {
3059     OutputStream *ost;
3060     AVStream *st = av_new_stream(oc, oc->nb_streams < o->nb_streamid_map ? o->streamid_map[oc->nb_streams] : 0);
3061     int idx      = oc->nb_streams - 1;
3062     int64_t max_frames = INT64_MAX;
3063     char *bsf = NULL, *next, *codec_tag = NULL;
3064     AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3065     double qscale = -1;
3066
3067     if (!st) {
3068         av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3069         exit_program(1);
3070     }
3071
3072     output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3073                                 nb_output_streams + 1);
3074     ost = &output_streams[nb_output_streams - 1];
3075     ost->file_index = nb_output_files;
3076     ost->index = idx;
3077     ost->st    = st;
3078     st->codec->codec_type = type;
3079     ost->enc = choose_codec(o, oc, st, type);
3080     if (ost->enc) {
3081         ost->opts  = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3082     }
3083
3084     avcodec_get_context_defaults3(st->codec, ost->enc);
3085     st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3086
3087     MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3088     ost->max_frames = max_frames;
3089
3090     MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3091     while (bsf) {
3092         if (next = strchr(bsf, ','))
3093             *next++ = 0;
3094         if (!(bsfc = av_bitstream_filter_init(bsf))) {
3095             av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3096             exit_program(1);
3097         }
3098         if (bsfc_prev)
3099             bsfc_prev->next = bsfc;
3100         else
3101             ost->bitstream_filters = bsfc;
3102
3103         bsfc_prev = bsfc;
3104         bsf       = next;
3105     }
3106
3107     MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3108     if (codec_tag) {
3109         uint32_t tag = strtol(codec_tag, &next, 0);
3110         if (*next)
3111             tag = AV_RL32(codec_tag);
3112         st->codec->codec_tag = tag;
3113     }
3114
3115     MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3116     if (qscale >= 0 || same_quant) {
3117         st->codec->flags |= CODEC_FLAG_QSCALE;
3118         st->codec->global_quality = FF_QP2LAMBDA * qscale;
3119     }
3120
3121     ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3122     return ost;
3123 }
3124
3125 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3126 {
3127     int i;
3128     const char *p = str;
3129     for(i = 0;; i++) {
3130         dest[i] = atoi(p);
3131         if(i == 63)
3132             break;
3133         p = strchr(p, ',');
3134         if(!p) {
3135             fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3136             exit_program(1);
3137         }
3138         p++;
3139     }
3140 }
3141
3142 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3143 {
3144     AVStream *st;
3145     OutputStream *ost;
3146     AVCodecContext *video_enc;
3147
3148     ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3149     st  = ost->st;
3150     video_enc = st->codec;
3151
3152     if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3153         video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3154     }
3155
3156     if (!st->stream_copy) {
3157         const char *p = NULL;
3158         char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3159         char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3160         char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3161         int i, force_fps = 0, top_field_first = -1;
3162
3163         MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3164         if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3165             av_log(NULL, AV_LOG_ERROR, "Invalid framerate value: %s\n", frame_rate);
3166             exit_program(1);
3167         }
3168
3169         MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3170         if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3171             av_log(NULL, AV_LOG_ERROR, "Invalid frame size: %s.\n", frame_size);
3172             exit_program(1);
3173         }
3174
3175         MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3176         if (frame_aspect_ratio)
3177             ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3178
3179         MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3180         if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3181             av_log(NULL, AV_LOG_ERROR, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3182             exit_program(1);
3183         }
3184         st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3185
3186         MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3187         if (intra_matrix) {
3188             if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3189                 av_log(NULL, AV_LOG_ERROR, "Could not allocate memory for intra matrix.\n");
3190                 exit_program(1);
3191             }
3192             parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3193         }
3194         MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3195         if (inter_matrix) {
3196             if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3197                 av_log(NULL, AV_LOG_ERROR, "Could not allocate memory for inter matrix.\n");
3198                 exit_program(1);
3199             }
3200             parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3201         }
3202
3203         MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3204         for(i=0; p; i++){
3205             int start, end, q;
3206             int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3207             if(e!=3){
3208                 fprintf(stderr, "error parsing rc_override\n");
3209                 exit_program(1);
3210             }
3211             video_enc->rc_override=
3212                 av_realloc(video_enc->rc_override,
3213                            sizeof(RcOverride)*(i+1));
3214             video_enc->rc_override[i].start_frame= start;
3215             video_enc->rc_override[i].end_frame  = end;
3216             if(q>0){
3217                 video_enc->rc_override[i].qscale= q;
3218                 video_enc->rc_override[i].quality_factor= 1.0;
3219             }
3220             else{
3221                 video_enc->rc_override[i].qscale= 0;
3222                 video_enc->rc_override[i].quality_factor= -q/100.0;
3223             }
3224             p= strchr(p, '/');
3225             if(p) p++;
3226         }
3227         video_enc->rc_override_count=i;
3228         if (!video_enc->rc_initial_buffer_occupancy)
3229             video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3230         video_enc->intra_dc_precision= intra_dc_precision - 8;
3231
3232         /* two pass mode */
3233         if (do_pass) {
3234             if (do_pass == 1) {
3235                 video_enc->flags |= CODEC_FLAG_PASS1;
3236             } else {
3237                 video_enc->flags |= CODEC_FLAG_PASS2;
3238             }
3239         }
3240
3241         MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3242         if (forced_key_frames)
3243             parse_forced_key_frames(forced_key_frames, ost, video_enc);
3244
3245         MATCH_PER_STREAM_OPT(force_fps, i, force_fps, oc, st);
3246         ost->force_fps = force_fps;
3247
3248         MATCH_PER_STREAM_OPT(top_field_first, i, top_field_first, oc, st);
3249         ost->top_field_first = top_field_first;
3250
3251 #if CONFIG_AVFILTER
3252         MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3253         if (filters)
3254             ost->avfilter = av_strdup(filters);
3255 #endif
3256     }
3257
3258     return ost;
3259 }
3260
3261 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3262 {
3263     AVStream *st;
3264     OutputStream *ost;
3265     AVCodecContext *audio_enc;
3266
3267     ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3268     st  = ost->st;
3269
3270     audio_enc = st->codec;
3271     audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3272
3273     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3274         audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3275     }
3276     if (!st->stream_copy) {
3277         char *sample_fmt = NULL;
3278
3279         MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3280
3281         MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3282         if (sample_fmt &&
3283             (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3284             av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", sample_fmt);
3285             exit_program(1);
3286         }
3287
3288         MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3289     }
3290
3291     return ost;
3292 }
3293
3294 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3295 {
3296     AVStream *st;
3297     OutputStream *ost;
3298     AVCodecContext *data_enc;
3299
3300     ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3301     st  = ost->st;
3302     data_enc = st->codec;
3303     if (!st->stream_copy) {
3304         fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3305         exit_program(1);
3306     }
3307
3308     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3309         data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3310     }
3311
3312     return ost;
3313 }
3314
3315 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3316 {
3317     AVStream *st;
3318     OutputStream *ost;
3319     AVCodecContext *subtitle_enc;
3320
3321     ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3322     st  = ost->st;
3323     subtitle_enc = st->codec;
3324
3325     subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3326
3327     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3328         subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3329     }
3330
3331     return ost;
3332 }
3333
3334 /* arg format is "output-stream-index:streamid-value". */
3335 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3336 {
3337     int idx;
3338     char *p;
3339     char idx_str[16];
3340
3341     av_strlcpy(idx_str, arg, sizeof(idx_str));
3342     p = strchr(idx_str, ':');
3343     if (!p) {
3344         fprintf(stderr,
3345                 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3346                 arg, opt);
3347         exit_program(1);
3348     }
3349     *p++ = '\0';
3350     idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3351     o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3352     o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3353     return 0;
3354 }
3355
3356 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3357 {
3358     AVFormatContext *is = ifile->ctx;
3359     AVFormatContext *os = ofile->ctx;
3360     int i;
3361
3362     for (i = 0; i < is->nb_chapters; i++) {
3363         AVChapter *in_ch = is->chapters[i], *out_ch;
3364         int64_t ts_off   = av_rescale_q(ofile->start_time - ifile->ts_offset,
3365                                       AV_TIME_BASE_Q, in_ch->time_base);
3366         int64_t rt       = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3367                            av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3368
3369
3370         if (in_ch->end < ts_off)
3371             continue;
3372         if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3373             break;
3374
3375         out_ch = av_mallocz(sizeof(AVChapter));
3376         if (!out_ch)
3377             return AVERROR(ENOMEM);
3378
3379         out_ch->id        = in_ch->id;
3380         out_ch->time_base = in_ch->time_base;
3381         out_ch->start     = FFMAX(0,  in_ch->start - ts_off);
3382         out_ch->end       = FFMIN(rt, in_ch->end   - ts_off);
3383
3384         if (copy_metadata)
3385             av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3386
3387         os->nb_chapters++;
3388         os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3389         if (!os->chapters)
3390             return AVERROR(ENOMEM);
3391         os->chapters[os->nb_chapters - 1] = out_ch;
3392     }
3393     return 0;
3394 }
3395
3396 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3397 {
3398     int i, err;
3399     AVFormatContext *ic = NULL;
3400
3401     err = avformat_open_input(&ic, filename, NULL, NULL);
3402     if (err < 0)
3403         return err;
3404     /* copy stream format */
3405     for(i=0;i<ic->nb_streams;i++) {
3406         AVStream *st;
3407         OutputStream *ost;
3408         AVCodec *codec;
3409
3410         codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3411         ost   = new_output_stream(o, s, codec->type);
3412         st    = ost->st;
3413
3414         // FIXME: a more elegant solution is needed
3415         memcpy(st, ic->streams[i], sizeof(AVStream));
3416         st->info = av_malloc(sizeof(*st->info));
3417         memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3418         avcodec_copy_context(st->codec, ic->streams[i]->codec);
3419
3420         if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3421             choose_sample_fmt(st, codec);
3422         else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3423             choose_pixel_fmt(st, codec);
3424     }
3425
3426     av_close_input_file(ic);
3427     return 0;
3428 }
3429
3430 static void opt_output_file(void *optctx, const char *filename)
3431 {
3432     OptionsContext *o = optctx;
3433     AVFormatContext *oc;
3434     int i, err;
3435     AVOutputFormat *file_oformat;
3436     OutputStream *ost;
3437     InputStream  *ist;
3438
3439     if (!strcmp(filename, "-"))
3440         filename = "pipe:";
3441
3442     err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3443     if (!oc) {
3444         print_error(filename, err);
3445         exit_program(1);
3446     }
3447
3448     file_oformat= oc->oformat;
3449
3450     if (!strcmp(file_oformat->name, "ffm") &&
3451         av_strstart(filename, "http:", NULL)) {
3452         /* special case for files sent to ffserver: we get the stream
3453            parameters from ffserver */
3454         int err = read_ffserver_streams(o, oc, filename);
3455         if (err < 0) {
3456             print_error(filename, err);
3457             exit_program(1);
3458         }
3459     } else if (!o->nb_stream_maps) {
3460         /* pick the "best" stream of each type */
3461 #define NEW_STREAM(type, index)\
3462         if (index >= 0) {\
3463             ost = new_ ## type ## _stream(o, oc);\
3464             ost->source_index = index;\
3465             ost->sync_ist     = &input_streams[index];\
3466             input_streams[index].discard = 0;\
3467         }
3468
3469         /* video: highest resolution */
3470         if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3471             int area = 0, idx = -1;
3472             for (i = 0; i < nb_input_streams; i++) {
3473                 ist = &input_streams[i];
3474                 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3475                     ist->st->codec->width * ist->st->codec->height > area) {
3476                     area = ist->st->codec->width * ist->st->codec->height;
3477                     idx = i;
3478                 }
3479             }
3480             NEW_STREAM(video, idx);
3481         }
3482
3483         /* audio: most channels */
3484         if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3485             int channels = 0, idx = -1;
3486             for (i = 0; i < nb_input_streams; i++) {
3487                 ist = &input_streams[i];
3488                 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3489                     ist->st->codec->channels > channels) {
3490                     channels = ist->st->codec->channels;
3491                     idx = i;
3492                 }
3493             }
3494             NEW_STREAM(audio, idx);
3495         }
3496
3497         /* subtitles: pick first */
3498         if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3499             for (i = 0; i < nb_input_streams; i++)
3500                 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3501                     NEW_STREAM(subtitle, i);
3502                     break;
3503                 }
3504         }
3505         /* do something with data? */
3506     } else {
3507         for (i = 0; i < o->nb_stream_maps; i++) {
3508             StreamMap *map = &o->stream_maps[i];
3509
3510             if (map->disabled)
3511                 continue;
3512
3513             ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3514             switch (ist->st->codec->codec_type) {
3515             case AVMEDIA_TYPE_VIDEO:    ost = new_video_stream(o, oc);    break;
3516             case AVMEDIA_TYPE_AUDIO:    ost = new_audio_stream(o, oc);    break;
3517             case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3518             case AVMEDIA_TYPE_DATA:     ost = new_data_stream(o, oc);     break;
3519             default:
3520                 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3521                        map->file_index, map->stream_index);
3522                 exit_program(1);
3523             }
3524
3525             ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3526             ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3527                                            map->sync_stream_index];
3528             ist->discard = 0;
3529         }
3530     }
3531
3532     output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3533     output_files[nb_output_files - 1].ctx       = oc;
3534     output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3535     output_files[nb_output_files - 1].recording_time = o->recording_time;
3536     output_files[nb_output_files - 1].start_time     = o->start_time;
3537     output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3538     av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3539
3540     /* check filename in case of an image number is expected */
3541     if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3542         if (!av_filename_number_test(oc->filename)) {
3543             print_error(oc->filename, AVERROR(EINVAL));
3544             exit_program(1);
3545         }
3546     }
3547
3548     if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3549         /* test if it already exists to avoid loosing precious files */
3550         if (!file_overwrite &&
3551             (strchr(filename, ':') == NULL ||
3552              filename[1] == ':' ||
3553              av_strstart(filename, "file:", NULL))) {
3554             if (avio_check(filename, 0) == 0) {
3555                 if (!using_stdin) {
3556                     fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3557                     fflush(stderr);
3558                     if (!read_yesno()) {
3559                         fprintf(stderr, "Not overwriting - exiting\n");
3560                         exit_program(1);
3561                     }
3562                 }
3563                 else {
3564                     fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3565                     exit_program(1);
3566                 }
3567             }
3568         }
3569
3570         /* open the file */
3571         if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3572             print_error(filename, err);
3573             exit_program(1);
3574         }
3575     }
3576
3577     oc->preload   = (int)(o->mux_preload   * AV_TIME_BASE);
3578     oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3579
3580     /* copy chapters */
3581     if (o->chapters_input_file >= nb_input_files) {
3582         if (o->chapters_input_file == INT_MAX) {
3583             /* copy chapters from the first input file that has them*/
3584             o->chapters_input_file = -1;
3585             for (i = 0; i < nb_input_files; i++)
3586                 if (input_files[i].ctx->nb_chapters) {
3587                     o->chapters_input_file = i;
3588                     break;
3589                 }
3590         } else {
3591             av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3592                    o->chapters_input_file);
3593             exit_program(1);
3594         }
3595     }
3596     if (o->chapters_input_file >= 0)
3597         copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3598                       !o->metadata_chapters_manual);
3599
3600     /* copy metadata */
3601     for (i = 0; i < o->nb_meta_data_maps; i++) {
3602         AVFormatContext *files[2];
3603         AVDictionary    **meta[2];
3604         int j;
3605
3606 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3607         if ((index) < 0 || (index) >= (nb_elems)) {\
3608             av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3609                      (desc), (index));\
3610             exit_program(1);\
3611         }
3612
3613         int in_file_index = o->meta_data_maps[i][1].file;
3614         if (in_file_index < 0)
3615             continue;
3616         METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3617
3618         files[0] = oc;
3619         files[1] = input_files[in_file_index].ctx;
3620
3621         for (j = 0; j < 2; j++) {
3622             MetadataMap *map = &o->meta_data_maps[i][j];
3623
3624             switch (map->type) {
3625             case 'g':
3626                 meta[j] = &files[j]->metadata;
3627                 break;
3628             case 's':
3629                 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3630                 meta[j] = &files[j]->streams[map->index]->metadata;
3631                 break;
3632             case 'c':
3633                 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3634                 meta[j] = &files[j]->chapters[map->index]->metadata;
3635                 break;
3636             case 'p':
3637                 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3638                 meta[j] = &files[j]->programs[map->index]->metadata;
3639                 break;
3640             }
3641         }
3642
3643         av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3644     }
3645
3646     /* copy global metadata by default */
3647     if (!o->metadata_global_manual && nb_input_files)
3648         av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3649                      AV_DICT_DONT_OVERWRITE);
3650     if (!o->metadata_streams_manual)
3651         for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3652             InputStream *ist = &input_streams[output_streams[i].source_index];
3653             av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3654         }
3655
3656     /* process manually set metadata */
3657     for (i = 0; i < o->nb_metadata; i++) {
3658         AVDictionary **m;
3659         char type, *val;
3660         int index = 0;
3661
3662         val = strchr(o->metadata[i].u.str, '=');
3663         if (!val) {
3664             av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3665                    o->metadata[i].u.str);
3666             exit_program(1);
3667         }
3668         *val++ = 0;
3669
3670         parse_meta_type(o->metadata[i].specifier, &type, &index);
3671         switch (type) {
3672         case 'g':
3673             m = &oc->metadata;
3674             break;
3675         case 's':
3676             if (index < 0 || index >= oc->nb_streams) {
3677                 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3678                 exit_program(1);
3679             }
3680             m = &oc->streams[index]->metadata;
3681             break;
3682         case 'c':
3683             if (index < 0 || index >= oc->nb_chapters) {
3684                 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3685                 exit_program(1);
3686             }
3687             m = &oc->chapters[index]->metadata;
3688             break;
3689         default:
3690             av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3691             exit_program(1);
3692         }
3693
3694         av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3695     }
3696
3697     reset_options(o);
3698 }
3699
3700 /* same option as mencoder */
3701 static int opt_pass(const char *opt, const char *arg)
3702 {
3703     do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3704     return 0;
3705 }
3706
3707 static int64_t getutime(void)
3708 {
3709 #if HAVE_GETRUSAGE
3710     struct rusage rusage;
3711
3712     getrusage(RUSAGE_SELF, &rusage);
3713     return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3714 #elif HAVE_GETPROCESSTIMES
3715     HANDLE proc;
3716     FILETIME c, e, k, u;
3717     proc = GetCurrentProcess();
3718     GetProcessTimes(proc, &c, &e, &k, &u);
3719     return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3720 #else
3721     return av_gettime();
3722 #endif
3723 }
3724
3725 static int64_t getmaxrss(void)
3726 {
3727 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3728     struct rusage rusage;
3729     getrusage(RUSAGE_SELF, &rusage);
3730     return (int64_t)rusage.ru_maxrss * 1024;
3731 #elif HAVE_GETPROCESSMEMORYINFO
3732     HANDLE proc;
3733     PROCESS_MEMORY_COUNTERS memcounters;
3734     proc = GetCurrentProcess();
3735     memcounters.cb = sizeof(memcounters);
3736     GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3737     return memcounters.PeakPagefileUsage;
3738 #else
3739     return 0;
3740 #endif
3741 }
3742
3743 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3744 {
3745     return parse_option(o, "q:a", arg, options);
3746 }
3747
3748 static void show_usage(void)
3749 {
3750     printf("Hyper fast Audio and Video encoder\n");
3751     printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3752     printf("\n");
3753 }
3754
3755 static int opt_help(const char *opt, const char *arg)
3756 {
3757     AVCodec *c;
3758     AVOutputFormat *oformat = NULL;
3759     AVInputFormat  *iformat = NULL;
3760     const AVClass *class;
3761
3762     av_log_set_callback(log_callback_help);
3763     show_usage();
3764     show_help_options(options, "Main options:\n",
3765                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3766     show_help_options(options, "\nAdvanced options:\n",
3767                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3768                       OPT_EXPERT);
3769     show_help_options(options, "\nVideo options:\n",
3770                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3771                       OPT_VIDEO);
3772     show_help_options(options, "\nAdvanced Video options:\n",
3773                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3774                       OPT_VIDEO | OPT_EXPERT);
3775     show_help_options(options, "\nAudio options:\n",
3776                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3777                       OPT_AUDIO);
3778     show_help_options(options, "\nAdvanced Audio options:\n",
3779                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3780                       OPT_AUDIO | OPT_EXPERT);
3781     show_help_options(options, "\nSubtitle options:\n",
3782                       OPT_SUBTITLE | OPT_GRAB,
3783                       OPT_SUBTITLE);
3784     show_help_options(options, "\nAudio/Video grab options:\n",
3785                       OPT_GRAB,
3786                       OPT_GRAB);
3787     printf("\n");
3788     class = avcodec_get_class();
3789     av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3790     printf("\n");
3791
3792     /* individual codec options */
3793     c = NULL;
3794     while ((c = av_codec_next(c))) {
3795         if (c->priv_class) {
3796             av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3797             printf("\n");
3798         }
3799     }
3800
3801     class = avformat_get_class();
3802     av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3803     printf("\n");
3804
3805     /* individual muxer options */
3806     while ((oformat = av_oformat_next(oformat))) {
3807         if (oformat->priv_class) {
3808             av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3809             printf("\n");
3810         }
3811     }
3812
3813     /* individual demuxer options */
3814     while ((iformat = av_iformat_next(iformat))) {
3815         if (iformat->priv_class) {
3816             av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3817             printf("\n");
3818         }
3819     }
3820
3821     class = sws_get_class();
3822     av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3823     return 0;
3824 }
3825
3826 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3827 {
3828     enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3829     static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3830
3831     if(!strncmp(arg, "pal-", 4)) {
3832         norm = PAL;
3833         arg += 4;
3834     } else if(!strncmp(arg, "ntsc-", 5)) {
3835         norm = NTSC;
3836         arg += 5;
3837     } else if(!strncmp(arg, "film-", 5)) {
3838         norm = FILM;
3839         arg += 5;
3840     } else {
3841         /* Try to determine PAL/NTSC by peeking in the input files */
3842         if(nb_input_files) {
3843             int i, j, fr;
3844             for (j = 0; j < nb_input_files; j++) {
3845                 for (i = 0; i < input_files[j].nb_streams; i++) {
3846                     AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3847                     if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3848                         continue;
3849                     fr = c->time_base.den * 1000 / c->time_base.num;
3850                     if(fr == 25000) {
3851                         norm = PAL;
3852                         break;
3853                     } else if((fr == 29970) || (fr == 23976)) {
3854                         norm = NTSC;
3855                         break;
3856                     }
3857                 }
3858                 if(norm != UNKNOWN)
3859                     break;
3860             }
3861         }
3862         if(verbose > 0 && norm != UNKNOWN)
3863             fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3864     }
3865
3866     if(norm == UNKNOWN) {
3867         fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3868         fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3869         fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3870         exit_program(1);
3871     }
3872
3873     if(!strcmp(arg, "vcd")) {
3874         opt_video_codec(o, "c:v", "mpeg1video");
3875         opt_audio_codec(o, "c:a", "mp2");
3876         parse_option(o, "f", "vcd", options);
3877
3878         parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3879         parse_option(o, "r", frame_rates[norm], options);
3880         opt_default("g", norm == PAL ? "15" : "18");
3881
3882         opt_default("b", "1150000");
3883         opt_default("maxrate", "1150000");
3884         opt_default("minrate", "1150000");
3885         opt_default("bufsize", "327680"); // 40*1024*8;
3886
3887         opt_default("b:a", "224000");
3888         parse_option(o, "ar", "44100", options);
3889         parse_option(o, "ac", "2", options);
3890
3891         opt_default("packetsize", "2324");
3892         opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3893
3894         /* We have to offset the PTS, so that it is consistent with the SCR.
3895            SCR starts at 36000, but the first two packs contain only padding
3896            and the first pack from the other stream, respectively, may also have
3897            been written before.
3898            So the real data starts at SCR 36000+3*1200. */
3899         o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3900     } else if(!strcmp(arg, "svcd")) {
3901
3902         opt_video_codec(o, "c:v", "mpeg2video");
3903         opt_audio_codec(o, "c:a", "mp2");
3904         parse_option(o, "f", "svcd", options);
3905
3906         parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
3907         parse_option(o, "r", frame_rates[norm], options);
3908         opt_default("g", norm == PAL ? "15" : "18");
3909
3910         opt_default("b", "2040000");
3911         opt_default("maxrate", "2516000");
3912         opt_default("minrate", "0"); //1145000;
3913         opt_default("bufsize", "1835008"); //224*1024*8;
3914         opt_default("flags", "+scan_offset");
3915
3916
3917         opt_default("b:a", "224000");
3918         parse_option(o, "ar", "44100", options);
3919
3920         opt_default("packetsize", "2324");
3921
3922     } else if(!strcmp(arg, "dvd")) {
3923
3924         opt_video_codec(o, "c:v", "mpeg2video");
3925         opt_audio_codec(o, "c:a", "ac3");
3926         parse_option(o, "f", "dvd", options);
3927
3928         parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3929         parse_option(o, "r", frame_rates[norm], options);
3930         opt_default("g", norm == PAL ? "15" : "18");
3931
3932         opt_default("b", "6000000");
3933         opt_default("maxrate", "9000000");
3934         opt_default("minrate", "0"); //1500000;
3935         opt_default("bufsize", "1835008"); //224*1024*8;
3936
3937         opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3938         opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3939
3940         opt_default("b:a", "448000");
3941         parse_option(o, "ar", "48000", options);
3942
3943     } else if(!strncmp(arg, "dv", 2)) {
3944
3945         parse_option(o, "f", "dv", options);
3946
3947         parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3948         parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3949                           norm == PAL ? "yuv420p" : "yuv411p", options);
3950         parse_option(o, "r", frame_rates[norm], options);
3951
3952         parse_option(o, "ar", "48000", options);
3953         parse_option(o, "ac", "2", options);
3954
3955     } else {
3956         fprintf(stderr, "Unknown target: %s\n", arg);
3957         return AVERROR(EINVAL);
3958     }
3959     return 0;
3960 }
3961
3962 static int opt_vstats_file(const char *opt, const char *arg)
3963 {
3964     av_free (vstats_filename);
3965     vstats_filename=av_strdup (arg);
3966     return 0;
3967 }
3968
3969 static int opt_vstats(const char *opt, const char *arg)
3970 {
3971     char filename[40];
3972     time_t today2 = time(NULL);
3973     struct tm *today = localtime(&today2);
3974
3975     snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3976              today->tm_sec);
3977     return opt_vstats_file(opt, filename);
3978 }
3979
3980 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3981 {
3982     return parse_option(o, "frames:v", arg, options);
3983 }
3984
3985 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3986 {
3987     return parse_option(o, "frames:a", arg, options);
3988 }
3989
3990 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3991 {
3992     return parse_option(o, "frames:d", arg, options);
3993 }
3994
3995 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
3996 {
3997 }
3998
3999 static int opt_passlogfile(const char *opt, const char *arg)
4000 {
4001     pass_logfilename_prefix = arg;
4002 #if CONFIG_LIBX264_ENCODER
4003     return opt_default("passlogfile", arg);
4004 #else
4005     return 0;
4006 #endif
4007 }
4008
4009 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4010 {
4011     return parse_option(o, "tag:v", arg, options);
4012 }
4013
4014 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4015 {
4016     return parse_option(o, "tag:a", arg, options);
4017 }
4018
4019 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4020 {
4021     return parse_option(o, "tag:s", arg, options);
4022 }
4023
4024 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4025 {
4026     return parse_option(o, "filter:v", arg, options);
4027 }
4028
4029 #define OFFSET(x) offsetof(OptionsContext, x)
4030 static const OptionDef options[] = {
4031     /* main options */
4032 #include "cmdutils_common_opts.h"
4033     { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4034     { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4035     { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4036     { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4037     { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4038     { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4039     { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4040       "outfile[,metadata]:infile[,metadata]" },
4041     { "map_chapters",  OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)},  "set chapters mapping", "input_file_index" },
4042     { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4043     { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4044     { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4045     { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4046     { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4047     { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4048     { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4049     { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4050       "add timings for benchmarking" },
4051     { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4052     { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4053       "dump each input packet" },
4054     { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4055       "when dumping packets, also dump the payload" },
4056     { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4057     { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4058     { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4059     { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4060     { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4061     { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4062     { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
4063     { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying" },
4064     { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4065     { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4066     { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4067     { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
4068     { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4069     { "tag",   OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4070     { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4071     { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4072 #if CONFIG_AVFILTER
4073     { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4074 #endif
4075
4076     /* video options */
4077     { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4078     { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4079     { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4080     { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4081     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4082     { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
4083     { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4084     { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4085     { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4086     { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4087     { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4088       "use same quantizer as source (implies VBR)" },
4089     { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4090     { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4091     { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4092       "deinterlace pictures" },
4093     { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4094     { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4095 #if CONFIG_AVFILTER
4096     { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4097 #endif
4098     { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4099     { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4100     { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4101     { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4102     { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4103     { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4104     { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4105     { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4106     { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
4107
4108     /* audio options */
4109     { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4110     { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4111     { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4112     { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4113     { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4114     { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4115     { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4116     { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4117     { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4118
4119     /* subtitle options */
4120     { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4121     { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4122     { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4123
4124     /* grab options */
4125     { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4126
4127     /* muxer options */
4128     { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT   | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4129     { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)},   "set the initial demux-decode delay", "seconds" },
4130
4131     { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4132
4133     /* data codec support */
4134     { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4135
4136     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4137     { NULL, },
4138 };
4139
4140 int main(int argc, char **argv)
4141 {
4142     OptionsContext o = { 0 };
4143     int64_t ti;
4144
4145     reset_options(&o);
4146
4147     av_log_set_flags(AV_LOG_SKIP_REPEATED);
4148
4149     if(argc>1 && !strcmp(argv[1], "-d")){
4150         run_as_daemon=1;
4151         verbose=-1;
4152         av_log_set_callback(log_callback_null);
4153         argc--;
4154         argv++;
4155     }
4156
4157     avcodec_register_all();
4158 #if CONFIG_AVDEVICE
4159     avdevice_register_all();
4160 #endif
4161 #if CONFIG_AVFILTER
4162     avfilter_register_all();
4163 #endif
4164     av_register_all();
4165
4166 #if HAVE_ISATTY
4167     if(isatty(STDIN_FILENO))
4168         avio_set_interrupt_cb(decode_interrupt_cb);
4169 #endif
4170
4171     if(verbose>=0)
4172         show_banner();
4173
4174     /* parse options */
4175     parse_options(&o, argc, argv, options, opt_output_file);
4176
4177     if(nb_output_files <= 0 && nb_input_files == 0) {
4178         show_usage();
4179         fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4180         exit_program(1);
4181     }
4182
4183     /* file converter / grab */
4184     if (nb_output_files <= 0) {
4185         fprintf(stderr, "At least one output file must be specified\n");
4186         exit_program(1);
4187     }
4188
4189     if (nb_input_files == 0) {
4190         fprintf(stderr, "At least one input file must be specified\n");
4191         exit_program(1);
4192     }
4193
4194     ti = getutime();
4195     if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4196         exit_program(1);
4197     ti = getutime() - ti;
4198     if (do_benchmark) {
4199         int maxrss = getmaxrss() / 1024;
4200         printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4201     }
4202
4203     exit_program(0);
4204     return 0;
4205 }