ffmpeg.c
85f07f22
 /*
115329f1
  * FFmpeg main
01310af2
  * Copyright (c) 2000-2003 Fabrice Bellard
85f07f22
  *
b78e7197
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
bf5af568
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
b78e7197
  * version 2.1 of the License, or (at your option) any later version.
85f07f22
  *
b78e7197
  * FFmpeg is distributed in the hope that it will be useful,
85f07f22
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
bf5af568
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
85f07f22
  *
bf5af568
  * You should have received a copy of the GNU Lesser General Public
b78e7197
  * License along with FFmpeg; if not, write to the Free Software
5509bffa
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
85f07f22
  */
364a9607
 
7246177d
 /* needed for usleep() */
d0feff2a
 #define _XOPEN_SOURCE 600
7246177d
 
0f4e8165
 #include "config.h"
 #include <ctype.h>
 #include <string.h>
 #include <math.h>
 #include <stdlib.h>
 #include <errno.h>
d86b83f8
 #include <signal.h>
22f7a060
 #include <limits.h>
7246177d
 #include <unistd.h>
245976da
 #include "libavformat/avformat.h"
 #include "libavdevice/avdevice.h"
 #include "libswscale/swscale.h"
 #include "libavformat/framehook.h"
 #include "libavcodec/opt.h"
ce1ee094
 #include "libavcodec/audioconvert.h"
245976da
 #include "libavutil/fifo.h"
 #include "libavutil/avstring.h"
 #include "libavformat/os_support.h"
daf8e955
 
b250f9c6
 #if HAVE_SYS_RESOURCE_H
0a1b29de
 #include <sys/types.h>
b091aa44
 #include <sys/resource.h>
b250f9c6
 #elif HAVE_GETPROCESSTIMES
7495c306
 #include <windows.h>
 #endif
 
b250f9c6
 #if HAVE_SYS_SELECT_H
fb1d2d7b
 #include <sys/select.h>
 #endif
 
b250f9c6
 #if HAVE_TERMIOS_H
85f07f22
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
 #include <termios.h>
b250f9c6
 #elif HAVE_CONIO_H
4b54c6d0
 #include <conio.h>
bdc4796f
 #endif
64c020a8
 #undef time //needed because HAVE_AV_CONFIG_H is defined on top
bf5af568
 #include <time.h>
85f07f22
 
01310af2
 #include "cmdutils.h"
 
2b18dcd0
 #undef NDEBUG
 #include <assert.h>
 
c367d067
 #undef exit
 
64555bd9
 const char program_name[] = "FFmpeg";
ea9c581f
 const int program_birth_year = 2000;
86074ed1
 
85f07f22
 /* select an input stream for an output stream */
 typedef struct AVStreamMap {
     int file_index;
     int stream_index;
b4a3389e
     int sync_file_index;
     int sync_stream_index;
85f07f22
 } AVStreamMap;
 
0a38bafd
 /** select an input file for an output file */
 typedef struct AVMetaDataMap {
     int out_file;
     int in_file;
 } AVMetaDataMap;
 
580a6c57
 static const OptionDef options[];
85f07f22
 
 #define MAX_FILES 20
 
 static AVFormatContext *input_files[MAX_FILES];
a6a92a9a
 static int64_t input_files_ts_offset[MAX_FILES];
8833f375
 static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
6488cf9b
 static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
85f07f22
 static int nb_input_files = 0;
6488cf9b
 static int nb_icodecs;
85f07f22
 
 static AVFormatContext *output_files[MAX_FILES];
6488cf9b
 static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
85f07f22
 static int nb_output_files = 0;
6488cf9b
 static int nb_ocodecs;
85f07f22
 
f44fd374
 static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
85f07f22
 static int nb_stream_maps;
 
0a38bafd
 static AVMetaDataMap meta_data_maps[MAX_FILES];
 static int nb_meta_data_maps;
 
79fdaa4c
 static AVInputFormat *file_iformat;
 static AVOutputFormat *file_oformat;
55cf1959
 static int frame_width  = 0;
 static int frame_height = 0;
880e8ba7
 static float frame_aspect_ratio = 0;
644a9262
 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
ce1ee094
 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
1ff93ffc
 static int frame_padtop  = 0;
 static int frame_padbottom = 0;
 static int frame_padleft  = 0;
 static int frame_padright = 0;
 static int padcolor[3] = {16,128,128}; /* default to black */
ab6d194a
 static int frame_topBand  = 0;
 static int frame_bottomBand = 0;
 static int frame_leftBand  = 0;
 static int frame_rightBand = 0;
cf7fc795
 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
89129c6b
 static AVRational frame_rate;
158c7f05
 static float video_qscale = 0;
84f608f4
 static uint16_t *intra_matrix = NULL;
 static uint16_t *inter_matrix = NULL;
ac2830ec
 #if 0 //experimental, (can be removed)
3aa102be
 static float video_rc_qsquish=1.0;
 static float video_rc_qmod_amp=0;
 static int video_rc_qmod_freq=0;
ac2830ec
 #endif
464a631c
 static const char *video_rc_override_string=NULL;
85f07f22
 static int video_disable = 0;
f3356e9c
 static int video_discard = 0;
4a897224
 static char *video_codec_name = NULL;
b2a2197e
 static int video_codec_tag = 0;
85f07f22
 static int same_quality = 0;
cfcf0ffd
 static int do_deinterlace = 0;
bb198e19
 static int top_field_first = -1;
f4f3223f
 static int me_threshold = 0;
1a11cbcc
 static int intra_dc_precision = 8;
5894e1bb
 static int loop_input = 0;
8108551a
 static int loop_output = AVFMT_NOOUTPUTLOOP;
0888fd22
 static int qp_hist = 0;
85f07f22
 
 static int intra_only = 0;
 static int audio_sample_rate = 44100;
13367a46
 static int64_t channel_layout = 0;
c57c770d
 #define QSCALE_NONE -99999
 static float audio_qscale = QSCALE_NONE;
85f07f22
 static int audio_disable = 0;
 static int audio_channels = 1;
4a897224
 static char  *audio_codec_name = NULL;
b2a2197e
 static int audio_codec_tag = 0;
cf7fc795
 static char *audio_language = NULL;
 
11bf3847
 static int subtitle_disable = 0;
4a897224
 static char *subtitle_codec_name = NULL;
cf7fc795
 static char *subtitle_language = NULL;
85f07f22
 
17c88cb0
 static float mux_preload= 0.5;
 static float mux_max_delay= 0.7;
2db3c638
 
fc7ad2af
 static int64_t recording_time = INT64_MAX;
8831db5c
 static int64_t start_time = 0;
4568325a
 static int64_t rec_timestamp = 0;
a6a92a9a
 static int64_t input_ts_offset = 0;
85f07f22
 static int file_overwrite = 0;
a5926d85
 static int metadata_count;
 static AVMetadataTag *metadata;
5727b222
 static int do_benchmark = 0;
a0663ba4
 static int do_hex_dump = 0;
254abc2e
 static int do_pkt_dump = 0;
43f1708f
 static int do_psnr = 0;
5abdb4b1
 static int do_pass = 0;
ad16627f
 static char *pass_logfilename_prefix = NULL;
1629626f
 static int audio_stream_copy = 0;
 static int video_stream_copy = 0;
cf7fc795
 static int subtitle_stream_copy = 0;
8858816d
 static int video_sync_method= -1;
986ebcdb
 static int audio_sync_method= 0;
d4d226a8
 static float audio_drift_threshold= 0.1;
72bd8100
 static int copy_ts= 0;
76bdac6d
 static int opt_shortest = 0;
90ad92b3
 static int video_global_header = 0;
b60d1379
 static char *vstats_filename;
032aa7df
 static FILE *vstats_file;
50e143c4
 static int opt_programid = 0;
50e3477f
 static int copy_initial_nonkeyframes = 0;
5abdb4b1
 
bdfcbbed
 static int rate_emu = 0;
 
a5df11ab
 static int  video_channel = 0;
df0cecdd
 static char *video_standard;
79a7c268
 
a9aa3467
 static int audio_volume = 256;
8aa3ee32
 
f2abc559
 static int exit_on_error = 0;
d9a916e2
 static int using_stdin = 0;
bee0d9e5
 static int using_vhook = 0;
f068206e
 static int verbose = 1;
9c3d33d6
 static int thread_count= 1;
b51469a0
 static int q_pressed = 0;
1008ceb3
 static int64_t video_size = 0;
 static int64_t audio_size = 0;
 static int64_t extra_size = 0;
a6a92a9a
 static int nb_frames_dup = 0;
 static int nb_frames_drop = 0;
6e454c38
 static int input_sync;
76bdac6d
 static uint64_t limit_filesize = 0;
d2845b75
 static int force_fps = 0;
d9a916e2
 
5b6d5596
 static int pgmyuv_compatibility_hack=0;
a8482aab
 static float dts_delta_threshold = 10;
5b6d5596
 
e60da588
 static unsigned int sws_flags = SWS_BICUBIC;
18a54b04
 
29cc1c23
 static int64_t timer_start;
8bbf6db9
 
748c2fca
 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
e1cc8339
 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
748c2fca
 static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
5b6d5596
 
ad16627f
 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
85f07f22
 
b4a3389e
 struct AVInputStream;
 
85f07f22
 typedef struct AVOutputStream {
     int file_index;          /* file index */
     int index;               /* stream index in the output file */
     int source_index;        /* AVInputStream index */
     AVStream *st;            /* stream in the output file */
ec5517d5
     int encoding_needed;     /* true if encoding needed for this stream */
     int frame_number;
     /* input pts and corresponding output pts
        for A/V sync */
b4a3389e
     //double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
     struct AVInputStream *sync_ist; /* input stream to sync against */
e928649b
     int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
85f07f22
     /* video only */
07d0cdfc
     int video_resample;
a4d36c11
     AVFrame pict_tmp;      /* temporary image for resampling */
18a54b04
     struct SwsContext *img_resample_ctx; /* for image resampling */
     int resample_height;
34b10a57
 
07d0cdfc
     int video_crop;
34b10a57
     int topBand;             /* cropping area sizes */
     int leftBand;
115329f1
 
07d0cdfc
     int video_pad;
1ff93ffc
     int padtop;              /* padding area sizes */
     int padbottom;
     int padleft;
     int padright;
115329f1
 
85f07f22
     /* audio only */
     int audio_resample;
     ReSampleContext *resample; /* for audio resampling */
a79db0f7
     int reformat_pair;
     AVAudioConvert *reformat_ctx;
f5a478f6
     AVFifoBuffer fifo;     /* for compression: one audio fifo per codec */
5abdb4b1
     FILE *logfile;
85f07f22
 } AVOutputStream;
 
 typedef struct AVInputStream {
     int file_index;
     int index;
     AVStream *st;
     int discard;             /* true if stream data should be discarded */
     int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */
0c1a9eda
     int64_t sample_index;      /* current sample */
bdfcbbed
 
     int64_t       start;     /* time when read started */
254abc2e
     int64_t       next_pts;  /* synthetic pts for cases where pkt.pts
                                 is not defined */
e7d0374f
     int64_t       pts;       /* current pts */
ff4905a5
     int is_start;            /* is 1 at the start and after a discontinuity */
85f07f22
 } AVInputStream;
 
 typedef struct AVInputFile {
     int eof_reached;      /* true if eof reached */
     int ist_index;        /* index of first stream in ist_table */
     int buffer_size;      /* current total buffer size */
79fdaa4c
     int nb_streams;       /* nb streams we are aware of */
85f07f22
 } AVInputFile;
 
b250f9c6
 #if HAVE_TERMIOS_H
bdc4796f
 
85f07f22
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
d86b83f8
 #endif
85f07f22
 
 static void term_exit(void)
 {
b250f9c6
 #if HAVE_TERMIOS_H
85f07f22
     tcsetattr (0, TCSANOW, &oldtty);
d86b83f8
 #endif
85f07f22
 }
 
9680a722
 static volatile sig_atomic_t received_sigterm = 0;
 
 static void
 sigterm_handler(int sig)
 {
     received_sigterm = sig;
     term_exit();
 }
 
85f07f22
 static void term_init(void)
 {
b250f9c6
 #if HAVE_TERMIOS_H
85f07f22
     struct termios tty;
 
     tcgetattr (0, &tty);
     oldtty = tty;
 
     tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
                           |INLCR|IGNCR|ICRNL|IXON);
     tty.c_oflag |= OPOST;
     tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
     tty.c_cflag &= ~(CSIZE|PARENB);
     tty.c_cflag |= CS8;
     tty.c_cc[VMIN] = 1;
     tty.c_cc[VTIME] = 0;
115329f1
 
85f07f22
     tcsetattr (0, TCSANOW, &tty);
d86b83f8
     signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
 #endif
85f07f22
 
9680a722
     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */
     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
     /*
     register a function to be called at normal program termination
     */
85f07f22
     atexit(term_exit);
b250f9c6
 #if CONFIG_BEOS_NETSERVER
9ddd71fc
     fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
 #endif
85f07f22
 }
 
 /* read a key without blocking */
 static int read_key(void)
 {
b250f9c6
 #if HAVE_TERMIOS_H
9ddd71fc
     int n = 1;
85f07f22
     unsigned char ch;
b250f9c6
 #if !CONFIG_BEOS_NETSERVER
9ddd71fc
     struct timeval tv;
85f07f22
     fd_set rfds;
 
     FD_ZERO(&rfds);
     FD_SET(0, &rfds);
     tv.tv_sec = 0;
     tv.tv_usec = 0;
     n = select(1, &rfds, NULL, NULL, &tv);
9ddd71fc
 #endif
85f07f22
     if (n > 0) {
cb09b2ed
         n = read(0, &ch, 1);
         if (n == 1)
85f07f22
             return ch;
cb09b2ed
 
         return n;
85f07f22
     }
b250f9c6
 #elif HAVE_CONIO_H
4b54c6d0
     if(kbhit())
         return(getch());
d86b83f8
 #endif
85f07f22
     return -1;
 }
 
b51469a0
 static int decode_interrupt_cb(void)
 {
     return q_pressed || (q_pressed = read_key() == 'q');
 }
 
296df4e7
 static int av_exit(int ret)
e5295c0d
 {
     int i;
 
     /* close files */
     for(i=0;i<nb_output_files;i++) {
         /* maybe av_close_output_file ??? */
         AVFormatContext *s = output_files[i];
         int j;
8767060c
         if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
e5295c0d
             url_fclose(s->pb);
         for(j=0;j<s->nb_streams;j++) {
094d9df7
             av_metadata_free(&s->streams[j]->metadata);
e5295c0d
             av_free(s->streams[j]->codec);
             av_free(s->streams[j]);
         }
094d9df7
         for(j=0;j<s->nb_programs;j++) {
             av_metadata_free(&s->programs[j]->metadata);
         }
         for(j=0;j<s->nb_chapters;j++) {
             av_metadata_free(&s->chapters[j]->metadata);
         }
         av_metadata_free(&s->metadata);
e5295c0d
         av_free(s);
     }
     for(i=0;i<nb_input_files;i++)
         av_close_input_file(input_files[i]);
 
     av_free(intra_matrix);
     av_free(inter_matrix);
 
     if (vstats_file)
         fclose(vstats_file);
     av_free(vstats_filename);
 
     av_free(opt_names);
 
     av_free(video_codec_name);
     av_free(audio_codec_name);
     av_free(subtitle_codec_name);
 
     av_free(video_standard);
 
b250f9c6
 #if CONFIG_POWERPC_PERF
9686df2b
     void powerpc_display_perf_report(void);
e5295c0d
     powerpc_display_perf_report();
 #endif /* CONFIG_POWERPC_PERF */
 
     if (received_sigterm) {
         fprintf(stderr,
             "Received signal %d: terminating.\n",
             (int) received_sigterm);
         exit (255);
     }
 
296df4e7
     exit(ret); /* not all OS-es handle main() return value */
     return ret;
e5295c0d
 }
 
b29f97d1
 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
85f07f22
 {
79fdaa4c
     int i, err;
85f07f22
     AVFormatContext *ic;
3438d82d
     int nopts = 0;
85f07f22
 
79fdaa4c
     err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
     if (err < 0)
         return err;
85f07f22
     /* copy stream format */
     s->nb_streams = ic->nb_streams;
     for(i=0;i<ic->nb_streams;i++) {
         AVStream *st;
1e491e29
 
f37f8d4c
         // FIXME: a more elegant solution is needed
e1031171
         st = av_mallocz(sizeof(AVStream));
85f07f22
         memcpy(st, ic->streams[i], sizeof(AVStream));
f37f8d4c
         st->codec = avcodec_alloc_context();
         memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
85f07f22
         s->streams[i] = st;
837d248d
 
         if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
             st->stream_copy = 1;
         else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
             st->stream_copy = 1;
 
dbedf2aa
         if(!st->codec->thread_count)
             st->codec->thread_count = 1;
         if(st->codec->thread_count>1)
             avcodec_thread_init(st->codec, st->codec->thread_count);
 
3438d82d
         if(st->codec->flags & CODEC_FLAG_BITEXACT)
             nopts = 1;
85f07f22
     }
 
3438d82d
     if (!nopts)
         s->timestamp = av_gettime();
 
85f07f22
     av_close_input_file(ic);
     return 0;
 }
 
