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