OSDN Git Service

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