b4a3389e
 static double
 get_sync_ipts(const AVOutputStream *ost)
 {
     const AVInputStream *ist = ost->sync_ist;
fec401f7
     return (double)(ist->pts - start_time)/AV_TIME_BASE;
b4a3389e
 }
 
748c2fca
 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
0ac07031
     int ret;
 
748c2fca
     while(bsfc){
         AVPacket new_pkt= *pkt;
         int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
                                           &new_pkt.data, &new_pkt.size,
                                           pkt->data, pkt->size,
                                           pkt->flags & PKT_FLAG_KEY);
7055cdac
         if(a>0){
748c2fca
             av_free_packet(pkt);
             new_pkt.destruct= av_destruct_packet;
7055cdac
         } else if(a<0){
1f8e32cd
             fprintf(stderr, "%s failed for stream %d, codec %s",
                     bsfc->filter->name, pkt->stream_index,
                     avctx->codec ? avctx->codec->name : "copy");
7055cdac
             print_error("", a);
f2abc559
             if (exit_on_error)
                 av_exit(1);
748c2fca
         }
         *pkt= new_pkt;
 
         bsfc= bsfc->next;
     }
 
0ac07031
     ret= av_interleaved_write_frame(s, pkt);
     if(ret < 0){
         print_error("av_interleaved_write_frame()", ret);
296df4e7
         av_exit(1);
0ac07031
     }
748c2fca
 }
 
817b23ff
 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
85f07f22
 
115329f1
 static void do_audio_out(AVFormatContext *s,
                          AVOutputStream *ost,
85f07f22
                          AVInputStream *ist,
                          unsigned char *buf, int size)
 {
0c1a9eda
     uint8_t *buftmp;
d66c7abc
     static uint8_t *audio_buf = NULL;
     static uint8_t *audio_out = NULL;
a79db0f7
     static uint8_t *audio_out2 = NULL;
558eae03
     const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
d66c7abc
 
85f07f22
     int size_out, frame_bytes, ret;
01f4895c
     AVCodecContext *enc= ost->st->codec;
2886f311
     AVCodecContext *dec= ist->st->codec;
287ba997
     int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
     int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
85f07f22
 
d66c7abc
     /* SC: dynamic allocation of buffers */
     if (!audio_buf)
         audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
     if (!audio_out)
558eae03
         audio_out = av_malloc(audio_out_size);
d66c7abc
     if (!audio_buf || !audio_out)
         return;               /* Should signal an error ! */
 
2886f311
     if (enc->channels != dec->channels)
         ost->audio_resample = 1;
 
     if (ost->audio_resample && !ost->resample) {
d1e3c6fd
         if (dec->sample_fmt != SAMPLE_FMT_S16)
             fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
         ost->resample = av_audio_resample_init(enc->channels,    dec->channels,
                                                enc->sample_rate, dec->sample_rate,
                                                enc->sample_fmt,  dec->sample_fmt,
                                                16, 10, 0, 0.8);
2886f311
         if (!ost->resample) {
             fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
                     dec->channels, dec->sample_rate,
                     enc->channels, enc->sample_rate);
296df4e7
             av_exit(1);
2886f311
         }
     }
 
a79db0f7
 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
d1e3c6fd
     if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
a79db0f7
         MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
         if (!audio_out2)
             audio_out2 = av_malloc(audio_out_size);
         if (!audio_out2)
             av_exit(1);
         if (ost->reformat_ctx)
             av_audio_convert_free(ost->reformat_ctx);
         ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
                                                    dec->sample_fmt, 1, NULL, 0);
         if (!ost->reformat_ctx) {
             fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
                 avcodec_get_sample_fmt_name(dec->sample_fmt),
                 avcodec_get_sample_fmt_name(enc->sample_fmt));
             av_exit(1);
         }
         ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
     }
 
986ebcdb
     if(audio_sync_method){
115329f1
         double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
f5a478f6
                 - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
01f4895c
         double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
         int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
ff4905a5
 
986ebcdb
         //FIXME resample delay
         if(fabs(delta) > 50){
d4d226a8
             if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
ff4905a5
                 if(byte_delta < 0){
f41dd5aa
                     byte_delta= FFMAX(byte_delta, -size);
ff4905a5
                     size += byte_delta;
                     buf  -= byte_delta;
                     if(verbose > 2)
                         fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
                     if(!size)
                         return;
                     ist->is_start=0;
                 }else{
                     static uint8_t *input_tmp= NULL;
                     input_tmp= av_realloc(input_tmp, byte_delta + size);
 
                     if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
                         ist->is_start=0;
                     else
                         byte_delta= MAX_AUDIO_PACKET_SIZE - size;
 
                     memset(input_tmp, 0, byte_delta);
                     memcpy(input_tmp + byte_delta, buf, size);
                     buf= input_tmp;
                     size += byte_delta;
                     if(verbose > 2)
                         fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
                 }
             }else if(audio_sync_method>1){
f66e4f5f
                 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
ff4905a5
                 assert(ost->audio_resample);
                 if(verbose > 2)
                     fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
949b1a13
 //                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));
ff4905a5
                 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
             }
115329f1
         }
986ebcdb
     }else
b4a3389e
         ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
f5a478f6
                         - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
85f07f22
 
     if (ost->audio_resample) {
         buftmp = audio_buf;
115329f1
         size_out = audio_resample(ost->resample,
85f07f22
                                   (short *)buftmp, (short *)buf,
287ba997
                                   size / (ist->st->codec->channels * isize));
         size_out = size_out * enc->channels * osize;
85f07f22
     } else {
         buftmp = buf;
         size_out = size;
     }
 
d1e3c6fd
     if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
a79db0f7
         const void *ibuf[6]= {buftmp};
         void *obuf[6]= {audio_out2};
287ba997
         int istride[6]= {isize};
         int ostride[6]= {osize};
a79db0f7
         int len= size_out/istride[0];
         if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
             printf("av_audio_convert() failed\n");
f2abc559
             if (exit_on_error)
                 av_exit(1);
a79db0f7
             return;
         }
         buftmp = audio_out2;
287ba997
         size_out = len*osize;
a79db0f7
     }
 
85f07f22
     /* now encode as many frames as possible */
a0663ba4
     if (enc->frame_size > 1) {
85f07f22
         /* output resampled raw samples */
745b39d5
         if (av_fifo_realloc2(&ost->fifo, av_fifo_size(&ost->fifo) + size_out) < 0) {
             fprintf(stderr, "av_fifo_realloc2() failed\n");
             av_exit(1);
         }
1234da4c
         av_fifo_generic_write(&ost->fifo, buftmp, size_out, NULL);
85f07f22
 
287ba997
         frame_bytes = enc->frame_size * osize * enc->channels;
115329f1
 
0871ae1a
         while (av_fifo_size(&ost->fifo) >= frame_bytes) {
e928649b
             AVPacket pkt;
             av_init_packet(&pkt);
 
0871ae1a
             av_fifo_read(&ost->fifo, audio_buf, frame_bytes);
 
5bc440e7
             //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
 
115329f1
             ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
a0663ba4
                                        (short *)audio_buf);
528271ff
             if (ret < 0) {
                 fprintf(stderr, "Audio encoding failed\n");
                 av_exit(1);
             }
1008ceb3
             audio_size += ret;
e928649b
             pkt.stream_index= ost->index;
             pkt.data= audio_out;
             pkt.size= ret;
e7902f20
             if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
c0df9d75
                 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
e928649b
             pkt.flags |= PKT_FLAG_KEY;
748c2fca
             write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
115329f1
 
986ebcdb
             ost->sync_opts += enc->frame_size;
85f07f22
         }
     } else {
e928649b
         AVPacket pkt;
287ba997
         int coded_bps = av_get_bits_per_sample(enc->codec->id)/8;
e928649b
         av_init_packet(&pkt);
986ebcdb
 
287ba997
         ost->sync_opts += size_out / (osize * enc->channels);
986ebcdb
 
a0663ba4
         /* output a pcm frame */
287ba997
         /* determine the size of the coded buffer */
         size_out /= osize;
         if (coded_bps)
             size_out *= coded_bps;
 
5bc440e7
         //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
115329f1
         ret = avcodec_encode_audio(enc, audio_out, size_out,
bb270c08
                                    (short *)buftmp);
528271ff
         if (ret < 0) {
             fprintf(stderr, "Audio encoding failed\n");
             av_exit(1);
         }
1008ceb3
         audio_size += ret;
e928649b
         pkt.stream_index= ost->index;
         pkt.data= audio_out;
         pkt.size= ret;
e7902f20
         if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
c0df9d75
             pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
e928649b
         pkt.flags |= PKT_FLAG_KEY;
748c2fca
         write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
85f07f22
     }
 }
 
10d104e4
 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
 {
     AVCodecContext *dec;
     AVPicture *picture2;
     AVPicture picture_tmp;
0c1a9eda
     uint8_t *buf = 0;
10d104e4
 
01f4895c
     dec = ist->st->codec;
10d104e4
 
     /* deinterlace : must be done before any resize */
bee0d9e5
     if (do_deinterlace || using_vhook) {
10d104e4
         int size;
 
         /* create temporary picture */
         size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
         buf = av_malloc(size);
         if (!buf)
             return;
115329f1
 
10d104e4
         picture2 = &picture_tmp;
         avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
 
dafc3856
         if (do_deinterlace){
115329f1
             if(avpicture_deinterlace(picture2, picture,
dafc3856
                                      dec->pix_fmt, dec->width, dec->height) < 0) {
                 /* if error, do not deinterlace */
6b682df2
                 fprintf(stderr, "Deinterlacing failed\n");
dafc3856
                 av_free(buf);
                 buf = NULL;
                 picture2 = picture;
             }
         } else {
636d6a4a
             av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
bee0d9e5
         }
10d104e4
     } else {
         picture2 = picture;
     }
 
49fb20cb
     if (CONFIG_VHOOK)
390d5a7c
         frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
                            1000000 * ist->pts / AV_TIME_BASE);
10d104e4
 
     if (picture != picture2)
         *picture = *picture2;
     *bufp = buf;
 }
 
ec5517d5
 /* we begin to correct av delay at this threshold */
 #define AV_DELAY_MAX 0.100
85f07f22
 
115329f1
 static void do_subtitle_out(AVFormatContext *s,
                             AVOutputStream *ost,
cf7fc795
                             AVInputStream *ist,
                             AVSubtitle *sub,
                             int64_t pts)
 {
     static uint8_t *subtitle_out = NULL;
     int subtitle_out_max_size = 65536;
     int subtitle_out_size, nb, i;
     AVCodecContext *enc;
     AVPacket pkt;
 
     if (pts == AV_NOPTS_VALUE) {
         fprintf(stderr, "Subtitle packets must have a pts\n");
f2abc559
         if (exit_on_error)
             av_exit(1);
cf7fc795
         return;
     }
 
01f4895c
     enc = ost->st->codec;
cf7fc795
 
     if (!subtitle_out) {
         subtitle_out = av_malloc(subtitle_out_max_size);
     }
 
     /* Note: DVB subtitle need one packet to draw them and one other
        packet to clear them */
     /* XXX: signal it in the codec context ? */
     if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
         nb = 2;
     else
         nb = 1;
 
     for(i = 0; i < nb; i++) {
115329f1
         subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
cf7fc795
                                                     subtitle_out_max_size, sub);
115329f1
 
cf7fc795
         av_init_packet(&pkt);
         pkt.stream_index = ost->index;
         pkt.data = subtitle_out;
         pkt.size = subtitle_out_size;
fec401f7
         pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
cf7fc795
         if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
             /* XXX: the pts correction is handled here. Maybe handling
                it in the codec would be better */
             if (i == 0)
                 pkt.pts += 90 * sub->start_display_time;
             else
                 pkt.pts += 90 * sub->end_display_time;
         }
748c2fca
         write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
cf7fc795
     }
 }
 
8a6cb114
 static int bit_buffer_size= 1024*256;
27537106
 static uint8_t *bit_buffer= NULL;
1ff93ffc
 
115329f1
 static void do_video_out(AVFormatContext *s,
                          AVOutputStream *ost,
85f07f22
                          AVInputStream *ist,
7a0f9d7e
                          AVFrame *in_picture,
986ebcdb
                          int *frame_size)
85f07f22
 {
ec5517d5
     int nb_frames, i, ret;
07d0cdfc
     AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
18a54b04
     AVFrame picture_crop_temp, picture_pad_temp;
cfcf0ffd
     AVCodecContext *enc, *dec;
115329f1
 
a4d36c11
     avcodec_get_frame_defaults(&picture_crop_temp);
07d0cdfc
     avcodec_get_frame_defaults(&picture_pad_temp);
a4d36c11
 
01f4895c
     enc = ost->st->codec;
     dec = ist->st->codec;
85f07f22
 
ec5517d5
     /* by default, we output a single frame */
     nb_frames = 1;
 
204c0f48
     *frame_size = 0;
 
8858816d
     if(video_sync_method>0 || (video_sync_method && av_q2d(enc->time_base) > 0.001)){
10d104e4
         double vdelta;
b4a3389e
         vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
e928649b
         //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
         if (vdelta < -1.1)
             nb_frames = 0;
e6fdc2b1
         else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
             if(vdelta<=-0.6){
                 nb_frames=0;
             }else if(vdelta>0.6)
880add37
             ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
e6fdc2b1
         }else if (vdelta > 1.1)
70122f29
             nb_frames = lrintf(vdelta);
fc6765d7
 //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);
50c3dd32
         if (nb_frames == 0){
             ++nb_frames_drop;
             if (verbose>2)
                 fprintf(stderr, "*** drop!\n");
8300609b
         }else if (nb_frames > 1) {
             nb_frames_dup += nb_frames;
50c3dd32
             if (verbose>2)
8300609b
                 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
50c3dd32
         }
     }else
b4a3389e
         ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
445f1b83
 
7ca60994
     nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
115329f1
     if (nb_frames <= 0)
85f07f22
         return;
ce7c56c2
 
07d0cdfc
     if (ost->video_crop) {
636d6a4a
         if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
49a06a4d
             fprintf(stderr, "error cropping picture\n");
f2abc559
             if (exit_on_error)
                 av_exit(1);
4e780252
             return;
07d0cdfc
         }
         formatted_picture = &picture_crop_temp;
18a54b04
     } else {
         formatted_picture = in_picture;
07d0cdfc
     }
 
     final_picture = formatted_picture;
     padding_src = formatted_picture;
     resampling_dst = &ost->pict_tmp;
     if (ost->video_pad) {
         final_picture = &ost->pict_tmp;
         if (ost->video_resample) {
636d6a4a
             if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
49a06a4d
                 fprintf(stderr, "error padding picture\n");
f2abc559
                 if (exit_on_error)
                     av_exit(1);
4e780252
                 return;
07d0cdfc
             }
             resampling_dst = &picture_pad_temp;
         }
     }
 
85f07f22
     if (ost->video_resample) {
07d0cdfc
         padding_src = NULL;
34b10a57
         final_picture = &ost->pict_tmp;
18a54b04
         sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
               0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
f122deb4
     }
07d0cdfc
 
     if (ost->video_pad) {
636d6a4a
         av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
07d0cdfc
                 enc->height, enc->width, enc->pix_fmt,
                 ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
85f07f22
     }
07d0cdfc
 
85f07f22
     /* duplicates frame if needed */
