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