OSDN Git Service

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