ec5517d5
     for(i=0;i<nb_frames;i++) {
e928649b
         AVPacket pkt;
         av_init_packet(&pkt);
         pkt.stream_index= ost->index;
 
e8750b00
         if (s->oformat->flags & AVFMT_RAWPICTURE) {
             /* raw pictures are written as AVPicture structure to
                avoid any copies. We support temorarily the older
                method. */
2744ca9a
             AVFrame* old_frame = enc->coded_frame;
bb270c08
             enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
e928649b
             pkt.data= (uint8_t *)final_picture;
             pkt.size=  sizeof(AVPicture);
b4dba580
             pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
             pkt.flags |= PKT_FLAG_KEY;
e928649b
 
748c2fca
             write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
bb270c08
             enc->coded_frame = old_frame;
e8750b00
         } else {
492cd3a9
             AVFrame big_picture;
a4d36c11
 
             big_picture= *final_picture;
7a0f9d7e
             /* better than nothing: use input picture interlaced
                settings */
             big_picture.interlaced_frame = in_picture->interlaced_frame;
23b254fb
             if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
bb198e19
                 if(top_field_first == -1)
                     big_picture.top_field_first = in_picture->top_field_first;
                 else
2a8edc5d
                     big_picture.top_field_first = top_field_first;
bb198e19
             }
7a0f9d7e
 
85f07f22
             /* handles sameq here. This is not correct because it may
                not be a global option */
             if (same_quality) {
1e491e29
                 big_picture.quality = ist->st->quality;
             }else
                 big_picture.quality = ost->st->quality;
f4f3223f
             if(!me_threshold)
                 big_picture.pict_type = 0;
50c3dd32
 //            big_picture.pts = AV_NOPTS_VALUE;
c0df9d75
             big_picture.pts= ost->sync_opts;
 //            big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
949b1a13
 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
115329f1
             ret = avcodec_encode_video(enc,
8a6cb114
                                        bit_buffer, bit_buffer_size,
1e491e29
                                        &big_picture);
95af5e1c
             if (ret < 0) {
4156a436
                 fprintf(stderr, "Video encoding failed\n");
296df4e7
                 av_exit(1);
4156a436
             }
44429457
             //enc->frame_number = enc->real_pict_num;
4bbc6260
             if(ret>0){
27537106
                 pkt.data= bit_buffer;
e928649b
                 pkt.size= ret;
e6b4e4ff
                 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
c0df9d75
                     pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
949b1a13
 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
c0df9d75
    pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
    pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
50c3dd32
 
e6b4e4ff
                 if(enc->coded_frame->key_frame)
e928649b
                     pkt.flags |= PKT_FLAG_KEY;
748c2fca
                 write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
e928649b
                 *frame_size = ret;
44eb047a
                 video_size += ret;
e928649b
                 //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
                 //        enc->frame_number-1, enc->real_pict_num, ret,
                 //        enc->pict_type);
                 /* if two pass, output log */
                 if (ost->logfile && enc->stats_out) {
                     fprintf(ost->logfile, "%s", enc->stats_out);
                 }
5abdb4b1
             }
85f07f22
         }
50c3dd32
         ost->sync_opts++;
ec5517d5
         ost->frame_number++;
85f07f22
     }
 }
 
140cb663
 static double psnr(double d){
b29f97d1
     return -10.0*log(d)/log(10.0);
140cb663
 }
 
115329f1
 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
ec5517d5
                            int frame_size)
ce7c56c2
 {
     AVCodecContext *enc;
     int frame_number;
     double ti1, bitrate, avg_bitrate;
115329f1
 
b60d1379
     /* this is executed just the first time do_video_stats is called */
032aa7df
     if (!vstats_file) {
         vstats_file = fopen(vstats_filename, "w");
         if (!vstats_file) {
4bd0c2b1
             perror("fopen");
296df4e7
             av_exit(1);
4bd0c2b1
         }
     }
 
01f4895c
     enc = ost->st->codec;
ce7c56c2
     if (enc->codec_type == CODEC_TYPE_VIDEO) {
ec5517d5
         frame_number = ost->frame_number;
032aa7df
         fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
140cb663
         if (enc->flags&CODEC_FLAG_PSNR)
032aa7df
             fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
115329f1
 
032aa7df
         fprintf(vstats_file,"f_size= %6d ", frame_size);
ec5517d5
         /* compute pts value */
c0df9d75
         ti1 = ost->sync_opts * av_q2d(enc->time_base);
ce7c56c2
         if (ti1 < 0.01)
             ti1 = 0.01;
115329f1
 
c0df9d75
         bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1008ceb3
         avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
032aa7df
         fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1008ceb3
             (double)video_size / 1024, ti1, bitrate, avg_bitrate);
032aa7df
         fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
ce7c56c2
     }
ec5517d5
 }
 
b29f97d1
 static void print_report(AVFormatContext **output_files,
bb270c08
                          AVOutputStream **ost_table, int nb_ostreams,
                          int is_last_report)
ec5517d5
 {
     char buf[1024];
     AVOutputStream *ost;
     AVFormatContext *oc, *os;
0c1a9eda
     int64_t total_size;
ec5517d5
     AVCodecContext *enc;
     int frame_number, vid, i;
     double bitrate, ti1, pts;
0c1a9eda
     static int64_t last_time = -1;
0888fd22
     static int qp_histogram[52];
115329f1
 
ec5517d5
     if (!is_last_report) {
0c1a9eda
         int64_t cur_time;
ec5517d5
         /* display the report every 0.5 seconds */
         cur_time = av_gettime();
         if (last_time == -1) {
             last_time = cur_time;
             return;
115329f1
         }
ec5517d5
         if ((cur_time - last_time) < 500000)
             return;
         last_time = cur_time;
     }
 
ce7c56c2
 
ec5517d5
     oc = output_files[0];
 
899681cd
     total_size = url_fsize(oc->pb);
859d95ba
     if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
899681cd
         total_size= url_ftell(oc->pb);
115329f1
 
ec5517d5
     buf[0] = '\0';
     ti1 = 1e10;
     vid = 0;
     for(i=0;i<nb_ostreams;i++) {
         ost = ost_table[i];
         os = output_files[ost->file_index];
01f4895c
         enc = ost->st->codec;
10d104e4
         if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
0ecca7a4
             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
e6b4e4ff
                      !ost->st->stream_copy ?
99fb79b5
                      enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
10d104e4
         }
ec5517d5
         if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
7fc98937
             float t = (av_gettime()-timer_start) / 1000000.0;
 
ec5517d5
             frame_number = ost->frame_number;
7fc98937
             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
                      frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
e6b4e4ff
                      !ost->st->stream_copy ?
99fb79b5
                      enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
890972be
             if(is_last_report)
0ecca7a4
                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
e6b4e4ff
             if(qp_hist){
0888fd22
                 int j;
                 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
37d3e066
                 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
0888fd22
                     qp_histogram[qp]++;
                 for(j=0; j<32; j++)
                     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
             }
890972be
             if (enc->flags&CODEC_FLAG_PSNR){
                 int j;
                 double error, error_sum=0;
                 double scale, scale_sum=0;
                 char type[3]= {'Y','U','V'};
0ecca7a4
                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
890972be
                 for(j=0; j<3; j++){
                     if(is_last_report){
                         error= enc->error[j];
                         scale= enc->width*enc->height*255.0*255.0*frame_number;
                     }else{
                         error= enc->coded_frame->error[j];
                         scale= enc->width*enc->height*255.0*255.0;
                     }
                     if(j) scale/=4;
                     error_sum += error;
                     scale_sum += scale;
0ecca7a4
                     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
890972be
                 }
0ecca7a4
                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
890972be
             }
ec5517d5
             vid = 1;
         }
         /* compute min output value */
43924f01
         pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
5d9827bc
         if ((pts < ti1) && (pts > 0))
ec5517d5
             ti1 = pts;
     }
     if (ti1 < 0.01)
         ti1 = 0.01;
115329f1
 
f068206e
     if (verbose || is_last_report) {
         bitrate = (double)(total_size * 8) / ti1 / 1000.0;
115329f1
 
         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
475f4d8d
             "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
ec5517d5
             (double)total_size / 1024, ti1, bitrate);
a6a92a9a
 
bb270c08
         if (verbose > 1)
           snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
                   nb_frames_dup, nb_frames_drop);
115329f1
 
d8019eb5
         if (verbose >= 0)
             fprintf(stderr, "%s    \r", buf);
 
ec5517d5
         fflush(stderr);
     }
115329f1
 
1008ceb3
     if (is_last_report && verbose >= 0){
         int64_t raw= audio_size + video_size + extra_size;
f068206e
         fprintf(stderr, "\n");
1008ceb3
         fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
                 video_size/1024.0,
                 audio_size/1024.0,
                 extra_size/1024.0,
                 100.0*(total_size - raw)/raw
         );
     }
ce7c56c2
 }
 
a700a6ae
 /* pkt = NULL means EOF (needed to flush decoder buffers) */
 static int output_packet(AVInputStream *ist, int ist_index,
                          AVOutputStream **ost_table, int nb_ostreams,
4b85a28f
                          const AVPacket *pkt)
a700a6ae
 {
     AVFormatContext *os;
     AVOutputStream *ost;
     uint8_t *ptr;
     int len, ret, i;
     uint8_t *data_buf;
     int data_size, got_picture;
     AVFrame picture;
     void *buffer_to_free;
f038fe8b
     static unsigned int samples_size= 0;
78953e62
     static short *samples= NULL;
cf7fc795
     AVSubtitle subtitle, *subtitle_to_free;
     int got_subtitle;
115329f1
 
ed923859
     if(ist->next_pts == AV_NOPTS_VALUE)
         ist->next_pts= ist->pts;
 
a700a6ae
     if (pkt == NULL) {
         /* EOF handling */
         ptr = NULL;
         len = 0;
         goto handle_eof;
     }
 
b1b818fc
     if(pkt->dts != AV_NOPTS_VALUE)
         ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
 
a700a6ae
     len = pkt->size;
     ptr = pkt->data;
bd6754aa
 
     //while we have more to decode or while the decoder did output something on EOF
     while (len > 0 || (!pkt && ist->next_pts != ist->pts)) {
a700a6ae
     handle_eof:
b1b818fc
         ist->pts= ist->next_pts;
19d5da50
 
40cb57a2
         if(len && len != pkt->size && verbose>0)
             fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
 
a700a6ae
         /* decode the packet if needed */
         data_buf = NULL; /* fail safe */
         data_size = 0;
cf7fc795
         subtitle_to_free = NULL;
a700a6ae
         if (ist->decoding_needed) {
01f4895c
             switch(ist->st->codec->codec_type) {
df84ac2e
             case CODEC_TYPE_AUDIO:{
81b060fa
                 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
                     samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
                     av_free(samples);
                     samples= av_malloc(samples_size);
                 }
5d55e966
                 data_size= samples_size;
a700a6ae
                     /* XXX: could avoid copy if PCM 16 bits with same
                        endianness as CPU */
5d55e966
                 ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
a700a6ae
                                            ptr, len);
                 if (ret < 0)
                     goto fail_decode;
                 ptr += ret;
                 len -= ret;
                 /* Some bug in mpeg audio decoder gives */
                 /* data_size < 0, it seems they are overflows */
                 if (data_size <= 0) {
                     /* no audio frame */
                     continue;
                 }
                 data_buf = (uint8_t *)samples;
115329f1
                 ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
01f4895c
                     (ist->st->codec->sample_rate * ist->st->codec->channels);
df84ac2e
                 break;}
a700a6ae
             case CODEC_TYPE_VIDEO:
01f4895c
                     data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
a700a6ae
                     /* XXX: allocate picture correctly */
9740beff
                     avcodec_get_frame_defaults(&picture);
 
115329f1
                     ret = avcodec_decode_video(ist->st->codec,
a700a6ae
                                                &picture, &got_picture, ptr, len);
                     ist->st->quality= picture.quality;
115329f1
                     if (ret < 0)
a700a6ae
                         goto fail_decode;
                     if (!got_picture) {
                         /* no picture yet */
                         goto discard_packet;
                     }
01f4895c
                     if (ist->st->codec->time_base.num != 0) {
3797c74b
                         int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
115329f1
                         ist->next_pts += ((int64_t)AV_TIME_BASE *
34583e1b
                                           ist->st->codec->time_base.num * ticks) /
01f4895c
                             ist->st->codec->time_base.den;
a700a6ae
                     }
                     len = 0;
                     break;
cf7fc795
             case CODEC_TYPE_SUBTITLE:
115329f1
                 ret = avcodec_decode_subtitle(ist->st->codec,
cf7fc795
                                               &subtitle, &got_subtitle, ptr, len);
                 if (ret < 0)
a700a6ae
                     goto fail_decode;
cf7fc795
                 if (!got_subtitle) {
                     goto discard_packet;
a700a6ae
                 }
cf7fc795
                 subtitle_to_free = &subtitle;
                 len = 0;
                 break;
             default:
                 goto fail_decode;
             }
         } else {
bde0705c
             switch(ist->st->codec->codec_type) {
             case CODEC_TYPE_AUDIO:
                 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1c715415
                     ist->st->codec->sample_rate;
bde0705c
                 break;
             case CODEC_TYPE_VIDEO:
                 if (ist->st->codec->time_base.num != 0) {
3797c74b
                     int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
bde0705c
                     ist->next_pts += ((int64_t)AV_TIME_BASE *
34583e1b
                                       ist->st->codec->time_base.num * ticks) /
bde0705c
                         ist->st->codec->time_base.den;
2fef0bdf
                 }
bde0705c
                 break;
a700a6ae
             }
bde0705c
             data_buf = ptr;
             data_size = len;
             ret = len;
             len = 0;
         }
a700a6ae
 
bde0705c
         buffer_to_free = NULL;
         if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
             pre_process_video_frame(ist, (AVPicture *)&picture,
                                     &buffer_to_free);
         }
a700a6ae
 
bde0705c
         // preprocess audio (volume)
         if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
             if (audio_volume != 256) {
                 short *volp;
                 volp = samples;
                 for(i=0;i<(data_size / sizeof(short));i++) {
                     int v = ((*volp) * audio_volume + 128) >> 8;
                     if (v < -32768) v = -32768;
                     if (v >  32767) v = 32767;
                     *volp++ = v;
7e987c33
                 }
             }
bde0705c
         }
7e987c33
 
bde0705c
         /* frame rate emulation */
3a25ca18
         if (rate_emu) {
cb103a19
             int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
bde0705c
             int64_t now = av_gettime() - ist->start;
             if (pts > now)
                 usleep(pts - now);
         }
a700a6ae
 
bde0705c
         /* if output time reached then transcode raw format,
            encode packets and output them */
         if (start_time == 0 || ist->pts >= start_time)
             for(i=0;i<nb_ostreams;i++) {
                 int frame_size;
a700a6ae
 
bde0705c
                 ost = ost_table[i];
                 if (ost->source_index == ist_index) {
                     os = output_files[ost->file_index];
a700a6ae
 
 #if 0
bde0705c
                     printf("%d: got pts=%0.3f %0.3f\n", i,
                            (double)pkt->pts / AV_TIME_BASE,
                            ((double)ist->pts / AV_TIME_BASE) -
                            ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
a700a6ae
 #endif
bde0705c
                     /* set the input output pts pairs */
                     //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
 
                     if (ost->encoding_needed) {
                         switch(ost->st->codec->codec_type) {
                         case CODEC_TYPE_AUDIO:
                             do_audio_out(os, ost, ist, data_buf, data_size);
                             break;
                         case CODEC_TYPE_VIDEO:
                             do_video_out(os, ost, ist, &picture, &frame_size);
b60d1379
                             if (vstats_filename && frame_size)
bde0705c
                                 do_video_stats(os, ost, frame_size);
                             break;
                         case CODEC_TYPE_SUBTITLE:
                             do_subtitle_out(os, ost, ist, &subtitle,
                                             pkt->pts);
                             break;
                         default:
0f4e8165
                             abort();
bde0705c
                         }
                     } else {
                         AVFrame avframe; //FIXME/XXX remove this
                         AVPacket opkt;
                         av_init_packet(&opkt);
 
50e3477f
                         if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
7cacf1e8
                             continue;
 
bde0705c
                         /* no reencoding needed : output the packet directly */
                         /* force the input stream PTS */
 
                         avcodec_get_frame_defaults(&avframe);
                         ost->st->codec->coded_frame= &avframe;
                         avframe.key_frame = pkt->flags & PKT_FLAG_KEY;
 
                         if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
                             audio_size += data_size;
                         else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
                             video_size += data_size;
                             ost->sync_opts++;
                         }
 
                         opkt.stream_index= ost->index;
                         if(pkt->pts != AV_NOPTS_VALUE)
fec401f7
                             opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
bde0705c
                         else
                             opkt.pts= AV_NOPTS_VALUE;
 
d2ce2f5e
                         if (pkt->dts == AV_NOPTS_VALUE)
181782ae
                             opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
d2ce2f5e
                         else
                             opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
c0dd7b7c
 
a03d59b7
                         opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
bde0705c
                         opkt.flags= pkt->flags;
 
                         //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
                         if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
                             opkt.destruct= av_destruct_packet;
 
8b389f15
                         write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
bde0705c
                         ost->st->codec->frame_number++;
                         ost->frame_number++;
                         av_free_packet(&opkt);
a700a6ae
                     }
                 }
bde0705c
             }
         av_free(buffer_to_free);
         /* XXX: allocate the subtitles in the codec ? */
         if (subtitle_to_free) {
             if (subtitle_to_free->rects != NULL) {
                 for (i = 0; i < subtitle_to_free->num_rects; i++) {
25b4c651
                     av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
                     av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
db4fac64
                     av_freep(&subtitle_to_free->rects[i]);
c6ec28b1
                 }
bde0705c
                 av_freep(&subtitle_to_free->rects);
cf7fc795
             }
bde0705c
             subtitle_to_free->num_rects = 0;
             subtitle_to_free = NULL;
a700a6ae
         }
