OSDN Git Service

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