]> git.sesse.net Git - ffmpeg/blob - ffmpeg.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / ffmpeg.c
1 /*
2  * Copyright (c) 2000-2003 Fabrice Bellard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 /**
22  * @file
23  * multimedia converter based on the FFmpeg libraries
24  */
25
26 #include "config.h"
27 #include <ctype.h>
28 #include <string.h>
29 #include <math.h>
30 #include <stdlib.h>
31 #include <errno.h>
32 #include <signal.h>
33 #include <limits.h>
34 #include <unistd.h>
35 #include "libavformat/avformat.h"
36 #include "libavdevice/avdevice.h"
37 #include "libswscale/swscale.h"
38 #include "libavutil/opt.h"
39 #include "libavcodec/audioconvert.h"
40 #include "libavutil/audioconvert.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/samplefmt.h"
43 #include "libavutil/colorspace.h"
44 #include "libavutil/fifo.h"
45 #include "libavutil/intreadwrite.h"
46 #include "libavutil/dict.h"
47 #include "libavutil/mathematics.h"
48 #include "libavutil/pixdesc.h"
49 #include "libavutil/avstring.h"
50 #include "libavutil/libm.h"
51 #include "libavutil/imgutils.h"
52 #include "libavutil/timestamp.h"
53 #include "libavformat/os_support.h"
54 #include "libswresample/swresample.h"
55
56 #include "libavformat/ffm.h" // not public API
57
58 #if CONFIG_AVFILTER
59 # include "libavfilter/avcodec.h"
60 # include "libavfilter/avfilter.h"
61 # include "libavfilter/avfiltergraph.h"
62 # include "libavfilter/buffersink.h"
63 # include "libavfilter/buffersrc.h"
64 # include "libavfilter/vsrc_buffer.h"
65 #endif
66
67 #if HAVE_SYS_RESOURCE_H
68 #include <sys/types.h>
69 #include <sys/time.h>
70 #include <sys/resource.h>
71 #elif HAVE_GETPROCESSTIMES
72 #include <windows.h>
73 #endif
74 #if HAVE_GETPROCESSMEMORYINFO
75 #include <windows.h>
76 #include <psapi.h>
77 #endif
78
79 #if HAVE_SYS_SELECT_H
80 #include <sys/select.h>
81 #endif
82
83 #if HAVE_TERMIOS_H
84 #include <fcntl.h>
85 #include <sys/ioctl.h>
86 #include <sys/time.h>
87 #include <termios.h>
88 #elif HAVE_KBHIT
89 #include <conio.h>
90 #endif
91 #include <time.h>
92
93 #include "cmdutils.h"
94
95 #include "libavutil/avassert.h"
96
97 #define VSYNC_AUTO       -1
98 #define VSYNC_PASSTHROUGH 0
99 #define VSYNC_CFR         1
100 #define VSYNC_VFR         2
101 #define VSYNC_DROP        0xff
102
103 const char program_name[] = "ffmpeg";
104 const int program_birth_year = 2000;
105
106 /* select an input stream for an output stream */
107 typedef struct StreamMap {
108     int disabled;           /** 1 is this mapping is disabled by a negative map */
109     int file_index;
110     int stream_index;
111     int sync_file_index;
112     int sync_stream_index;
113 } StreamMap;
114
115 typedef struct {
116     int  file_idx,  stream_idx,  channel_idx; // input
117     int ofile_idx, ostream_idx;               // output
118 } AudioChannelMap;
119
120 /**
121  * select an input file for an output file
122  */
123 typedef struct MetadataMap {
124     int  file;      ///< file index
125     char type;      ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
126     int  index;     ///< stream/chapter/program number
127 } MetadataMap;
128
129 static const OptionDef options[];
130
131 #define MAX_STREAMS 1024    /* arbitrary sanity check value */
132
133 static int frame_bits_per_raw_sample = 0;
134 static int video_discard = 0;
135 static int same_quant = 0;
136 static int do_deinterlace = 0;
137 static int intra_dc_precision = 8;
138 static int qp_hist = 0;
139 static int intra_only = 0;
140 static const char *video_codec_name    = NULL;
141 static const char *audio_codec_name    = NULL;
142 static const char *subtitle_codec_name = NULL;
143
144 static int file_overwrite = 0;
145 static int no_file_overwrite = 0;
146 static int do_benchmark = 0;
147 static int do_hex_dump = 0;
148 static int do_pkt_dump = 0;
149 static int do_psnr = 0;
150 static int do_pass = 0;
151 static const char *pass_logfilename_prefix;
152 static int video_sync_method = VSYNC_AUTO;
153 static int audio_sync_method = 0;
154 static float audio_drift_threshold = 0.1;
155 static int copy_ts = 0;
156 static int copy_tb = -1;
157 static int opt_shortest = 0;
158 static char *vstats_filename;
159 static FILE *vstats_file;
160
161 static int audio_volume = 256;
162
163 static int exit_on_error = 0;
164 static int using_stdin = 0;
165 static int run_as_daemon  = 0;
166 static volatile int received_nb_signals = 0;
167 static int64_t video_size = 0;
168 static int64_t audio_size = 0;
169 static int64_t extra_size = 0;
170 static int nb_frames_dup = 0;
171 static int nb_frames_drop = 0;
172 static int input_sync;
173
174 static float dts_delta_threshold = 10;
175 static float dts_error_threshold = 3600*30;
176
177 static int print_stats = 1;
178 static int debug_ts = 0;
179
180 static uint8_t *audio_buf;
181 static unsigned int allocated_audio_buf_size;
182
183 static uint8_t *input_tmp= NULL;
184
185 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
186
187 typedef struct FrameBuffer {
188     uint8_t *base[4];
189     uint8_t *data[4];
190     int  linesize[4];
191
192     int h, w;
193     enum PixelFormat pix_fmt;
194
195     int refcount;
196     struct InputStream *ist;
197     struct FrameBuffer *next;
198 } FrameBuffer;
199
200 typedef struct InputStream {
201     int file_index;
202     AVStream *st;
203     int discard;             /* true if stream data should be discarded */
204     int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */
205     AVCodec *dec;
206     AVFrame *decoded_frame;
207     AVFrame *filtered_frame;
208
209     int64_t       start;     /* time when read started */
210     /* predicted dts of the next packet read for this stream or (when there are
211      * several frames in a packet) of the next frame in current packet */
212     int64_t       next_dts;
213     /* dts of the last packet read for this stream */
214     int64_t       dts;
215
216     int64_t       next_pts;  ///< synthetic pts for the next decode frame
217     int64_t       pts;       ///< current pts of the decoded frame
218     double ts_scale;
219     int is_start;            /* is 1 at the start and after a discontinuity */
220     int showed_multi_packet_warning;
221     AVDictionary *opts;
222
223     /* a pool of free buffers for decoded data */
224     FrameBuffer *buffer_pool;
225     int dr1;
226 } InputStream;
227
228 typedef struct InputFile {
229     AVFormatContext *ctx;
230     int eof_reached;      /* true if eof reached */
231     int ist_index;        /* index of first stream in input_streams */
232     int buffer_size;      /* current total buffer size */
233     int64_t ts_offset;
234     int nb_streams;       /* number of stream that ffmpeg is aware of; may be different
235                              from ctx.nb_streams if new streams appear during av_read_frame() */
236     int rate_emu;
237 } InputFile;
238
239 typedef struct OutputStream {
240     int file_index;          /* file index */
241     int index;               /* stream index in the output file */
242     int source_index;        /* InputStream index */
243     AVStream *st;            /* stream in the output file */
244     int encoding_needed;     /* true if encoding needed for this stream */
245     int frame_number;
246     /* input pts and corresponding output pts
247        for A/V sync */
248     struct InputStream *sync_ist; /* input stream to sync against */
249     int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
250     AVBitStreamFilterContext *bitstream_filters;
251     AVCodec *enc;
252     int64_t max_frames;
253     AVFrame *output_frame;
254
255     /* video only */
256     int video_resample;
257     AVFrame resample_frame;              /* temporary frame for image resampling */
258     struct SwsContext *img_resample_ctx; /* for image resampling */
259     int resample_height;
260     int resample_width;
261     int resample_pix_fmt;
262     AVRational frame_rate;
263     int force_fps;
264     int top_field_first;
265
266     float frame_aspect_ratio;
267
268     /* forced key frames */
269     int64_t *forced_kf_pts;
270     int forced_kf_count;
271     int forced_kf_index;
272
273     /* audio only */
274     int audio_resample;
275     int audio_channels_map[SWR_CH_MAX];  ///< list of the channels id to pick from the source stream
276     int audio_channels_mapped;           ///< number of channels in audio_channels_map
277     int resample_sample_fmt;
278     int resample_channels;
279     int resample_sample_rate;
280     float rematrix_volume;
281     AVFifoBuffer *fifo;     /* for compression: one audio fifo per codec */
282     FILE *logfile;
283
284     struct SwrContext *swr;
285
286 #if CONFIG_AVFILTER
287     AVFilterContext *output_video_filter;
288     AVFilterContext *input_video_filter;
289     AVFilterBufferRef *picref;
290     char *avfilter;
291     AVFilterGraph *graph;
292 #endif
293
294     int64_t sws_flags;
295     AVDictionary *opts;
296     int is_past_recording_time;
297     int stream_copy;
298     const char *attachment_filename;
299     int copy_initial_nonkeyframes;
300 } OutputStream;
301
302
303 #if HAVE_TERMIOS_H
304
305 /* init terminal so that we can grab keys */
306 static struct termios oldtty;
307 static int restore_tty;
308 #endif
309
310 typedef struct OutputFile {
311     AVFormatContext *ctx;
312     AVDictionary *opts;
313     int ost_index;       /* index of the first stream in output_streams */
314     int64_t recording_time; /* desired length of the resulting file in microseconds */
315     int64_t start_time;     /* start time in microseconds */
316     uint64_t limit_filesize; /* filesize limit expressed in bytes */
317 } OutputFile;
318
319 static InputStream *input_streams   = NULL;
320 static int         nb_input_streams = 0;
321 static InputFile   *input_files     = NULL;
322 static int         nb_input_files   = 0;
323
324 static OutputStream *output_streams = NULL;
325 static int        nb_output_streams = 0;
326 static OutputFile   *output_files   = NULL;
327 static int        nb_output_files   = 0;
328
329 typedef struct OptionsContext {
330     /* input/output options */
331     int64_t start_time;
332     const char *format;
333
334     SpecifierOpt *codec_names;
335     int        nb_codec_names;
336     SpecifierOpt *audio_channels;
337     int        nb_audio_channels;
338     SpecifierOpt *audio_sample_rate;
339     int        nb_audio_sample_rate;
340     SpecifierOpt *rematrix_volume;
341     int        nb_rematrix_volume;
342     SpecifierOpt *frame_rates;
343     int        nb_frame_rates;
344     SpecifierOpt *frame_sizes;
345     int        nb_frame_sizes;
346     SpecifierOpt *frame_pix_fmts;
347     int        nb_frame_pix_fmts;
348
349     /* input options */
350     int64_t input_ts_offset;
351     int rate_emu;
352
353     SpecifierOpt *ts_scale;
354     int        nb_ts_scale;
355     SpecifierOpt *dump_attachment;
356     int        nb_dump_attachment;
357
358     /* output options */
359     StreamMap *stream_maps;
360     int     nb_stream_maps;
361     AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
362     int           nb_audio_channel_maps; ///< number of (valid) -map_channel settings
363     /* first item specifies output metadata, second is input */
364     MetadataMap (*meta_data_maps)[2];
365     int nb_meta_data_maps;
366     int metadata_global_manual;
367     int metadata_streams_manual;
368     int metadata_chapters_manual;
369     const char **attachments;
370     int       nb_attachments;
371
372     int chapters_input_file;
373
374     int64_t recording_time;
375     uint64_t limit_filesize;
376     float mux_preload;
377     float mux_max_delay;
378
379     int video_disable;
380     int audio_disable;
381     int subtitle_disable;
382     int data_disable;
383
384     /* indexed by output file stream index */
385     int   *streamid_map;
386     int nb_streamid_map;
387
388     SpecifierOpt *metadata;
389     int        nb_metadata;
390     SpecifierOpt *max_frames;
391     int        nb_max_frames;
392     SpecifierOpt *bitstream_filters;
393     int        nb_bitstream_filters;
394     SpecifierOpt *codec_tags;
395     int        nb_codec_tags;
396     SpecifierOpt *sample_fmts;
397     int        nb_sample_fmts;
398     SpecifierOpt *qscale;
399     int        nb_qscale;
400     SpecifierOpt *forced_key_frames;
401     int        nb_forced_key_frames;
402     SpecifierOpt *force_fps;
403     int        nb_force_fps;
404     SpecifierOpt *frame_aspect_ratios;
405     int        nb_frame_aspect_ratios;
406     SpecifierOpt *rc_overrides;
407     int        nb_rc_overrides;
408     SpecifierOpt *intra_matrices;
409     int        nb_intra_matrices;
410     SpecifierOpt *inter_matrices;
411     int        nb_inter_matrices;
412     SpecifierOpt *top_field_first;
413     int        nb_top_field_first;
414     SpecifierOpt *metadata_map;
415     int        nb_metadata_map;
416     SpecifierOpt *presets;
417     int        nb_presets;
418     SpecifierOpt *copy_initial_nonkeyframes;
419     int        nb_copy_initial_nonkeyframes;
420 #if CONFIG_AVFILTER
421     SpecifierOpt *filters;
422     int        nb_filters;
423 #endif
424 } OptionsContext;
425
426 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
427 {\
428     int i, ret;\
429     for (i = 0; i < o->nb_ ## name; i++) {\
430         char *spec = o->name[i].specifier;\
431         if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
432             outvar = o->name[i].u.type;\
433         else if (ret < 0)\
434             exit_program(1);\
435     }\
436 }
437
438 static void reset_options(OptionsContext *o, int is_input)
439 {
440     const OptionDef *po = options;
441     OptionsContext bak= *o;
442
443     /* all OPT_SPEC and OPT_STRING can be freed in generic way */
444     while (po->name) {
445         void *dst = (uint8_t*)o + po->u.off;
446
447         if (po->flags & OPT_SPEC) {
448             SpecifierOpt **so = dst;
449             int i, *count = (int*)(so + 1);
450             for (i = 0; i < *count; i++) {
451                 av_freep(&(*so)[i].specifier);
452                 if (po->flags & OPT_STRING)
453                     av_freep(&(*so)[i].u.str);
454             }
455             av_freep(so);
456             *count = 0;
457         } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
458             av_freep(dst);
459         po++;
460     }
461
462     av_freep(&o->stream_maps);
463     av_freep(&o->audio_channel_maps);
464     av_freep(&o->meta_data_maps);
465     av_freep(&o->streamid_map);
466
467     memset(o, 0, sizeof(*o));
468
469     if(is_input) o->recording_time = bak.recording_time;
470     else         o->recording_time = INT64_MAX;
471     o->mux_max_delay  = 0.7;
472     o->limit_filesize = UINT64_MAX;
473     o->chapters_input_file = INT_MAX;
474
475     uninit_opts();
476     init_opts();
477 }
478
479 static int alloc_buffer(AVCodecContext *s, InputStream *ist, FrameBuffer **pbuf)
480 {
481     FrameBuffer  *buf = av_mallocz(sizeof(*buf));
482     int i, ret;
483     const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
484     int h_chroma_shift, v_chroma_shift;
485     int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
486     int w = s->width, h = s->height;
487
488     if (!buf)
489         return AVERROR(ENOMEM);
490
491     if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
492         w += 2*edge;
493         h += 2*edge;
494     }
495
496     avcodec_align_dimensions(s, &w, &h);
497     if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
498                               s->pix_fmt, 32)) < 0) {
499         av_freep(&buf);
500         return ret;
501     }
502     /* XXX this shouldn't be needed, but some tests break without this line
503      * those decoders are buggy and need to be fixed.
504      * the following tests fail:
505      * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
506      */
507     memset(buf->base[0], 128, ret);
508
509     avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
510     for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
511         const int h_shift = i==0 ? 0 : h_chroma_shift;
512         const int v_shift = i==0 ? 0 : v_chroma_shift;
513         if ((s->flags & CODEC_FLAG_EMU_EDGE) || !buf->linesize[1])
514             buf->data[i] = buf->base[i];
515         else
516             buf->data[i] = buf->base[i] +
517                            FFALIGN((buf->linesize[i]*edge >> v_shift) +
518                                    (pixel_size*edge >> h_shift), 32);
519     }
520     buf->w       = s->width;
521     buf->h       = s->height;
522     buf->pix_fmt = s->pix_fmt;
523     buf->ist     = ist;
524
525     *pbuf = buf;
526     return 0;
527 }
528
529 static void free_buffer_pool(InputStream *ist)
530 {
531     FrameBuffer *buf = ist->buffer_pool;
532     while (buf) {
533         ist->buffer_pool = buf->next;
534         av_freep(&buf->base[0]);
535         av_free(buf);
536         buf = ist->buffer_pool;
537     }
538 }
539
540 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
541 {
542     av_assert0(buf->refcount);
543     buf->refcount--;
544     if (!buf->refcount) {
545         buf->next = ist->buffer_pool;
546         ist->buffer_pool = buf;
547     }
548 }
549
550 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
551 {
552     InputStream *ist = s->opaque;
553     FrameBuffer *buf;
554     int ret, i;
555
556     if(av_image_check_size(s->width, s->height, 0, s) || s->pix_fmt<0)
557         return -1;
558
559     if (!ist->buffer_pool && (ret = alloc_buffer(s, ist, &ist->buffer_pool)) < 0)
560         return ret;
561
562     buf              = ist->buffer_pool;
563     ist->buffer_pool = buf->next;
564     buf->next        = NULL;
565     if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
566         av_freep(&buf->base[0]);
567         av_free(buf);
568         ist->dr1 = 0;
569         if ((ret = alloc_buffer(s, ist, &buf)) < 0)
570             return ret;
571     }
572     buf->refcount++;
573
574     frame->opaque        = buf;
575     frame->type          = FF_BUFFER_TYPE_USER;
576     frame->extended_data = frame->data;
577     frame->pkt_pts       = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
578
579     for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
580         frame->base[i]     = buf->base[i];  // XXX h264.c uses base though it shouldn't
581         frame->data[i]     = buf->data[i];
582         frame->linesize[i] = buf->linesize[i];
583     }
584
585     return 0;
586 }
587
588 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
589 {
590     InputStream *ist = s->opaque;
591     FrameBuffer *buf = frame->opaque;
592     int i;
593
594     if(frame->type!=FF_BUFFER_TYPE_USER)
595         return avcodec_default_release_buffer(s, frame);
596
597     for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
598         frame->data[i] = NULL;
599
600     unref_buffer(ist, buf);
601 }
602
603 static void filter_release_buffer(AVFilterBuffer *fb)
604 {
605     FrameBuffer *buf = fb->priv;
606     av_free(fb);
607     unref_buffer(buf->ist, buf);
608 }
609
610 #if CONFIG_AVFILTER
611
612 static int configure_video_filters(InputStream *ist, OutputStream *ost)
613 {
614     AVFilterContext *last_filter, *filter;
615     /** filter graph containing all filters including input & output */
616     AVCodecContext *codec = ost->st->codec;
617     AVCodecContext *icodec = ist->st->codec;
618     enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
619     AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
620     AVRational sample_aspect_ratio;
621     char args[255];
622     int ret;
623
624     ost->graph = avfilter_graph_alloc();
625     if (!ost->graph)
626         return AVERROR(ENOMEM);
627
628     if (ist->st->sample_aspect_ratio.num) {
629         sample_aspect_ratio = ist->st->sample_aspect_ratio;
630     } else
631         sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
632
633     snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
634              ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
635              sample_aspect_ratio.num, sample_aspect_ratio.den);
636
637     ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
638                                        "src", args, NULL, ost->graph);
639     if (ret < 0)
640         return ret;
641
642 #if FF_API_OLD_VSINK_API
643     ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
644                                        "out", NULL, pix_fmts, ost->graph);
645 #else
646     buffersink_params->pixel_fmts = pix_fmts;
647     ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
648                                        "out", NULL, buffersink_params, ost->graph);
649 #endif
650     av_freep(&buffersink_params);
651
652     if (ret < 0)
653         return ret;
654     last_filter = ost->input_video_filter;
655
656     if (codec->width != icodec->width || codec->height != icodec->height) {
657         snprintf(args, 255, "%d:%d:flags=0x%X",
658                  codec->width,
659                  codec->height,
660                  (unsigned)ost->sws_flags);
661         if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
662                                                 NULL, args, NULL, ost->graph)) < 0)
663             return ret;
664         if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
665             return ret;
666         last_filter = filter;
667     }
668
669     snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
670     ost->graph->scale_sws_opts = av_strdup(args);
671
672     if (ost->avfilter) {
673         AVFilterInOut *outputs = avfilter_inout_alloc();
674         AVFilterInOut *inputs  = avfilter_inout_alloc();
675
676         outputs->name    = av_strdup("in");
677         outputs->filter_ctx = last_filter;
678         outputs->pad_idx = 0;
679         outputs->next    = NULL;
680
681         inputs->name    = av_strdup("out");
682         inputs->filter_ctx = ost->output_video_filter;
683         inputs->pad_idx = 0;
684         inputs->next    = NULL;
685
686         if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
687             return ret;
688         av_freep(&ost->avfilter);
689     } else {
690         if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
691             return ret;
692     }
693
694     if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
695         return ret;
696
697     codec->width  = ost->output_video_filter->inputs[0]->w;
698     codec->height = ost->output_video_filter->inputs[0]->h;
699     codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
700         ost->frame_aspect_ratio ? // overridden by the -aspect cli option
701         av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
702         ost->output_video_filter->inputs[0]->sample_aspect_ratio;
703
704     return 0;
705 }
706 #endif /* CONFIG_AVFILTER */
707
708 static void term_exit(void)
709 {
710     av_log(NULL, AV_LOG_QUIET, "%s", "");
711 #if HAVE_TERMIOS_H
712     if(restore_tty)
713         tcsetattr (0, TCSANOW, &oldtty);
714 #endif
715 }
716
717 static volatile int received_sigterm = 0;
718
719 static void sigterm_handler(int sig)
720 {
721     received_sigterm = sig;
722     received_nb_signals++;
723     term_exit();
724     if(received_nb_signals > 3)
725         exit(123);
726 }
727
728 static void term_init(void)
729 {
730 #if HAVE_TERMIOS_H
731     if(!run_as_daemon){
732     struct termios tty;
733
734     if (tcgetattr (0, &tty) == 0) {
735     oldtty = tty;
736     restore_tty = 1;
737     atexit(term_exit);
738
739     tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
740                           |INLCR|IGNCR|ICRNL|IXON);
741     tty.c_oflag |= OPOST;
742     tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
743     tty.c_cflag &= ~(CSIZE|PARENB);
744     tty.c_cflag |= CS8;
745     tty.c_cc[VMIN] = 1;
746     tty.c_cc[VTIME] = 0;
747
748     tcsetattr (0, TCSANOW, &tty);
749     }
750     signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
751     }
752 #endif
753     avformat_network_deinit();
754
755     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
756     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
757 #ifdef SIGXCPU
758     signal(SIGXCPU, sigterm_handler);
759 #endif
760 }
761
762 /* read a key without blocking */
763 static int read_key(void)
764 {
765     unsigned char ch;
766 #if HAVE_TERMIOS_H
767     int n = 1;
768     struct timeval tv;
769     fd_set rfds;
770
771     FD_ZERO(&rfds);
772     FD_SET(0, &rfds);
773     tv.tv_sec = 0;
774     tv.tv_usec = 0;
775     n = select(1, &rfds, NULL, NULL, &tv);
776     if (n > 0) {
777         n = read(0, &ch, 1);
778         if (n == 1)
779             return ch;
780
781         return n;
782     }
783 #elif HAVE_KBHIT
784 #    if HAVE_PEEKNAMEDPIPE
785     static int is_pipe;
786     static HANDLE input_handle;
787     DWORD dw, nchars;
788     if(!input_handle){
789         input_handle = GetStdHandle(STD_INPUT_HANDLE);
790         is_pipe = !GetConsoleMode(input_handle, &dw);
791     }
792
793     if (stdin->_cnt > 0) {
794         read(0, &ch, 1);
795         return ch;
796     }
797     if (is_pipe) {
798         /* When running under a GUI, you will end here. */
799         if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
800             return -1;
801         //Read it
802         if(nchars != 0) {
803             read(0, &ch, 1);
804             return ch;
805         }else{
806             return -1;
807         }
808     }
809 #    endif
810     if(kbhit())
811         return(getch());
812 #endif
813     return -1;
814 }
815
816 static int decode_interrupt_cb(void *ctx)
817 {
818     return received_nb_signals > 1;
819 }
820
821 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
822
823 void av_noreturn exit_program(int ret)
824 {
825     int i;
826
827     /* close files */
828     for (i = 0; i < nb_output_files; i++) {
829         AVFormatContext *s = output_files[i].ctx;
830         if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
831             avio_close(s->pb);
832         avformat_free_context(s);
833         av_dict_free(&output_files[i].opts);
834     }
835     for (i = 0; i < nb_output_streams; i++) {
836         AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
837         while (bsfc) {
838             AVBitStreamFilterContext *next = bsfc->next;
839             av_bitstream_filter_close(bsfc);
840             bsfc = next;
841         }
842         output_streams[i].bitstream_filters = NULL;
843
844         if (output_streams[i].output_frame) {
845             AVFrame *frame = output_streams[i].output_frame;
846             if (frame->extended_data != frame->data)
847                 av_freep(&frame->extended_data);
848             av_freep(&frame);
849         }
850     }
851     for (i = 0; i < nb_input_files; i++) {
852         avformat_close_input(&input_files[i].ctx);
853     }
854     for (i = 0; i < nb_input_streams; i++) {
855         av_freep(&input_streams[i].decoded_frame);
856         av_freep(&input_streams[i].filtered_frame);
857         av_dict_free(&input_streams[i].opts);
858         free_buffer_pool(&input_streams[i]);
859     }
860
861     if (vstats_file)
862         fclose(vstats_file);
863     av_free(vstats_filename);
864
865     av_freep(&input_streams);
866     av_freep(&input_files);
867     av_freep(&output_streams);
868     av_freep(&output_files);
869
870     uninit_opts();
871     av_free(audio_buf);
872     allocated_audio_buf_size = 0;
873
874 #if CONFIG_AVFILTER
875     avfilter_uninit();
876 #endif
877     avformat_network_deinit();
878
879     av_freep(&input_tmp);
880
881     if (received_sigterm) {
882         av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
883                (int) received_sigterm);
884         exit (255);
885     }
886
887     exit(ret); /* not all OS-es handle main() return value */
888 }
889
890 static void assert_avoptions(AVDictionary *m)
891 {
892     AVDictionaryEntry *t;
893     if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
894         av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
895         exit_program(1);
896     }
897 }
898
899 static void assert_codec_experimental(AVCodecContext *c, int encoder)
900 {
901     const char *codec_string = encoder ? "encoder" : "decoder";
902     AVCodec *codec;
903     if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
904         c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
905         av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
906                 "results.\nAdd '-strict experimental' if you want to use it.\n",
907                 codec_string, c->codec->name);
908         codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
909         if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
910             av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
911                    codec_string, codec->name);
912         exit_program(1);
913     }
914 }
915
916 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
917 {
918     if (codec && codec->sample_fmts) {
919         const enum AVSampleFormat *p = codec->sample_fmts;
920         for (; *p != -1; p++) {
921             if (*p == st->codec->sample_fmt)
922                 break;
923         }
924         if (*p == -1) {
925             if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
926                 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
927             if(av_get_sample_fmt_name(st->codec->sample_fmt))
928             av_log(NULL, AV_LOG_WARNING,
929                    "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
930                    av_get_sample_fmt_name(st->codec->sample_fmt),
931                    codec->name,
932                    av_get_sample_fmt_name(codec->sample_fmts[0]));
933             st->codec->sample_fmt = codec->sample_fmts[0];
934         }
935     }
936 }
937
938 static void choose_sample_rate(AVStream *st, AVCodec *codec)
939 {
940     if (codec && codec->supported_samplerates) {
941         const int *p  = codec->supported_samplerates;
942         int best      = 0;
943         int best_dist = INT_MAX;
944         for (; *p; p++) {
945             int dist = abs(st->codec->sample_rate - *p);
946             if (dist < best_dist) {
947                 best_dist = dist;
948                 best      = *p;
949             }
950         }
951         if (best_dist) {
952             av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
953         }
954         st->codec->sample_rate = best;
955     }
956 }
957
958 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
959 {
960     if (codec && codec->pix_fmts) {
961         const enum PixelFormat *p = codec->pix_fmts;
962         int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
963         enum PixelFormat best= PIX_FMT_NONE;
964         if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
965             if (st->codec->codec_id == CODEC_ID_MJPEG) {
966                 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
967             } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
968                 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
969                                                  PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
970             }
971         }
972         for (; *p != PIX_FMT_NONE; p++) {
973             best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
974             if (*p == st->codec->pix_fmt)
975                 break;
976         }
977         if (*p == PIX_FMT_NONE) {
978             if (st->codec->pix_fmt != PIX_FMT_NONE)
979                 av_log(NULL, AV_LOG_WARNING,
980                        "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
981                        av_pix_fmt_descriptors[st->codec->pix_fmt].name,
982                        codec->name,
983                        av_pix_fmt_descriptors[best].name);
984             st->codec->pix_fmt = best;
985         }
986     }
987 }
988
989 static double
990 get_sync_ipts(const OutputStream *ost, int64_t pts)
991 {
992     OutputFile *of = &output_files[ost->file_index];
993     return (double)(pts - of->start_time) / AV_TIME_BASE;
994 }
995
996 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
997 {
998     AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
999     AVCodecContext          *avctx = ost->st->codec;
1000     int ret;
1001
1002     /*
1003      * Audio encoders may split the packets --  #frames in != #packets out.
1004      * But there is no reordering, so we can limit the number of output packets
1005      * by simply dropping them here.
1006      * Counting encoded video frames needs to be done separately because of
1007      * reordering, see do_video_out()
1008      */
1009     if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1010         if (ost->frame_number >= ost->max_frames)
1011             return;
1012         ost->frame_number++;
1013     }
1014
1015     while (bsfc) {
1016         AVPacket new_pkt = *pkt;
1017         int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1018                                            &new_pkt.data, &new_pkt.size,
1019                                            pkt->data, pkt->size,
1020                                            pkt->flags & AV_PKT_FLAG_KEY);
1021         if (a > 0) {
1022             av_free_packet(pkt);
1023             new_pkt.destruct = av_destruct_packet;
1024         } else if (a < 0) {
1025             av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1026                    bsfc->filter->name, pkt->stream_index,
1027                    avctx->codec ? avctx->codec->name : "copy");
1028             print_error("", a);
1029             if (exit_on_error)
1030                 exit_program(1);
1031         }
1032         *pkt = new_pkt;
1033
1034         bsfc = bsfc->next;
1035     }
1036
1037     pkt->stream_index = ost->index;
1038     ret = av_interleaved_write_frame(s, pkt);
1039     if (ret < 0) {
1040         print_error("av_interleaved_write_frame()", ret);
1041         exit_program(1);
1042     }
1043 }
1044
1045 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1046 {
1047     int fill_char = 0x00;
1048     if (sample_fmt == AV_SAMPLE_FMT_U8)
1049         fill_char = 0x80;
1050     memset(buf, fill_char, size);
1051 }
1052
1053 static int encode_audio_frame(AVFormatContext *s, OutputStream *ost,
1054                               const uint8_t *buf, int buf_size)
1055 {
1056     AVCodecContext *enc = ost->st->codec;
1057     AVFrame *frame = NULL;
1058     AVPacket pkt;
1059     int ret, got_packet;
1060
1061     av_init_packet(&pkt);
1062     pkt.data = NULL;
1063     pkt.size = 0;
1064
1065     if (buf) {
1066         if (!ost->output_frame) {
1067             ost->output_frame = avcodec_alloc_frame();
1068             if (!ost->output_frame) {
1069                 av_log(NULL, AV_LOG_FATAL, "out-of-memory in encode_audio_frame()\n");
1070                 exit_program(1);
1071             }
1072         }
1073         frame = ost->output_frame;
1074         if (frame->extended_data != frame->data)
1075             av_freep(&frame->extended_data);
1076         avcodec_get_frame_defaults(frame);
1077
1078         frame->nb_samples  = buf_size /
1079                              (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
1080         if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
1081                                             buf, buf_size, 1)) < 0) {
1082             av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1083             exit_program(1);
1084         }
1085
1086         ost->sync_opts += frame->nb_samples;
1087     }
1088
1089     got_packet = 0;
1090     if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1091         av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1092         exit_program(1);
1093     }
1094
1095     ret = pkt.size;
1096
1097     if (got_packet) {
1098         if (pkt.pts != AV_NOPTS_VALUE)
1099             pkt.pts      = av_rescale_q(pkt.pts,      enc->time_base, ost->st->time_base);
1100         if (pkt.dts != AV_NOPTS_VALUE)
1101             pkt.dts      = av_rescale_q(pkt.dts,      enc->time_base, ost->st->time_base);
1102         if (pkt.duration > 0)
1103             pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1104
1105         write_frame(s, &pkt, ost);
1106
1107         audio_size += pkt.size;
1108
1109         av_free_packet(&pkt);
1110     }
1111
1112     if (debug_ts) {
1113         av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1114                "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1115                av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1116                av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1117     }
1118
1119     return ret;
1120 }
1121
1122 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1123                          InputStream *ist, AVFrame *decoded_frame)
1124 {
1125     uint8_t *buftmp;
1126     int64_t audio_buf_size, size_out;
1127
1128     int frame_bytes, resample_changed;
1129     AVCodecContext *enc = ost->st->codec;
1130     AVCodecContext *dec = ist->st->codec;
1131     int osize = av_get_bytes_per_sample(enc->sample_fmt);
1132     int isize = av_get_bytes_per_sample(dec->sample_fmt);
1133     uint8_t *buf = decoded_frame->data[0];
1134     int size     = decoded_frame->nb_samples * dec->channels * isize;
1135     int64_t allocated_for_size = size;
1136
1137 need_realloc:
1138     audio_buf_size  = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
1139     audio_buf_size  = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
1140     audio_buf_size  = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
1141     audio_buf_size  = FFMAX(audio_buf_size, enc->frame_size);
1142     audio_buf_size *= osize * enc->channels;
1143
1144     if (audio_buf_size > INT_MAX) {
1145         av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1146         exit_program(1);
1147     }
1148
1149     av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
1150     if (!audio_buf) {
1151         av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1152         exit_program(1);
1153     }
1154
1155     if (enc->channels != dec->channels
1156      || enc->sample_fmt != dec->sample_fmt
1157      || enc->sample_rate!= dec->sample_rate
1158     )
1159         ost->audio_resample = 1;
1160
1161     resample_changed = ost->resample_sample_fmt  != dec->sample_fmt ||
1162                        ost->resample_channels    != dec->channels   ||
1163                        ost->resample_sample_rate != dec->sample_rate;
1164
1165     if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1166         if (resample_changed) {
1167             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",
1168                    ist->file_index, ist->st->index,
1169                    ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
1170                    dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
1171             ost->resample_sample_fmt  = dec->sample_fmt;
1172             ost->resample_channels    = dec->channels;
1173             ost->resample_sample_rate = dec->sample_rate;
1174             swr_free(&ost->swr);
1175         }
1176         /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1177         if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1178             ost->resample_sample_fmt  == enc->sample_fmt &&
1179             ost->resample_channels    == enc->channels   &&
1180             ost->resample_sample_rate == enc->sample_rate) {
1181             //ost->swr = NULL;
1182             ost->audio_resample = 0;
1183         } else {
1184             ost->swr = swr_alloc_set_opts(ost->swr,
1185                                           enc->channel_layout, enc->sample_fmt, enc->sample_rate,
1186                                           dec->channel_layout, dec->sample_fmt, dec->sample_rate,
1187                                           0, NULL);
1188             if (ost->audio_channels_mapped)
1189                 swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1190             av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1191             if (ost->audio_channels_mapped) {
1192                 av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
1193                 av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1194             }
1195             if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
1196                 av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
1197                 exit_program(1);
1198             }
1199             if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
1200                 av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
1201                 exit_program(1);
1202             }
1203             if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
1204             if(ost->swr && swr_init(ost->swr) < 0){
1205                 av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
1206                 swr_free(&ost->swr);
1207             }
1208
1209             if (!ost->swr) {
1210                 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
1211                         dec->channels, dec->sample_rate,
1212                         enc->channels, enc->sample_rate);
1213                 exit_program(1);
1214             }
1215         }
1216     }
1217
1218     av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1219
1220     if (audio_sync_method) {
1221         double delta = get_sync_ipts(ost, ist->pts) * enc->sample_rate - ost->sync_opts -
1222                        av_fifo_size(ost->fifo) / (enc->channels * osize);
1223         int idelta = delta * dec->sample_rate / enc->sample_rate;
1224         int byte_delta = idelta * isize * dec->channels;
1225
1226         // FIXME resample delay
1227         if (fabs(delta) > 50) {
1228             if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
1229                 if (byte_delta < 0) {
1230                     byte_delta = FFMAX(byte_delta, -size);
1231                     size += byte_delta;
1232                     buf  -= byte_delta;
1233                     av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
1234                            -byte_delta / (isize * dec->channels));
1235                     if (!size)
1236                         return;
1237                     ist->is_start = 0;
1238                 } else {
1239                     input_tmp = av_realloc(input_tmp, byte_delta + size);
1240
1241                     if (byte_delta > allocated_for_size - size) {
1242                         allocated_for_size = byte_delta + (int64_t)size;
1243                         goto need_realloc;
1244                     }
1245                     ist->is_start = 0;
1246
1247                     generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1248                     memcpy(input_tmp + byte_delta, buf, size);
1249                     buf = input_tmp;
1250                     size += byte_delta;
1251                     av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1252                 }
1253             } else if (audio_sync_method > 1) {
1254                 int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1255                 av_assert0(ost->audio_resample);
1256                 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
1257                        delta, comp, enc->sample_rate);
1258 //                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));
1259                 swr_set_compensation(ost->swr, comp, enc->sample_rate);
1260             }
1261         }
1262     } else
1263         ost->sync_opts = lrintf(get_sync_ipts(ost, ist->pts) * enc->sample_rate) -
1264                                 av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
1265
1266     if (ost->audio_resample || ost->audio_channels_mapped) {
1267         buftmp = audio_buf;
1268         size_out = swr_convert(ost->swr, (      uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
1269                                          (const uint8_t*[]){buf   }, size / (dec->channels * isize));
1270         if (size_out < 0) {
1271             av_log(NULL, AV_LOG_FATAL, "swr_convert failed\n");
1272             exit_program(1);
1273         }
1274         size_out = size_out * enc->channels * osize;
1275     } else {
1276         buftmp = buf;
1277         size_out = size;
1278     }
1279
1280     av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1281
1282     /* now encode as many frames as possible */
1283     if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
1284         /* output resampled raw samples */
1285         if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1286             av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1287             exit_program(1);
1288         }
1289         av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
1290
1291         frame_bytes = enc->frame_size * osize * enc->channels;
1292
1293         while (av_fifo_size(ost->fifo) >= frame_bytes) {
1294             av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1295             encode_audio_frame(s, ost, audio_buf, frame_bytes);
1296         }
1297     } else {
1298         encode_audio_frame(s, ost, buftmp, size_out);
1299     }
1300 }
1301
1302 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1303 {
1304     AVCodecContext *dec;
1305     AVPicture *picture2;
1306     AVPicture picture_tmp;
1307     uint8_t *buf = 0;
1308
1309     dec = ist->st->codec;
1310
1311     /* deinterlace : must be done before any resize */
1312     if (do_deinterlace) {
1313         int size;
1314
1315         /* create temporary picture */
1316         size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1317         buf  = av_malloc(size);
1318         if (!buf)
1319             return;
1320
1321         picture2 = &picture_tmp;
1322         avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1323
1324         if (avpicture_deinterlace(picture2, picture,
1325                                  dec->pix_fmt, dec->width, dec->height) < 0) {
1326             /* if error, do not deinterlace */
1327             av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1328             av_free(buf);
1329             buf = NULL;
1330             picture2 = picture;
1331         }
1332     } else {
1333         picture2 = picture;
1334     }
1335
1336     if (picture != picture2)
1337         *picture = *picture2;
1338     *bufp = buf;
1339 }
1340
1341 static void do_subtitle_out(AVFormatContext *s,
1342                             OutputStream *ost,
1343                             InputStream *ist,
1344                             AVSubtitle *sub,
1345                             int64_t pts)
1346 {
1347     static uint8_t *subtitle_out = NULL;
1348     int subtitle_out_max_size = 1024 * 1024;
1349     int subtitle_out_size, nb, i;
1350     AVCodecContext *enc;
1351     AVPacket pkt;
1352
1353     if (pts == AV_NOPTS_VALUE) {
1354         av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1355         if (exit_on_error)
1356             exit_program(1);
1357         return;
1358     }
1359
1360     enc = ost->st->codec;
1361
1362     if (!subtitle_out) {
1363         subtitle_out = av_malloc(subtitle_out_max_size);
1364     }
1365
1366     /* Note: DVB subtitle need one packet to draw them and one other
1367        packet to clear them */
1368     /* XXX: signal it in the codec context ? */
1369     if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1370         nb = 2;
1371     else
1372         nb = 1;
1373
1374     for (i = 0; i < nb; i++) {
1375         ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1376
1377         sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1378         // start_display_time is required to be 0
1379         sub->pts               += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1380         sub->end_display_time  -= sub->start_display_time;
1381         sub->start_display_time = 0;
1382         subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1383                                                     subtitle_out_max_size, sub);
1384         if (subtitle_out_size < 0) {
1385             av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1386             exit_program(1);
1387         }
1388
1389         av_init_packet(&pkt);
1390         pkt.data = subtitle_out;
1391         pkt.size = subtitle_out_size;
1392         pkt.pts  = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1393         if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1394             /* XXX: the pts correction is handled here. Maybe handling
1395                it in the codec would be better */
1396             if (i == 0)
1397                 pkt.pts += 90 * sub->start_display_time;
1398             else
1399                 pkt.pts += 90 * sub->end_display_time;
1400         }
1401         write_frame(s, &pkt, ost);
1402     }
1403 }
1404
1405 static void do_video_resample(OutputStream *ost,
1406                               InputStream *ist,
1407                               AVFrame *in_picture,
1408                               AVFrame **out_picture)
1409 {
1410 #if CONFIG_AVFILTER
1411     *out_picture = in_picture;
1412 #else
1413     AVCodecContext *dec = ist->st->codec;
1414     AVCodecContext *enc = ost->st->codec;
1415     int resample_changed = ost->resample_width   != in_picture->width  ||
1416                            ost->resample_height  != in_picture->height ||
1417                            ost->resample_pix_fmt != in_picture->format;
1418
1419     *out_picture = in_picture;
1420     if (resample_changed) {
1421         av_log(NULL, AV_LOG_INFO,
1422                "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s / frm size:%dx%d fmt:%s\n",
1423                ist->file_index, ist->st->index,
1424                ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1425                dec->width         , dec->height         , av_get_pix_fmt_name(dec->pix_fmt),
1426                in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
1427         ost->resample_width   = in_picture->width;
1428         ost->resample_height  = in_picture->height;
1429         ost->resample_pix_fmt = in_picture->format;
1430     }
1431
1432     ost->video_resample = in_picture->width   != enc->width  ||
1433                           in_picture->height  != enc->height ||
1434                           in_picture->format  != enc->pix_fmt;
1435
1436     if (ost->video_resample) {
1437         *out_picture = &ost->resample_frame;
1438         if (!ost->img_resample_ctx || resample_changed) {
1439             /* initialize the destination picture */
1440             if (!ost->resample_frame.data[0]) {
1441                 avcodec_get_frame_defaults(&ost->resample_frame);
1442                 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1443                                     enc->width, enc->height)) {
1444                     av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1445                     exit_program(1);
1446                 }
1447             }
1448             /* initialize a new scaler context */
1449             sws_freeContext(ost->img_resample_ctx);
1450             ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1451                                                    enc->width, enc->height, enc->pix_fmt,
1452                                                    ost->sws_flags, NULL, NULL, NULL);
1453             if (ost->img_resample_ctx == NULL) {
1454                 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1455                 exit_program(1);
1456             }
1457         }
1458         sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1459               0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1460     }
1461 #endif
1462 }
1463
1464 static double psnr(double d)
1465 {
1466     return -10.0 * log(d) / log(10.0);
1467 }
1468
1469 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1470                            int frame_size)
1471 {
1472     AVCodecContext *enc;
1473     int frame_number;
1474     double ti1, bitrate, avg_bitrate;
1475
1476     /* this is executed just the first time do_video_stats is called */
1477     if (!vstats_file) {
1478         vstats_file = fopen(vstats_filename, "w");
1479         if (!vstats_file) {
1480             perror("fopen");
1481             exit_program(1);
1482         }
1483     }
1484
1485     enc = ost->st->codec;
1486     if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1487         frame_number = ost->frame_number;
1488         fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1489         if (enc->flags&CODEC_FLAG_PSNR)
1490             fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1491
1492         fprintf(vstats_file,"f_size= %6d ", frame_size);
1493         /* compute pts value */
1494         ti1 = ost->sync_opts * av_q2d(enc->time_base);
1495         if (ti1 < 0.01)
1496             ti1 = 0.01;
1497
1498         bitrate     = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1499         avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1500         fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1501                (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1502         fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1503     }
1504 }
1505
1506
1507 static void do_video_out(AVFormatContext *s, OutputStream *ost,
1508                          InputStream *ist, AVFrame *in_picture)
1509 {
1510     int nb_frames, i, ret, format_video_sync;
1511     AVFrame *final_picture;
1512     AVCodecContext *enc;
1513     double sync_ipts, delta;
1514     double duration = 0;
1515     int frame_size = 0;
1516     float quality = same_quant ? in_picture->quality
1517                                : ost->st->codec->global_quality;
1518
1519     enc = ost->st->codec;
1520
1521     if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
1522         duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
1523         if(ist->st->avg_frame_rate.num)
1524             duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
1525
1526         duration /= av_q2d(enc->time_base);
1527     }
1528
1529     sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1530     delta = sync_ipts - ost->sync_opts + duration;
1531
1532     /* by default, we output a single frame */
1533     nb_frames = 1;
1534
1535     format_video_sync = video_sync_method;
1536     if (format_video_sync == VSYNC_AUTO)
1537         format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1538
1539     switch (format_video_sync) {
1540     case VSYNC_CFR:
1541         // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1542         if (delta < -1.1)
1543             nb_frames = 0;
1544         else if (delta > 1.1)
1545             nb_frames = lrintf(delta);
1546         break;
1547     case VSYNC_VFR:
1548         if (delta <= -0.6)
1549             nb_frames = 0;
1550         else if (delta > 0.6)
1551             ost->sync_opts = lrintf(sync_ipts);
1552         break;
1553     case VSYNC_DROP:
1554     case VSYNC_PASSTHROUGH:
1555         ost->sync_opts = lrintf(sync_ipts);
1556         break;
1557     default:
1558         av_assert0(0);
1559     }
1560
1561     nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1562     if (nb_frames == 0) {
1563         nb_frames_drop++;
1564         av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1565         return;
1566     } else if (nb_frames > 1) {
1567         nb_frames_dup += nb_frames - 1;
1568         av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1569     }
1570
1571     do_video_resample(ost, ist, in_picture, &final_picture);
1572
1573     /* duplicates frame if needed */
1574     for (i = 0; i < nb_frames; i++) {
1575         AVPacket pkt;
1576         av_init_packet(&pkt);
1577         pkt.data = NULL;
1578         pkt.size = 0;
1579
1580         if (s->oformat->flags & AVFMT_RAWPICTURE &&
1581             enc->codec->id == CODEC_ID_RAWVIDEO) {
1582             /* raw pictures are written as AVPicture structure to
1583                avoid any copies. We support temporarily the older
1584                method. */
1585             enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1586             enc->coded_frame->top_field_first  = in_picture->top_field_first;
1587             pkt.data   = (uint8_t *)final_picture;
1588             pkt.size   =  sizeof(AVPicture);
1589             pkt.pts    = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1590             pkt.flags |= AV_PKT_FLAG_KEY;
1591
1592             write_frame(s, &pkt, ost);
1593         } else {
1594             int got_packet;
1595             AVFrame big_picture;
1596
1597             big_picture = *final_picture;
1598             /* better than nothing: use input picture interlaced
1599                settings */
1600             big_picture.interlaced_frame = in_picture->interlaced_frame;
1601             if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1602                 if (ost->top_field_first == -1)
1603                     big_picture.top_field_first = in_picture->top_field_first;
1604                 else
1605                     big_picture.top_field_first = !!ost->top_field_first;
1606             }
1607
1608             /* handles same_quant here. This is not correct because it may
1609                not be a global option */
1610             big_picture.quality = quality;
1611             if (!enc->me_threshold)
1612                 big_picture.pict_type = 0;
1613             big_picture.pts = ost->sync_opts;
1614             if (ost->forced_kf_index < ost->forced_kf_count &&
1615                 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1616                 big_picture.pict_type = AV_PICTURE_TYPE_I;
1617                 ost->forced_kf_index++;
1618             }
1619             ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1620             if (ret < 0) {
1621                 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1622                 exit_program(1);
1623             }
1624
1625             if (got_packet) {
1626                 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1627                     pkt.pts = ost->sync_opts;
1628
1629                 if (pkt.pts != AV_NOPTS_VALUE)
1630                     pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1631                 if (pkt.dts != AV_NOPTS_VALUE)
1632                     pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1633
1634                 if (debug_ts) {
1635                     av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1636                            "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1637                            av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1638                            av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1639                 }
1640
1641                 if (format_video_sync == VSYNC_DROP)
1642                     pkt.pts = pkt.dts = AV_NOPTS_VALUE;
1643
1644                 write_frame(s, &pkt, ost);
1645                 frame_size = pkt.size;
1646                 video_size += pkt.size;
1647                 av_free_packet(&pkt);
1648
1649                 /* if two pass, output log */
1650                 if (ost->logfile && enc->stats_out) {
1651                     fprintf(ost->logfile, "%s", enc->stats_out);
1652                 }
1653             }
1654         }
1655         ost->sync_opts++;
1656         /*
1657          * For video, number of frames in == number of packets out.
1658          * But there may be reordering, so we can't throw away frames on encoder
1659          * flush, we need to limit them here, before they go into encoder.
1660          */
1661         ost->frame_number++;
1662     }
1663     if (vstats_filename && frame_size)
1664         do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
1665 }
1666
1667 static void print_report(OutputFile *output_files,
1668                          OutputStream *ost_table, int nb_ostreams,
1669                          int is_last_report, int64_t timer_start, int64_t cur_time)
1670 {
1671     char buf[1024];
1672     OutputStream *ost;
1673     AVFormatContext *oc;
1674     int64_t total_size;
1675     AVCodecContext *enc;
1676     int frame_number, vid, i;
1677     double bitrate;
1678     int64_t pts = INT64_MAX;
1679     static int64_t last_time = -1;
1680     static int qp_histogram[52];
1681     int hours, mins, secs, us;
1682
1683     if (!print_stats && !is_last_report)
1684         return;
1685
1686     if (!is_last_report) {
1687         if (last_time == -1) {
1688             last_time = cur_time;
1689             return;
1690         }
1691         if ((cur_time - last_time) < 500000)
1692             return;
1693         last_time = cur_time;
1694     }
1695
1696
1697     oc = output_files[0].ctx;
1698
1699     total_size = avio_size(oc->pb);
1700     if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1701         total_size = avio_tell(oc->pb);
1702         if (total_size < 0)
1703             total_size = 0;
1704     }
1705
1706     buf[0] = '\0';
1707     vid = 0;
1708     for (i = 0; i < nb_ostreams; i++) {
1709         float q = -1;
1710         ost = &ost_table[i];
1711         enc = ost->st->codec;
1712         if (!ost->stream_copy && enc->coded_frame)
1713             q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1714         if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1715             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1716         }
1717         if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1718             float t = (cur_time-timer_start) / 1000000.0;
1719
1720             frame_number = ost->frame_number;
1721             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1722                      frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
1723             if (is_last_report)
1724                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1725             if (qp_hist) {
1726                 int j;
1727                 int qp = lrintf(q);
1728                 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1729                     qp_histogram[qp]++;
1730                 for (j = 0; j < 32; j++)
1731                     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1732             }
1733             if (enc->flags&CODEC_FLAG_PSNR) {
1734                 int j;
1735                 double error, error_sum = 0;
1736                 double scale, scale_sum = 0;
1737                 char type[3] = { 'Y','U','V' };
1738                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1739                 for (j = 0; j < 3; j++) {
1740                     if (is_last_report) {
1741                         error = enc->error[j];
1742                         scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1743                     } else {
1744                         error = enc->coded_frame->error[j];
1745                         scale = enc->width * enc->height * 255.0 * 255.0;
1746                     }
1747                     if (j)
1748                         scale /= 4;
1749                     error_sum += error;
1750                     scale_sum += scale;
1751                     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1752                 }
1753                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1754             }
1755             vid = 1;
1756         }
1757         /* compute min output value */
1758         pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1759                                       ost->st->time_base, AV_TIME_BASE_Q));
1760     }
1761
1762     secs = pts / AV_TIME_BASE;
1763     us = pts % AV_TIME_BASE;
1764     mins = secs / 60;
1765     secs %= 60;
1766     hours = mins / 60;
1767     mins %= 60;
1768
1769     bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1770
1771     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1772              "size=%8.0fkB time=", total_size / 1024.0);
1773     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1774              "%02d:%02d:%02d.%02d ", hours, mins, secs,
1775              (100 * us) / AV_TIME_BASE);
1776     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1777              "bitrate=%6.1fkbits/s", bitrate);
1778
1779     if (nb_frames_dup || nb_frames_drop)
1780         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1781                 nb_frames_dup, nb_frames_drop);
1782
1783     av_log(NULL, AV_LOG_INFO, "%s    \r", buf);
1784
1785     fflush(stderr);
1786
1787     if (is_last_report) {
1788         int64_t raw= audio_size + video_size + extra_size;
1789         av_log(NULL, AV_LOG_INFO, "\n");
1790         av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1791                video_size / 1024.0,
1792                audio_size / 1024.0,
1793                extra_size / 1024.0,
1794                100.0 * (total_size - raw) / raw
1795         );
1796         if(video_size + audio_size + extra_size == 0){
1797             av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
1798         }
1799     }
1800 }
1801
1802 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1803 {
1804     int i, ret;
1805
1806     for (i = 0; i < nb_ostreams; i++) {
1807         OutputStream   *ost = &ost_table[i];
1808         AVCodecContext *enc = ost->st->codec;
1809         AVFormatContext *os = output_files[ost->file_index].ctx;
1810         int stop_encoding = 0;
1811
1812         if (!ost->encoding_needed)
1813             continue;
1814
1815         if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1816             continue;
1817         if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1818             continue;
1819
1820         for (;;) {
1821             AVPacket pkt;
1822             int fifo_bytes, got_packet;
1823             av_init_packet(&pkt);
1824             pkt.data = NULL;
1825             pkt.size = 0;
1826
1827             switch (ost->st->codec->codec_type) {
1828             case AVMEDIA_TYPE_AUDIO:
1829                 fifo_bytes = av_fifo_size(ost->fifo);
1830                 if (fifo_bytes > 0) {
1831                     /* encode any samples remaining in fifo */
1832                     int frame_bytes = fifo_bytes;
1833
1834                     av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1835
1836                     /* pad last frame with silence if needed */
1837                     if (!(enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)) {
1838                         frame_bytes = enc->frame_size * enc->channels *
1839                                       av_get_bytes_per_sample(enc->sample_fmt);
1840                         if (allocated_audio_buf_size < frame_bytes)
1841                             exit_program(1);
1842                         generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1843                     }
1844                     encode_audio_frame(os, ost, audio_buf, frame_bytes);
1845                 } else {
1846                     /* flush encoder with NULL frames until it is done
1847                        returning packets */
1848                     if (encode_audio_frame(os, ost, NULL, 0) == 0) {
1849                         stop_encoding = 1;
1850                         break;
1851                     }
1852                 }
1853                 break;
1854             case AVMEDIA_TYPE_VIDEO:
1855                 ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet);
1856                 if (ret < 0) {
1857                     av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1858                     exit_program(1);
1859                 }
1860                 video_size += pkt.size;
1861                 if (ost->logfile && enc->stats_out) {
1862                     fprintf(ost->logfile, "%s", enc->stats_out);
1863                 }
1864                 if (!got_packet) {
1865                     stop_encoding = 1;
1866                     break;
1867                 }
1868                 if (pkt.pts != AV_NOPTS_VALUE)
1869                     pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1870                 if (pkt.dts != AV_NOPTS_VALUE)
1871                     pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1872                 write_frame(os, &pkt, ost);
1873                 break;
1874             default:
1875                 stop_encoding = 1;
1876             }
1877             if (stop_encoding)
1878                 break;
1879         }
1880     }
1881 }
1882
1883 /*
1884  * Check whether a packet from ist should be written into ost at this time
1885  */
1886 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1887 {
1888     OutputFile *of = &output_files[ost->file_index];
1889     int ist_index  = ist - input_streams;
1890
1891     if (ost->source_index != ist_index)
1892         return 0;
1893
1894     if (of->start_time && ist->pts < of->start_time)
1895         return 0;
1896
1897     if (of->recording_time != INT64_MAX &&
1898         av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1899                       (AVRational){ 1, 1000000 }) >= 0) {
1900         ost->is_past_recording_time = 1;
1901         return 0;
1902     }
1903
1904     return 1;
1905 }
1906
1907 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1908 {
1909     OutputFile *of = &output_files[ost->file_index];
1910     int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1911     AVPicture pict;
1912     AVPacket opkt;
1913
1914     av_init_packet(&opkt);
1915
1916     if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1917         !ost->copy_initial_nonkeyframes)
1918         return;
1919
1920     /* force the input stream PTS */
1921     if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1922         audio_size += pkt->size;
1923     else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1924         video_size += pkt->size;
1925         ost->sync_opts++;
1926     }
1927
1928     if (pkt->pts != AV_NOPTS_VALUE)
1929         opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1930     else
1931         opkt.pts = AV_NOPTS_VALUE;
1932
1933     if (pkt->dts == AV_NOPTS_VALUE)
1934         opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
1935     else
1936         opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1937     opkt.dts -= ost_tb_start_time;
1938
1939     opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1940     opkt.flags    = pkt->flags;
1941
1942     // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1943     if (  ost->st->codec->codec_id != CODEC_ID_H264
1944        && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1945        && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1946        && ost->st->codec->codec_id != CODEC_ID_VC1
1947        ) {
1948         if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1949             opkt.destruct = av_destruct_packet;
1950     } else {
1951         opkt.data = pkt->data;
1952         opkt.size = pkt->size;
1953     }
1954     if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
1955         /* store AVPicture in AVPacket, as expected by the output format */
1956         avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1957         opkt.data = (uint8_t *)&pict;
1958         opkt.size = sizeof(AVPicture);
1959         opkt.flags |= AV_PKT_FLAG_KEY;
1960     }
1961
1962     write_frame(of->ctx, &opkt, ost);
1963     ost->st->codec->frame_number++;
1964     av_free_packet(&opkt);
1965 }
1966
1967 static void rate_emu_sleep(InputStream *ist)
1968 {
1969     if (input_files[ist->file_index].rate_emu) {
1970         int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
1971         int64_t now = av_gettime() - ist->start;
1972         if (pts > now)
1973             usleep(pts - now);
1974     }
1975 }
1976
1977 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
1978 {
1979     AVFrame *decoded_frame;
1980     AVCodecContext *avctx = ist->st->codec;
1981     int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1982     int i, ret;
1983
1984     if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
1985         return AVERROR(ENOMEM);
1986     else
1987         avcodec_get_frame_defaults(ist->decoded_frame);
1988     decoded_frame = ist->decoded_frame;
1989
1990     ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
1991     if (ret < 0) {
1992         return ret;
1993     }
1994
1995     if (!*got_output) {
1996         /* no audio frame */
1997         return ret;
1998     }
1999
2000     /* if the decoder provides a pts, use it instead of the last packet pts.
2001        the decoder could be delaying output by a packet or more. */
2002     if (decoded_frame->pts != AV_NOPTS_VALUE)
2003         ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2004
2005     /* increment next_dts to use for the case where the input stream does not
2006        have timestamps or there are multiple frames in the packet */
2007     ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2008                      avctx->sample_rate;
2009     ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2010                      avctx->sample_rate;
2011
2012
2013     // preprocess audio (volume)
2014     if (audio_volume != 256) {
2015         int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
2016         void *samples = decoded_frame->data[0];
2017         switch (avctx->sample_fmt) {
2018         case AV_SAMPLE_FMT_U8:
2019         {
2020             uint8_t *volp = samples;
2021             for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2022                 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
2023                 *volp++ = av_clip_uint8(v);
2024             }
2025             break;
2026         }
2027         case AV_SAMPLE_FMT_S16:
2028         {
2029             int16_t *volp = samples;
2030             for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2031                 int v = ((*volp) * audio_volume + 128) >> 8;
2032                 *volp++ = av_clip_int16(v);
2033             }
2034             break;
2035         }
2036         case AV_SAMPLE_FMT_S32:
2037         {
2038             int32_t *volp = samples;
2039             for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2040                 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
2041                 *volp++ = av_clipl_int32(v);
2042             }
2043             break;
2044         }
2045         case AV_SAMPLE_FMT_FLT:
2046         {
2047             float *volp = samples;
2048             float scale = audio_volume / 256.f;
2049             for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2050                 *volp++ *= scale;
2051             }
2052             break;
2053         }
2054         case AV_SAMPLE_FMT_DBL:
2055         {
2056             double *volp = samples;
2057             double scale = audio_volume / 256.;
2058             for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
2059                 *volp++ *= scale;
2060             }
2061             break;
2062         }
2063         default:
2064             av_log(NULL, AV_LOG_FATAL,
2065                    "Audio volume adjustment on sample format %s is not supported.\n",
2066                    av_get_sample_fmt_name(ist->st->codec->sample_fmt));
2067             exit_program(1);
2068         }
2069     }
2070
2071     rate_emu_sleep(ist);
2072
2073     for (i = 0; i < nb_output_streams; i++) {
2074         OutputStream *ost = &output_streams[i];
2075
2076         if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2077             continue;
2078         do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2079     }
2080
2081     return ret;
2082 }
2083
2084 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
2085 {
2086     AVFrame *decoded_frame;
2087     void *buffer_to_free = NULL;
2088     int i, ret = 0;
2089     int64_t *best_effort_timestamp;
2090     AVRational *frame_sample_aspect;
2091
2092     if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2093         return AVERROR(ENOMEM);
2094     else
2095         avcodec_get_frame_defaults(ist->decoded_frame);
2096     decoded_frame = ist->decoded_frame;
2097     pkt->pts  = *pkt_pts;
2098     pkt->dts  = ist->dts;
2099     *pkt_pts  = AV_NOPTS_VALUE;
2100
2101     ret = avcodec_decode_video2(ist->st->codec,
2102                                 decoded_frame, got_output, pkt);
2103     if (ret < 0)
2104         return ret;
2105
2106     if (!*got_output) {
2107         /* no picture yet */
2108         return ret;
2109     }
2110
2111     best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
2112     if(*best_effort_timestamp != AV_NOPTS_VALUE)
2113         ist->next_pts = ist->pts = decoded_frame->pts = *best_effort_timestamp;
2114
2115     pkt->size = 0;
2116
2117     pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2118
2119 #if CONFIG_AVFILTER
2120     frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2121     for(i=0;i<nb_output_streams;i++) {
2122         OutputStream *ost = ost = &output_streams[i];
2123         if(check_output_constraints(ist, ost) && ost->encoding_needed){
2124             if (!frame_sample_aspect->num)
2125                 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2126             decoded_frame->pts = ist->pts;
2127             if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2128                 FrameBuffer      *buf = decoded_frame->opaque;
2129                 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2130                                             decoded_frame->data, decoded_frame->linesize,
2131                                             AV_PERM_READ | AV_PERM_PRESERVE,
2132                                             ist->st->codec->width, ist->st->codec->height,
2133                                             ist->st->codec->pix_fmt);
2134
2135                 avfilter_copy_frame_props(fb, decoded_frame);
2136                 fb->buf->priv           = buf;
2137                 fb->buf->free           = filter_release_buffer;
2138
2139                 buf->refcount++;
2140                 av_buffersrc_buffer(ost->input_video_filter, fb);
2141             } else
2142             if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
2143                 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2144                 exit_program(1);
2145             }
2146         }
2147     }
2148 #endif
2149
2150     rate_emu_sleep(ist);
2151
2152     for (i = 0; i < nb_output_streams; i++) {
2153         OutputStream *ost = &output_streams[i];
2154
2155         if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2156             continue;
2157
2158 #if CONFIG_AVFILTER
2159         while (av_buffersink_poll_frame(ost->output_video_filter)) {
2160             AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2161             AVFrame *filtered_frame;
2162
2163             if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
2164                 av_log(NULL, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2165                 goto cont;
2166             }
2167             if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
2168                 ret = AVERROR(ENOMEM);
2169                 goto end;
2170             }
2171             filtered_frame = ist->filtered_frame;
2172             *filtered_frame= *decoded_frame; //for me_threshold
2173             avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
2174             filtered_frame->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2175             if (ost->picref->video && !ost->frame_aspect_ratio)
2176                 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
2177             do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame);
2178             cont:
2179             avfilter_unref_buffer(ost->picref);
2180         }
2181 #else
2182         do_video_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2183 #endif
2184     }
2185
2186 end:
2187     av_free(buffer_to_free);
2188     return ret;
2189 }
2190
2191 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2192 {
2193     AVSubtitle subtitle;
2194     int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2195                                           &subtitle, got_output, pkt);
2196     if (ret < 0)
2197         return ret;
2198     if (!*got_output)
2199         return ret;
2200
2201     rate_emu_sleep(ist);
2202
2203     for (i = 0; i < nb_output_streams; i++) {
2204         OutputStream *ost = &output_streams[i];
2205
2206         if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2207             continue;
2208
2209         do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
2210     }
2211
2212     avsubtitle_free(&subtitle);
2213     return ret;
2214 }
2215
2216 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2217 static int output_packet(InputStream *ist,
2218                          OutputStream *ost_table, int nb_ostreams,
2219                          const AVPacket *pkt)
2220 {
2221     int ret = 0, i;
2222     int got_output;
2223     int64_t pkt_pts = AV_NOPTS_VALUE;
2224
2225     AVPacket avpkt;
2226
2227     if (ist->next_dts == AV_NOPTS_VALUE)
2228         ist->next_dts = ist->dts;
2229     if (ist->next_pts == AV_NOPTS_VALUE)
2230         ist->next_pts = ist->pts;
2231
2232     if (pkt == NULL) {
2233         /* EOF handling */
2234         av_init_packet(&avpkt);
2235         avpkt.data = NULL;
2236         avpkt.size = 0;
2237         goto handle_eof;
2238     } else {
2239         avpkt = *pkt;
2240     }
2241
2242     if (pkt->dts != AV_NOPTS_VALUE) {
2243         ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2244         if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2245             ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2246     }
2247     if(pkt->pts != AV_NOPTS_VALUE)
2248         pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2249
2250     // while we have more to decode or while the decoder did output something on EOF
2251     while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2252         int duration;
2253     handle_eof:
2254
2255         ist->pts = ist->next_pts;
2256         ist->dts = ist->next_dts;
2257
2258         if (avpkt.size && avpkt.size != pkt->size) {
2259             av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2260                    "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2261             ist->showed_multi_packet_warning = 1;
2262         }
2263
2264         switch (ist->st->codec->codec_type) {
2265         case AVMEDIA_TYPE_AUDIO:
2266             ret = transcode_audio    (ist, &avpkt, &got_output);
2267             break;
2268         case AVMEDIA_TYPE_VIDEO:
2269             ret = transcode_video    (ist, &avpkt, &got_output, &pkt_pts);
2270             if (avpkt.duration) {
2271                 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2272             } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2273                 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2274                 duration = ((int64_t)AV_TIME_BASE *
2275                                 ist->st->codec->time_base.num * ticks) /
2276                                 ist->st->codec->time_base.den;
2277             } else
2278                 duration = 0;
2279
2280             if(ist->dts != AV_NOPTS_VALUE && duration) {
2281                 ist->next_dts += duration;
2282             }else
2283                 ist->next_dts = AV_NOPTS_VALUE;
2284
2285             if (got_output)
2286                 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2287             break;
2288         case AVMEDIA_TYPE_SUBTITLE:
2289             ret = transcode_subtitles(ist, &avpkt, &got_output);
2290             break;
2291         default:
2292             return -1;
2293         }
2294
2295         if (ret < 0)
2296             return ret;
2297
2298         avpkt.dts=
2299         avpkt.pts= AV_NOPTS_VALUE;
2300
2301         // touch data and size only if not EOF
2302         if (pkt) {
2303             if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2304                 ret = avpkt.size;
2305             avpkt.data += ret;
2306             avpkt.size -= ret;
2307         }
2308         if (!got_output) {
2309             continue;
2310         }
2311     }
2312
2313     /* handle stream copy */
2314     if (!ist->decoding_needed) {
2315         rate_emu_sleep(ist);
2316         ist->dts = ist->next_dts;
2317         switch (ist->st->codec->codec_type) {
2318         case AVMEDIA_TYPE_AUDIO:
2319             ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2320                              ist->st->codec->sample_rate;
2321             break;
2322         case AVMEDIA_TYPE_VIDEO:
2323             if (pkt->duration) {
2324                 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2325             } else if(ist->st->codec->time_base.num != 0) {
2326                 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2327                 ist->next_dts += ((int64_t)AV_TIME_BASE *
2328                                   ist->st->codec->time_base.num * ticks) /
2329                                   ist->st->codec->time_base.den;
2330             }
2331             break;
2332         }
2333         ist->pts = ist->dts;
2334         ist->next_pts = ist->next_dts;
2335     }
2336     for (i = 0; pkt && i < nb_ostreams; i++) {
2337         OutputStream *ost = &ost_table[i];
2338
2339         if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2340             continue;
2341
2342         do_streamcopy(ist, ost, pkt);
2343     }
2344
2345     return 0;
2346 }
2347
2348 static void print_sdp(OutputFile *output_files, int n)
2349 {
2350     char sdp[2048];
2351     int i;
2352     AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2353
2354     if (!avc)
2355         exit_program(1);
2356     for (i = 0; i < n; i++)
2357         avc[i] = output_files[i].ctx;
2358
2359     av_sdp_create(avc, n, sdp, sizeof(sdp));
2360     printf("SDP:\n%s\n", sdp);
2361     fflush(stdout);
2362     av_freep(&avc);
2363 }
2364
2365 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
2366                              char *error, int error_len)
2367 {
2368     InputStream *ist = &input_streams[ist_index];
2369     if (ist->decoding_needed) {
2370         AVCodec *codec = ist->dec;
2371         if (!codec) {
2372             snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2373                     avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2374             return AVERROR(EINVAL);
2375         }
2376
2377         ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
2378         if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2379             ist->st->codec->get_buffer     = codec_get_buffer;
2380             ist->st->codec->release_buffer = codec_release_buffer;
2381             ist->st->codec->opaque         = ist;
2382         }
2383
2384         if (!av_dict_get(ist->opts, "threads", NULL, 0))
2385             av_dict_set(&ist->opts, "threads", "auto", 0);
2386         if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2387             snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2388                     ist->file_index, ist->st->index);
2389             return AVERROR(EINVAL);
2390         }
2391         assert_codec_experimental(ist->st->codec, 0);
2392         assert_avoptions(ist->opts);
2393     }
2394
2395     ist->dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2396     ist->next_pts = AV_NOPTS_VALUE;
2397     ist->next_dts = AV_NOPTS_VALUE;
2398     ist->is_start = 1;
2399
2400     return 0;
2401 }
2402
2403 static int transcode_init(OutputFile *output_files, int nb_output_files,
2404                           InputFile  *input_files,  int nb_input_files)
2405 {
2406     int ret = 0, i, j, k;
2407     AVFormatContext *oc;
2408     AVCodecContext *codec, *icodec;
2409     OutputStream *ost;
2410     InputStream *ist;
2411     char error[1024];
2412     int want_sdp = 1;
2413
2414     /* init framerate emulation */
2415     for (i = 0; i < nb_input_files; i++) {
2416         InputFile *ifile = &input_files[i];
2417         if (ifile->rate_emu)
2418             for (j = 0; j < ifile->nb_streams; j++)
2419                 input_streams[j + ifile->ist_index].start = av_gettime();
2420     }
2421
2422     /* output stream init */
2423     for (i = 0; i < nb_output_files; i++) {
2424         oc = output_files[i].ctx;
2425         if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2426             av_dump_format(oc, i, oc->filename, 1);
2427             av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2428             return AVERROR(EINVAL);
2429         }
2430     }
2431
2432     /* for each output stream, we compute the right encoding parameters */
2433     for (i = 0; i < nb_output_streams; i++) {
2434         ost = &output_streams[i];
2435         oc  = output_files[ost->file_index].ctx;
2436         ist = &input_streams[ost->source_index];
2437
2438         if (ost->attachment_filename)
2439             continue;
2440
2441         codec  = ost->st->codec;
2442         icodec = ist->st->codec;
2443
2444         ost->st->disposition          = ist->st->disposition;
2445         codec->bits_per_raw_sample    = icodec->bits_per_raw_sample;
2446         codec->chroma_sample_location = icodec->chroma_sample_location;
2447
2448         if (ost->stream_copy) {
2449             uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2450
2451             if (extra_size > INT_MAX) {
2452                 return AVERROR(EINVAL);
2453             }
2454
2455             /* if stream_copy is selected, no need to decode or encode */
2456             codec->codec_id   = icodec->codec_id;
2457             codec->codec_type = icodec->codec_type;
2458
2459             if (!codec->codec_tag) {
2460                 if (!oc->oformat->codec_tag ||
2461                      av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2462                      av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2463                     codec->codec_tag = icodec->codec_tag;
2464             }
2465
2466             codec->bit_rate       = icodec->bit_rate;
2467             codec->rc_max_rate    = icodec->rc_max_rate;
2468             codec->rc_buffer_size = icodec->rc_buffer_size;
2469             codec->field_order    = icodec->field_order;
2470             codec->extradata      = av_mallocz(extra_size);
2471             if (!codec->extradata) {
2472                 return AVERROR(ENOMEM);
2473             }
2474             memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2475             codec->extradata_size= icodec->extradata_size;
2476
2477             codec->time_base = ist->st->time_base;
2478             /*
2479              * Avi is a special case here because it supports variable fps but
2480              * having the fps and timebase differe significantly adds quite some
2481              * overhead
2482              */
2483             if(!strcmp(oc->oformat->name, "avi")) {
2484                 if (   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2485                                  && av_q2d(ist->st->time_base) < 1.0/500
2486                     || copy_tb==0){
2487                     codec->time_base = icodec->time_base;
2488                     codec->time_base.num *= icodec->ticks_per_frame;
2489                     codec->time_base.den *= 2;
2490                 }
2491             } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2492                       && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2493                       && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2494             ) {
2495                 if(   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2496                                 && av_q2d(ist->st->time_base) < 1.0/500
2497                    || copy_tb==0){
2498                     codec->time_base = icodec->time_base;
2499                     codec->time_base.num *= icodec->ticks_per_frame;
2500                 }
2501             }
2502             av_reduce(&codec->time_base.num, &codec->time_base.den,
2503                         codec->time_base.num, codec->time_base.den, INT_MAX);
2504
2505             switch (codec->codec_type) {
2506             case AVMEDIA_TYPE_AUDIO:
2507                 if (audio_volume != 256) {
2508                     av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2509                     exit_program(1);
2510                 }
2511                 codec->channel_layout     = icodec->channel_layout;
2512                 codec->sample_rate        = icodec->sample_rate;
2513                 codec->channels           = icodec->channels;
2514                 codec->frame_size         = icodec->frame_size;
2515                 codec->audio_service_type = icodec->audio_service_type;
2516                 codec->block_align        = icodec->block_align;
2517                 break;
2518             case AVMEDIA_TYPE_VIDEO:
2519                 codec->pix_fmt            = icodec->pix_fmt;
2520                 codec->width              = icodec->width;
2521                 codec->height             = icodec->height;
2522                 codec->has_b_frames       = icodec->has_b_frames;
2523                 if (!codec->sample_aspect_ratio.num) {
2524                     codec->sample_aspect_ratio   =
2525                     ost->st->sample_aspect_ratio =
2526                         ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2527                         ist->st->codec->sample_aspect_ratio.num ?
2528                         ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2529                 }
2530                 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2531                 break;
2532             case AVMEDIA_TYPE_SUBTITLE:
2533                 codec->width  = icodec->width;
2534                 codec->height = icodec->height;
2535                 break;
2536             case AVMEDIA_TYPE_DATA:
2537             case AVMEDIA_TYPE_ATTACHMENT:
2538                 break;
2539             default:
2540                 abort();
2541             }
2542         } else {
2543             if (!ost->enc)
2544                 ost->enc = avcodec_find_encoder(codec->codec_id);
2545
2546             ist->decoding_needed = 1;
2547             ost->encoding_needed = 1;
2548
2549             switch (codec->codec_type) {
2550             case AVMEDIA_TYPE_AUDIO:
2551                 ost->fifo = av_fifo_alloc(1024);
2552                 if (!ost->fifo) {
2553                     return AVERROR(ENOMEM);
2554                 }
2555                 if (!codec->sample_rate)
2556                     codec->sample_rate = icodec->sample_rate;
2557                 choose_sample_rate(ost->st, ost->enc);
2558                 codec->time_base = (AVRational){ 1, codec->sample_rate };
2559
2560                 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2561                     codec->sample_fmt = icodec->sample_fmt;
2562                 choose_sample_fmt(ost->st, ost->enc);
2563
2564                 if (ost->audio_channels_mapped) {
2565                     /* the requested output channel is set to the number of
2566                      * -map_channel only if no -ac are specified */
2567                     if (!codec->channels) {
2568                         codec->channels       = ost->audio_channels_mapped;
2569                         codec->channel_layout = av_get_default_channel_layout(codec->channels);
2570                         if (!codec->channel_layout) {
2571                             av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
2572                             exit_program(1);
2573                         }
2574                     }
2575                     /* fill unused channel mapping with -1 (which means a muted
2576                      * channel in case the number of output channels is bigger
2577                      * than the number of mapped channel) */
2578                     for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
2579                         ost->audio_channels_map[j] = -1;
2580                 } else if (!codec->channels) {
2581                     codec->channels = icodec->channels;
2582                     codec->channel_layout = icodec->channel_layout;
2583                 }
2584                 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2585                     codec->channel_layout = 0;
2586
2587                 ost->audio_resample       = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2588                 ost->audio_resample      |=    codec->sample_fmt     != icodec->sample_fmt
2589                                             || codec->channel_layout != icodec->channel_layout;
2590                 icodec->request_channels  = codec->channels;
2591                 ost->resample_sample_fmt  = icodec->sample_fmt;
2592                 ost->resample_sample_rate = icodec->sample_rate;
2593                 ost->resample_channels    = icodec->channels;
2594                 break;
2595             case AVMEDIA_TYPE_VIDEO:
2596                 if (codec->pix_fmt == PIX_FMT_NONE)
2597                     codec->pix_fmt = icodec->pix_fmt;
2598                 choose_pixel_fmt(ost->st, ost->enc);
2599
2600                 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2601                     av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2602                     exit_program(1);
2603                 }
2604
2605                 if (!codec->width || !codec->height) {
2606                     codec->width  = icodec->width;
2607                     codec->height = icodec->height;
2608                 }
2609
2610                 ost->video_resample = codec->width   != icodec->width  ||
2611                                       codec->height  != icodec->height ||
2612                                       codec->pix_fmt != icodec->pix_fmt;
2613                 if (ost->video_resample) {
2614                     codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2615                 }
2616
2617                 ost->resample_height  = icodec->height;
2618                 ost->resample_width   = icodec->width;
2619                 ost->resample_pix_fmt = icodec->pix_fmt;
2620
2621                 if (!ost->frame_rate.num)
2622                     ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2623                 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2624                     int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2625                     ost->frame_rate = ost->enc->supported_framerates[idx];
2626                 }
2627                 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2628                 if (   av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
2629                    && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2630                     av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2631                                                "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2632                 }
2633                 for (j = 0; j < ost->forced_kf_count; j++)
2634                     ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2635                                                          AV_TIME_BASE_Q,
2636                                                          codec->time_base);
2637
2638 #if CONFIG_AVFILTER
2639                 if (configure_video_filters(ist, ost)) {
2640                     av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2641                     exit_program(1);
2642                 }
2643 #endif
2644                 break;
2645             case AVMEDIA_TYPE_SUBTITLE:
2646                 codec->time_base = (AVRational){1, 1000};
2647                 break;
2648             default:
2649                 abort();
2650                 break;
2651             }
2652             /* two pass mode */
2653             if (codec->codec_id != CODEC_ID_H264 &&
2654                 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2655                 char logfilename[1024];
2656                 FILE *f;
2657
2658                 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2659                          pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2660                          i);
2661                 if (codec->flags & CODEC_FLAG_PASS2) {
2662                     char  *logbuffer;
2663                     size_t logbuffer_size;
2664                     if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2665                         av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2666                                logfilename);
2667                         exit_program(1);
2668                     }
2669                     codec->stats_in = logbuffer;
2670                 }
2671                 if (codec->flags & CODEC_FLAG_PASS1) {
2672                     f = fopen(logfilename, "wb");
2673                     if (!f) {
2674                         av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2675                                logfilename, strerror(errno));
2676                         exit_program(1);
2677                     }
2678                     ost->logfile = f;
2679                 }
2680             }
2681         }
2682     }
2683
2684     /* open each encoder */
2685     for (i = 0; i < nb_output_streams; i++) {
2686         ost = &output_streams[i];
2687         if (ost->encoding_needed) {
2688             AVCodec      *codec = ost->enc;
2689             AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2690             if (!codec) {
2691                 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2692                          avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2693                 ret = AVERROR(EINVAL);
2694                 goto dump_format;
2695             }
2696             if (dec->subtitle_header) {
2697                 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2698                 if (!ost->st->codec->subtitle_header) {
2699                     ret = AVERROR(ENOMEM);
2700                     goto dump_format;
2701                 }
2702                 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2703                 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2704             }
2705             if (!av_dict_get(ost->opts, "threads", NULL, 0))
2706                 av_dict_set(&ost->opts, "threads", "auto", 0);
2707             if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2708                 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2709                         ost->file_index, ost->index);
2710                 ret = AVERROR(EINVAL);
2711                 goto dump_format;
2712             }
2713             assert_codec_experimental(ost->st->codec, 1);
2714             assert_avoptions(ost->opts);
2715             if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2716                 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2717                                              " It takes bits/s as argument, not kbits/s\n");
2718             extra_size += ost->st->codec->extradata_size;
2719
2720             if (ost->st->codec->me_threshold)
2721                 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2722         }
2723     }
2724
2725     /* init input streams */
2726     for (i = 0; i < nb_input_streams; i++)
2727         if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2728             goto dump_format;
2729
2730     /* discard unused programs */
2731     for (i = 0; i < nb_input_files; i++) {
2732         InputFile *ifile = &input_files[i];
2733         for (j = 0; j < ifile->ctx->nb_programs; j++) {
2734             AVProgram *p = ifile->ctx->programs[j];
2735             int discard  = AVDISCARD_ALL;
2736
2737             for (k = 0; k < p->nb_stream_indexes; k++)
2738                 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2739                     discard = AVDISCARD_DEFAULT;
2740                     break;
2741                 }
2742             p->discard = discard;
2743         }
2744     }
2745
2746     /* open files and write file headers */
2747     for (i = 0; i < nb_output_files; i++) {
2748         oc = output_files[i].ctx;
2749         oc->interrupt_callback = int_cb;
2750         if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2751             snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2752             ret = AVERROR(EINVAL);
2753             goto dump_format;
2754         }
2755 //        assert_avoptions(output_files[i].opts);
2756         if (strcmp(oc->oformat->name, "rtp")) {
2757             want_sdp = 0;
2758         }
2759     }
2760
2761  dump_format:
2762     /* dump the file output parameters - cannot be done before in case
2763        of stream copy */
2764     for (i = 0; i < nb_output_files; i++) {
2765         av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2766     }
2767
2768     /* dump the stream mapping */
2769     av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2770     for (i = 0; i < nb_output_streams; i++) {
2771         ost = &output_streams[i];
2772
2773         if (ost->attachment_filename) {
2774             /* an attached file */
2775             av_log(NULL, AV_LOG_INFO, "  File %s -> Stream #%d:%d\n",
2776                    ost->attachment_filename, ost->file_index, ost->index);
2777             continue;
2778         }
2779         av_log(NULL, AV_LOG_INFO, "  Stream #%d:%d -> #%d:%d",
2780                input_streams[ost->source_index].file_index,
2781                input_streams[ost->source_index].st->index,
2782                ost->file_index,
2783                ost->index);
2784         if (ost->audio_channels_mapped) {
2785             av_log(NULL, AV_LOG_INFO, " [ch:");
2786             for (j = 0; j < ost->audio_channels_mapped; j++)
2787                 if (ost->audio_channels_map[j] == -1)
2788                     av_log(NULL, AV_LOG_INFO, " M");
2789                 else
2790                     av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
2791             av_log(NULL, AV_LOG_INFO, "]");
2792         }
2793         if (ost->sync_ist != &input_streams[ost->source_index])
2794             av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2795                    ost->sync_ist->file_index,
2796                    ost->sync_ist->st->index);
2797         if (ost->stream_copy)
2798             av_log(NULL, AV_LOG_INFO, " (copy)");
2799         else
2800             av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2801                    input_streams[ost->source_index].dec->name : "?",
2802                    ost->enc ? ost->enc->name : "?");
2803         av_log(NULL, AV_LOG_INFO, "\n");
2804     }
2805
2806     if (ret) {
2807         av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2808         return ret;
2809     }
2810
2811     if (want_sdp) {
2812         print_sdp(output_files, nb_output_files);
2813     }
2814
2815     return 0;
2816 }
2817
2818 /*
2819  * The following code is the main loop of the file converter
2820  */
2821 static int transcode(OutputFile *output_files, int nb_output_files,
2822                      InputFile  *input_files,  int nb_input_files)
2823 {
2824     int ret, i;
2825     AVFormatContext *is, *os;
2826     OutputStream *ost;
2827     InputStream *ist;
2828     uint8_t *no_packet;
2829     int no_packet_count = 0;
2830     int64_t timer_start;
2831     int key;
2832
2833     if (!(no_packet = av_mallocz(nb_input_files)))
2834         exit_program(1);
2835
2836     ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2837     if (ret < 0)
2838         goto fail;
2839
2840     if (!using_stdin) {
2841         av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2842     }
2843
2844     timer_start = av_gettime();
2845
2846     for (; received_sigterm == 0;) {
2847         int file_index, ist_index;
2848         AVPacket pkt;
2849         int64_t ipts_min;
2850         double opts_min;
2851         int64_t cur_time= av_gettime();
2852
2853         ipts_min = INT64_MAX;
2854         opts_min = 1e100;
2855         /* if 'q' pressed, exits */
2856         if (!using_stdin) {
2857             static int64_t last_time;
2858             if (received_nb_signals)
2859                 break;
2860             /* read_key() returns 0 on EOF */
2861             if(cur_time - last_time >= 100000 && !run_as_daemon){
2862                 key =  read_key();
2863                 last_time = cur_time;
2864             }else
2865                 key = -1;
2866             if (key == 'q')
2867                 break;
2868             if (key == '+') av_log_set_level(av_log_get_level()+10);
2869             if (key == '-') av_log_set_level(av_log_get_level()-10);
2870             if (key == 's') qp_hist     ^= 1;
2871             if (key == 'h'){
2872                 if (do_hex_dump){
2873                     do_hex_dump = do_pkt_dump = 0;
2874                 } else if(do_pkt_dump){
2875                     do_hex_dump = 1;
2876                 } else
2877                     do_pkt_dump = 1;
2878                 av_log_set_level(AV_LOG_DEBUG);
2879             }
2880 #if CONFIG_AVFILTER
2881             if (key == 'c' || key == 'C'){
2882                 char buf[4096], target[64], command[256], arg[256] = {0};
2883                 double time;
2884                 int k, n = 0;
2885                 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2886                 i = 0;
2887                 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
2888                     if (k > 0)
2889                         buf[i++] = k;
2890                 buf[i] = 0;
2891                 if (k > 0 &&
2892                     (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
2893                     av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
2894                            target, time, command, arg);
2895                     for (i = 0; i < nb_output_streams; i++) {
2896                         ost = &output_streams[i];
2897                         if (ost->graph) {
2898                             if (time < 0) {
2899                                 ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
2900                                                                   key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2901                                 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
2902                             } else {
2903                                 ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2904                             }
2905                         }
2906                     }
2907                 } else {
2908                     av_log(NULL, AV_LOG_ERROR,
2909                            "Parse error, at least 3 arguments were expected, "
2910                            "only %d given in string '%s'\n", n, buf);
2911                 }
2912             }
2913 #endif
2914             if (key == 'd' || key == 'D'){
2915                 int debug=0;
2916                 if(key == 'D') {
2917                     debug = input_streams[0].st->codec->debug<<1;
2918                     if(!debug) debug = 1;
2919                     while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2920                         debug += debug;
2921                 }else
2922                     if(scanf("%d", &debug)!=1)
2923                         fprintf(stderr,"error parsing debug value\n");
2924                 for(i=0;i<nb_input_streams;i++) {
2925                     input_streams[i].st->codec->debug = debug;
2926                 }
2927                 for(i=0;i<nb_output_streams;i++) {
2928                     ost = &output_streams[i];
2929                     ost->st->codec->debug = debug;
2930                 }
2931                 if(debug) av_log_set_level(AV_LOG_DEBUG);
2932                 fprintf(stderr,"debug=%d\n", debug);
2933             }
2934             if (key == '?'){
2935                 fprintf(stderr, "key    function\n"
2936                                 "?      show this help\n"
2937                                 "+      increase verbosity\n"
2938                                 "-      decrease verbosity\n"
2939                                 "c      Send command to filtergraph\n"
2940                                 "D      cycle through available debug modes\n"
2941                                 "h      dump packets/hex press to cycle through the 3 states\n"
2942                                 "q      quit\n"
2943                                 "s      Show QP histogram\n"
2944                 );
2945             }
2946         }
2947
2948         /* select the stream that we must read now by looking at the
2949            smallest output pts */
2950         file_index = -1;
2951         for (i = 0; i < nb_output_streams; i++) {
2952             OutputFile *of;
2953             int64_t ipts;
2954             double  opts;
2955             ost = &output_streams[i];
2956             of = &output_files[ost->file_index];
2957             os = output_files[ost->file_index].ctx;
2958             ist = &input_streams[ost->source_index];
2959             if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2960                 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2961                 continue;
2962             opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2963             ipts = ist->pts;
2964             if (!input_files[ist->file_index].eof_reached) {
2965                 if (ipts < ipts_min) {
2966                     ipts_min = ipts;
2967                     if (input_sync)
2968                         file_index = ist->file_index;
2969                 }
2970                 if (opts < opts_min) {
2971                     opts_min = opts;
2972                     if (!input_sync) file_index = ist->file_index;
2973                 }
2974             }
2975             if (ost->frame_number >= ost->max_frames) {
2976                 int j;
2977                 for (j = 0; j < of->ctx->nb_streams; j++)
2978                     output_streams[of->ost_index + j].is_past_recording_time = 1;
2979                 continue;
2980             }
2981         }
2982         /* if none, if is finished */
2983         if (file_index < 0) {
2984             if (no_packet_count) {
2985                 no_packet_count = 0;
2986                 memset(no_packet, 0, nb_input_files);
2987                 usleep(10000);
2988                 continue;
2989             }
2990             break;
2991         }
2992
2993         /* read a frame from it and output it in the fifo */
2994         is  = input_files[file_index].ctx;
2995         ret = av_read_frame(is, &pkt);
2996         if (ret == AVERROR(EAGAIN)) {
2997             no_packet[file_index] = 1;
2998             no_packet_count++;
2999             continue;
3000         }
3001         if (ret < 0) {
3002             input_files[file_index].eof_reached = 1;
3003             if (opt_shortest)
3004                 break;
3005             else
3006                 continue;
3007         }
3008
3009         no_packet_count = 0;
3010         memset(no_packet, 0, nb_input_files);
3011
3012         if (do_pkt_dump) {
3013             av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3014                              is->streams[pkt.stream_index]);
3015         }
3016         /* the following test is needed in case new streams appear
3017            dynamically in stream : we ignore them */
3018         if (pkt.stream_index >= input_files[file_index].nb_streams)
3019             goto discard_packet;
3020         ist_index = input_files[file_index].ist_index + pkt.stream_index;
3021         ist = &input_streams[ist_index];
3022         if (ist->discard)
3023             goto discard_packet;
3024
3025         if (pkt.dts != AV_NOPTS_VALUE)
3026             pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3027         if (pkt.pts != AV_NOPTS_VALUE)
3028             pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3029
3030         if (pkt.pts != AV_NOPTS_VALUE)
3031             pkt.pts *= ist->ts_scale;
3032         if (pkt.dts != AV_NOPTS_VALUE)
3033             pkt.dts *= ist->ts_scale;
3034
3035         if (debug_ts) {
3036             av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3037                     "next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%"PRId64"\n",
3038                     ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3039                     av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3040                     av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3041                     av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3042                     input_files[ist->file_index].ts_offset);
3043         }
3044
3045         if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3046             int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3047             int64_t delta   = pkt_dts - ist->next_dts;
3048             if (is->iformat->flags & AVFMT_TS_DISCONT) {
3049             if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3050                 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3051                  ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3052                 pkt_dts+1<ist->pts){
3053                 input_files[ist->file_index].ts_offset -= delta;
3054                 av_log(NULL, AV_LOG_DEBUG,
3055                        "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3056                        delta, input_files[ist->file_index].ts_offset);
3057                 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3058                 if (pkt.pts != AV_NOPTS_VALUE)
3059                     pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3060             }
3061             } else {
3062                 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3063                     (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3064                      pkt_dts+1<ist->pts){
3065                     av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid droping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3066                     pkt.dts = AV_NOPTS_VALUE;
3067                 }
3068                 if (pkt.pts != AV_NOPTS_VALUE){
3069                     int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3070                     delta   = pkt_pts - ist->next_dts;
3071                     if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3072                         (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE)) {
3073                         av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid droping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3074                         pkt.pts = AV_NOPTS_VALUE;
3075                     }
3076                 }
3077             }
3078         }
3079
3080         // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3081         if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3082
3083             av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3084                    ist->file_index, ist->st->index);
3085             if (exit_on_error)
3086                 exit_program(1);
3087             av_free_packet(&pkt);
3088             continue;
3089         }
3090
3091     discard_packet:
3092         av_free_packet(&pkt);
3093
3094         /* dump report by using the output first video and audio streams */
3095         print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
3096     }
3097
3098     /* at the end of stream, we must flush the decoder buffers */
3099     for (i = 0; i < nb_input_streams; i++) {
3100         ist = &input_streams[i];
3101         if (ist->decoding_needed) {
3102             output_packet(ist, output_streams, nb_output_streams, NULL);
3103         }
3104     }
3105     flush_encoders(output_streams, nb_output_streams);
3106
3107     term_exit();
3108
3109     /* write the trailer if needed and close file */
3110     for (i = 0; i < nb_output_files; i++) {
3111         os = output_files[i].ctx;
3112         av_write_trailer(os);
3113     }
3114
3115     /* dump report by using the first video and audio streams */
3116     print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3117
3118     /* close each encoder */
3119     for (i = 0; i < nb_output_streams; i++) {
3120         ost = &output_streams[i];
3121         if (ost->encoding_needed) {
3122             av_freep(&ost->st->codec->stats_in);
3123             avcodec_close(ost->st->codec);
3124         }
3125 #if CONFIG_AVFILTER
3126         avfilter_graph_free(&ost->graph);
3127 #endif
3128     }
3129
3130     /* close each decoder */
3131     for (i = 0; i < nb_input_streams; i++) {
3132         ist = &input_streams[i];
3133         if (ist->decoding_needed) {
3134             avcodec_close(ist->st->codec);
3135         }
3136     }
3137
3138     /* finished ! */
3139     ret = 0;
3140
3141  fail:
3142     av_freep(&no_packet);
3143
3144     if (output_streams) {
3145         for (i = 0; i < nb_output_streams; i++) {
3146             ost = &output_streams[i];
3147             if (ost) {
3148                 if (ost->stream_copy)
3149                     av_freep(&ost->st->codec->extradata);
3150                 if (ost->logfile) {
3151                     fclose(ost->logfile);
3152                     ost->logfile = NULL;
3153                 }
3154                 av_fifo_free(ost->fifo); /* works even if fifo is not
3155                                              initialized but set to zero */
3156                 av_freep(&ost->st->codec->subtitle_header);
3157                 av_free(ost->resample_frame.data[0]);
3158                 av_free(ost->forced_kf_pts);
3159                 if (ost->video_resample)
3160                     sws_freeContext(ost->img_resample_ctx);
3161                 swr_free(&ost->swr);
3162                 av_dict_free(&ost->opts);
3163             }
3164         }
3165     }
3166     return ret;
3167 }
3168
3169 static int opt_frame_crop(const char *opt, const char *arg)
3170 {
3171     av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3172     return AVERROR(EINVAL);
3173 }
3174
3175 static int opt_pad(const char *opt, const char *arg)
3176 {
3177     av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3178     return -1;
3179 }
3180
3181 static int opt_video_channel(const char *opt, const char *arg)
3182 {
3183     av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3184     return opt_default("channel", arg);
3185 }
3186
3187 static int opt_video_standard(const char *opt, const char *arg)
3188 {
3189     av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3190     return opt_default("standard", arg);
3191 }
3192
3193 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3194 {
3195     audio_codec_name = arg;
3196     return parse_option(o, "codec:a", arg, options);
3197 }
3198
3199 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3200 {
3201     video_codec_name = arg;
3202     return parse_option(o, "codec:v", arg, options);
3203 }
3204
3205 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3206 {
3207     subtitle_codec_name = arg;
3208     return parse_option(o, "codec:s", arg, options);
3209 }
3210
3211 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3212 {
3213     return parse_option(o, "codec:d", arg, options);
3214 }
3215
3216 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3217 {
3218     StreamMap *m = NULL;
3219     int i, negative = 0, file_idx;
3220     int sync_file_idx = -1, sync_stream_idx = 0;
3221     char *p, *sync;
3222     char *map;
3223
3224     if (*arg == '-') {
3225         negative = 1;
3226         arg++;
3227     }
3228     map = av_strdup(arg);
3229
3230     /* parse sync stream first, just pick first matching stream */
3231     if (sync = strchr(map, ',')) {
3232         *sync = 0;
3233         sync_file_idx = strtol(sync + 1, &sync, 0);
3234         if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3235             av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3236             exit_program(1);
3237         }
3238         if (*sync)
3239             sync++;
3240         for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3241             if (check_stream_specifier(input_files[sync_file_idx].ctx,
3242                                        input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
3243                 sync_stream_idx = i;
3244                 break;
3245             }
3246         if (i == input_files[sync_file_idx].nb_streams) {
3247             av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3248                                        "match any streams.\n", arg);
3249             exit_program(1);
3250         }
3251     }
3252
3253
3254     file_idx = strtol(map, &p, 0);
3255     if (file_idx >= nb_input_files || file_idx < 0) {
3256         av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3257         exit_program(1);
3258     }
3259     if (negative)
3260         /* disable some already defined maps */
3261         for (i = 0; i < o->nb_stream_maps; i++) {
3262             m = &o->stream_maps[i];
3263             if (file_idx == m->file_index &&
3264                 check_stream_specifier(input_files[m->file_index].ctx,
3265                                        input_files[m->file_index].ctx->streams[m->stream_index],
3266                                        *p == ':' ? p + 1 : p) > 0)
3267                 m->disabled = 1;
3268         }
3269     else
3270         for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3271             if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
3272                         *p == ':' ? p + 1 : p) <= 0)
3273                 continue;
3274             o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3275                                         &o->nb_stream_maps, o->nb_stream_maps + 1);
3276             m = &o->stream_maps[o->nb_stream_maps - 1];
3277
3278             m->file_index   = file_idx;
3279             m->stream_index = i;
3280
3281             if (sync_file_idx >= 0) {
3282                 m->sync_file_index   = sync_file_idx;
3283                 m->sync_stream_index = sync_stream_idx;
3284             } else {
3285                 m->sync_file_index   = file_idx;
3286                 m->sync_stream_index = i;
3287             }
3288         }
3289
3290     if (!m) {
3291         av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3292         exit_program(1);
3293     }
3294
3295     av_freep(&map);
3296     return 0;
3297 }
3298
3299 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3300 {
3301     o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3302                                 &o->nb_attachments, o->nb_attachments + 1);
3303     o->attachments[o->nb_attachments - 1] = arg;
3304     return 0;
3305 }
3306
3307 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3308 {
3309     int n;
3310     AVStream *st;
3311     AudioChannelMap *m;
3312
3313     o->audio_channel_maps =
3314         grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3315                    &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3316     m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3317
3318     /* muted channel syntax */
3319     n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3320     if ((n == 1 || n == 3) && m->channel_idx == -1) {
3321         m->file_idx = m->stream_idx = -1;
3322         if (n == 1)
3323             m->ofile_idx = m->ostream_idx = -1;
3324         return 0;
3325     }
3326
3327     /* normal syntax */
3328     n = sscanf(arg, "%d.%d.%d:%d.%d",
3329                &m->file_idx,  &m->stream_idx, &m->channel_idx,
3330                &m->ofile_idx, &m->ostream_idx);
3331
3332     if (n != 3 && n != 5) {
3333         av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3334                "[file.stream.channel|-1][:syncfile:syncstream]\n");
3335         exit_program(1);
3336     }
3337
3338     if (n != 5) // only file.stream.channel specified
3339         m->ofile_idx = m->ostream_idx = -1;
3340
3341     /* check input */
3342     if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3343         av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3344                m->file_idx);
3345         exit_program(1);
3346     }
3347     if (m->stream_idx < 0 ||
3348         m->stream_idx >= input_files[m->file_idx].nb_streams) {
3349         av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3350                m->file_idx, m->stream_idx);
3351         exit_program(1);
3352     }
3353     st = input_files[m->file_idx].ctx->streams[m->stream_idx];
3354     if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3355         av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3356                m->file_idx, m->stream_idx);
3357         exit_program(1);
3358     }
3359     if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3360         av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3361                m->file_idx, m->stream_idx, m->channel_idx);
3362         exit_program(1);
3363     }
3364     return 0;
3365 }
3366
3367 /**
3368  * Parse a metadata specifier in arg.
3369  * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3370  * @param index for type c/p, chapter/program index is written here
3371  * @param stream_spec for type s, the stream specifier is written here
3372  */
3373 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3374 {
3375     if (*arg) {
3376         *type = *arg;
3377         switch (*arg) {
3378         case 'g':
3379             break;
3380         case 's':
3381             if (*(++arg) && *arg != ':') {
3382                 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3383                 exit_program(1);
3384             }
3385             *stream_spec = *arg == ':' ? arg + 1 : "";
3386             break;
3387         case 'c':
3388         case 'p':
3389             if (*(++arg) == ':')
3390                 *index = strtol(++arg, NULL, 0);
3391             break;
3392         default:
3393             av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3394             exit_program(1);
3395         }
3396     } else
3397         *type = 'g';
3398 }
3399
3400 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3401 {
3402     AVDictionary **meta_in = NULL;
3403     AVDictionary **meta_out = NULL;
3404     int i, ret = 0;
3405     char type_in, type_out;
3406     const char *istream_spec = NULL, *ostream_spec = NULL;
3407     int idx_in = 0, idx_out = 0;
3408
3409     parse_meta_type(inspec,  &type_in,  &idx_in,  &istream_spec);
3410     parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3411
3412     if (type_in == 'g' || type_out == 'g')
3413         o->metadata_global_manual = 1;
3414     if (type_in == 's' || type_out == 's')
3415         o->metadata_streams_manual = 1;
3416     if (type_in == 'c' || type_out == 'c')
3417         o->metadata_chapters_manual = 1;
3418
3419 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3420     if ((index) < 0 || (index) >= (nb_elems)) {\
3421         av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3422                 (desc), (index));\
3423         exit_program(1);\
3424     }
3425
3426 #define SET_DICT(type, meta, context, index)\
3427         switch (type) {\
3428         case 'g':\
3429             meta = &context->metadata;\
3430             break;\
3431         case 'c':\
3432             METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3433             meta = &context->chapters[index]->metadata;\
3434             break;\
3435         case 'p':\
3436             METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3437             meta = &context->programs[index]->metadata;\
3438             break;\
3439         }\
3440
3441     SET_DICT(type_in, meta_in, ic, idx_in);
3442     SET_DICT(type_out, meta_out, oc, idx_out);
3443
3444     /* for input streams choose first matching stream */
3445     if (type_in == 's') {
3446         for (i = 0; i < ic->nb_streams; i++) {
3447             if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3448                 meta_in = &ic->streams[i]->metadata;
3449                 break;
3450             } else if (ret < 0)
3451                 exit_program(1);
3452         }
3453         if (!meta_in) {
3454             av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match  any streams.\n", istream_spec);
3455             exit_program(1);
3456         }
3457     }
3458
3459     if (type_out == 's') {
3460         for (i = 0; i < oc->nb_streams; i++) {
3461             if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
3462                 meta_out = &oc->streams[i]->metadata;
3463                 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3464             } else if (ret < 0)
3465                 exit_program(1);
3466         }
3467     } else
3468         av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3469
3470     return 0;
3471 }
3472
3473 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3474 {
3475     char buf[128];
3476     int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3477     struct tm time = *gmtime((time_t*)&recording_timestamp);
3478     strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3479     parse_option(o, "metadata", buf, options);
3480
3481     av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3482                                  "tag instead.\n", opt);
3483     return 0;
3484 }
3485
3486 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3487 {
3488     const char *codec_string = encoder ? "encoder" : "decoder";
3489     AVCodec *codec;
3490
3491     codec = encoder ?
3492         avcodec_find_encoder_by_name(name) :
3493         avcodec_find_decoder_by_name(name);
3494     if (!codec) {
3495         av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3496         exit_program(1);
3497     }
3498     if (codec->type != type) {
3499         av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3500         exit_program(1);
3501     }
3502     return codec;
3503 }
3504
3505 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3506 {
3507     char *codec_name = NULL;
3508
3509     MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3510     if (codec_name) {
3511         AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
3512         st->codec->codec_id = codec->id;
3513         return codec;
3514     } else
3515         return avcodec_find_decoder(st->codec->codec_id);
3516 }
3517
3518 /**
3519  * Add all the streams from the given input file to the global
3520  * list of input streams.
3521  */
3522 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3523 {
3524     int i;
3525     char *next, *codec_tag = NULL;
3526
3527     for (i = 0; i < ic->nb_streams; i++) {
3528         AVStream *st = ic->streams[i];
3529         AVCodecContext *dec = st->codec;
3530         InputStream *ist;
3531
3532         input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3533         ist = &input_streams[nb_input_streams - 1];
3534         ist->st = st;
3535         ist->file_index = nb_input_files;
3536         ist->discard = 1;
3537         st->discard  = AVDISCARD_ALL;
3538         ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3539
3540         ist->ts_scale = 1.0;
3541         MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3542
3543         MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
3544         if (codec_tag) {
3545             uint32_t tag = strtol(codec_tag, &next, 0);
3546             if (*next)
3547                 tag = AV_RL32(codec_tag);
3548             st->codec->codec_tag = tag;
3549         }
3550
3551         ist->dec = choose_decoder(o, ic, st);
3552
3553         switch (dec->codec_type) {
3554         case AVMEDIA_TYPE_VIDEO:
3555             if(!ist->dec)
3556                 ist->dec = avcodec_find_decoder(dec->codec_id);
3557             if (dec->lowres) {
3558                 dec->flags |= CODEC_FLAG_EMU_EDGE;
3559             }
3560
3561             break;
3562         case AVMEDIA_TYPE_AUDIO:
3563         case AVMEDIA_TYPE_DATA:
3564         case AVMEDIA_TYPE_SUBTITLE:
3565             if(!ist->dec)
3566                 ist->dec = avcodec_find_decoder(dec->codec_id);
3567             break;
3568         case AVMEDIA_TYPE_ATTACHMENT:
3569         case AVMEDIA_TYPE_UNKNOWN:
3570             break;
3571         default:
3572             abort();
3573         }
3574     }
3575 }
3576
3577 static void assert_file_overwrite(const char *filename)
3578 {
3579     if ((!file_overwrite || no_file_overwrite) &&
3580         (strchr(filename, ':') == NULL || filename[1] == ':' ||
3581          av_strstart(filename, "file:", NULL))) {
3582         if (avio_check(filename, 0) == 0) {
3583             if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3584                 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3585                 fflush(stderr);
3586                 term_exit();
3587                 signal(SIGINT, SIG_DFL);
3588                 if (!read_yesno()) {
3589                     av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
3590                     exit_program(1);
3591                 }
3592                 term_init();
3593             }
3594             else {
3595                 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
3596                 exit_program(1);
3597             }
3598         }
3599     }
3600 }
3601
3602 static void dump_attachment(AVStream *st, const char *filename)
3603 {
3604     int ret;
3605     AVIOContext *out = NULL;
3606     AVDictionaryEntry *e;
3607
3608     if (!st->codec->extradata_size) {
3609         av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
3610                nb_input_files - 1, st->index);
3611         return;
3612     }
3613     if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
3614         filename = e->value;
3615     if (!*filename) {
3616         av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
3617                "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3618         exit_program(1);
3619     }
3620
3621     assert_file_overwrite(filename);
3622
3623     if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3624         av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
3625                filename);
3626         exit_program(1);
3627     }
3628
3629     avio_write(out, st->codec->extradata, st->codec->extradata_size);
3630     avio_flush(out);
3631     avio_close(out);
3632 }
3633
3634 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
3635 {
3636     AVFormatContext *ic;
3637     AVInputFormat *file_iformat = NULL;
3638     int err, i, ret;
3639     int64_t timestamp;
3640     uint8_t buf[128];
3641     AVDictionary **opts;
3642     int orig_nb_streams;                     // number of streams before avformat_find_stream_info
3643
3644     if (o->format) {
3645         if (!(file_iformat = av_find_input_format(o->format))) {
3646             av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3647             exit_program(1);
3648         }
3649     }
3650
3651     if (!strcmp(filename, "-"))
3652         filename = "pipe:";
3653
3654     using_stdin |= !strncmp(filename, "pipe:", 5) ||
3655                     !strcmp(filename, "/dev/stdin");
3656
3657     /* get default parameters from command line */
3658     ic = avformat_alloc_context();
3659     if (!ic) {
3660         print_error(filename, AVERROR(ENOMEM));
3661         exit_program(1);
3662     }
3663     if (o->nb_audio_sample_rate) {
3664         snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3665         av_dict_set(&format_opts, "sample_rate", buf, 0);
3666     }
3667     if (o->nb_audio_channels) {
3668         snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3669         av_dict_set(&format_opts, "channels", buf, 0);
3670     }
3671     if (o->nb_frame_rates) {
3672         av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3673     }
3674     if (o->nb_frame_sizes) {
3675         av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3676     }
3677     if (o->nb_frame_pix_fmts)
3678         av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3679
3680     ic->video_codec_id   = video_codec_name ?
3681         find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0)->id : CODEC_ID_NONE;
3682     ic->audio_codec_id   = audio_codec_name ?
3683         find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0)->id : CODEC_ID_NONE;
3684     ic->subtitle_codec_id= subtitle_codec_name ?
3685         find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3686     ic->flags |= AVFMT_FLAG_NONBLOCK;
3687     ic->interrupt_callback = int_cb;
3688
3689     /* open the input file with generic avformat function */
3690     err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3691     if (err < 0) {
3692         print_error(filename, err);
3693         exit_program(1);
3694     }
3695     assert_avoptions(format_opts);
3696
3697     /* apply forced codec ids */
3698     for (i = 0; i < ic->nb_streams; i++)
3699         choose_decoder(o, ic, ic->streams[i]);
3700
3701     /* Set AVCodecContext options for avformat_find_stream_info */
3702     opts = setup_find_stream_info_opts(ic, codec_opts);
3703     orig_nb_streams = ic->nb_streams;
3704
3705     /* If not enough info to get the stream parameters, we decode the
3706        first frames to get it. (used in mpeg case for example) */
3707     ret = avformat_find_stream_info(ic, opts);
3708     if (ret < 0) {
3709         av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3710         avformat_close_input(&ic);
3711         exit_program(1);
3712     }
3713
3714     timestamp = o->start_time;
3715     /* add the stream start time */
3716     if (ic->start_time != AV_NOPTS_VALUE)
3717         timestamp += ic->start_time;
3718
3719     /* if seeking requested, we execute it */
3720     if (o->start_time != 0) {
3721         ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3722         if (ret < 0) {
3723             av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3724                    filename, (double)timestamp / AV_TIME_BASE);
3725         }
3726     }
3727
3728     /* update the current parameters so that they match the one of the input stream */
3729     add_input_streams(o, ic);
3730
3731     /* dump the file content */
3732     av_dump_format(ic, nb_input_files, filename, 0);
3733
3734     input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3735     input_files[nb_input_files - 1].ctx        = ic;
3736     input_files[nb_input_files - 1].ist_index  = nb_input_streams - ic->nb_streams;
3737     input_files[nb_input_files - 1].ts_offset  = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3738     input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3739     input_files[nb_input_files - 1].rate_emu   = o->rate_emu;
3740
3741     for (i = 0; i < o->nb_dump_attachment; i++) {
3742         int j;
3743
3744         for (j = 0; j < ic->nb_streams; j++) {
3745             AVStream *st = ic->streams[j];
3746
3747             if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3748                 dump_attachment(st, o->dump_attachment[i].u.str);
3749         }
3750     }
3751
3752     for (i = 0; i < orig_nb_streams; i++)
3753         av_dict_free(&opts[i]);
3754     av_freep(&opts);
3755
3756     reset_options(o, 1);
3757     return 0;
3758 }
3759
3760 static void parse_forced_key_frames(char *kf, OutputStream *ost)
3761 {
3762     char *p;
3763     int n = 1, i;
3764
3765     for (p = kf; *p; p++)
3766         if (*p == ',')
3767             n++;
3768     ost->forced_kf_count = n;
3769     ost->forced_kf_pts   = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3770     if (!ost->forced_kf_pts) {
3771         av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3772         exit_program(1);
3773     }
3774     for (i = 0; i < n; i++) {
3775         p = i ? strchr(p, ',') + 1 : kf;
3776         ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3777     }
3778 }
3779
3780 static uint8_t *get_line(AVIOContext *s)
3781 {
3782     AVIOContext *line;
3783     uint8_t *buf;
3784     char c;
3785
3786     if (avio_open_dyn_buf(&line) < 0) {
3787         av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3788         exit_program(1);
3789     }
3790
3791     while ((c = avio_r8(s)) && c != '\n')
3792         avio_w8(line, c);
3793     avio_w8(line, 0);
3794     avio_close_dyn_buf(line, &buf);
3795
3796     return buf;
3797 }
3798
3799 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3800 {
3801     int i, ret = 1;
3802     char filename[1000];
3803     const char *base[3] = { getenv("AVCONV_DATADIR"),
3804                             getenv("HOME"),
3805                             AVCONV_DATADIR,
3806                             };
3807
3808     for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3809         if (!base[i])
3810             continue;
3811         if (codec_name) {
3812             snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3813                      i != 1 ? "" : "/.avconv", codec_name, preset_name);
3814             ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3815         }
3816         if (ret) {
3817             snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3818                      i != 1 ? "" : "/.avconv", preset_name);
3819             ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3820         }
3821     }
3822     return ret;
3823 }
3824
3825 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3826 {
3827     char *codec_name = NULL;
3828
3829     MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3830     if (!codec_name) {
3831         ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3832                                                   NULL, ost->st->codec->codec_type);
3833         ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3834     } else if (!strcmp(codec_name, "copy"))
3835         ost->stream_copy = 1;
3836     else {
3837         ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3838         ost->st->codec->codec_id = ost->enc->id;
3839     }
3840 }
3841
3842 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3843 {
3844     OutputStream *ost;
3845     AVStream *st = avformat_new_stream(oc, NULL);
3846     int idx      = oc->nb_streams - 1, ret = 0;
3847     char *bsf = NULL, *next, *codec_tag = NULL;
3848     AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3849     double qscale = -1;
3850     char *buf = NULL, *arg = NULL, *preset = NULL;
3851     AVIOContext *s = NULL;
3852
3853     if (!st) {
3854         av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3855         exit_program(1);
3856     }
3857
3858     if (oc->nb_streams - 1 < o->nb_streamid_map)
3859         st->id = o->streamid_map[oc->nb_streams - 1];
3860
3861     output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3862                                 nb_output_streams + 1);
3863     ost = &output_streams[nb_output_streams - 1];
3864     ost->file_index = nb_output_files;
3865     ost->index      = idx;
3866     ost->st         = st;
3867     st->codec->codec_type = type;
3868     choose_encoder(o, oc, ost);
3869     if (ost->enc) {
3870         ost->opts  = filter_codec_opts(codec_opts, ost->enc, oc, st);
3871     }
3872
3873     avcodec_get_context_defaults3(st->codec, ost->enc);
3874     st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3875
3876     MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3877     if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3878         do  {
3879             buf = get_line(s);
3880             if (!buf[0] || buf[0] == '#') {
3881                 av_free(buf);
3882                 continue;
3883             }
3884             if (!(arg = strchr(buf, '='))) {
3885                 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3886                 exit_program(1);
3887             }
3888             *arg++ = 0;
3889             av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3890             av_free(buf);
3891         } while (!s->eof_reached);
3892         avio_close(s);
3893     }
3894     if (ret) {
3895         av_log(NULL, AV_LOG_FATAL,
3896                "Preset %s specified for stream %d:%d, but could not be opened.\n",
3897                preset, ost->file_index, ost->index);
3898         exit_program(1);
3899     }
3900
3901     ost->max_frames = INT64_MAX;
3902     MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3903
3904     MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3905     while (bsf) {
3906         if (next = strchr(bsf, ','))
3907             *next++ = 0;
3908         if (!(bsfc = av_bitstream_filter_init(bsf))) {
3909             av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3910             exit_program(1);
3911         }
3912         if (bsfc_prev)
3913             bsfc_prev->next = bsfc;
3914         else
3915             ost->bitstream_filters = bsfc;
3916
3917         bsfc_prev = bsfc;
3918         bsf       = next;
3919     }
3920
3921     MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3922     if (codec_tag) {
3923         uint32_t tag = strtol(codec_tag, &next, 0);
3924         if (*next)
3925             tag = AV_RL32(codec_tag);
3926         st->codec->codec_tag = tag;
3927     }
3928
3929     MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3930     if (qscale >= 0 || same_quant) {
3931         st->codec->flags |= CODEC_FLAG_QSCALE;
3932         st->codec->global_quality = FF_QP2LAMBDA * qscale;
3933     }
3934
3935     if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3936         st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3937
3938     av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3939     return ost;
3940 }
3941
3942 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3943 {
3944     int i;
3945     const char *p = str;
3946     for (i = 0;; i++) {
3947         dest[i] = atoi(p);
3948         if (i == 63)
3949             break;
3950         p = strchr(p, ',');
3951         if (!p) {
3952             av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3953             exit_program(1);
3954         }
3955         p++;
3956     }
3957 }
3958
3959 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3960 {
3961     AVStream *st;
3962     OutputStream *ost;
3963     AVCodecContext *video_enc;
3964
3965     ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3966     st  = ost->st;
3967     video_enc = st->codec;
3968
3969     if (!ost->stream_copy) {
3970         const char *p = NULL;
3971         char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3972         char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3973         char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3974         int i;
3975
3976         MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3977         if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3978             av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3979             exit_program(1);
3980         }
3981
3982         MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3983         if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3984             av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3985             exit_program(1);
3986         }
3987
3988         MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3989         if (frame_aspect_ratio) {
3990             AVRational q;
3991             if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
3992                 q.num <= 0 || q.den <= 0) {
3993                 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
3994                 exit_program(1);
3995             }
3996             ost->frame_aspect_ratio = av_q2d(q);
3997         }
3998
3999         video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4000         MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4001         if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4002             av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4003             exit_program(1);
4004         }
4005         st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4006
4007         if (intra_only)
4008             video_enc->gop_size = 0;
4009         MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4010         if (intra_matrix) {
4011             if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4012                 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4013                 exit_program(1);
4014             }
4015             parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4016         }
4017         MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4018         if (inter_matrix) {
4019             if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4020                 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4021                 exit_program(1);
4022             }
4023             parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4024         }
4025
4026         MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4027         for (i = 0; p; i++) {
4028             int start, end, q;
4029             int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4030             if (e != 3) {
4031                 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4032                 exit_program(1);
4033             }
4034             /* FIXME realloc failure */
4035             video_enc->rc_override =
4036                 av_realloc(video_enc->rc_override,
4037                            sizeof(RcOverride) * (i + 1));
4038             video_enc->rc_override[i].start_frame = start;
4039             video_enc->rc_override[i].end_frame   = end;
4040             if (q > 0) {
4041                 video_enc->rc_override[i].qscale         = q;
4042                 video_enc->rc_override[i].quality_factor = 1.0;
4043             }
4044             else {
4045                 video_enc->rc_override[i].qscale         = 0;
4046                 video_enc->rc_override[i].quality_factor = -q/100.0;
4047             }
4048             p = strchr(p, '/');
4049             if (p) p++;
4050         }
4051         video_enc->rc_override_count = i;
4052         if (!video_enc->rc_initial_buffer_occupancy)
4053             video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4054         video_enc->intra_dc_precision = intra_dc_precision - 8;
4055
4056         if (do_psnr)
4057             video_enc->flags|= CODEC_FLAG_PSNR;
4058
4059         /* two pass mode */
4060         if (do_pass) {
4061             if (do_pass & 1) {
4062                 video_enc->flags |= CODEC_FLAG_PASS1;
4063             }
4064             if (do_pass & 2) {
4065                 video_enc->flags |= CODEC_FLAG_PASS2;
4066             }
4067         }
4068
4069         MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4070         if (forced_key_frames)
4071             parse_forced_key_frames(forced_key_frames, ost);
4072
4073         MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4074
4075         ost->top_field_first = -1;
4076         MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4077
4078 #if CONFIG_AVFILTER
4079         MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4080         if (filters)
4081             ost->avfilter = av_strdup(filters);
4082 #endif
4083     } else {
4084         MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4085     }
4086
4087     return ost;
4088 }
4089
4090 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4091 {
4092     int n;
4093     AVStream *st;
4094     OutputStream *ost;
4095     AVCodecContext *audio_enc;
4096
4097     ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4098     st  = ost->st;
4099
4100     audio_enc = st->codec;
4101     audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4102
4103     if (!ost->stream_copy) {
4104         char *sample_fmt = NULL;
4105
4106         MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4107
4108         MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4109         if (sample_fmt &&
4110             (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4111             av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4112             exit_program(1);
4113         }
4114
4115         MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4116
4117         ost->rematrix_volume=1.0;
4118         MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4119     }
4120
4121     /* check for channel mapping for this audio stream */
4122     for (n = 0; n < o->nb_audio_channel_maps; n++) {
4123         AudioChannelMap *map = &o->audio_channel_maps[n];
4124         InputStream *ist = &input_streams[ost->source_index];
4125         if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4126             (map->ofile_idx   == -1 || ost->file_index == map->ofile_idx) &&
4127             (map->ostream_idx == -1 || ost->st->index  == map->ostream_idx)) {
4128             if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4129                 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4130             else
4131                 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4132                        ost->file_index, ost->st->index);
4133         }
4134     }
4135
4136     return ost;
4137 }
4138
4139 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4140 {
4141     OutputStream *ost;
4142
4143     ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4144     if (!ost->stream_copy) {
4145         av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4146         exit_program(1);
4147     }
4148
4149     return ost;
4150 }
4151
4152 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
4153 {
4154     OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4155     ost->stream_copy = 1;
4156     return ost;
4157 }
4158
4159 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4160 {
4161     AVStream *st;
4162     OutputStream *ost;
4163     AVCodecContext *subtitle_enc;
4164
4165     ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4166     st  = ost->st;
4167     subtitle_enc = st->codec;
4168
4169     subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4170
4171     return ost;
4172 }
4173
4174 /* arg format is "output-stream-index:streamid-value". */
4175 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4176 {
4177     int idx;
4178     char *p;
4179     char idx_str[16];
4180
4181     av_strlcpy(idx_str, arg, sizeof(idx_str));
4182     p = strchr(idx_str, ':');
4183     if (!p) {
4184         av_log(NULL, AV_LOG_FATAL,
4185                "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4186                arg, opt);
4187         exit_program(1);
4188     }
4189     *p++ = '\0';
4190     idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4191     o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4192     o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4193     return 0;
4194 }
4195
4196 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4197 {
4198     AVFormatContext *is = ifile->ctx;
4199     AVFormatContext *os = ofile->ctx;
4200     int i;
4201
4202     for (i = 0; i < is->nb_chapters; i++) {
4203         AVChapter *in_ch = is->chapters[i], *out_ch;
4204         int64_t ts_off   = av_rescale_q(ofile->start_time - ifile->ts_offset,
4205                                        AV_TIME_BASE_Q, in_ch->time_base);
4206         int64_t rt       = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4207                            av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4208
4209
4210         if (in_ch->end < ts_off)
4211             continue;
4212         if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4213             break;
4214
4215         out_ch = av_mallocz(sizeof(AVChapter));
4216         if (!out_ch)
4217             return AVERROR(ENOMEM);
4218
4219         out_ch->id        = in_ch->id;
4220         out_ch->time_base = in_ch->time_base;
4221         out_ch->start     = FFMAX(0,  in_ch->start - ts_off);
4222         out_ch->end       = FFMIN(rt, in_ch->end   - ts_off);
4223
4224         if (copy_metadata)
4225             av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4226
4227         os->nb_chapters++;
4228         os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4229         if (!os->chapters)
4230             return AVERROR(ENOMEM);
4231         os->chapters[os->nb_chapters - 1] = out_ch;
4232     }
4233     return 0;
4234 }
4235
4236 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4237 {
4238     int i, err;
4239     AVFormatContext *ic = avformat_alloc_context();
4240
4241     ic->interrupt_callback = int_cb;
4242     err = avformat_open_input(&ic, filename, NULL, NULL);
4243     if (err < 0)
4244         return err;
4245     /* copy stream format */
4246     for(i=0;i<ic->nb_streams;i++) {
4247         AVStream *st;
4248         OutputStream *ost;
4249         AVCodec *codec;
4250         AVCodecContext *avctx;
4251
4252         codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4253         ost   = new_output_stream(o, s, codec->type);
4254         st    = ost->st;
4255         avctx = st->codec;
4256         ost->enc = codec;
4257
4258         // FIXME: a more elegant solution is needed
4259         memcpy(st, ic->streams[i], sizeof(AVStream));
4260         st->info = av_malloc(sizeof(*st->info));
4261         memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4262         st->codec= avctx;
4263         avcodec_copy_context(st->codec, ic->streams[i]->codec);
4264
4265         if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4266             choose_sample_fmt(st, codec);
4267         else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4268             choose_pixel_fmt(st, codec);
4269     }
4270
4271     avformat_close_input(&ic);
4272     return 0;
4273 }
4274
4275 static void opt_output_file(void *optctx, const char *filename)
4276 {
4277     OptionsContext *o = optctx;
4278     AVFormatContext *oc;
4279     int i, err;
4280     AVOutputFormat *file_oformat;
4281     OutputStream *ost;
4282     InputStream  *ist;
4283
4284     if (!strcmp(filename, "-"))
4285         filename = "pipe:";
4286
4287     err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4288     if (!oc) {
4289         print_error(filename, err);
4290         exit_program(1);
4291     }
4292     file_oformat= oc->oformat;
4293     oc->interrupt_callback = int_cb;
4294
4295     if (!strcmp(file_oformat->name, "ffm") &&
4296         av_strstart(filename, "http:", NULL)) {
4297         int j;
4298         /* special case for files sent to ffserver: we get the stream
4299            parameters from ffserver */
4300         int err = read_ffserver_streams(o, oc, filename);
4301         if (err < 0) {
4302             print_error(filename, err);
4303             exit_program(1);
4304         }
4305         for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4306             ost = &output_streams[j];
4307             for (i = 0; i < nb_input_streams; i++) {
4308                 ist = &input_streams[i];
4309                 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4310                     ost->sync_ist= ist;
4311                     ost->source_index= i;
4312                     ist->discard = 0;
4313                     ist->st->discard = AVDISCARD_NONE;
4314                     break;
4315                 }
4316             }
4317             if(!ost->sync_ist){
4318                 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
4319                 exit_program(1);
4320             }
4321         }
4322     } else if (!o->nb_stream_maps) {
4323         /* pick the "best" stream of each type */
4324 #define NEW_STREAM(type, index)\
4325         if (index >= 0) {\
4326             ost = new_ ## type ## _stream(o, oc);\
4327             ost->source_index = index;\
4328             ost->sync_ist     = &input_streams[index];\
4329             input_streams[index].discard = 0;\
4330             input_streams[index].st->discard = AVDISCARD_NONE;\
4331         }
4332
4333         /* video: highest resolution */
4334         if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4335             int area = 0, idx = -1;
4336             for (i = 0; i < nb_input_streams; i++) {
4337                 ist = &input_streams[i];
4338                 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
4339                     ist->st->codec->width * ist->st->codec->height > area) {
4340                     area = ist->st->codec->width * ist->st->codec->height;
4341                     idx = i;
4342                 }
4343             }
4344             NEW_STREAM(video, idx);
4345         }
4346
4347         /* audio: most channels */
4348         if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4349             int channels = 0, idx = -1;
4350             for (i = 0; i < nb_input_streams; i++) {
4351                 ist = &input_streams[i];
4352                 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
4353                     ist->st->codec->channels > channels) {
4354                     channels = ist->st->codec->channels;
4355                     idx = i;
4356                 }
4357             }
4358             NEW_STREAM(audio, idx);
4359         }
4360
4361         /* subtitles: pick first */
4362         if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4363             for (i = 0; i < nb_input_streams; i++)
4364                 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
4365                     NEW_STREAM(subtitle, i);
4366                     break;
4367                 }
4368         }
4369         /* do something with data? */
4370     } else {
4371         for (i = 0; i < o->nb_stream_maps; i++) {
4372             StreamMap *map = &o->stream_maps[i];
4373
4374             if (map->disabled)
4375                 continue;
4376
4377             ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4378             if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
4379                 continue;
4380             if(o->   audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
4381                 continue;
4382             if(o->   video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
4383                 continue;
4384             if(o->    data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
4385                 continue;
4386
4387             switch (ist->st->codec->codec_type) {
4388             case AVMEDIA_TYPE_VIDEO:    ost = new_video_stream(o, oc);    break;
4389             case AVMEDIA_TYPE_AUDIO:    ost = new_audio_stream(o, oc);    break;
4390             case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
4391             case AVMEDIA_TYPE_DATA:     ost = new_data_stream(o, oc);     break;
4392             case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4393             default:
4394                 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4395                        map->file_index, map->stream_index);
4396                 exit_program(1);
4397             }
4398
4399             ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4400             ost->sync_ist     = &input_streams[input_files[map->sync_file_index].ist_index +
4401                                            map->sync_stream_index];
4402             ist->discard = 0;
4403             ist->st->discard = AVDISCARD_NONE;
4404         }
4405     }
4406
4407
4408     for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
4409         AVDictionaryEntry *e;
4410         ost = &output_streams[i];
4411
4412         if (   ost->stream_copy
4413             && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
4414             && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
4415             if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
4416                 exit_program(1);
4417     }
4418
4419     /* handle attached files */
4420     for (i = 0; i < o->nb_attachments; i++) {
4421         AVIOContext *pb;
4422         uint8_t *attachment;
4423         const char *p;
4424         int64_t len;
4425
4426         if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4427             av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
4428                    o->attachments[i]);
4429             exit_program(1);
4430         }
4431         if ((len = avio_size(pb)) <= 0) {
4432             av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
4433                    o->attachments[i]);
4434             exit_program(1);
4435         }
4436         if (!(attachment = av_malloc(len))) {
4437             av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
4438                    o->attachments[i]);
4439             exit_program(1);
4440         }
4441         avio_read(pb, attachment, len);
4442
4443         ost = new_attachment_stream(o, oc);
4444         ost->stream_copy               = 0;
4445         ost->source_index              = -1;
4446         ost->attachment_filename       = o->attachments[i];
4447         ost->st->codec->extradata      = attachment;
4448         ost->st->codec->extradata_size = len;
4449
4450         p = strrchr(o->attachments[i], '/');
4451         av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
4452         avio_close(pb);
4453     }
4454
4455     output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
4456     output_files[nb_output_files - 1].ctx       = oc;
4457     output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4458     output_files[nb_output_files - 1].recording_time = o->recording_time;
4459     if (o->recording_time != INT64_MAX)
4460         oc->duration = o->recording_time;
4461     output_files[nb_output_files - 1].start_time     = o->start_time;
4462     output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4463     av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
4464
4465     /* check filename in case of an image number is expected */
4466     if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4467         if (!av_filename_number_test(oc->filename)) {
4468             print_error(oc->filename, AVERROR(EINVAL));
4469             exit_program(1);
4470         }
4471     }
4472
4473     if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4474         /* test if it already exists to avoid losing precious files */
4475         assert_file_overwrite(filename);
4476
4477         /* open the file */
4478         if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
4479                               &oc->interrupt_callback,
4480                               &output_files[nb_output_files - 1].opts)) < 0) {
4481             print_error(filename, err);
4482             exit_program(1);
4483         }
4484     }
4485
4486     if (o->mux_preload) {
4487         uint8_t buf[64];
4488         snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
4489         av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
4490     }
4491     oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4492
4493     /* copy metadata */
4494     for (i = 0; i < o->nb_metadata_map; i++) {
4495         char *p;
4496         int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4497
4498         if (in_file_index < 0)
4499             continue;
4500         if (in_file_index >= nb_input_files) {
4501             av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
4502             exit_program(1);
4503         }
4504         copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
4505     }
4506
4507     /* copy chapters */
4508     if (o->chapters_input_file >= nb_input_files) {
4509         if (o->chapters_input_file == INT_MAX) {
4510             /* copy chapters from the first input file that has them*/
4511             o->chapters_input_file = -1;
4512             for (i = 0; i < nb_input_files; i++)
4513                 if (input_files[i].ctx->nb_chapters) {
4514                     o->chapters_input_file = i;
4515                     break;
4516                 }
4517         } else {
4518             av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4519                    o->chapters_input_file);
4520             exit_program(1);
4521         }
4522     }
4523     if (o->chapters_input_file >= 0)
4524         copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4525                       !o->metadata_chapters_manual);
4526
4527     /* copy global metadata by default */
4528     if (!o->metadata_global_manual && nb_input_files){
4529         av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
4530                      AV_DICT_DONT_OVERWRITE);
4531         if(o->recording_time != INT64_MAX)
4532             av_dict_set(&oc->metadata, "duration", NULL, 0);
4533     }
4534     if (!o->metadata_streams_manual)
4535         for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4536             InputStream *ist;
4537             if (output_streams[i].source_index < 0)         /* this is true e.g. for attached files */
4538                 continue;
4539             ist = &input_streams[output_streams[i].source_index];
4540             av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4541         }
4542
4543     /* process manually set metadata */
4544     for (i = 0; i < o->nb_metadata; i++) {
4545         AVDictionary **m;
4546         char type, *val;
4547         const char *stream_spec;
4548         int index = 0, j, ret = 0;
4549
4550         val = strchr(o->metadata[i].u.str, '=');
4551         if (!val) {
4552             av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4553                    o->metadata[i].u.str);
4554             exit_program(1);
4555         }
4556         *val++ = 0;
4557
4558         parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
4559         if (type == 's') {
4560             for (j = 0; j < oc->nb_streams; j++) {
4561                 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
4562                     av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
4563                 } else if (ret < 0)
4564                     exit_program(1);
4565             }
4566             printf("ret %d, stream_spec %s\n", ret, stream_spec);
4567         }
4568         else {
4569             switch (type) {
4570             case 'g':
4571                 m = &oc->metadata;
4572                 break;
4573             case 'c':
4574                 if (index < 0 || index >= oc->nb_chapters) {
4575                     av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
4576                     exit_program(1);
4577                 }
4578                 m = &oc->chapters[index]->metadata;
4579                 break;
4580             default:
4581                 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4582                 exit_program(1);
4583             }
4584             av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4585         }
4586     }
4587
4588     reset_options(o, 0);
4589 }
4590
4591 /* same option as mencoder */
4592 static int opt_pass(const char *opt, const char *arg)
4593 {
4594     do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4595     return 0;
4596 }
4597
4598 static int64_t getutime(void)
4599 {
4600 #if HAVE_GETRUSAGE
4601     struct rusage rusage;
4602
4603     getrusage(RUSAGE_SELF, &rusage);
4604     return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4605 #elif HAVE_GETPROCESSTIMES
4606     HANDLE proc;
4607     FILETIME c, e, k, u;
4608     proc = GetCurrentProcess();
4609     GetProcessTimes(proc, &c, &e, &k, &u);
4610     return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4611 #else
4612     return av_gettime();
4613 #endif
4614 }
4615
4616 static int64_t getmaxrss(void)
4617 {
4618 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4619     struct rusage rusage;
4620     getrusage(RUSAGE_SELF, &rusage);
4621     return (int64_t)rusage.ru_maxrss * 1024;
4622 #elif HAVE_GETPROCESSMEMORYINFO
4623     HANDLE proc;
4624     PROCESS_MEMORY_COUNTERS memcounters;
4625     proc = GetCurrentProcess();
4626     memcounters.cb = sizeof(memcounters);
4627     GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4628     return memcounters.PeakPagefileUsage;
4629 #else
4630     return 0;
4631 #endif
4632 }
4633
4634 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4635 {
4636     return parse_option(o, "q:a", arg, options);
4637 }
4638
4639 static void show_usage(void)
4640 {
4641     av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
4642     av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4643     av_log(NULL, AV_LOG_INFO, "\n");
4644 }
4645
4646 static int opt_help(const char *opt, const char *arg)
4647 {
4648     int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4649     av_log_set_callback(log_callback_help);
4650     show_usage();
4651     show_help_options(options, "Main options:\n",
4652                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4653     show_help_options(options, "\nAdvanced options:\n",
4654                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4655                       OPT_EXPERT);
4656     show_help_options(options, "\nVideo options:\n",
4657                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4658                       OPT_VIDEO);
4659     show_help_options(options, "\nAdvanced Video options:\n",
4660                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4661                       OPT_VIDEO | OPT_EXPERT);
4662     show_help_options(options, "\nAudio options:\n",
4663                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4664                       OPT_AUDIO);
4665     show_help_options(options, "\nAdvanced Audio options:\n",
4666                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4667                       OPT_AUDIO | OPT_EXPERT);
4668     show_help_options(options, "\nSubtitle options:\n",
4669                       OPT_SUBTITLE | OPT_GRAB,
4670                       OPT_SUBTITLE);
4671     show_help_options(options, "\nAudio/Video grab options:\n",
4672                       OPT_GRAB,
4673                       OPT_GRAB);
4674     printf("\n");
4675     show_help_children(avcodec_get_class(), flags);
4676     show_help_children(avformat_get_class(), flags);
4677     show_help_children(sws_get_class(), flags);
4678
4679     return 0;
4680 }
4681
4682 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4683 {
4684     enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4685     static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4686
4687     if (!strncmp(arg, "pal-", 4)) {
4688         norm = PAL;
4689         arg += 4;
4690     } else if (!strncmp(arg, "ntsc-", 5)) {
4691         norm = NTSC;
4692         arg += 5;
4693     } else if (!strncmp(arg, "film-", 5)) {
4694         norm = FILM;
4695         arg += 5;
4696     } else {
4697         /* Try to determine PAL/NTSC by peeking in the input files */
4698         if (nb_input_files) {
4699             int i, j, fr;
4700             for (j = 0; j < nb_input_files; j++) {
4701                 for (i = 0; i < input_files[j].nb_streams; i++) {
4702                     AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4703                     if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4704                         continue;
4705                     fr = c->time_base.den * 1000 / c->time_base.num;
4706                     if (fr == 25000) {
4707                         norm = PAL;
4708                         break;
4709                     } else if ((fr == 29970) || (fr == 23976)) {
4710                         norm = NTSC;
4711                         break;
4712                     }
4713                 }
4714                 if (norm != UNKNOWN)
4715                     break;
4716             }
4717         }
4718         if (norm != UNKNOWN)
4719             av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4720     }
4721
4722     if (norm == UNKNOWN) {
4723         av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4724         av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4725         av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4726         exit_program(1);
4727     }
4728
4729     if (!strcmp(arg, "vcd")) {
4730         opt_video_codec(o, "c:v", "mpeg1video");
4731         opt_audio_codec(o, "c:a", "mp2");
4732         parse_option(o, "f", "vcd", options);
4733
4734         parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
4735         parse_option(o, "r", frame_rates[norm], options);
4736         opt_default("g", norm == PAL ? "15" : "18");
4737
4738         opt_default("b:v", "1150000");
4739         opt_default("maxrate", "1150000");
4740         opt_default("minrate", "1150000");
4741         opt_default("bufsize", "327680"); // 40*1024*8;
4742
4743         opt_default("b:a", "224000");
4744         parse_option(o, "ar", "44100", options);
4745         parse_option(o, "ac", "2", options);
4746
4747         opt_default("packetsize", "2324");
4748         opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4749
4750         /* We have to offset the PTS, so that it is consistent with the SCR.
4751            SCR starts at 36000, but the first two packs contain only padding
4752            and the first pack from the other stream, respectively, may also have
4753            been written before.
4754            So the real data starts at SCR 36000+3*1200. */
4755         o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
4756     } else if (!strcmp(arg, "svcd")) {
4757
4758         opt_video_codec(o, "c:v", "mpeg2video");
4759         opt_audio_codec(o, "c:a", "mp2");
4760         parse_option(o, "f", "svcd", options);
4761
4762         parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4763         parse_option(o, "r", frame_rates[norm], options);
4764         parse_option(o, "pix_fmt", "yuv420p", options);
4765         opt_default("g", norm == PAL ? "15" : "18");
4766
4767         opt_default("b:v", "2040000");
4768         opt_default("maxrate", "2516000");
4769         opt_default("minrate", "0"); // 1145000;
4770         opt_default("bufsize", "1835008"); // 224*1024*8;
4771         opt_default("flags", "+scan_offset");
4772
4773
4774         opt_default("b:a", "224000");
4775         parse_option(o, "ar", "44100", options);
4776
4777         opt_default("packetsize", "2324");
4778
4779     } else if (!strcmp(arg, "dvd")) {
4780
4781         opt_video_codec(o, "c:v", "mpeg2video");
4782         opt_audio_codec(o, "c:a", "ac3");
4783         parse_option(o, "f", "dvd", options);
4784
4785         parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4786         parse_option(o, "r", frame_rates[norm], options);
4787         parse_option(o, "pix_fmt", "yuv420p", options);
4788         opt_default("g", norm == PAL ? "15" : "18");
4789
4790         opt_default("b:v", "6000000");
4791         opt_default("maxrate", "9000000");
4792         opt_default("minrate", "0"); // 1500000;
4793         opt_default("bufsize", "1835008"); // 224*1024*8;
4794
4795         opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4796         opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4797
4798         opt_default("b:a", "448000");
4799         parse_option(o, "ar", "48000", options);
4800
4801     } else if (!strncmp(arg, "dv", 2)) {
4802
4803         parse_option(o, "f", "dv", options);
4804
4805         parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4806         parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4807                           norm == PAL ? "yuv420p" : "yuv411p", options);
4808         parse_option(o, "r", frame_rates[norm], options);
4809
4810         parse_option(o, "ar", "48000", options);
4811         parse_option(o, "ac", "2", options);
4812
4813     } else {
4814         av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4815         return AVERROR(EINVAL);
4816     }
4817     return 0;
4818 }
4819
4820 static int opt_vstats_file(const char *opt, const char *arg)
4821 {
4822     av_free (vstats_filename);
4823     vstats_filename = av_strdup (arg);
4824     return 0;
4825 }
4826
4827 static int opt_vstats(const char *opt, const char *arg)
4828 {
4829     char filename[40];
4830     time_t today2 = time(NULL);
4831     struct tm *today = localtime(&today2);
4832
4833     snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4834              today->tm_sec);
4835     return opt_vstats_file(opt, filename);
4836 }
4837
4838 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4839 {
4840     return parse_option(o, "frames:v", arg, options);
4841 }
4842
4843 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4844 {
4845     return parse_option(o, "frames:a", arg, options);
4846 }
4847
4848 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4849 {
4850     return parse_option(o, "frames:d", arg, options);
4851 }
4852
4853 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4854 {
4855     FILE *f=NULL;
4856     char filename[1000], tmp[1000], tmp2[1000], line[1000];
4857     const char *codec_name = *opt == 'v' ? video_codec_name :
4858                              *opt == 'a' ? audio_codec_name :
4859                                            subtitle_codec_name;
4860
4861     if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4862         if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4863             av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4864         }else
4865             av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4866         exit_program(1);
4867     }
4868
4869     while(!feof(f)){
4870         int e= fscanf(f, "%999[^\n]\n", line) - 1;
4871         if(line[0] == '#' && !e)
4872             continue;
4873         e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4874         if(e){
4875             av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4876             exit_program(1);
4877         }
4878         if(!strcmp(tmp, "acodec")){
4879             opt_audio_codec(o, tmp, tmp2);
4880         }else if(!strcmp(tmp, "vcodec")){
4881             opt_video_codec(o, tmp, tmp2);
4882         }else if(!strcmp(tmp, "scodec")){
4883             opt_subtitle_codec(o, tmp, tmp2);
4884         }else if(!strcmp(tmp, "dcodec")){
4885             opt_data_codec(o, tmp, tmp2);
4886         }else if(opt_default(tmp, tmp2) < 0){
4887             av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4888             exit_program(1);
4889         }
4890     }
4891
4892     fclose(f);
4893
4894     return 0;
4895 }
4896
4897 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4898 {
4899 }
4900
4901 static int opt_passlogfile(const char *opt, const char *arg)
4902 {
4903     pass_logfilename_prefix = arg;
4904 #if CONFIG_LIBX264_ENCODER
4905     return opt_default(opt, arg);
4906 #else
4907     return 0;
4908 #endif
4909 }
4910
4911 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
4912 {
4913     char *s = av_asprintf("%s:%c", opt + 1, *opt);
4914     int ret = parse_option(o, s, arg, options);
4915     av_free(s);
4916     return ret;
4917 }
4918
4919 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
4920 {
4921     if(!strcmp(opt, "b")){
4922         av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4923         return parse_option(o, "b:v", arg, options);
4924     }
4925     return opt_default(opt, arg);
4926 }
4927
4928 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
4929 {
4930     char *s;
4931     int ret;
4932     if(!strcmp(opt, "qscale")){
4933         av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
4934         return parse_option(o, "q:v", arg, options);
4935     }
4936     s = av_asprintf("q%s", opt + 6);
4937     ret = parse_option(o, s, arg, options);
4938     av_free(s);
4939     return ret;
4940 }
4941
4942 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4943 {
4944     return parse_option(o, "filter:v", arg, options);
4945 }
4946
4947 static int opt_vsync(const char *opt, const char *arg)
4948 {
4949     if      (!av_strcasecmp(arg, "cfr"))         video_sync_method = VSYNC_CFR;
4950     else if (!av_strcasecmp(arg, "vfr"))         video_sync_method = VSYNC_VFR;
4951     else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
4952     else if (!av_strcasecmp(arg, "drop"))        video_sync_method = VSYNC_DROP;
4953
4954     if (video_sync_method == VSYNC_AUTO)
4955         video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
4956     return 0;
4957 }
4958
4959 static int opt_deinterlace(const char *opt, const char *arg)
4960 {
4961     av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
4962     do_deinterlace = 1;
4963     return 0;
4964 }
4965
4966 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
4967 {
4968     int idx = locate_option(argc, argv, options, "cpuflags");
4969     if (idx && argv[idx + 1])
4970         opt_cpuflags("cpuflags", argv[idx + 1]);
4971 }
4972
4973 #define OFFSET(x) offsetof(OptionsContext, x)
4974 static const OptionDef options[] = {
4975     /* main options */
4976 #include "cmdutils_common_opts.h"
4977     { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4978     { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4979     { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4980     { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4981     { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4982     { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4983     { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4984     { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4985     { "map_channel", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_channel}, "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
4986     { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4987       "outfile[,metadata]:infile[,metadata]" },
4988     { "map_chapters",  OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)},  "set chapters mapping", "input_file_index" },
4989     { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4990     { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4991     { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4992     { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4993     { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4994     { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4995     { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4996     { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4997     { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4998       "add timings for benchmarking" },
4999     { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5000     { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5001       "dump each input packet" },
5002     { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5003       "when dumping packets, also dump the payload" },
5004     { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5005     { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5006     { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5007     { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5008     { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5009     { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
5010     { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying", "source" },
5011     { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5012     { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5013     { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5014     { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5015     { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5016     { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5017     { "tag",   OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5018     { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5019     { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5020 #if CONFIG_AVFILTER
5021     { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5022 #endif
5023     { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5024     { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5025     { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5026     { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5027
5028     /* video options */
5029     { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5030     { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5031     { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5032     { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
5033     { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5034     { "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" },
5035     { "croptop",  HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5036     { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5037     { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5038     { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5039     { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5040     { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5041     { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5042     { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5043     { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5044     { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
5045     { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5046     { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5047     { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5048     { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5049     { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5050     { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5051       "use same quantizer as source (implies VBR)" },
5052     { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5053     { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5054     { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5055       "this option is deprecated, use the yadif filter instead" },
5056     { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5057     { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5058     { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5059 #if CONFIG_AVFILTER
5060     { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5061 #endif
5062     { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5063     { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5064     { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5065     { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5066     { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5067     { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5068     { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5069     { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5070     { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
5071     { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5072
5073     /* audio options */
5074     { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5075     { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5076     { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5077     { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5078     { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5079     { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5080     { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5081     { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5082     { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5083     { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5084
5085     /* subtitle options */
5086     { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5087     { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5088     { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5089
5090     /* grab options */
5091     { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5092     { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5093     { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5094
5095     /* muxer options */
5096     { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT   | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5097     { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)},   "set the initial demux-decode delay", "seconds" },
5098
5099     { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5100     { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5101     { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5102
5103     { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5104     { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5105     { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5106     { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5107     /* data codec support */
5108     { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5109     { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5110
5111     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5112     { NULL, },
5113 };
5114
5115 int main(int argc, char **argv)
5116 {
5117     OptionsContext o = { 0 };
5118     int64_t ti;
5119
5120     reset_options(&o, 0);
5121
5122     av_log_set_flags(AV_LOG_SKIP_REPEATED);
5123     parse_loglevel(argc, argv, options);
5124
5125     if(argc>1 && !strcmp(argv[1], "-d")){
5126         run_as_daemon=1;
5127         av_log_set_callback(log_callback_null);
5128         argc--;
5129         argv++;
5130     }
5131
5132     avcodec_register_all();
5133 #if CONFIG_AVDEVICE
5134     avdevice_register_all();
5135 #endif
5136 #if CONFIG_AVFILTER
5137     avfilter_register_all();
5138 #endif
5139     av_register_all();
5140     avformat_network_init();
5141
5142     show_banner(argc, argv, options);
5143
5144     term_init();
5145
5146     parse_cpuflags(argc, argv, options);
5147
5148     /* parse options */
5149     parse_options(&o, argc, argv, options, opt_output_file);
5150
5151     if (nb_output_files <= 0 && nb_input_files == 0) {
5152         show_usage();
5153         av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5154         exit_program(1);
5155     }
5156
5157     /* file converter / grab */
5158     if (nb_output_files <= 0) {
5159         av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5160         exit_program(1);
5161     }
5162
5163     if (nb_input_files == 0) {
5164         av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5165         exit_program(1);
5166     }
5167
5168     ti = getutime();
5169     if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5170         exit_program(1);
5171     ti = getutime() - ti;
5172     if (do_benchmark) {
5173         int maxrss = getmaxrss() / 1024;
5174         printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
5175     }
5176
5177     exit_program(0);
5178     return 0;
5179 }