bde0705c
     }
a700a6ae
  discard_packet:
6f824977
     if (pkt == NULL) {
         /* EOF handling */
115329f1
 
6f824977
         for(i=0;i<nb_ostreams;i++) {
             ost = ost_table[i];
             if (ost->source_index == ist_index) {
01f4895c
                 AVCodecContext *enc= ost->st->codec;
6f824977
                 os = output_files[ost->file_index];
115329f1
 
01f4895c
                 if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
6f824977
                     continue;
01f4895c
                 if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
6f824977
                     continue;
 
                 if (ost->encoding_needed) {
                     for(;;) {
                         AVPacket pkt;
cef7cc72
                         int fifo_bytes;
6f824977
                         av_init_packet(&pkt);
                         pkt.stream_index= ost->index;
115329f1
 
01f4895c
                         switch(ost->st->codec->codec_type) {
115329f1
                         case CODEC_TYPE_AUDIO:
f5a478f6
                             fifo_bytes = av_fifo_size(&ost->fifo);
cef7cc72
                             ret = 0;
                             /* encode any samples remaining in fifo */
                             if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
                                 int fs_tmp = enc->frame_size;
                                 enc->frame_size = fifo_bytes / (2 * enc->channels);
0871ae1a
                                 av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes);
cef7cc72
                                     ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
                                 enc->frame_size = fs_tmp;
9e0db7d5
                             }
                             if(ret <= 0) {
cef7cc72
                                 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
                             }
528271ff
                             if (ret < 0) {
                                 fprintf(stderr, "Audio encoding failed\n");
                                 av_exit(1);
                             }
6f824977
                             audio_size += ret;
                             pkt.flags |= PKT_FLAG_KEY;
                             break;
                         case CODEC_TYPE_VIDEO:
8a6cb114
                             ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
528271ff
                             if (ret < 0) {
                                 fprintf(stderr, "Video encoding failed\n");
                                 av_exit(1);
                             }
6f824977
                             video_size += ret;
                             if(enc->coded_frame && enc->coded_frame->key_frame)
                                 pkt.flags |= PKT_FLAG_KEY;
                             if (ost->logfile && enc->stats_out) {
                                 fprintf(ost->logfile, "%s", enc->stats_out);
                             }
                             break;
                         default:
                             ret=-1;
                         }
115329f1
 
6f824977
                         if(ret<=0)
                             break;
27537106
                         pkt.data= bit_buffer;
6f824977
                         pkt.size= ret;
e7902f20
                         if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
c0df9d75
                             pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
748c2fca
                         write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
6f824977
                     }
                 }
             }
         }
     }
115329f1
 
a700a6ae
     return 0;
  fail_decode:
     return -1;
 }
 
6d1ba1ac
 static void print_sdp(AVFormatContext **avc, int n)
 {
     char sdp[2048];
 
     avf_sdp_create(avc, n, sdp, sizeof(sdp));
     printf("SDP:\n%s\n", sdp);
536cd1db
     fflush(stdout);
6d1ba1ac
 }
a700a6ae
 
50e143c4
 static int stream_index_from_inputs(AVFormatContext **input_files,
                                     int nb_input_files,
                                     AVInputFile *file_table,
                                     AVInputStream **ist_table,
                                     enum CodecType type,
                                     int programid)
 {
c1a4cdf9
     int p, q, z;
50e143c4
     for(z=0; z<nb_input_files; z++) {
         AVFormatContext *ic = input_files[z];
         for(p=0; p<ic->nb_programs; p++) {
             AVProgram *program = ic->programs[p];
             if(program->id != programid)
                 continue;
             for(q=0; q<program->nb_stream_indexes; q++) {
                 int sidx = program->stream_index[q];
                 int ris = file_table[z].ist_index + sidx;
                 if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
                     return ris;
             }
         }
     }
 
     return -1;
 }
 
85f07f22
 /*
  * The following code is the main loop of the file converter
  */
 static int av_encode(AVFormatContext **output_files,
                      int nb_output_files,
                      AVFormatContext **input_files,
                      int nb_input_files,
                      AVStreamMap *stream_maps, int nb_stream_maps)
 {
445f1b83
     int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
85f07f22
     AVFormatContext *is, *os;
     AVCodecContext *codec, *icodec;
     AVOutputStream *ost, **ost_table = NULL;
     AVInputStream *ist, **ist_table = NULL;
bdc4796f
     AVInputFile *file_table;
cb09b2ed
     int key;
6d1ba1ac
     int want_sdp = 1;
bdc4796f
 
90901860
     file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
bdc4796f
     if (!file_table)
         goto fail;
115329f1
 
85f07f22
     /* input stream init */
     j = 0;
     for(i=0;i<nb_input_files;i++) {
         is = input_files[i];
         file_table[i].ist_index = j;
79fdaa4c
         file_table[i].nb_streams = is->nb_streams;
85f07f22
         j += is->nb_streams;
     }
     nb_istreams = j;
 
     ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
     if (!ist_table)
bdc4796f
         goto fail;
115329f1
 
85f07f22
     for(i=0;i<nb_istreams;i++) {
         ist = av_mallocz(sizeof(AVInputStream));
         if (!ist)
             goto fail;
         ist_table[i] = ist;
     }
     j = 0;
     for(i=0;i<nb_input_files;i++) {
         is = input_files[i];
         for(k=0;k<is->nb_streams;k++) {
             ist = ist_table[j++];
             ist->st = is->streams[k];
             ist->file_index = i;
             ist->index = k;
             ist->discard = 1; /* the stream is discarded by default
                                  (changed later) */
bdfcbbed
 
3a25ca18
             if (rate_emu) {
bdfcbbed
                 ist->start = av_gettime();
             }
85f07f22
         }
     }
 
     /* output stream init */
     nb_ostreams = 0;
     for(i=0;i<nb_output_files;i++) {
         os = output_files[i];
8a7bde1c
         if (!os->nb_streams) {
fc5d0db5
             dump_format(output_files[i], i, output_files[i]->filename, 1);
             fprintf(stderr, "Output file #%d does not contain any stream\n", i);
296df4e7
             av_exit(1);
8a7bde1c
         }
85f07f22
         nb_ostreams += os->nb_streams;
     }
     if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
         fprintf(stderr, "Number of stream maps must match number of output streams\n");
296df4e7
         av_exit(1);
85f07f22
     }
 
bd073980
     /* Sanity check the mapping args -- do the input files & streams exist? */
     for(i=0;i<nb_stream_maps;i++) {
         int fi = stream_maps[i].file_index;
         int si = stream_maps[i].stream_index;
115329f1
 
bd073980
         if (fi < 0 || fi > nb_input_files - 1 ||
             si < 0 || si > file_table[fi].nb_streams - 1) {
             fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
296df4e7
             av_exit(1);
bd073980
         }
b4a3389e
         fi = stream_maps[i].sync_file_index;
         si = stream_maps[i].sync_stream_index;
         if (fi < 0 || fi > nb_input_files - 1 ||
             si < 0 || si > file_table[fi].nb_streams - 1) {
             fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
296df4e7
             av_exit(1);
b4a3389e
         }
bd073980
     }
115329f1
 
85f07f22
     ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
     if (!ost_table)
         goto fail;
     for(i=0;i<nb_ostreams;i++) {
         ost = av_mallocz(sizeof(AVOutputStream));
         if (!ost)
             goto fail;
         ost_table[i] = ost;
     }
115329f1
 
85f07f22
     n = 0;
     for(k=0;k<nb_output_files;k++) {
         os = output_files[k];
de427ff4
         for(i=0;i<os->nb_streams;i++,n++) {
85f07f22
             int found;
de427ff4
             ost = ost_table[n];
85f07f22
             ost->file_index = k;
             ost->index = i;
             ost->st = os->streams[i];
             if (nb_stream_maps > 0) {
de427ff4
                 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
                     stream_maps[n].stream_index;
115329f1
 
bd073980
                 /* Sanity check that the stream types match */
01f4895c
                 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
150d5a25
                     int i= ost->file_index;
                     dump_format(output_files[i], i, output_files[i]->filename, 1);
bd073980
                     fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
de427ff4
                         stream_maps[n].file_index, stream_maps[n].stream_index,
bd073980
                         ost->file_index, ost->index);
296df4e7
                     av_exit(1);
bd073980
                 }
115329f1
 
85f07f22
             } else {
50e143c4
                 if(opt_programid) {
                     found = 0;
                     j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
                     if(j != -1) {
                         ost->source_index = j;
                         found = 1;
                     }
                 } else {
a15bc651
                     /* get corresponding input stream index : we select the first one with the right type */
                     found = 0;
85f07f22
                     for(j=0;j<nb_istreams;j++) {
                         ist = ist_table[j];
a15bc651
                         if (ist->discard &&
                             ist->st->codec->codec_type == ost->st->codec->codec_type) {
85f07f22
                             ost->source_index = j;
                             found = 1;
a15bc651
                             break;
85f07f22
                         }
                     }
a15bc651
                 }
 
                 if (!found) {
                     if(! opt_programid) {
                         /* try again and reuse existing stream */
                         for(j=0;j<nb_istreams;j++) {
                             ist = ist_table[j];
                             if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
                                 ost->source_index = j;
                                 found = 1;
                             }
                         }
50e143c4
                     }
85f07f22
                     if (!found) {
462cca10
                         int i= ost->file_index;
                         dump_format(output_files[i], i, output_files[i]->filename, 1);
85f07f22
                         fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
                                 ost->file_index, ost->index);
296df4e7
                         av_exit(1);
85f07f22
                     }
                 }
             }
             ist = ist_table[ost->source_index];
             ist->discard = 0;
b4a3389e
             ost->sync_ist = (nb_stream_maps > 0) ?
de427ff4
                 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
                          stream_maps[n].sync_stream_index] : ist;
85f07f22
         }
     }
 
     /* for each output stream, we compute the right encoding parameters */
     for(i=0;i<nb_ostreams;i++) {
0a789246
         AVMetadataTag *lang;
85f07f22
         ost = ost_table[i];
365515ac
         os = output_files[ost->file_index];
85f07f22
         ist = ist_table[ost->source_index];
 
01f4895c
         codec = ost->st->codec;
         icodec = ist->st->codec;
85f07f22
 
0a789246
         if ((lang=av_metadata_get(ist->st->metadata, "language", NULL, 0))
             &&   !av_metadata_get(ost->st->metadata, "language", NULL, 0))
             av_metadata_set(&ost->st->metadata, "language", lang->value);
8e0d882b
 
90c2295b
         ost->st->disposition = ist->st->disposition;
 
1629626f
         if (ost->st->stream_copy) {
             /* if stream_copy is selected, no need to decode or encode */
             codec->codec_id = icodec->codec_id;
             codec->codec_type = icodec->codec_type;
365515ac
 
             if(!codec->codec_tag){
                 if(   !os->oformat->codec_tag
                    || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
                    || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
                     codec->codec_tag = icodec->codec_tag;
             }
 
1629626f
             codec->bit_rate = icodec->bit_rate;
dffbfd06
             codec->extradata= icodec->extradata;
             codec->extradata_size= icodec->extradata_size;
3797c74b
             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){
d29de719
                 codec->time_base = icodec->time_base;
3797c74b
                 codec->time_base.num *= icodec->ticks_per_frame;
             }else
d29de719
                 codec->time_base = ist->st->time_base;
1629626f
             switch(codec->codec_type) {
             case CODEC_TYPE_AUDIO:
d08e3e91
                 if(audio_volume != 256) {
                     fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
                     av_exit(1);
                 }
13367a46
                 codec->channel_layout = icodec->channel_layout;
1629626f
                 codec->sample_rate = icodec->sample_rate;
                 codec->channels = icodec->channels;
0a3b0447
                 codec->frame_size = icodec->frame_size;
c1344911
                 codec->block_align= icodec->block_align;
4efd6f58
                 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
                     codec->block_align= 0;
bcbd328e
                 if(codec->codec_id == CODEC_ID_AC3)
                     codec->block_align= 0;
1629626f
                 break;
             case CODEC_TYPE_VIDEO:
8d74e55b
                 if(using_vhook) {
                     fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
296df4e7
                     av_exit(1);
8d74e55b
                 }
9df3437f
                 codec->pix_fmt = icodec->pix_fmt;
1629626f
                 codec->width = icodec->width;
                 codec->height = icodec->height;
ff8cc24b
                 codec->has_b_frames = icodec->has_b_frames;
1629626f
                 break;
cf7fc795
             case CODEC_TYPE_SUBTITLE:
d43b26ea
                 codec->width = icodec->width;
                 codec->height = icodec->height;
cf7fc795
                 break;
1629626f
             default:
0f4e8165
                 abort();
1629626f
             }
         } else {
             switch(codec->codec_type) {
             case CODEC_TYPE_AUDIO:
10e7fc7c
                 if (av_fifo_init(&ost->fifo, 1024))
85f07f22
                     goto fail;
a79db0f7
                 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
2886f311
                 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
                 icodec->request_channels = codec->channels;
85f07f22
                 ist->decoding_needed = 1;
                 ost->encoding_needed = 1;
1629626f
                 break;
             case CODEC_TYPE_VIDEO:
c3f11d19
                 ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
                 ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
                 ost->video_resample = ((codec->width != icodec->width -
                                 (frame_leftBand + frame_rightBand) +
                                 (frame_padleft + frame_padright)) ||
                         (codec->height != icodec->height -
                                 (frame_topBand  + frame_bottomBand) +
18a54b04
                                 (frame_padtop + frame_padbottom)) ||
                         (codec->pix_fmt != icodec->pix_fmt));
c3f11d19
                 if (ost->video_crop) {
34b10a57
                     ost->topBand = frame_topBand;
                     ost->leftBand = frame_leftBand;
c3f11d19
                 }
                 if (ost->video_pad) {
1ff93ffc
                     ost->padtop = frame_padtop;
                     ost->padleft = frame_padleft;
                     ost->padbottom = frame_padbottom;
                     ost->padright = frame_padright;
c3f11d19
                     if (!ost->video_resample) {
                         avcodec_get_frame_defaults(&ost->pict_tmp);
9d58e0a9
                         if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
                                          codec->width, codec->height))
c3f11d19
                             goto fail;
                     }
                 }
                 if (ost->video_resample) {
2de28abb
                     avcodec_get_frame_defaults(&ost->pict_tmp);
9d58e0a9
                     if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
                                          codec->width, codec->height)) {
eddc482d
                         fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
296df4e7
                         av_exit(1);
eddc482d
                     }
9de8e6ac
                     sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
18a54b04
                     ost->img_resample_ctx = sws_getContext(
                             icodec->width - (frame_leftBand + frame_rightBand),
                             icodec->height - (frame_topBand + frame_bottomBand),
                             icodec->pix_fmt,
07d0cdfc
                             codec->width - (frame_padleft + frame_padright),
                             codec->height - (frame_padtop + frame_padbottom),
18a54b04
                             codec->pix_fmt,
                             sws_flags, NULL, NULL, NULL);
0b50ac8a
                     if (ost->img_resample_ctx == NULL) {
                         fprintf(stderr, "Cannot get resampling context\n");
296df4e7
                         av_exit(1);
0b50ac8a
                     }
18a54b04
                     ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
85f07f22
                 }
                 ost->encoding_needed = 1;
                 ist->decoding_needed = 1;
1629626f
                 break;
cf7fc795
             case CODEC_TYPE_SUBTITLE:
                 ost->encoding_needed = 1;
                 ist->decoding_needed = 1;
                 break;
1629626f
             default:
0f4e8165
                 abort();
cf7fc795
                 break;
85f07f22
             }
1629626f
             /* two pass mode */
115329f1
             if (ost->encoding_needed &&
1629626f
                 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
                 char logfilename[1024];
                 FILE *f;
                 int size;
                 char *logbuffer;
115329f1
 
                 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
22730e87
                          pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
                          i);
1629626f
                 if (codec->flags & CODEC_FLAG_PASS1) {
                     f = fopen(logfilename, "w");
                     if (!f) {
42d1d06e
                         fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
296df4e7
                         av_exit(1);
1629626f
                     }
                     ost->logfile = f;
                 } else {
                     /* read the log file */
                     f = fopen(logfilename, "r");
                     if (!f) {
42d1d06e
                         fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
296df4e7
                         av_exit(1);
1629626f
                     }
                     fseek(f, 0, SEEK_END);
                     size = ftell(f);
                     fseek(f, 0, SEEK_SET);
                     logbuffer = av_malloc(size + 1);
                     if (!logbuffer) {
                         fprintf(stderr, "Could not allocate log buffer\n");
296df4e7
                         av_exit(1);
1629626f
                     }
4776fa92
                     size = fread(logbuffer, 1, size, f);
1629626f
                     fclose(f);
                     logbuffer[size] = '\0';
                     codec->stats_in = logbuffer;
5abdb4b1
                 }
             }
         }
