OSDN Git Service

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