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