8a6cb114
         if(codec->codec_type == CODEC_TYPE_VIDEO){
             int size= codec->width * codec->height;
c027e91a
             bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
8a6cb114
         }
85f07f22
     }
 
8a6cb114
     if (!bit_buffer)
         bit_buffer = av_malloc(bit_buffer_size);
     if (!bit_buffer)
         goto fail;
 
1629626f
     /* dump the file output parameters - cannot be done before in case
        of stream copy */
     for(i=0;i<nb_output_files;i++) {
         dump_format(output_files[i], i, output_files[i]->filename, 1);
     }
 
     /* dump the stream mapping */
d8019eb5
     if (verbose >= 0) {
         fprintf(stderr, "Stream mapping:\n");
         for(i=0;i<nb_ostreams;i++) {
             ost = ost_table[i];
b4a3389e
             fprintf(stderr, "  Stream #%d.%d -> #%d.%d",
d8019eb5
                     ist_table[ost->source_index]->file_index,
                     ist_table[ost->source_index]->index,
115329f1
                     ost->file_index,
d8019eb5
                     ost->index);
b4a3389e
             if (ost->sync_ist != ist_table[ost->source_index])
                 fprintf(stderr, " [sync #%d.%d]",
                         ost->sync_ist->file_index,
                         ost->sync_ist->index);
             fprintf(stderr, "\n");
d8019eb5
         }
1629626f
     }
 
85f07f22
     /* open each encoder */
     for(i=0;i<nb_ostreams;i++) {
         ost = ost_table[i];
         if (ost->encoding_needed) {
6488cf9b
             AVCodec *codec = output_codecs[i];
             if (!codec)
fd2b356a
                 codec = avcodec_find_encoder(ost->st->codec->codec_id);
85f07f22
             if (!codec) {
115329f1
                 fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
85f07f22
                         ost->file_index, ost->index);
296df4e7
                 av_exit(1);
85f07f22
             }
01f4895c
             if (avcodec_open(ost->st->codec, codec) < 0) {
115329f1
                 fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
85f07f22
                         ost->file_index, ost->index);
296df4e7
                 av_exit(1);
85f07f22
             }
01f4895c
             extra_size += ost->st->codec->extradata_size;
85f07f22
         }
     }
 
     /* open each decoder */
     for(i=0;i<nb_istreams;i++) {
         ist = ist_table[i];
         if (ist->decoding_needed) {
6488cf9b
             AVCodec *codec = input_codecs[i];
             if (!codec)
fd2b356a
                 codec = avcodec_find_decoder(ist->st->codec->codec_id);
85f07f22
             if (!codec) {
115329f1
                 fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
01f4895c
                         ist->st->codec->codec_id, ist->file_index, ist->index);
296df4e7
                 av_exit(1);
85f07f22
             }
01f4895c
             if (avcodec_open(ist->st->codec, codec) < 0) {
115329f1
                 fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
85f07f22
                         ist->file_index, ist->index);
296df4e7
                 av_exit(1);
85f07f22
             }
01f4895c
             //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
             //    ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
85f07f22
         }
     }
 
     /* init pts */
     for(i=0;i<nb_istreams;i++) {
         ist = ist_table[i];
bb270c08
         is = input_files[ist->file_index];
e7d0374f
         ist->pts = 0;
48291040
         ist->next_pts = AV_NOPTS_VALUE;
ff4905a5
         ist->is_start = 1;
85f07f22
     }
bd1b79a1
 
0a38bafd
     /* set meta data information from input file if required */
     for (i=0;i<nb_meta_data_maps;i++) {
         AVFormatContext *out_file;
         AVFormatContext *in_file;
a5926d85
         AVMetadataTag *mtag;
0a38bafd
 
         int out_file_index = meta_data_maps[i].out_file;
         int in_file_index = meta_data_maps[i].in_file;
9d58e0a9
         if (out_file_index < 0 || out_file_index >= nb_output_files) {
0a38bafd
             fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
8fa36ae0
             ret = AVERROR(EINVAL);
0a38bafd
             goto fail;
         }
9d58e0a9
         if (in_file_index < 0 || in_file_index >= nb_input_files) {
0a38bafd
             fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
8fa36ae0
             ret = AVERROR(EINVAL);
0a38bafd
             goto fail;
115329f1
         }
 
0a38bafd
         out_file = output_files[out_file_index];
         in_file = input_files[in_file_index];
 
a5926d85
 
         mtag=NULL;
         while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
             av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
         av_metadata_conv(out_file, out_file->oformat->metadata_conv,
                                     in_file->iformat->metadata_conv);
0a38bafd
     }
115329f1
 
85f07f22
     /* open files and write file headers */
     for(i=0;i<nb_output_files;i++) {
         os = output_files[i];
79fdaa4c
         if (av_write_header(os) < 0) {
65bf3c53
             fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
8fa36ae0
             ret = AVERROR(EINVAL);
a38469e1
             goto fail;
         }
6d1ba1ac
         if (strcmp(output_files[i]->oformat->name, "rtp")) {
             want_sdp = 0;
         }
     }
     if (want_sdp) {
         print_sdp(output_files, nb_output_files);
85f07f22
     }
 
9d58e0a9
     if (!using_stdin && verbose >= 0) {
d9a916e2
         fprintf(stderr, "Press [q] to stop encoding\n");
b51469a0
         url_set_interrupt_cb(decode_interrupt_cb);
     }
a38469e1
     term_init();
 
cb09b2ed
     key = -1;
7fc98937
     timer_start = av_gettime();
51bd4565
 
d9a916e2
     for(; received_sigterm == 0;) {
85f07f22
         int file_index, ist_index;
         AVPacket pkt;
a9aeda81
         double ipts_min;
         double opts_min;
23ffe323
 
85f07f22
     redo:
a9aeda81
         ipts_min= 1e100;
         opts_min= 1e100;
a38469e1
         /* if 'q' pressed, exits */
d9a916e2
         if (!using_stdin) {
b51469a0
             if (q_pressed)
                 break;
cb09b2ed
             /* read_key() returns 0 on EOF */
             key = read_key();
             if (key == 'q')
                 break;
         }
a38469e1
 
ec5517d5
         /* select the stream that we must read now by looking at the
            smallest output pts */
85f07f22
         file_index = -1;
ec5517d5
         for(i=0;i<nb_ostreams;i++) {
23ffe323
             double ipts, opts;
ec5517d5
             ost = ost_table[i];
             os = output_files[ost->file_index];
             ist = ist_table[ost->source_index];
01f4895c
             if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
                 opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
23ffe323
             else
c0df9d75
                 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
23ffe323
             ipts = (double)ist->pts;
             if (!file_table[ist->file_index].eof_reached){
                 if(ipts < ipts_min) {
                     ipts_min = ipts;
                     if(input_sync ) file_index = ist->file_index;
                 }
                 if(opts < opts_min) {
                     opts_min = opts;
                     if(!input_sync) file_index = ist->file_index;
                 }
85f07f22
             }
01f4895c
             if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
7ca60994
                 file_index= -1;
                 break;
             }
85f07f22
         }
         /* if none, if is finished */
51bd4565
         if (file_index < 0) {
85f07f22
             break;
ec5517d5
         }
 
85f07f22
         /* finish if recording time exhausted */
fc7ad2af
         if (opts_min >= (recording_time / 1000000.0))
85f07f22
             break;
ec5517d5
 
b6e16b86
         /* finish if limit size exhausted */
899681cd
         if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
b6e16b86
             break;
 
254abc2e
         /* read a frame from it and output it in the fifo */
85f07f22
         is = input_files[file_index];
07679e68
         if (av_read_frame(is, &pkt) < 0) {
85f07f22
             file_table[file_index].eof_reached = 1;
d24ce947
             if (opt_shortest)
                 break;
             else
                 continue;
85f07f22
         }
303e50e6
 
254abc2e
         if (do_pkt_dump) {
750f0e1f
             av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
817b23ff
         }
79fdaa4c
         /* the following test is needed in case new streams appear
            dynamically in stream : we ignore them */
         if (pkt.stream_index >= file_table[file_index].nb_streams)
bf5af568
             goto discard_packet;
85f07f22
         ist_index = file_table[file_index].ist_index + pkt.stream_index;
         ist = ist_table[ist_index];
bf5af568
         if (ist->discard)
             goto discard_packet;
85f07f22
 
fec401f7
         if (pkt.dts != AV_NOPTS_VALUE)
             pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
         if (pkt.pts != AV_NOPTS_VALUE)
             pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
 
8833f375
         if(input_files_ts_scale[file_index][pkt.stream_index]){
             if(pkt.pts != AV_NOPTS_VALUE)
                 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
             if(pkt.dts != AV_NOPTS_VALUE)
                 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
         }
 
949b1a13
 //        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);
965530e1
         if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
             && (is->iformat->flags & AVFMT_TS_DISCONT)) {
81d6d520
             int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
             int64_t delta= pkt_dts - ist->next_pts;
             if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
72bd8100
                 input_files_ts_offset[ist->file_index]-= delta;
                 if (verbose > 2)
4733abcb
                     fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
fec401f7
                 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
                 if(pkt.pts != AV_NOPTS_VALUE)
                     pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
72bd8100
             }
         }
 
8831db5c
         //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
a700a6ae
         if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
d8019eb5
 
             if (verbose >= 0)
                 fprintf(stderr, "Error while decoding stream #%d.%d\n",
                         ist->file_index, ist->index);
f2abc559
             if (exit_on_error)
                 av_exit(1);
a700a6ae
             av_free_packet(&pkt);
             goto redo;
fe08925f
         }
cf7fc795
 
bf5af568
     discard_packet:
85f07f22
         av_free_packet(&pkt);
115329f1
 
ec5517d5
         /* dump report by using the output first video and audio streams */
         print_report(output_files, ost_table, nb_ostreams, 0);
85f07f22
     }
a700a6ae
 
     /* at the end of stream, we must flush the decoder buffers */
     for(i=0;i<nb_istreams;i++) {
         ist = ist_table[i];
         if (ist->decoding_needed) {
             output_packet(ist, i, ost_table, nb_ostreams, NULL);
         }
     }
 
a38469e1
     term_exit();
85f07f22
 
c4e37247
     /* write the trailer if needed and close file */
     for(i=0;i<nb_output_files;i++) {
         os = output_files[i];
         av_write_trailer(os);
     }
 
37f5cd5a
     /* dump report by using the first video and audio streams */
     print_report(output_files, ost_table, nb_ostreams, 1);
 
85f07f22
     /* close each encoder */
     for(i=0;i<nb_ostreams;i++) {
         ost = ost_table[i];
         if (ost->encoding_needed) {
01f4895c
             av_freep(&ost->st->codec->stats_in);
             avcodec_close(ost->st->codec);
85f07f22
         }
     }
115329f1
 
85f07f22
     /* close each decoder */
     for(i=0;i<nb_istreams;i++) {
         ist = ist_table[i];
         if (ist->decoding_needed) {
01f4895c
             avcodec_close(ist->st->codec);
85f07f22
         }
     }
 
     /* finished ! */
115329f1
 
85f07f22
     ret = 0;
  fail1:
83b07470
     av_freep(&bit_buffer);
0f1578af
     av_free(file_table);
bdc4796f
 
85f07f22
     if (ist_table) {
         for(i=0;i<nb_istreams;i++) {
             ist = ist_table[i];
0f1578af
             av_free(ist);
85f07f22
         }
0f1578af
         av_free(ist_table);
85f07f22
     }
     if (ost_table) {
         for(i=0;i<nb_ostreams;i++) {
             ost = ost_table[i];
             if (ost) {
5abdb4b1
                 if (ost->logfile) {
                     fclose(ost->logfile);
                     ost->logfile = NULL;
                 }
f5a478f6
                 av_fifo_free(&ost->fifo); /* works even if fifo is not
                                              initialized but set to zero */
0f1578af
                 av_free(ost->pict_tmp.data[0]);
85f07f22
                 if (ost->video_resample)
18a54b04
                     sws_freeContext(ost->img_resample_ctx);
8e4270c5
                 if (ost->resample)
85f07f22
                     audio_resample_close(ost->resample);
a79db0f7
                 if (ost->reformat_ctx)
                     av_audio_convert_free(ost->reformat_ctx);
0f1578af
                 av_free(ost);
85f07f22
             }
         }
0f1578af
         av_free(ost_table);
85f07f22
     }
     return ret;
  fail:
8fa36ae0
     ret = AVERROR(ENOMEM);
85f07f22
     goto fail1;
 }
 
 #if 0
 int file_read(const char *filename)
 {
     URLContext *h;
     unsigned char buffer[1024];
     int len, i;
 
     if (url_open(&h, filename, O_RDONLY) < 0) {
         printf("could not open '%s'\n", filename);
         return -1;
     }
     for(;;) {
         len = url_read(h, buffer, sizeof(buffer));
         if (len <= 0)
             break;
         for(i=0;i<len;i++) putchar(buffer[i]);
     }
     url_close(h);
     return 0;
 }
 #endif
 
b29f97d1
 static void opt_format(const char *arg)
85f07f22
 {
817b23ff
     /* compatibility stuff for pgmyuv */
     if (!strcmp(arg, "pgmyuv")) {
5b6d5596
         pgmyuv_compatibility_hack=1;
9286699a
 //        opt_image_format(arg);
5b6d5596
         arg = "image2";
17ceb4f9
         fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
817b23ff
     }
 
79fdaa4c
     file_iformat = av_find_input_format(arg);
     file_oformat = guess_format(arg, NULL, NULL);
     if (!file_iformat && !file_oformat) {
         fprintf(stderr, "Unknown input or output format: %s\n", arg);
296df4e7
         av_exit(1);
85f07f22
     }
 }
 
464a631c
 static void opt_video_rc_override_string(const char *arg)
ac2830ec
 {
     video_rc_override_string = arg;
 }
 
c48da33c
 static int opt_me_threshold(const char *opt, const char *arg)
f4f3223f
 {
c48da33c
     me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
     return 0;
f4f3223f
 }
 
c48da33c
 static int opt_verbose(const char *opt, const char *arg)
f068206e
 {
46eab093
     verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
b3574faa
     av_log_set_level(verbose);
c48da33c
     return 0;
f068206e
 }
 
2fc3866d
 static int opt_frame_rate(const char *opt, const char *arg)
85f07f22
 {
b33ece16
     if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2fc3866d
         fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
296df4e7
         av_exit(1);
445f1b83
     }
2fc3866d
     return 0;
85f07f22
 }
 
ebde2a2c
 static int opt_bitrate(const char *opt, const char *arg)
1b1656c6
 {
     int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;
 
     opt_default(opt, arg);
 
     if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
         fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
ebde2a2c
 
     return 0;
1b1656c6
 }
 
b29f97d1
 static void opt_frame_crop_top(const char *arg)
ab6d194a
 {
115329f1
     frame_topBand = atoi(arg);
ab6d194a
     if (frame_topBand < 0) {
         fprintf(stderr, "Incorrect top crop size\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_topBand % 2) != 0) {
         fprintf(stderr, "Top crop size must be a multiple of 2\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_topBand) >= frame_height){
bb270c08
         fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     frame_height -= frame_topBand;
 }
 
b29f97d1
 static void opt_frame_crop_bottom(const char *arg)
ab6d194a
 {
     frame_bottomBand = atoi(arg);
     if (frame_bottomBand < 0) {
         fprintf(stderr, "Incorrect bottom crop size\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_bottomBand % 2) != 0) {
         fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_bottomBand) >= frame_height){
bb270c08
         fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     frame_height -= frame_bottomBand;
 }
 
b29f97d1
 static void opt_frame_crop_left(const char *arg)
ab6d194a
 {
     frame_leftBand = atoi(arg);
     if (frame_leftBand < 0) {
         fprintf(stderr, "Incorrect left crop size\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_leftBand % 2) != 0) {
         fprintf(stderr, "Left crop size must be a multiple of 2\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_leftBand) >= frame_width){
bb270c08
         fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     frame_width -= frame_leftBand;
 }
 
b29f97d1
 static void opt_frame_crop_right(const char *arg)
ab6d194a
 {
     frame_rightBand = atoi(arg);
     if (frame_rightBand < 0) {
         fprintf(stderr, "Incorrect right crop size\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_rightBand % 2) != 0) {
         fprintf(stderr, "Right crop size must be a multiple of 2\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     if ((frame_rightBand) >= frame_width){
bb270c08
         fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
296df4e7
         av_exit(1);
ab6d194a
     }
     frame_width -= frame_rightBand;
 }
 
b29f97d1
 static void opt_frame_size(const char *arg)
85f07f22
 {
b33ece16
     if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
85f07f22
         fprintf(stderr, "Incorrect frame size\n");
296df4e7
         av_exit(1);
85f07f22
     }
     if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
         fprintf(stderr, "Frame size must be a multiple of 2\n");
296df4e7
         av_exit(1);
85f07f22
     }
 }
 
1ff93ffc
 
 #define SCALEBITS 10
 #define ONE_HALF  (1 << (SCALEBITS - 1))
bb270c08
 #define FIX(x)    ((int) ((x) * (1<<SCALEBITS) + 0.5))
1ff93ffc
 
 #define RGB_TO_Y(r, g, b) \
 ((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
   FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)
 
 #define RGB_TO_U(r1, g1, b1, shift)\
 (((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +         \
      FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
 
 #define RGB_TO_V(r1, g1, b1, shift)\
 (((FIX(0.50000) * r1 - FIX(0.41869) * g1 -           \
    FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
 
 static void opt_pad_color(const char *arg) {
     /* Input is expected to be six hex digits similar to
        how colors are expressed in html tags (but without the #) */
     int rgb = strtol(arg, NULL, 16);
     int r,g,b;
115329f1
 
     r = (rgb >> 16);
1ff93ffc
     g = ((rgb >> 8) & 255);
     b = (rgb & 255);
 
     padcolor[0] = RGB_TO_Y(r,g,b);
     padcolor[1] = RGB_TO_U(r,g,b,0);
     padcolor[2] = RGB_TO_V(r,g,b,0);
 }
 
 static void opt_frame_pad_top(const char *arg)
 {
115329f1
     frame_padtop = atoi(arg);
1ff93ffc
     if (frame_padtop < 0) {
         fprintf(stderr, "Incorrect top pad size\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
     if ((frame_padtop % 2) != 0) {
         fprintf(stderr, "Top pad size must be a multiple of 2\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
 }
 
 static void opt_frame_pad_bottom(const char *arg)
 {
115329f1
     frame_padbottom = atoi(arg);
1ff93ffc
     if (frame_padbottom < 0) {
         fprintf(stderr, "Incorrect bottom pad size\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
     if ((frame_padbottom % 2) != 0) {
         fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
 }
 
 
 static void opt_frame_pad_left(const char *arg)
 {
115329f1
     frame_padleft = atoi(arg);
1ff93ffc
     if (frame_padleft < 0) {
         fprintf(stderr, "Incorrect left pad size\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
     if ((frame_padleft % 2) != 0) {
         fprintf(stderr, "Left pad size must be a multiple of 2\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
 }
 
 
 static void opt_frame_pad_right(const char *arg)
 {
115329f1
     frame_padright = atoi(arg);
1ff93ffc
     if (frame_padright < 0) {
         fprintf(stderr, "Incorrect right pad size\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
     if ((frame_padright % 2) != 0) {
         fprintf(stderr, "Right pad size must be a multiple of 2\n");
296df4e7
         av_exit(1);
1ff93ffc
     }
 }
 
ce1ee094
 static void list_fmts(void (*get_fmt_string)(char *buf, int buf_size, int fmt), int nb_fmts)
c3b95b1d
 {
     int i;
ce1ee094
     char fmt_str[128];
     for (i=-1; i < nb_fmts; i++) {
         get_fmt_string (fmt_str, sizeof(fmt_str), i);
         fprintf(stdout, "%s\n", fmt_str);
c3b95b1d
     }
 }
1ff93ffc
 
63167088
 static void opt_frame_pix_fmt(const char *arg)
 {
c3b95b1d
     if (strcmp(arg, "list"))
         frame_pix_fmt = avcodec_get_pix_fmt(arg);
     else {
ce1ee094
         list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
296df4e7
         av_exit(0);
c3b95b1d
     }
63167088
 }
 
5fe03e38
 static void opt_frame_aspect_ratio(const char *arg)
 {
     int x = 0, y = 0;
     double ar = 0;
     const char *p;
815f98cc
     char *end;
115329f1
 
5fe03e38
     p = strchr(arg, ':');
     if (p) {
815f98cc
         x = strtol(arg, &end, 10);
         if (end == p)
             y = strtol(end+1, &end, 10);
bb270c08
         if (x > 0 && y > 0)
             ar = (double)x / (double)y;
5fe03e38
     } else
815f98cc
         ar = strtod(arg, NULL);
5fe03e38
 
     if (!ar) {
         fprintf(stderr, "Incorrect aspect ratio specification.\n");
296df4e7
         av_exit(1);
5fe03e38
     }
     frame_aspect_ratio = ar;
 }
 
a5926d85
 static int opt_metadata(const char *opt, const char *arg)
 {
     char *mid= strchr(arg, '=');
 
     if(!mid){
         fprintf(stderr, "Missing =\n");
         av_exit(1);
     }
     *mid++= 0;
 
     metadata_count++;
     metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
     metadata[metadata_count-1].key  = av_strdup(arg);
     metadata[metadata_count-1].value= av_strdup(mid);
 
     return 0;
 }
 
b29f97d1
 static void opt_qscale(const char *arg)
85f07f22
 {
158c7f05
     video_qscale = atof(arg);
4e64bead
     if (video_qscale <= 0 ||
158c7f05
         video_qscale > 255) {
4e64bead
         fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
296df4e7
         av_exit(1);
85f07f22
     }
 }
 
bb198e19
 static void opt_top_field_first(const char *arg)
 {
     top_field_first= atoi(arg);
 }
 
d18811bb
 static int opt_thread_count(const char *opt, const char *arg)
9c3d33d6
 {
d18811bb
     thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
b250f9c6
 #if !HAVE_THREADS
d8019eb5
     if (verbose >= 0)
         fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
842b556a
 #endif
d18811bb
     return 0;
9c3d33d6
 }
 
ce1ee094
 static void opt_audio_sample_fmt(const char *arg)
 {
     if (strcmp(arg, "list"))
         audio_sample_fmt = avcodec_get_sample_fmt(arg);
     else {
         list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
         av_exit(0);
     }
 }
 
c48da33c
 static int opt_audio_rate(const char *opt, const char *arg)
85f07f22
 {
c48da33c
     audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
     return 0;
85f07f22
 }
 
c48da33c
 static int opt_audio_channels(const char *opt, const char *arg)
85f07f22
 {
c48da33c
     audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
     return 0;
85f07f22
 }
 
b29f97d1
 static void opt_video_channel(const char *arg)
a5df11ab
 {
     video_channel = strtol(arg, NULL, 0);
 }
 
e3ee3283
 static void opt_video_standard(const char *arg)
 {
     video_standard = av_strdup(arg);
 }
 
4a897224
 static void opt_codec(int *pstream_copy, char **pcodec_name,
cf7fc795
                       int codec_type, const char *arg)
85f07f22
 {
4a897224
     av_freep(pcodec_name);
1629626f
     if (!strcmp(arg, "copy")) {
cf7fc795
         *pstream_copy = 1;
85f07f22
     } else {
4a897224
         *pcodec_name = av_strdup(arg);
85f07f22
     }
 }
 
cf7fc795
 static void opt_audio_codec(const char *arg)
 {
4a897224
     opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
cf7fc795
 }
 
b2a2197e
 static void opt_audio_tag(const char *arg)
 {
     char *tail;
     audio_codec_tag= strtol(arg, &tail, 0);
 
     if(!tail || *tail)
         audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
 }
 
 static void opt_video_tag(const char *arg)
 {
     char *tail;
     video_codec_tag= strtol(arg, &tail, 0);
 
     if(!tail || *tail)
         video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
 }
 
b250f9c6
 #if CONFIG_VHOOK
b29f97d1
 static void add_frame_hooker(const char *arg)
10d104e4
 {
     int argc = 0;
     char *argv[64];
     int i;
e9a9e0c2
     char *args = av_strdup(arg);
10d104e4
 
bee0d9e5
     using_vhook = 1;
 
10d104e4
     argv[0] = strtok(args, " ");
     while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
     }
 
     i = frame_hook_add(argc, argv);
 
     if (i != 0) {
         fprintf(stderr, "Failed to add video hook function: %s\n", arg);
296df4e7
         av_exit(1);
10d104e4
     }
 }
d0f596b4
 #endif
10d104e4
 
b29f97d1
 static void opt_video_codec(const char *arg)
85f07f22
 {
4a897224
     opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
cf7fc795
 }
85f07f22
 
cf7fc795
 static void opt_subtitle_codec(const char *arg)
 {
4a897224
     opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
85f07f22
 }
 
b29f97d1
 static void opt_map(const char *arg)
85f07f22
 {
     AVStreamMap *m;
815f98cc
     char *p;
85f07f22
 
     m = &stream_maps[nb_stream_maps++];
 
815f98cc
     m->file_index = strtol(arg, &p, 0);
85f07f22
     if (*p)
         p++;
a5dc85ef
 
815f98cc
     m->stream_index = strtol(p, &p, 0);
b4a3389e
     if (*p) {
         p++;
815f98cc
         m->sync_file_index = strtol(p, &p, 0);
b4a3389e
         if (*p)
             p++;
815f98cc
         m->sync_stream_index = strtol(p, &p, 0);
b4a3389e
     } else {
         m->sync_file_index = m->file_index;
         m->sync_stream_index = m->stream_index;
     }
85f07f22
 }
 
0a38bafd
 static void opt_map_meta_data(const char *arg)
 {
     AVMetaDataMap *m;
815f98cc
     char *p;
115329f1
 
0a38bafd
     m = &meta_data_maps[nb_meta_data_maps++];
 
815f98cc
     m->out_file = strtol(arg, &p, 0);
0a38bafd
     if (*p)
         p++;
 
815f98cc
     m->in_file = strtol(p, &p, 0);
0a38bafd
 }
 
8833f375
 static void opt_input_ts_scale(const char *arg)
 {
     unsigned int stream;
     double scale;
     char *p;
 
     stream = strtol(arg, &p, 0);
     if (*p)
         p++;
     scale= strtod(p, &p);
 
     if(stream >= MAX_STREAMS)
         av_exit(1);
 
     input_files_ts_scale[nb_input_files][stream]= scale;
 }
 
b19221c8
 static int opt_recording_time(const char *opt, const char *arg)
85f07f22
 {
b19221c8
     recording_time = parse_time_or_die(opt, arg, 1);
     return 0;
85f07f22
 }
 
b19221c8
 static int opt_start_time(const char *opt, const char *arg)
8831db5c
 {
b19221c8
     start_time = parse_time_or_die(opt, arg, 1);
     return 0;
8831db5c
 }
 
b19221c8
 static int opt_rec_timestamp(const char *opt, const char *arg)
4568325a
 {
b19221c8
     rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
     return 0;
4568325a
 }
 
b19221c8
 static int opt_input_ts_offset(const char *opt, const char *arg)
a6a92a9a
 {
b19221c8
     input_ts_offset = parse_time_or_die(opt, arg, 1);
     return 0;
a6a92a9a
 }
 
4a897224
 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
 {
f73008d8
     const char *codec_string = encoder ? "encoder" : "decoder";
4a897224
     AVCodec *codec;
 
     if(!name)
         return CODEC_ID_NONE;
     codec = encoder ?
         avcodec_find_encoder_by_name(name) :
         avcodec_find_decoder_by_name(name);
     if(!codec) {
49a06a4d
         fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
296df4e7
         av_exit(1);
4a897224
     }
     if(codec->type != type) {
49a06a4d
         fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
296df4e7
         av_exit(1);
4a897224
     }
     return codec->id;
 }
 
b29f97d1
 static void opt_input_file(const char *filename)
85f07f22
 {
     AVFormatContext *ic;
     AVFormatParameters params, *ap = &params;
14bea432
     int err, i, ret, rfps, rfps_base;
bd1b79a1
     int64_t timestamp;
85f07f22
 
b242baa4
     if (!strcmp(filename, "-"))
         filename = "pipe:";
 
115329f1
     using_stdin |= !strncmp(filename, "pipe:", 5) ||
9d58e0a9
                     !strcmp(filename, "/dev/stdin");
d9a916e2
 
85f07f22
     /* get default parameters from command line */
8e2fd8e1
     ic = avformat_alloc_context();
4eb72c6b
 
79fdaa4c
     memset(ap, 0, sizeof(*ap));
4eb72c6b
     ap->prealloced_context = 1;
79fdaa4c
     ap->sample_rate = audio_sample_rate;
     ap->channels = audio_channels;
b33ece16
     ap->time_base.den = frame_rate.num;
     ap->time_base.num = frame_rate.den;
1ff93ffc
     ap->width = frame_width + frame_padleft + frame_padright;
     ap->height = frame_height + frame_padtop + frame_padbottom;
63167088
     ap->pix_fmt = frame_pix_fmt;
a79db0f7
    // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2639c651
     ap->channel = video_channel;
     ap->standard = video_standard;
4a897224
     ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
     ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
5b6d5596
     if(pgmyuv_compatibility_hack)
         ap->video_codec_id= CODEC_ID_PGMYUV;
79fdaa4c
 
3022cd10
     set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
62600469
 
     ic->video_codec_id   = find_codec_or_die(video_codec_name   , CODEC_TYPE_VIDEO   , 0);
     ic->audio_codec_id   = find_codec_or_die(audio_codec_name   , CODEC_TYPE_AUDIO   , 0);
     ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
 
79fdaa4c
     /* open the input file with generic libav function */
     err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
85f07f22
     if (err < 0) {
79fdaa4c
         print_error(filename, err);
296df4e7
         av_exit(1);
85f07f22
     }
50e143c4
     if(opt_programid) {
         int i;
         for(i=0; i<ic->nb_programs; i++)
             if(ic->programs[i]->id != opt_programid)
                 ic->programs[i]->discard = AVDISCARD_ALL;
     }
30bc6613
 
5894e1bb
     ic->loop_input = loop_input;
 
79fdaa4c
     /* If not enough info to get the stream parameters, we decode the
        first frames to get it. (used in mpeg case for example) */
     ret = av_find_stream_info(ic);
d8019eb5
     if (ret < 0 && verbose >= 0) {
85f07f22
         fprintf(stderr, "%s: could not find codec parameters\n", filename);
296df4e7
         av_exit(1);
85f07f22
     }
 
bd1b79a1
     timestamp = start_time;
     /* add the stream start time */
     if (ic->start_time != AV_NOPTS_VALUE)
         timestamp += ic->start_time;
 
254abc2e
     /* if seeking requested, we execute it */
     if (start_time != 0) {
3ba1438d
         ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
254abc2e
         if (ret < 0) {
115329f1
             fprintf(stderr, "%s: could not seek to position %0.3f\n",
254abc2e
                     filename, (double)timestamp / AV_TIME_BASE);
         }
         /* reset seek info */
         start_time = 0;
     }
 
85f07f22
     /* update the current parameters so that they match the one of the input stream */
     for(i=0;i<ic->nb_streams;i++) {
01f4895c
         AVCodecContext *enc = ic->streams[i]->codec;
c62c07d3
         if(thread_count>1)
             avcodec_thread_init(enc, thread_count);
         enc->thread_count= thread_count;
85f07f22
         switch(enc->codec_type) {
         case CODEC_TYPE_AUDIO:
3022cd10
             set_context_opts(enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
e0d2714a
             //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
13367a46
             channel_layout = enc->channel_layout;
85f07f22
             audio_channels = enc->channels;
             audio_sample_rate = enc->sample_rate;
a79db0f7
             audio_sample_fmt = enc->sample_fmt;
6488cf9b
             input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
b4aea108
             if(audio_disable)
f3356e9c
                 ic->streams[i]->discard= AVDISCARD_ALL;
85f07f22
             break;
         case CODEC_TYPE_VIDEO:
3022cd10
             set_context_opts(enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
85f07f22
             frame_height = enc->height;
             frame_width = enc->width;
c30a4489
             if(ic->streams[i]->sample_aspect_ratio.num)
                 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
             else
                 frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
             frame_aspect_ratio *= (float) enc->width / enc->height;
bb270c08
             frame_pix_fmt = enc->pix_fmt;
c0df9d75
             rfps      = ic->streams[i]->r_frame_rate.num;
             rfps_base = ic->streams[i]->r_frame_rate.den;
637b5326
             if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
f4f3223f
             if(me_threshold)
                 enc->debug |= FF_DEBUG_MV;
d7425f59
 
115329f1
             if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
d8019eb5
 
                 if (verbose >= 0)
386c88de
                     fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
c0df9d75
                             i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
d8019eb5
 
15bc38e5
                     (float)rfps / rfps_base, rfps, rfps_base);
79fdaa4c
             }
bf5af568
             /* update the current frame rate to match the stream frame rate */
b33ece16
             frame_rate.num = rfps;
             frame_rate.den = rfps_base;
bdfcbbed
 
6488cf9b
             input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
b4aea108
             if(video_disable)
f3356e9c
                 ic->streams[i]->discard= AVDISCARD_ALL;
             else if(video_discard)
                 ic->streams[i]->discard= video_discard;
85f07f22
             break;
254abc2e
         case CODEC_TYPE_DATA:
             break;
cf7fc795
         case CODEC_TYPE_SUBTITLE:
6488cf9b
             input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
11bf3847
             if(subtitle_disable)
                 ic->streams[i]->discard = AVDISCARD_ALL;
cf7fc795
             break;
f8d7c9d3
         case CODEC_TYPE_ATTACHMENT:
ae38261e
         case CODEC_TYPE_UNKNOWN:
6488cf9b
             nb_icodecs++;
ae38261e
             break;
51bd4565
         default:
0f4e8165
             abort();
85f07f22
         }
     }
115329f1
 
85f07f22
     input_files[nb_input_files] = ic;
bd1b79a1
     input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
85f07f22
     /* dump the file content */
d8019eb5
     if (verbose >= 0)
         dump_format(ic, nb_input_files, filename, 0);
 
85f07f22
     nb_input_files++;
79fdaa4c
     file_iformat = NULL;
     file_oformat = NULL;
bdfcbbed
 
2639c651
     video_channel = 0;
115329f1
 
a06a18c5
     av_freep(&video_codec_name);
     av_freep(&audio_codec_name);
     av_freep(&subtitle_codec_name);
85f07f22
 }
 
11bf3847
 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
                                          int *has_subtitle_ptr)
919f448d
 {
11bf3847
     int has_video, has_audio, has_subtitle, i, j;
919f448d
     AVFormatContext *ic;
 
     has_video = 0;
     has_audio = 0;
11bf3847
     has_subtitle = 0;
919f448d
     for(j=0;j<nb_input_files;j++) {
         ic = input_files[j];
         for(i=0;i<ic->nb_streams;i++) {
01f4895c
             AVCodecContext *enc = ic->streams[i]->codec;
919f448d
             switch(enc->codec_type) {
             case CODEC_TYPE_AUDIO:
                 has_audio = 1;
                 break;
             case CODEC_TYPE_VIDEO:
                 has_video = 1;
                 break;
11bf3847
             case CODEC_TYPE_SUBTITLE:
                 has_subtitle = 1;
                 break;
6fb316d5
             case CODEC_TYPE_DATA:
f8d7c9d3
             case CODEC_TYPE_ATTACHMENT:
ae38261e
             case CODEC_TYPE_UNKNOWN:
6fb316d5
                 break;
51bd4565
             default:
0f4e8165
                 abort();
919f448d
             }
         }
     }
     *has_video_ptr = has_video;
     *has_audio_ptr = has_audio;
11bf3847
     *has_subtitle_ptr = has_subtitle;
919f448d
 }
 
cf7fc795
 static void new_video_stream(AVFormatContext *oc)
85f07f22
 {
     AVStream *st;
cf7fc795
     AVCodecContext *video_enc;
     int codec_id;
115329f1
 
cf7fc795
     st = av_new_stream(oc, oc->nb_streams);
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
296df4e7
         av_exit(1);
cf7fc795
     }
54cc9c46
     avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
748c2fca
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
     video_bitstream_filters= NULL;
 
cf7fc795
     if(thread_count>1)
01f4895c
         avcodec_thread_init(st->codec, thread_count);
115329f1
 
01f4895c
     video_enc = st->codec;
115329f1
 
cf7fc795
     if(video_codec_tag)
         video_enc->codec_tag= video_codec_tag;
115329f1
 
90ad92b3
     if(   (video_global_header&1)
637b5326
        || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
cf7fc795
         video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
23b254fb
         avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
637b5326
     }
     if(video_global_header&2){
90ad92b3
         video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
23b254fb
         avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
637b5326
     }
90ad92b3
 
cf7fc795
     if (video_stream_copy) {
         st->stream_copy = 1;
         video_enc->codec_type = CODEC_TYPE_VIDEO;
143df827
         video_enc->sample_aspect_ratio =
c30a4489
         st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
cf7fc795
     } else {
464a631c
         const char *p;
cf7fc795
         int i;
         AVCodec *codec;
9de0be61
         AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
115329f1
 
6488cf9b
         if (video_codec_name) {
4a897224
             codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
6488cf9b
             codec = avcodec_find_encoder_by_name(video_codec_name);
             output_codecs[nb_ocodecs] = codec;
         } else {
             codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
             codec = avcodec_find_encoder(codec_id);
         }
115329f1
 
cf7fc795
         video_enc->codec_id = codec_id;
115329f1
 
3022cd10
         set_context_opts(video_enc, avctx_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
115329f1
 
d2845b75
         if (codec && codec->supported_framerates && !force_fps)
             fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
9de0be61
         video_enc->time_base.den = fps.num;
         video_enc->time_base.num = fps.den;
115329f1
 
cf7fc795
         video_enc->width = frame_width + frame_padright + frame_padleft;
         video_enc->height = frame_height + frame_padtop + frame_padbottom;
e7268d51
         video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
cf7fc795
         video_enc->pix_fmt = frame_pix_fmt;
c30a4489
         st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
cf7fc795
 
         if(codec && codec->pix_fmts){
             const enum PixelFormat *p= codec->pix_fmts;
             for(; *p!=-1; p++){
                 if(*p == video_enc->pix_fmt)
                     break;
             }
             if(*p == -1)
                 video_enc->pix_fmt = codec->pix_fmts[0];
         }
 
babe0e8c
         if (intra_only)
cf7fc795
             video_enc->gop_size = 0;
         if (video_qscale || same_quality) {
             video_enc->flags |= CODEC_FLAG_QSCALE;
115329f1
             video_enc->global_quality=
cf7fc795
                 st->quality = FF_QP2LAMBDA * video_qscale;
         }
 
         if(intra_matrix)
             video_enc->intra_matrix = intra_matrix;
         if(inter_matrix)
             video_enc->inter_matrix = inter_matrix;
 
         video_enc->thread_count = thread_count;
         p= video_rc_override_string;
         for(i=0; p; i++){
             int start, end, q;
             int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
             if(e!=3){
                 fprintf(stderr, "error parsing rc_override\n");
296df4e7
                 av_exit(1);
cf7fc795
             }
115329f1
             video_enc->rc_override=
                 av_realloc(video_enc->rc_override,
cf7fc795
                            sizeof(RcOverride)*(i+1));
             video_enc->rc_override[i].start_frame= start;
             video_enc->rc_override[i].end_frame  = end;
             if(q>0){
                 video_enc->rc_override[i].qscale= q;
                 video_enc->rc_override[i].quality_factor= 1.0;
             }
             else{
                 video_enc->rc_override[i].qscale= 0;
                 video_enc->rc_override[i].quality_factor= -q/100.0;
             }
             p= strchr(p, '/');
             if(p) p++;
         }
         video_enc->rc_override_count=i;
079e8cb9
         if (!video_enc->rc_initial_buffer_occupancy)
             video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
cf7fc795
         video_enc->me_threshold= me_threshold;
         video_enc->intra_dc_precision= intra_dc_precision - 8;
 
         if (do_psnr)
             video_enc->flags|= CODEC_FLAG_PSNR;
115329f1
 
cf7fc795
         /* two pass mode */
         if (do_pass) {
             if (do_pass == 1) {
                 video_enc->flags |= CODEC_FLAG_PASS1;
             } else {
                 video_enc->flags |= CODEC_FLAG_PASS2;
             }
         }
     }
6488cf9b
     nb_ocodecs++;
cf7fc795
 
     /* reset some key parameters */
     video_disable = 0;
4a897224
     av_freep(&video_codec_name);
cf7fc795
     video_stream_copy = 0;
 }
 
 static void new_audio_stream(AVFormatContext *oc)
 {
     AVStream *st;
     AVCodecContext *audio_enc;
3022cd10
     int codec_id;
115329f1
 
cf7fc795
     st = av_new_stream(oc, oc->nb_streams);
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
296df4e7
         av_exit(1);
cf7fc795
     }
54cc9c46
     avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
748c2fca
 
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
     audio_bitstream_filters= NULL;
 
cf7fc795
     if(thread_count>1)
01f4895c
         avcodec_thread_init(st->codec, thread_count);
115329f1
 
01f4895c
     audio_enc = st->codec;
cf7fc795
     audio_enc->codec_type = CODEC_TYPE_AUDIO;
115329f1
 
cf7fc795
     if(audio_codec_tag)
         audio_enc->codec_tag= audio_codec_tag;
115329f1
 
637b5326
     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
cf7fc795
         audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
23b254fb
         avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
637b5326
     }
cf7fc795
     if (audio_stream_copy) {
         st->stream_copy = 1;
         audio_enc->channels = audio_channels;
     } else {
a79db0f7
         AVCodec *codec;
115329f1
 
3022cd10
         set_context_opts(audio_enc, avctx_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
115329f1
 
6488cf9b
         if (audio_codec_name) {
4a897224
             codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
6488cf9b
             codec = avcodec_find_encoder_by_name(audio_codec_name);
             output_codecs[nb_ocodecs] = codec;
         } else {
             codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
             codec = avcodec_find_encoder(codec_id);
         }
cf7fc795
         audio_enc->codec_id = codec_id;
115329f1
 
c57c770d
         if (audio_qscale > QSCALE_NONE) {
             audio_enc->flags |= CODEC_FLAG_QSCALE;
             audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
         }
cf7fc795
         audio_enc->thread_count = thread_count;
e3e3be53
         audio_enc->channels = audio_channels;
a79db0f7
         audio_enc->sample_fmt = audio_sample_fmt;
13367a46
         audio_enc->channel_layout = channel_layout;
a79db0f7
 
         if(codec && codec->sample_fmts){
             const enum SampleFormat *p= codec->sample_fmts;
             for(; *p!=-1; p++){
                 if(*p == audio_enc->sample_fmt)
                     break;
             }
             if(*p == -1)
                 audio_enc->sample_fmt = codec->sample_fmts[0];
         }
cf7fc795
     }
6488cf9b
     nb_ocodecs++;
cf7fc795
     audio_enc->sample_rate = audio_sample_rate;
78e03516
     audio_enc->time_base= (AVRational){1, audio_sample_rate};
cf7fc795
     if (audio_language) {
0a789246
         av_metadata_set(&st->metadata, "language", audio_language);
cf7fc795
         av_free(audio_language);
         audio_language = NULL;
     }
 
     /* reset some key parameters */
     audio_disable = 0;
4a897224
     av_freep(&audio_codec_name);
cf7fc795
     audio_stream_copy = 0;
 }
 
11bf3847
 static void new_subtitle_stream(AVFormatContext *oc)
cf7fc795
 {
     AVStream *st;
     AVCodecContext *subtitle_enc;
115329f1
 
cf7fc795
     st = av_new_stream(oc, oc->nb_streams);
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
296df4e7
         av_exit(1);
cf7fc795
     }
54cc9c46
     avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
cf7fc795
 
e1cc8339
     bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
     subtitle_bitstream_filters= NULL;
 
01f4895c
     subtitle_enc = st->codec;
cf7fc795
     subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
     if (subtitle_stream_copy) {
         st->stream_copy = 1;
     } else {
3022cd10
         set_context_opts(avctx_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
4a897224
         subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
6488cf9b
         output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
cf7fc795
     }
6488cf9b
     nb_ocodecs++;
cf7fc795
 
     if (subtitle_language) {
0a789246
         av_metadata_set(&st->metadata, "language", subtitle_language);
cf7fc795
         av_free(subtitle_language);
         subtitle_language = NULL;
     }
 
11bf3847
     subtitle_disable = 0;
4a897224
     av_freep(&subtitle_codec_name);
cf7fc795
     subtitle_stream_copy = 0;
 }
 
 static void opt_new_audio_stream(void)
 {
     AVFormatContext *oc;
     if (nb_output_files <= 0) {
         fprintf(stderr, "At least one output file must be specified\n");
296df4e7
         av_exit(1);
cf7fc795
     }
     oc = output_files[nb_output_files - 1];
     new_audio_stream(oc);
 }
 
 static void opt_new_video_stream(void)
 {
     AVFormatContext *oc;
     if (nb_output_files <= 0) {
         fprintf(stderr, "At least one output file must be specified\n");
296df4e7
         av_exit(1);
cf7fc795
     }
     oc = output_files[nb_output_files - 1];
     new_video_stream(oc);
 }
 
11bf3847
 static void opt_new_subtitle_stream(void)
 {
     AVFormatContext *oc;
     if (nb_output_files <= 0) {
         fprintf(stderr, "At least one output file must be specified\n");
296df4e7
         av_exit(1);
11bf3847
     }
     oc = output_files[nb_output_files - 1];
     new_subtitle_stream(oc);
 }
 
cf7fc795
 static void opt_output_file(const char *filename)
 {
     AVFormatContext *oc;
11bf3847
     int use_video, use_audio, use_subtitle;
3022cd10
     int input_has_video, input_has_audio, input_has_subtitle;
817b23ff
     AVFormatParameters params, *ap = &params;
85f07f22
 
     if (!strcmp(filename, "-"))
         filename = "pipe:";
 
8e2fd8e1
     oc = avformat_alloc_context();
85f07f22
 
79fdaa4c
     if (!file_oformat) {
         file_oformat = guess_format(NULL, filename, NULL);
         if (!file_oformat) {
4021300c
             fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
79fdaa4c
                     filename);
296df4e7
             av_exit(1);
79fdaa4c
         }
85f07f22
     }
115329f1
 
79fdaa4c
     oc->oformat = file_oformat;
f7d78f36
     av_strlcpy(oc->filename, filename, sizeof(oc->filename));
85f07f22
 
115329f1
     if (!strcmp(file_oformat->name, "ffm") &&
f7d78f36
         av_strstart(filename, "http:", NULL)) {
85f07f22
         /* special case for files sent to ffserver: we get the stream
            parameters from ffserver */
d58ddafd
         int err = read_ffserver_streams(oc, filename);
         if (err < 0) {
             print_error(filename, err);
296df4e7
             av_exit(1);
85f07f22
         }
     } else {
4a897224
         use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
         use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
         use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
919f448d
 
e30a2846
         /* disable if no corresponding type found and at least one
            input file */
         if (nb_input_files > 0) {
11bf3847
             check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
                                          &input_has_subtitle);
e30a2846
             if (!input_has_video)
                 use_video = 0;
             if (!input_has_audio)
                 use_audio = 0;
11bf3847
             if (!input_has_subtitle)
                 use_subtitle = 0;
e30a2846
         }
919f448d
 
         /* manual disable */
85f07f22
         if (audio_disable) {
             use_audio = 0;
         }
         if (video_disable) {
             use_video = 0;
         }
11bf3847
         if (subtitle_disable) {
             use_subtitle = 0;
         }
115329f1
 
85f07f22
         if (use_video) {
cf7fc795
             new_video_stream(oc);
85f07f22
         }
115329f1
 
85f07f22
         if (use_audio) {
cf7fc795
             new_audio_stream(oc);
85f07f22
         }
 
11bf3847
         if (use_subtitle) {
             new_subtitle_stream(oc);
         }
 
4568325a
         oc->timestamp = rec_timestamp;
115329f1
 
a5926d85
         for(; metadata_count>0; metadata_count--){
             av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
                                            metadata[metadata_count-1].value);
         }
         av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
85f07f22
     }
 
1629626f
     output_files[nb_output_files++] = oc;
85f07f22
 
919f448d
     /* check filename in case of an image number is expected */
79fdaa4c
     if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5c07cf53
         if (!av_filename_number_test(oc->filename)) {
79fdaa4c
             print_error(oc->filename, AVERROR_NUMEXPECTED);
296df4e7
             av_exit(1);
79fdaa4c
         }
919f448d
     }
 
79fdaa4c
     if (!(oc->oformat->flags & AVFMT_NOFILE)) {
85f07f22
         /* test if it already exists to avoid loosing precious files */
115329f1
         if (!file_overwrite &&
85f07f22
             (strchr(filename, ':') == NULL ||
a5baedea
              filename[1] == ':' ||
f7d78f36
              av_strstart(filename, "file:", NULL))) {
85f07f22
             if (url_exist(filename)) {
                 int c;
115329f1
 
9d58e0a9
                 if (!using_stdin) {
d9a916e2
                     fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                     fflush(stderr);
                     c = getchar();
                     if (toupper(c) != 'Y') {
                         fprintf(stderr, "Not overwriting - exiting\n");
296df4e7
                         av_exit(1);
d9a916e2
                     }
9d58e0a9
                 }
                 else {
d9a916e2
                     fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
296df4e7
                     av_exit(1);
9d58e0a9
                 }
85f07f22
             }
         }
115329f1
 
85f07f22
         /* open the file */
         if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
             fprintf(stderr, "Could not open '%s'\n", filename);
296df4e7
             av_exit(1);
85f07f22
         }
     }
 
817b23ff
     memset(ap, 0, sizeof(*ap));
     if (av_set_parameters(oc, ap) < 0) {
         fprintf(stderr, "%s: Invalid encoding parameters\n",
                 oc->filename);
296df4e7
         av_exit(1);
817b23ff
     }
 
17c88cb0
     oc->preload= (int)(mux_preload*AV_TIME_BASE);
     oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
8108551a
     oc->loop_output = loop_output;
2db3c638
 
3022cd10
     set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
8e16b25c
 
85f07f22
     /* reset some options */
79fdaa4c
     file_oformat = NULL;
     file_iformat = NULL;
85f07f22
 }
 
5abdb4b1
 /* same option as mencoder */
b29f97d1
 static void opt_pass(const char *pass_str)
5abdb4b1
 {
     int pass;
     pass = atoi(pass_str);
     if (pass != 1 && pass != 2) {
         fprintf(stderr, "pass number can be only 1 or 2\n");
296df4e7
         av_exit(1);
5abdb4b1
     }
     do_pass = pass;
 }
a38469e1
 
0c1a9eda
 static int64_t getutime(void)
bdc4796f
 {
b250f9c6
 #if HAVE_GETRUSAGE
f3ec2d46
     struct rusage rusage;
 
     getrusage(RUSAGE_SELF, &rusage);
     return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
b250f9c6
 #elif HAVE_GETPROCESSTIMES
7495c306
     HANDLE proc;
     FILETIME c, e, k, u;
     proc = GetCurrentProcess();
     GetProcessTimes(proc, &c, &e, &k, &u);
     return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
 #else
a9bb28a3
     return av_gettime();
66be5b45
 #endif
bdc4796f
 }
5727b222
 
ceaf1909
 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
84f608f4
 {
     int i;
     const char *p = str;
     for(i = 0;; i++) {
         dest[i] = atoi(p);
         if(i == 63)
             break;
         p = strchr(p, ',');
         if(!p) {
             fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
296df4e7
             av_exit(1);
84f608f4
         }
         p++;
     }
 }
 
ceaf1909
 static void opt_inter_matrix(const char *arg)
84f608f4
 {
     inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
     parse_matrix_coeffs(inter_matrix, arg);
 }
 
ceaf1909
 static void opt_intra_matrix(const char *arg)
84f608f4
 {
     intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
     parse_matrix_coeffs(intra_matrix, arg);
 }
 
3b855466
 /**
  * Trivial log callback.
  * Only suitable for show_help and similar since it lacks prefix handling.
  */
 static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
 {
     vfprintf(stdout, fmt, vl);
 }
 
 static void show_help(void)
 {
     av_log_set_callback(log_callback_help);
     printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
            "Hyper fast Audio and Video encoder\n");
     printf("\n");
     show_help_options(options, "Main options:\n",
fb74bc43
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
88643f39
     show_help_options(options, "\nAdvanced options:\n",
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
                       OPT_EXPERT);
3b855466
     show_help_options(options, "\nVideo options:\n",
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
                       OPT_VIDEO);
     show_help_options(options, "\nAdvanced Video options:\n",
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
                       OPT_VIDEO | OPT_EXPERT);
     show_help_options(options, "\nAudio options:\n",
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
                       OPT_AUDIO);
     show_help_options(options, "\nAdvanced Audio options:\n",
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
                       OPT_AUDIO | OPT_EXPERT);
     show_help_options(options, "\nSubtitle options:\n",
                       OPT_SUBTITLE | OPT_GRAB,
                       OPT_SUBTITLE);
     show_help_options(options, "\nAudio/Video grab options:\n",
                       OPT_GRAB,
                       OPT_GRAB);
e992fba4
     printf("\n");
3b855466
     av_opt_show(avctx_opts[0], NULL);
e992fba4
     printf("\n");
3b855466
     av_opt_show(avformat_opts, NULL);
e992fba4
     printf("\n");
3b855466
     av_opt_show(sws_opts, NULL);
 }
 
e0595741
 static void opt_target(const char *arg)
 {
     int norm = -1;
88730be6
     static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
e0595741
 
     if(!strncmp(arg, "pal-", 4)) {
         norm = 0;
         arg += 4;
     } else if(!strncmp(arg, "ntsc-", 5)) {
         norm = 1;
         arg += 5;
ed2d7a34
     } else if(!strncmp(arg, "film-", 5)) {
         norm = 2;
         arg += 5;
e0595741
     } else {
         int fr;
         /* Calculate FR via float to avoid int overflow */
b33ece16
         fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
e0595741
         if(fr == 25000) {
             norm = 0;
         } else if((fr == 29970) || (fr == 23976)) {
             norm = 1;
         } else {
             /* Try to determine PAL/NTSC by peeking in the input files */
             if(nb_input_files) {
                 int i, j;
                 for(j = 0; j < nb_input_files; j++) {
                     for(i = 0; i < input_files[j]->nb_streams; i++) {
01f4895c
                         AVCodecContext *c = input_files[j]->streams[i]->codec;
e0595741
                         if(c->codec_type != CODEC_TYPE_VIDEO)
                             continue;
c0df9d75
                         fr = c->time_base.den * 1000 / c->time_base.num;
e0595741
                         if(fr == 25000) {
                             norm = 0;
                             break;
                         } else if((fr == 29970) || (fr == 23976)) {
                             norm = 1;
                             break;
                         }
                     }
                     if(norm >= 0)
                         break;
                 }
             }
         }
         if(verbose && norm >= 0)
ac930a99
             fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
e0595741
     }
 
     if(norm < 0) {
ed2d7a34
         fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
         fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
e0595741
         fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
296df4e7
         av_exit(1);
e0595741
     }
 
     if(!strcmp(arg, "vcd")) {
 
         opt_video_codec("mpeg1video");
         opt_audio_codec("mp2");
         opt_format("vcd");
 
         opt_frame_size(norm ? "352x240" : "352x288");
2fc3866d
         opt_frame_rate(NULL, frame_rates[norm]);
babe0e8c
         opt_default("gop", norm ? "18" : "15");
e0595741
 
3c0ba870
         opt_default("b", "1150000");
a5515106
         opt_default("maxrate", "1150000");
         opt_default("minrate", "1150000");
81d0618f
         opt_default("bufsize", "327680"); // 40*1024*8;
e0595741
 
066a81a8
         opt_default("ab", "224000");
e0595741
         audio_sample_rate = 44100;
57b7e784
         audio_channels = 2;
115329f1
 
4ff8fcef
         opt_default("packetsize", "2324");
09a45576
         opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
e0595741
 
17c88cb0
         /* We have to offset the PTS, so that it is consistent with the SCR.
            SCR starts at 36000, but the first two packs contain only padding
            and the first pack from the other stream, respectively, may also have
            been written before.
            So the real data starts at SCR 36000+3*1200. */
         mux_preload= (36000+3*1200) / 90000.0; //0.44
e0595741
     } else if(!strcmp(arg, "svcd")) {
 
         opt_video_codec("mpeg2video");
         opt_audio_codec("mp2");
24515926
         opt_format("svcd");
e0595741
 
         opt_frame_size(norm ? "480x480" : "480x576");
2fc3866d
         opt_frame_rate(NULL, frame_rates[norm]);
babe0e8c
         opt_default("gop", norm ? "18" : "15");
e0595741
 
3c0ba870
         opt_default("b", "2040000");
a5515106
         opt_default("maxrate", "2516000");
         opt_default("minrate", "0"); //1145000;
81d0618f
         opt_default("bufsize", "1835008"); //224*1024*8;
46cd15ca
         opt_default("flags", "+scan_offset");
637b5326
 
e0595741
 
066a81a8
         opt_default("ab", "224000");
e0595741
         audio_sample_rate = 44100;
 
4ff8fcef
         opt_default("packetsize", "2324");
2db3c638
 
e0595741
     } else if(!strcmp(arg, "dvd")) {
 
         opt_video_codec("mpeg2video");
         opt_audio_codec("ac3");
78a0efb4
         opt_format("dvd");
e0595741
 
         opt_frame_size(norm ? "720x480" : "720x576");
2fc3866d
         opt_frame_rate(NULL, frame_rates[norm]);
babe0e8c
         opt_default("gop", norm ? "18" : "15");
e0595741
 
3c0ba870
         opt_default("b", "6000000");
a5515106
         opt_default("maxrate", "9000000");
         opt_default("minrate", "0"); //1500000;
81d0618f
         opt_default("bufsize", "1835008"); //224*1024*8;
e0595741
 
4ff8fcef
         opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
09a45576
         opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
cbb6e405
 
066a81a8
         opt_default("ab", "448000");
e0595741
         audio_sample_rate = 48000;
 
06ab9cff
     } else if(!strncmp(arg, "dv", 2)) {
ff52bc3e
 
         opt_format("dv");
 
         opt_frame_size(norm ? "720x480" : "720x576");
06ab9cff
         opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
                                              (norm ? "yuv411p" : "yuv420p"));
2fc3866d
         opt_frame_rate(NULL, frame_rates[norm]);
ff52bc3e
 
         audio_sample_rate = 48000;
         audio_channels = 2;
 
e0595741
     } else {
         fprintf(stderr, "Unknown target: %s\n", arg);
296df4e7
         av_exit(1);
e0595741
     }
 }
 
b60d1379
 static void opt_vstats_file (const char *arg)
 {
     av_free (vstats_filename);
     vstats_filename=av_strdup (arg);
 }
 
 static void opt_vstats (void)
 {
     char filename[40];
     time_t today2 = time(NULL);
     struct tm *today = localtime(&today2);
 
     snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
              today->tm_sec);
     opt_vstats_file(filename);
 }
 
ebde2a2c
 static int opt_bsf(const char *opt, const char *arg)
748c2fca
 {
     AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
     AVBitStreamFilterContext **bsfp;
 
     if(!bsfc){
cbc09a7d
         fprintf(stderr, "Unknown bitstream filter %s\n", arg);
296df4e7
         av_exit(1);
748c2fca
     }
 
e1cc8339
     bsfp= *opt == 'v' ? &video_bitstream_filters :
           *opt == 'a' ? &audio_bitstream_filters :
                         &subtitle_bitstream_filters;
748c2fca
     while(*bsfp)
         bsfp= &(*bsfp)->next;
 
     *bsfp= bsfc;
ebde2a2c
 
     return 0;
748c2fca
 }
 
d9f1b68c
 static int opt_preset(const char *opt, const char *arg)
 {
23b20b5c
     FILE *f=NULL;
70899705
     char filename[1000], tmp[1000], tmp2[1000], line[1000];
23b20b5c
     int i;
17771682
     const char *base[2]= { getenv("HOME"),
                            FFMPEG_DATADIR,
23b20b5c
                          };
d9f1b68c
 
17771682
     for(i=!base[0]; i<2 && !f; i++){
         snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
70899705
         f= fopen(filename, "r");
439c18c7
         if(!f){
             char *codec_name= *opt == 'v' ? video_codec_name :
                               *opt == 'a' ? audio_codec_name :
                                             subtitle_codec_name;
17771682
             snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i],  i ? "" : "/.ffmpeg", codec_name, arg);
70899705
             f= fopen(filename, "r");
439c18c7
         }
23b20b5c
     }
3ddb448d
     if(!f && ((arg[0]=='.' && arg[1]=='/') || arg[0]=='/' ||
               is_dos_path(arg))){
6d0c77ba
         av_strlcpy(filename, arg, sizeof(filename));
70899705
         f= fopen(filename, "r");
4e72f129
     }
d9f1b68c
 
     if(!f){
9ac1c884
         fprintf(stderr, "File for preset '%s' not found\n", arg);
d9f1b68c
         av_exit(1);
     }
 
     while(!feof(f)){
8a4f816a
         int e= fscanf(f, "%999[^\n]\n", line) - 1;
         if(line[0] == '#' && !e)
             continue;
         e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
         if(e){
b04665ac
             fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
d9f1b68c
             av_exit(1);
         }
385b19df
         if(!strcmp(tmp, "acodec")){
             opt_audio_codec(tmp2);
         }else if(!strcmp(tmp, "vcodec")){
             opt_video_codec(tmp2);
         }else if(!strcmp(tmp, "scodec")){
             opt_subtitle_codec(tmp2);
b7353317
         }else if(opt_default(tmp, tmp2) < 0){
e178d7fd
             fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
b7353317
             av_exit(1);
         }
d9f1b68c
     }
 
     fclose(f);
 
     return 0;
 }
 
580a6c57
 static const OptionDef options[] = {
02d504a7
     /* main options */
a0b3bcd9
     { "L", OPT_EXIT, {(void*)show_license}, "show license" },
     { "h", OPT_EXIT, {(void*)show_help}, "show help" },
20176cbc
     { "version", OPT_EXIT, {(void*)show_version}, "show version" },
ba9880c1
     { "formats", OPT_EXIT, {(void*)show_formats}, "show available formats, codecs, protocols, ..." },
bdc4796f
     { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
     { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
     { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
b4a3389e
     { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
0a38bafd
     { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
b19221c8
     { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
f9645d7c
     { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
b19221c8
     { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
     { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
8833f375
     { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
ced06bd8
     { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
a5926d85
     { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)&opt_metadata}, "add metadata", "string=string" },
9c09099e
     { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
115329f1
     { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5727b222
       "add timings for benchmarking" },
115329f1
     { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
a0663ba4
       "dump each input packet" },
115329f1
     { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
254abc2e
       "when dumping packets, also dump the payload" },
b1b77fe9
     { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
6714e97c
     { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
8108551a
     { "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)", "" },
c48da33c
     { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
06ab9cff
     { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
d18811bb
     { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
986ebcdb
     { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
     { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
6363827e
     { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
90ad92b3
     { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
72bd8100
     { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
ca80810b
     { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
6363827e
     { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
50e143c4
     { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
f2abc559
     { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
50e3477f
     { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
02d504a7
 
     /* video options */
6363827e
     { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
     { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
7ca60994
     { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
2fc3866d
     { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
02d504a7
     { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
     { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
c3b95b1d
     { "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" },
02d504a7
     { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
     { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
     { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
     { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
1ff93ffc
     { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
     { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
     { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
     { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
     { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
02d504a7
     { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
     { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
eb8393a8
     { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4bef236b
     { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
d95ac2c5
     { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
02d504a7
     { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
c48da33c
     { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold",  "threshold" },
115329f1
     { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
02d504a7
       "use same video quality as source (implies VBR)" },
     { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
ad16627f
     { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
115329f1
     { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
02d504a7
       "deinterlace pictures" },
     { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
b60d1379
     { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
     { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
b250f9c6
 #if CONFIG_VHOOK
02d504a7
     { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
d0f596b4
 #endif
84f608f4
     { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
     { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
bb198e19
     { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
bf266e19
     { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
b2a2197e
     { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
cf7fc795
     { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
0888fd22
     { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
d2845b75
     { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
02d504a7
 
     /* audio options */
6363827e
     { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
036bfd18
     { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
c57c770d
     { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
c48da33c
     { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
     { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
02d504a7
     { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
     { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
b2a2197e
     { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
a9aa3467
     { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
cf7fc795
     { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
     { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
a79db0f7
     { "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" },
02d504a7
 
cf7fc795
     /* subtitle options */
11bf3847
     { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
cf7fc795
     { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
     { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
     { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
115329f1
 
02d504a7
     /* grab options */
     { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
     { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
cc58300e
     { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
115329f1
 
     /* muxer options */
17c88cb0
     { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
     { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
748c2fca
 
e5f6b7e5
     { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
     { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
     { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
748c2fca
 
a57bf697
     { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
     { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
     { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
d9f1b68c
 
8bbf6db9
     { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
85f07f22
     { NULL, },
 };
 
f71163d7
 int main(int argc, char **argv)
 {
     int i;
     int64_t ti;
 
c721d803
     avcodec_register_all();
     avdevice_register_all();
f71163d7
     av_register_all();
 
b86f5a02
     if(isatty(STDIN_FILENO))
         url_set_interrupt_cb(decode_interrupt_cb);
 
f71163d7
     for(i=0; i<CODEC_TYPE_NB; i++){
         avctx_opts[i]= avcodec_alloc_context2(i);
     }
8e2fd8e1
     avformat_opts = avformat_alloc_context();
f71163d7
     sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);
 
ea9c581f
     show_banner();
f71163d7
 
     /* parse options */
     parse_options(argc, argv, options, opt_output_file);
 
     /* file converter / grab */
     if (nb_output_files <= 0) {
bdb9fd9b
         fprintf(stderr, "At least one output file must be specified\n");
296df4e7
         av_exit(1);
f71163d7
     }
 
     if (nb_input_files == 0) {
bdb9fd9b
         fprintf(stderr, "At least one input file must be specified\n");
296df4e7
         av_exit(1);
f71163d7
     }
 
     ti = getutime();
6c7c44ee
     if (av_encode(output_files, nb_output_files, input_files, nb_input_files,
                   stream_maps, nb_stream_maps) < 0)
         av_exit(1);
f71163d7
     ti = getutime() - ti;
     if (do_benchmark) {
         printf("bench: utime=%0.3fs\n", ti / 1000000.0);
     }
 
296df4e7
     return av_exit(0);
f71163d7
 }