ffmpeg.c
85f07f22
 /*
89b503b5
  * 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
 
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"
41d0eb1c
 #include "libavutil/opt.h"
ce1ee094
 #include "libavcodec/audioconvert.h"
7ffe76e5
 #include "libavutil/audioconvert.h"
 #include "libavutil/parseutils.h"
 #include "libavutil/samplefmt.h"
2b4abbd6
 #include "libavutil/colorspace.h"
245976da
 #include "libavutil/fifo.h"
2839dc97
 #include "libavutil/intreadwrite.h"
d2d67e42
 #include "libavutil/dict.h"
718c7b18
 #include "libavutil/pixdesc.h"
245976da
 #include "libavutil/avstring.h"
335ee1aa
 #include "libavutil/libm.h"
245976da
 #include "libavformat/os_support.h"
daf8e955
 
d4d09329
 #include "libavformat/ffm.h" // not public API
 
46847a33
 #if CONFIG_AVFILTER
566666ca
 # include "libavfilter/avcodec.h"
46847a33
 # include "libavfilter/avfilter.h"
 # include "libavfilter/avfiltergraph.h"
44f669e7
 # include "libavfilter/vsink_buffer.h"
46847a33
 # include "libavfilter/vsrc_buffer.h"
 #endif
 
b250f9c6
 #if HAVE_SYS_RESOURCE_H
0a1b29de
 #include <sys/types.h>
fc5607f8
 #include <sys/time.h>
b091aa44
 #include <sys/resource.h>
b250f9c6
 #elif HAVE_GETPROCESSTIMES
7495c306
 #include <windows.h>
 #endif
fc5607f8
 #if HAVE_GETPROCESSMEMORYINFO
 #include <windows.h>
 #include <psapi.h>
 #endif
7495c306
 
b250f9c6
 #if HAVE_SYS_SELECT_H
fb1d2d7b
 #include <sys/select.h>
 #endif
 
8b8bf89e
 #if HAVE_TERMIOS_H
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
 #include <termios.h>
 #elif HAVE_KBHIT
4b54c6d0
 #include <conio.h>
bdc4796f
 #endif
bf5af568
 #include <time.h>
85f07f22
 
01310af2
 #include "cmdutils.h"
 
b64b4134
 #include "libavutil/avassert.h"
2b18dcd0
 
89b503b5
 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;
 
3f07e8db
 /**
  * select an input file for an output file
  */
0a38bafd
 typedef struct AVMetaDataMap {
1829e195
     int  file;      //< file index
     char type;      //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
     int  index;     //< stream/chapter/program number
0a38bafd
 } AVMetaDataMap;
 
91e96eba
 typedef struct AVChapterMap {
     int in_file;
     int out_file;
 } AVChapterMap;
 
580a6c57
 static const OptionDef options[];
85f07f22
 
60402344
 #define MAX_FILES 100
84fd51e5
 #define MAX_STREAMS 1024    /* arbitrary sanity check value */
85f07f22
 
ef6fc647
 static const char *last_asked_format = NULL;
a6a92a9a
 static int64_t input_files_ts_offset[MAX_FILES];
2c6958aa
 static double *input_files_ts_scale[MAX_FILES] = {NULL};
311e223f
 static AVCodec **input_codecs = NULL;
 static int nb_input_codecs = 0;
2c6958aa
 static int nb_input_files_ts_scale[MAX_FILES] = {0};
85f07f22
 
 static AVFormatContext *output_files[MAX_FILES];
 static int nb_output_files = 0;
 
3a8e8824
 static AVStreamMap *stream_maps = NULL;
85f07f22
 static int nb_stream_maps;
 
1829e195
 /* first item specifies output metadata, second is input */
 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
0a38bafd
 static int nb_meta_data_maps;
477b1aea
 static int metadata_global_autocopy   = 1;
d0abe80a
 static int metadata_streams_autocopy  = 1;
 static int metadata_chapters_autocopy = 1;
0a38bafd
 
91e96eba
 static AVChapterMap *chapter_maps = NULL;
 static int nb_chapter_maps;
 
006e8108
 /* indexed by output file stream index */
e640f261
 static int *streamid_map = NULL;
 static int nb_streamid_map = 0;
006e8108
 
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;
100a6b7c
 static int frame_bits_per_raw_sample = 0;
5d6e4c16
 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
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;
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;
83a36b2e
 static unsigned int video_codec_tag = 0;
0fc2c0f6
 static char *video_language = NULL;
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;
46847a33
 #if CONFIG_AVFILTER
 static char *vfilters = NULL;
 #endif
85f07f22
 
 static int intra_only = 0;
d7ee4402
 static int audio_sample_rate = 0;
13367a46
 static int64_t channel_layout = 0;
c57c770d
 #define QSCALE_NONE -99999
 static float audio_qscale = QSCALE_NONE;
85f07f22
 static int audio_disable = 0;
8f3e9997
 static int audio_channels = 0;
4a897224
 static char  *audio_codec_name = NULL;
83a36b2e
 static unsigned 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;
83a36b2e
 static unsigned int subtitle_codec_tag = 0;
85f07f22
 
e3b540b4
 static int data_disable = 0;
 static char *data_codec_name = NULL;
 static unsigned int data_codec_tag = 0;
 
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;
25d34458
 static int64_t recording_timestamp = 0;
a6a92a9a
 static int64_t input_ts_offset = 0;
85f07f22
 static int file_overwrite = 0;
d2d67e42
 static AVDictionary *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;
2c18893a
 static const char *pass_logfilename_prefix;
1629626f
 static int audio_stream_copy = 0;
 static int video_stream_copy = 0;
cf7fc795
 static int subtitle_stream_copy = 0;
e3b540b4
 static int data_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;
b5e08992
 static int copy_tb= 0;
76bdac6d
 static int opt_shortest = 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;
f068206e
 static int verbose = 1;
3c483620
 static int run_as_daemon  = 0;
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;
4ad08021
 static char *forced_key_frames = NULL;
d9a916e2
 
a8482aab
 static float dts_delta_threshold = 10;
5b6d5596
 
29cc1c23
 static int64_t timer_start;
8bbf6db9
 
3321cb3f
 static uint8_t *audio_buf;
 static uint8_t *audio_out;
41727b85
 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
3321cb3f
 
 static short *samples;
 
748c2fca
 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
e1cc8339
 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
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
0b6d358a
     AVBitStreamFilterContext *bitstream_filters;
9446d759
     AVCodec *enc;
 
85f07f22
     /* video only */
07d0cdfc
     int video_resample;
2beac7c3
     AVFrame resample_frame;              /* temporary frame for image resampling */
18a54b04
     struct SwsContext *img_resample_ctx; /* for image resampling */
     int resample_height;
352666c1
     int resample_width;
01a3c821
     int resample_pix_fmt;
a6286bda
     AVRational frame_rate;
34b10a57
 
abf8342a
     float frame_aspect_ratio;
901ff511
 
4ad08021
     /* forced key frames */
     int64_t *forced_kf_pts;
     int forced_kf_count;
     int forced_kf_index;
 
85f07f22
     /* audio only */
     int audio_resample;
     ReSampleContext *resample; /* for audio resampling */
8afab686
     int resample_sample_fmt;
     int resample_channels;
     int resample_sample_rate;
a79db0f7
     int reformat_pair;
     AVAudioConvert *reformat_ctx;
41dd680d
     AVFifoBuffer *fifo;     /* for compression: one audio fifo per codec */
5abdb4b1
     FILE *logfile;
1762d9ce
 
 #if CONFIG_AVFILTER
     AVFilterContext *output_video_filter;
     AVFilterContext *input_video_filter;
     AVFilterBufferRef *picref;
     char *avfilter;
     AVFilterGraph *graph;
 #endif
b97b4b58
 
1435f2fa
    int sws_flags;
85f07f22
 } AVOutputStream;
 
9fdf4b58
 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
 
85f07f22
 typedef struct AVInputStream {
     int file_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 */
3ff0daf0
     int showed_multi_packet_warning;
55a7e946
     int is_past_recording_time;
46847a33
 #if CONFIG_AVFILTER
     AVFrame *filter_frame;
     int has_filter_frame;
 #endif
85f07f22
 } AVInputStream;
 
 typedef struct AVInputFile {
07633154
     AVFormatContext *ctx;
85f07f22
     int eof_reached;      /* true if eof reached */
     int ist_index;        /* index of first stream in ist_table */
     int buffer_size;      /* current total buffer size */
fa750933
     int nb_streams;       /* nb streams we are aware of */
85f07f22
 } AVInputFile;
 
8b8bf89e
 #if HAVE_TERMIOS_H
 
 /* init terminal so that we can grab keys */
 static struct termios oldtty;
 #endif
 
07633154
 static AVInputStream *input_streams = NULL;
 static int         nb_input_streams = 0;
 static AVInputFile   *input_files   = NULL;
 static int         nb_input_files   = 0;
 
46847a33
 #if CONFIG_AVFILTER
 
5381823e
 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
46847a33
 {
a9f3cb93
     AVFilterContext *last_filter, *filter;
46847a33
     /** filter graph containing all filters including input & output */
     AVCodecContext *codec = ost->st->codec;
     AVCodecContext *icodec = ist->st->codec;
44f669e7
     enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
7b3ea550
     AVRational sample_aspect_ratio;
46847a33
     char args[255];
4ddf0d29
     int ret;
46847a33
 
1762d9ce
     ost->graph = avfilter_graph_alloc();
46847a33
 
7b3ea550
     if (ist->st->sample_aspect_ratio.num){
         sample_aspect_ratio = ist->st->sample_aspect_ratio;
     }else
         sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
 
     snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
              ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
              sample_aspect_ratio.num, sample_aspect_ratio.den);
 
1762d9ce
     ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
                                        "src", args, NULL, ost->graph);
037be76e
     if (ret < 0)
4ddf0d29
         return ret;
44f669e7
     ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
                                        "out", NULL, pix_fmts, ost->graph);
037be76e
     if (ret < 0)
4ddf0d29
         return ret;
1762d9ce
     last_filter = ost->input_video_filter;
46847a33
 
5879ea6d
     if (codec->width  != icodec->width || codec->height != icodec->height) {
6e82e7fa
         snprintf(args, 255, "%d:%d:flags=0x%X",
0c22311b
                  codec->width,
                  codec->height,
1435f2fa
                  ost->sws_flags);
037be76e
         if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
1762d9ce
                                                 NULL, args, NULL, ost->graph)) < 0)
4ddf0d29
             return ret;
         if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
             return ret;
a9f3cb93
         last_filter = filter;
46847a33
     }
 
1435f2fa
     snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
1762d9ce
     ost->graph->scale_sws_opts = av_strdup(args);
f96363df
 
1762d9ce
     if (ost->avfilter) {
c5354942
         AVFilterInOut *outputs = avfilter_inout_alloc();
         AVFilterInOut *inputs  = avfilter_inout_alloc();
46847a33
 
         outputs->name    = av_strdup("in");
7313132b
         outputs->filter_ctx = last_filter;
46847a33
         outputs->pad_idx = 0;
         outputs->next    = NULL;
 
         inputs->name    = av_strdup("out");
1762d9ce
         inputs->filter_ctx = ost->output_video_filter;
46847a33
         inputs->pad_idx = 0;
         inputs->next    = NULL;
 
6119b23a
         if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
4ddf0d29
             return ret;
1762d9ce
         av_freep(&ost->avfilter);
46847a33
     } else {
1762d9ce
         if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
4ddf0d29
             return ret;
46847a33
     }
 
1762d9ce
     if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
4ddf0d29
         return ret;
46847a33
 
1762d9ce
     codec->width  = ost->output_video_filter->inputs[0]->w;
     codec->height = ost->output_video_filter->inputs[0]->h;
7b3ea550
     codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
abf8342a
         ost->frame_aspect_ratio ? // overriden by the -aspect cli option
         av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
1762d9ce
         ost->output_video_filter->inputs[0]->sample_aspect_ratio;
46847a33
 
     return 0;
 }
 #endif /* CONFIG_AVFILTER */
 
85f07f22
 static void term_exit(void)
 {
4a34e54b
     av_log(NULL, AV_LOG_QUIET, "%s", "");
8b8bf89e
 #if HAVE_TERMIOS_H
3c483620
     if(!run_as_daemon)
39aafa5e
         tcsetattr (0, TCSANOW, &oldtty);
8b8bf89e
 #endif
64f6e357
 }
85f07f22
 
e9a832e5
 static volatile int received_sigterm = 0;
9680a722
 
 static void
 sigterm_handler(int sig)
 {
     received_sigterm = sig;
6dfb4ab8
     q_pressed++;
9680a722
     term_exit();
 }
 
85f07f22
 static void term_init(void)
 {
8b8bf89e
 #if HAVE_TERMIOS_H
3c483620
     if(!run_as_daemon){
8b8bf89e
     struct termios tty;
 
     tcgetattr (0, &tty);
     oldtty = tty;
     atexit(term_exit);
 
     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;
 
     tcsetattr (0, TCSANOW, &tty);
     signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
39aafa5e
     }
8b8bf89e
 #endif
 
9680a722
     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */
     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
ffcc6e24
 #ifdef SIGXCPU
     signal(SIGXCPU, sigterm_handler);
 #endif
85f07f22
 }
 
 /* read a key without blocking */
 static int read_key(void)
 {
8b8bf89e
 #if HAVE_TERMIOS_H
     int n = 1;
     unsigned char ch;
     struct timeval tv;
     fd_set rfds;
 
3c483620
     if(run_as_daemon)
39aafa5e
         return -1;
 
8b8bf89e
     FD_ZERO(&rfds);
     FD_SET(0, &rfds);
     tv.tv_sec = 0;
     tv.tv_usec = 0;
     n = select(1, &rfds, NULL, NULL, &tv);
     if (n > 0) {
         n = read(0, &ch, 1);
         if (n == 1)
             return ch;
 
         return n;
     }
 #elif HAVE_KBHIT
4b54c6d0
     if(kbhit())
         return(getch());
d86b83f8
 #endif
85f07f22
     return -1;
 }
 
b51469a0
 static int decode_interrupt_cb(void)
 {
8993b596
     q_pressed += read_key() == 'q';
     return q_pressed > 1;
b51469a0
 }
 
639e4ec8
 static int ffmpeg_exit(int ret)
e5295c0d
 {
     int i;
 
     /* close files */
     for(i=0;i<nb_output_files;i++) {
         AVFormatContext *s = output_files[i];
8767060c
         if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
ebb92e07
             avio_close(s->pb);
42f97696
         avformat_free_context(s);
9fdf4b58
         av_free(output_streams_for_file[i]);
e5295c0d
     }
2c6958aa
     for(i=0;i<nb_input_files;i++) {
07633154
         av_close_input_file(input_files[i].ctx);
2c6958aa
         av_free(input_files_ts_scale[i]);
     }
e5295c0d
 
     av_free(intra_matrix);
     av_free(inter_matrix);
 
     if (vstats_file)
         fclose(vstats_file);
     av_free(vstats_filename);
 
e640f261
     av_free(streamid_map);
311e223f
     av_free(input_codecs);
3a8e8824
     av_free(stream_maps);
63e856df
     av_free(meta_data_maps);
e5295c0d
 
07633154
     av_freep(&input_streams);
     av_freep(&input_files);
 
e5295c0d
     av_free(video_codec_name);
     av_free(audio_codec_name);
     av_free(subtitle_codec_name);
e3b540b4
     av_free(data_codec_name);
e5295c0d
 
     av_free(video_standard);
 
a5c33faa
     uninit_opts();
3321cb3f
     av_free(audio_buf);
     av_free(audio_out);
b8919a30
     allocated_audio_buf_size= allocated_audio_out_size= 0;
3321cb3f
     av_free(samples);
5973490a
 
46847a33
 #if CONFIG_AVFILTER
     avfilter_uninit();
 #endif
 
e5295c0d
     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;
dba249ab
 }
 
 /* similar to ff_dynarray_add() and av_fast_realloc() */
 static void *grow_array(void *array, int elem_size, int *size, int new_size)
 {
     if (new_size >= INT_MAX / elem_size) {
         fprintf(stderr, "Array too big.\n");
         ffmpeg_exit(1);
     }
     if (*size < new_size) {
         uint8_t *tmp = av_realloc(array, new_size*elem_size);
         if (!tmp) {
             fprintf(stderr, "Could not alloc buffer.\n");
             ffmpeg_exit(1);
         }
         memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
         *size = new_size;
         return tmp;
     }
     return array;
e5295c0d
 }
 
aa1de0d9
 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
 {
     if(codec && codec->sample_fmts){
5d6e4c16
         const enum AVSampleFormat *p= codec->sample_fmts;
aa1de0d9
         for(; *p!=-1; p++){
             if(*p == st->codec->sample_fmt)
                 break;
         }
5a8d1075
         if (*p == -1) {
035c13e3
             if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
                 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
5a8d1075
             av_log(NULL, AV_LOG_WARNING,
                    "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
                    av_get_sample_fmt_name(st->codec->sample_fmt),
                    codec->name,
                    av_get_sample_fmt_name(codec->sample_fmts[0]));
aa1de0d9
             st->codec->sample_fmt = codec->sample_fmts[0];
5a8d1075
         }
aa1de0d9
     }
 }
 
10d0f5e0
 static void choose_sample_rate(AVStream *st, AVCodec *codec)
 {
     if(codec && codec->supported_samplerates){
         const int *p= codec->supported_samplerates;
3c5e1b36
         int best=0;
10d0f5e0
         int best_dist=INT_MAX;
         for(; *p; p++){
             int dist= abs(st->codec->sample_rate - *p);
             if(dist < best_dist){
                 best_dist= dist;
                 best= *p;
             }
         }
ff866063
         if(best_dist){
             av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
         }
10d0f5e0
         st->codec->sample_rate= best;
     }
 }
 
aa1de0d9
 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
 {
     if(codec && codec->pix_fmts){
         const enum PixelFormat *p= codec->pix_fmts;
b26847b7
         if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
             if(st->codec->codec_id==CODEC_ID_MJPEG){
                 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
             }else if(st->codec->codec_id==CODEC_ID_LJPEG){
                 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
             }
         }
aa1de0d9
         for(; *p!=-1; p++){
             if(*p == st->codec->pix_fmt)
                 break;
         }
2ee85c06
         if (*p == -1) {
b5ef6f8e
             if(st->codec->pix_fmt != PIX_FMT_NONE)
b568d6d9
                 av_log(NULL, AV_LOG_WARNING,
                         "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
                         av_pix_fmt_descriptors[st->codec->pix_fmt].name,
                         codec->name,
                         av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
aa1de0d9
             st->codec->pix_fmt = codec->pix_fmts[0];
2ee85c06
         }
aa1de0d9
     }
 }
 
ec1ca41c
 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
 {
     int idx = oc->nb_streams - 1;
     AVOutputStream *ost;
 
     output_streams_for_file[file_idx] =
         grow_array(output_streams_for_file[file_idx],
                    sizeof(*output_streams_for_file[file_idx]),
                    &nb_output_streams_for_file[file_idx],
                    oc->nb_streams);
     ost = output_streams_for_file[file_idx][idx] =
         av_mallocz(sizeof(AVOutputStream));
     if (!ost) {
         fprintf(stderr, "Could not alloc output stream\n");
         ffmpeg_exit(1);
     }
     ost->file_index = file_idx;
     ost->index = idx;
1435f2fa
 
     ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
ec1ca41c
     return ost;
 }
 
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 */
b67f3d65
     s->nb_streams = 0;
db3262b7
     s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
85f07f22
     for(i=0;i<ic->nb_streams;i++) {
         AVStream *st;
d9521cb1
         AVCodec *codec;
1e491e29
 
b67f3d65
         s->nb_streams++;
 
f37f8d4c
         // FIXME: a more elegant solution is needed
e1031171
         st = av_mallocz(sizeof(AVStream));
85f07f22
         memcpy(st, ic->streams[i], sizeof(AVStream));
840238b8
         st->info = av_malloc(sizeof(*st->info));
         memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
f37f8d4c
         st->codec = avcodec_alloc_context();
7ef61879
         if (!st->codec) {
             print_error(filename, AVERROR(ENOMEM));
639e4ec8
             ffmpeg_exit(1);
7ef61879
         }
d9521cb1
         avcodec_copy_context(st->codec, ic->streams[i]->codec);
85f07f22
         s->streams[i] = st;
837d248d
 
d9521cb1
         codec = avcodec_find_encoder(st->codec->codec_id);
         if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
             if (audio_stream_copy) {
                 st->stream_copy = 1;
             } else
                 choose_sample_fmt(st, codec);
         } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
             if (video_stream_copy) {
                 st->stream_copy = 1;
             } else
                 choose_pixel_fmt(st, codec);
         }
837d248d
 
3438d82d
         if(st->codec->flags & CODEC_FLAG_BITEXACT)
             nopts = 1;
b67f3d65
 
         new_output_stream(s, nb_output_files);
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,
cc947f04
                                           pkt->flags & AV_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)
639e4ec8
                 ffmpeg_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);
639e4ec8
         ffmpeg_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;
15bfe412
     int64_t audio_out_size, audio_buf_size;
7a086a85
     int64_t allocated_for_size= size;
d66c7abc
 
8afab686
     int size_out, frame_bytes, ret, resample_changed;
01f4895c
     AVCodecContext *enc= ost->st->codec;
2886f311
     AVCodecContext *dec= ist->st->codec;
e6c52cee
     int osize = av_get_bytes_per_sample(enc->sample_fmt);
     int isize = av_get_bytes_per_sample(dec->sample_fmt);
15bfe412
     const int coded_bps = av_get_bits_per_sample(enc->codec->id);
 
7a086a85
 need_realloc:
     audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
15bfe412
     audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
8b484d0f
     audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
79c85beb
     audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
15bfe412
     audio_buf_size*= osize*enc->channels;
 
     audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
     if(coded_bps > 8*osize)
         audio_out_size= audio_out_size * coded_bps / (8*osize);
     audio_out_size += FF_MIN_BUFFER_SIZE;
 
     if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
         fprintf(stderr, "Buffer sizes too large\n");
639e4ec8
         ffmpeg_exit(1);
15bfe412
     }
85f07f22
 
b8919a30
     av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
     av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
e185a2f6
     if (!audio_buf || !audio_out){
         fprintf(stderr, "Out of memory in do_audio_out\n");
639e4ec8
         ffmpeg_exit(1);
e185a2f6
     }
d66c7abc
 
2886f311
     if (enc->channels != dec->channels)
         ost->audio_resample = 1;
 
8afab686
     resample_changed = ost->resample_sample_fmt  != dec->sample_fmt ||
                        ost->resample_channels    != dec->channels   ||
                        ost->resample_sample_rate != dec->sample_rate;
 
     if ((ost->audio_resample && !ost->resample) || resample_changed) {
         if (resample_changed) {
             av_log(NULL, AV_LOG_INFO, "Input stream #%d.%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
d2bc4da1
                    ist->file_index, ist->st->index,
8afab686
                    ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
                    dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
             ost->resample_sample_fmt  = dec->sample_fmt;
             ost->resample_channels    = dec->channels;
             ost->resample_sample_rate = dec->sample_rate;
             if (ost->resample)
                 audio_resample_close(ost->resample);
         }
0f16f725
         /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
         if (audio_sync_method <= 1 &&
             ost->resample_sample_fmt  == enc->sample_fmt &&
8afab686
             ost->resample_channels    == enc->channels   &&
             ost->resample_sample_rate == enc->sample_rate) {
             ost->resample = NULL;
             ost->audio_resample = 0;
         } else {
f6715848
             if (dec->sample_fmt != AV_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);
             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);
                 ffmpeg_exit(1);
             }
8afab686
         }
2886f311
     }
 
5d6e4c16
 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_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 (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",
ba7d6e79
                 av_get_sample_fmt_name(dec->sample_fmt),
                 av_get_sample_fmt_name(enc->sample_fmt));
639e4ec8
             ffmpeg_exit(1);
a79db0f7
         }
         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
37f5a713
                 - av_fifo_size(ost->fifo)/(enc->channels * 2);
         double idelta= delta*dec->sample_rate / enc->sample_rate;
ff19d16b
         int byte_delta= ((int)idelta)*2*dec->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);
 
7a086a85
                     if(byte_delta > allocated_for_size - size){
                         allocated_for_size= byte_delta + (int64_t)size;
                         goto need_realloc;
                     }
                     ist->is_start=0;
ff4905a5
 
                     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);
b926b628
                 av_assert0(ost->audio_resample);
ff4905a5
                 if(verbose > 2)
                     fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
41dd680d
 //                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)
37f5a713
                         - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
85f07f22
 
     if (ost->audio_resample) {
         buftmp = audio_buf;
115329f1
         size_out = audio_resample(ost->resample,
85f07f22
                                   (short *)buftmp, (short *)buf,
37f5a713
                                   size / (dec->channels * isize));
287ba997
         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};
80f47250
         void *obuf[6]= {audio_buf};
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)
639e4ec8
                 ffmpeg_exit(1);
a79db0f7
             return;
         }
80f47250
         buftmp = audio_buf;
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 */
41dd680d
         if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
745b39d5
             fprintf(stderr, "av_fifo_realloc2() failed\n");
639e4ec8
             ffmpeg_exit(1);
745b39d5
         }
41dd680d
         av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
85f07f22
 
287ba997
         frame_bytes = enc->frame_size * osize * enc->channels;
115329f1
 
41dd680d
         while (av_fifo_size(ost->fifo) >= frame_bytes) {
e928649b
             AVPacket pkt;
             av_init_packet(&pkt);
 
3898eed8
             av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
0871ae1a
 
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");
639e4ec8
                 ffmpeg_exit(1);
528271ff
             }
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);
cc947f04
             pkt.flags |= AV_PKT_FLAG_KEY;
0b6d358a
             write_frame(s, &pkt, enc, ost->bitstream_filters);
115329f1
 
986ebcdb
             ost->sync_opts += enc->frame_size;
85f07f22
         }
     } else {
e928649b
         AVPacket pkt;
         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)
060b8592
             size_out = size_out*coded_bps/8;
287ba997
 
5ee05a62
         if(size_out > audio_out_size){
             fprintf(stderr, "Internal error, buffer size too small\n");
639e4ec8
             ffmpeg_exit(1);
5ee05a62
         }
 
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");
639e4ec8
             ffmpeg_exit(1);
528271ff
         }
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);
cc947f04
         pkt.flags |= AV_PKT_FLAG_KEY;
0b6d358a
         write_frame(s, &pkt, enc, ost->bitstream_filters);
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 */
fdf11906
     if (do_deinterlace) {
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);
 
9e1cc598
         if(avpicture_deinterlace(picture2, picture,
                                  dec->pix_fmt, dec->width, dec->height) < 0) {
             /* if error, do not deinterlace */
             fprintf(stderr, "Deinterlacing failed\n");
             av_free(buf);
             buf = NULL;
             picture2 = picture;
         }
10d104e4
     } else {
         picture2 = picture;
     }
 
     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;
7f4fca03
     int subtitle_out_max_size = 1024 * 1024;
cf7fc795
     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)
639e4ec8
             ffmpeg_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++) {
4bbe788a
         sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
8b03c014
         // start_display_time is required to be 0
         sub->pts              += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
         sub->end_display_time -= sub->start_display_time;
         sub->start_display_time = 0;
115329f1
         subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
cf7fc795
                                                     subtitle_out_max_size, sub);
266649a5
         if (subtitle_out_size < 0) {
             fprintf(stderr, "Subtitle encoding failed\n");
639e4ec8
             ffmpeg_exit(1);
266649a5
         }
115329f1
 
cf7fc795
         av_init_packet(&pkt);
         pkt.stream_index = ost->index;
         pkt.data = subtitle_out;
         pkt.size = subtitle_out_size;
8b03c014
         pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, 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;
         }
0b6d358a
         write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
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
 {
a851fa7f
     int nb_frames, i, ret, av_unused resample_changed;
70c24b21
     AVFrame *final_picture, *formatted_picture;
cfcf0ffd
     AVCodecContext *enc, *dec;
47b229db
     double sync_ipts;
115329f1
 
01f4895c
     enc = ost->st->codec;
     dec = ist->st->codec;
85f07f22
 
47b229db
     sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
 
ec5517d5
     /* by default, we output a single frame */
     nb_frames = 1;
 
204c0f48
     *frame_size = 0;
 
9ff261a2
     if(video_sync_method){
d55065a2
         double vdelta = sync_ipts - 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)
7f48bfa1
                 ost->sync_opts= lrintf(sync_ipts);
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) {
ed30e518
             nb_frames_dup += nb_frames - 1;
50c3dd32
             if (verbose>2)
8300609b
                 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
50c3dd32
         }
     }else
47b229db
         ost->sync_opts= lrintf(sync_ipts);
445f1b83
 
72415b2a
     nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
115329f1
     if (nb_frames <= 0)
85f07f22
         return;
ce7c56c2
 
46847a33
     formatted_picture = in_picture;
07d0cdfc
     final_picture = formatted_picture;
 
a851fa7f
 #if !CONFIG_AVFILTER
0f230c53
     resample_changed = ost->resample_width   != dec->width  ||
                        ost->resample_height  != dec->height ||
                        ost->resample_pix_fmt != dec->pix_fmt;
 
     if (resample_changed) {
dfc6f5ae
         av_log(NULL, AV_LOG_INFO,
                "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
d2bc4da1
                ist->file_index, ist->st->index,
94bed8e5
                ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
                dec->width         , dec->height         , av_get_pix_fmt_name(dec->pix_fmt));
f5a669c2
         ost->resample_width   = dec->width;
         ost->resample_height  = dec->height;
         ost->resample_pix_fmt = dec->pix_fmt;
b83ccbff
     }
 
f5a669c2
     ost->video_resample = dec->width   != enc->width  ||
                           dec->height  != enc->height ||
                           dec->pix_fmt != enc->pix_fmt;
 
85f07f22
     if (ost->video_resample) {
2beac7c3
         final_picture = &ost->resample_frame;
f5a669c2
         if (!ost->img_resample_ctx || resample_changed) {
             /* initialize the destination picture */
2beac7c3
             if (!ost->resample_frame.data[0]) {
                 avcodec_get_frame_defaults(&ost->resample_frame);
                 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
f5a669c2
                                     enc->width, enc->height)) {
                     fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
                     ffmpeg_exit(1);
                 }
             }
352666c1
             /* initialize a new scaler context */
             sws_freeContext(ost->img_resample_ctx);
04c373c1
             ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
                                                    enc->width, enc->height, enc->pix_fmt,
b97b4b58
                                                    ost->sws_flags, NULL, NULL, NULL);
352666c1
             if (ost->img_resample_ctx == NULL) {
                 fprintf(stderr, "Cannot get resampling context\n");
639e4ec8
                 ffmpeg_exit(1);
352666c1
             }
         }
18a54b04
         sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
e65ab9d9
               0, ost->resample_height, final_picture->data, final_picture->linesize);
f122deb4
     }
46847a33
 #endif
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);
cc947f04
             pkt.flags |= AV_PKT_FLAG_KEY;
e928649b
 
0b6d358a
             write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
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;
648e55ff
             if (ost->st->codec->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 */
f62c025a
             big_picture.quality = same_quality ? ist->st->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);
4ad08021
             if (ost->forced_kf_index < ost->forced_kf_count &&
                 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
ce5e49b0
                 big_picture.pict_type = AV_PICTURE_TYPE_I;
4ad08021
                 ost->forced_kf_index++;
             }
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");
639e4ec8
                 ffmpeg_exit(1);
4156a436
             }
54e28a85
 
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)
cc947f04
                     pkt.flags |= AV_PKT_FLAG_KEY;
0b6d358a
                 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
e928649b
                 *frame_size = ret;
44eb047a
                 video_size += ret;
54e28a85
                 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
                 //        enc->frame_number-1, ret, enc->pict_type);
e928649b
                 /* 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");
639e4ec8
             ffmpeg_exit(1);
4bd0c2b1
         }
     }
 
01f4895c
     enc = ost->st->codec;
72415b2a
     if (enc->codec_type == AVMEDIA_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);
6209669d
         fprintf(vstats_file, "type= %c\n", av_get_picture_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;
b5ee9c23
     AVFormatContext *oc;
0c1a9eda
     int64_t total_size;
ec5517d5
     AVCodecContext *enc;
     int frame_number, vid, i;
1212d5b5
     double bitrate;
     int64_t pts = INT64_MAX;
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];
 
db44ea96
     total_size = avio_size(oc->pb);
     if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
384c9c2f
         total_size= avio_tell(oc->pb);
115329f1
 
ec5517d5
     buf[0] = '\0';
     vid = 0;
     for(i=0;i<nb_ostreams;i++) {
5da116a3
         float q = -1;
ec5517d5
         ost = ost_table[i];
01f4895c
         enc = ost->st->codec;
5da116a3
         if (!ost->st->stream_copy && enc->coded_frame)
             q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
72415b2a
         if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
6b1c886b
             snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
10d104e4
         }
72415b2a
         if (!vid && enc->codec_type == AVMEDIA_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 ",
6b1c886b
                      frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
890972be
             if(is_last_report)
0ecca7a4
                 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
e6b4e4ff
             if(qp_hist){
0888fd22
                 int j;
5da116a3
                 int qp = lrintf(q);
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 */
1212d5b5
         pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
                                       ost->st->time_base, AV_TIME_BASE_Q));
ec5517d5
     }
115329f1
 
17ee7b55
     if (verbose > 0 || is_last_report) {
dd471070
         int hours, mins, secs, us;
         secs = pts / AV_TIME_BASE;
         us = pts % AV_TIME_BASE;
         mins = secs / 60;
         secs %= 60;
         hours = mins / 60;
         mins %= 60;
 
1212d5b5
         bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
115329f1
 
         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
dd471070
                  "size=%8.0fkB time=", total_size / 1024.0);
         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
                  "%02d:%02d:%02d.%02d ", hours, mins, secs,
                  (100 * us) / AV_TIME_BASE);
         snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
                  "bitrate=%6.1fkbits/s", bitrate);
a6a92a9a
 
0f649d66
         if (nb_frames_dup || nb_frames_drop)
bb270c08
           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
 }
 
14cf0fd2
 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
 {
     int fill_char = 0x00;
     if (sample_fmt == AV_SAMPLE_FMT_U8)
         fill_char = 0x80;
     memset(buf, fill_char, size);
 }
 
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;
ede0e475
     int ret, i;
cb48fdf6
     int got_output;
a700a6ae
     AVFrame picture;
7046b63e
     void *buffer_to_free = NULL;
f038fe8b
     static unsigned int samples_size= 0;
cf7fc795
     AVSubtitle subtitle, *subtitle_to_free;
0ff4f0c0
     int64_t pkt_pts = AV_NOPTS_VALUE;
46847a33
 #if CONFIG_AVFILTER
d21f58b5
     int frame_available;
46847a33
 #endif
 
ede0e475
     AVPacket avpkt;
e6c52cee
     int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
ede0e475
 
ed923859
     if(ist->next_pts == AV_NOPTS_VALUE)
         ist->next_pts= ist->pts;
 
a700a6ae
     if (pkt == NULL) {
         /* EOF handling */
031e14ea
         av_init_packet(&avpkt);
ede0e475
         avpkt.data = NULL;
         avpkt.size = 0;
a700a6ae
         goto handle_eof;
031e14ea
     } else {
         avpkt = *pkt;
a700a6ae
     }
 
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);
0ff4f0c0
     if(pkt->pts != AV_NOPTS_VALUE)
         pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
b1b818fc
 
bd6754aa
     //while we have more to decode or while the decoder did output something on EOF
cb48fdf6
     while (avpkt.size > 0 || (!pkt && got_output)) {
036c1382
         uint8_t *data_buf, *decoded_data_buf;
         int data_size, decoded_data_size;
a700a6ae
     handle_eof:
b1b818fc
         ist->pts= ist->next_pts;
19d5da50
 
d859bb1d
         if(avpkt.size && avpkt.size != pkt->size &&
6e2fdc3e
            ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
40cb57a2
             fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
3ff0daf0
             ist->showed_multi_packet_warning=1;
         }
40cb57a2
 
a700a6ae
         /* decode the packet if needed */
036c1382
         decoded_data_buf = NULL; /* fail safe */
         decoded_data_size= 0;
         data_buf  = avpkt.data;
         data_size = avpkt.size;
cf7fc795
         subtitle_to_free = NULL;
a700a6ae
         if (ist->decoding_needed) {
01f4895c
             switch(ist->st->codec->codec_type) {
72415b2a
             case AVMEDIA_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);
                 }
036c1382
                 decoded_data_size= samples_size;
a700a6ae
                     /* XXX: could avoid copy if PCM 16 bits with same
                        endianness as CPU */
036c1382
                 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
ede0e475
                                             &avpkt);
a700a6ae
                 if (ret < 0)
                     goto fail_decode;
ede0e475
                 avpkt.data += ret;
                 avpkt.size -= ret;
036c1382
                 data_size   = ret;
cb48fdf6
                 got_output  = decoded_data_size > 0;
a700a6ae
                 /* Some bug in mpeg audio decoder gives */
036c1382
                 /* decoded_data_size < 0, it seems they are overflows */
cb48fdf6
                 if (!got_output) {
a700a6ae
                     /* no audio frame */
                     continue;
                 }
036c1382
                 decoded_data_buf = (uint8_t *)samples;
                 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
01f4895c
                     (ist->st->codec->sample_rate * ist->st->codec->channels);
df84ac2e
                 break;}
72415b2a
             case AVMEDIA_TYPE_VIDEO:
036c1382
                     decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
a700a6ae
                     /* XXX: allocate picture correctly */
9740beff
                     avcodec_get_frame_defaults(&picture);
fd0ae17a
                     avpkt.pts = pkt_pts;
                     avpkt.dts = ist->pts;
0ff4f0c0
                     pkt_pts = AV_NOPTS_VALUE;
9740beff
 
ede0e475
                     ret = avcodec_decode_video2(ist->st->codec,
cb48fdf6
                                                 &picture, &got_output, &avpkt);
a700a6ae
                     ist->st->quality= picture.quality;
115329f1
                     if (ret < 0)
a700a6ae
                         goto fail_decode;
cb48fdf6
                     if (!got_output) {
a700a6ae
                         /* no picture yet */
                         goto discard_packet;
                     }
76ad67ca
                     ist->next_pts = ist->pts = picture.best_effort_timestamp;
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
                     }
ede0e475
                     avpkt.size = 0;
7046b63e
                     buffer_to_free = NULL;
                     pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
a700a6ae
                     break;
72415b2a
             case AVMEDIA_TYPE_SUBTITLE:
ede0e475
                 ret = avcodec_decode_subtitle2(ist->st->codec,
cb48fdf6
                                                &subtitle, &got_output, &avpkt);
cf7fc795
                 if (ret < 0)
a700a6ae
                     goto fail_decode;
cb48fdf6
                 if (!got_output) {
cf7fc795
                     goto discard_packet;
a700a6ae
                 }
cf7fc795
                 subtitle_to_free = &subtitle;
ede0e475
                 avpkt.size = 0;
cf7fc795
                 break;
             default:
                 goto fail_decode;
             }
         } else {
bde0705c
             switch(ist->st->codec->codec_type) {
72415b2a
             case AVMEDIA_TYPE_AUDIO:
bde0705c
                 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1c715415
                     ist->st->codec->sample_rate;
bde0705c
                 break;
72415b2a
             case AVMEDIA_TYPE_VIDEO:
bde0705c
                 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
             }
ede0e475
             ret = avpkt.size;
             avpkt.size = 0;
bde0705c
         }
a700a6ae
 
580817df
 #if CONFIG_AVFILTER
         if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
         if (start_time == 0 || ist->pts >= start_time) {
             for(i=0;i<nb_ostreams;i++) {
                 ost = ost_table[i];
                 if (ost->input_video_filter && ost->source_index == ist_index) {
                     if (!picture.sample_aspect_ratio.num)
                         picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
                     picture.pts = ist->pts;
 
                     av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
                 }
             }
         }
 #endif
 
bde0705c
         // preprocess audio (volume)
72415b2a
         if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
bde0705c
             if (audio_volume != 256) {
                 short *volp;
                 volp = samples;
036c1382
                 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
bde0705c
                     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);
         }
         /* 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) {
1762d9ce
 #if CONFIG_AVFILTER
                 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
                     !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
                 while (frame_available) {
44f669e7
                     if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
                         AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
                         if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
6b5e1825
                             goto cont;
44f669e7
                         if (ost->picref) {
                             avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
                             ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
                         }
                     }
1762d9ce
 #endif
bde0705c
                     os = output_files[ost->file_index];
a700a6ae
 
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) {
b926b628
                         av_assert0(ist->decoding_needed);
bde0705c
                         switch(ost->st->codec->codec_type) {
72415b2a
                         case AVMEDIA_TYPE_AUDIO:
036c1382
                             do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
bde0705c
                             break;
72415b2a
                         case AVMEDIA_TYPE_VIDEO:
46847a33
 #if CONFIG_AVFILTER
abf8342a
                             if (ost->picref->video && !ost->frame_aspect_ratio)
35fe66ab
                                 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
46847a33
 #endif
bde0705c
                             do_video_out(os, ost, ist, &picture, &frame_size);
b60d1379
                             if (vstats_filename && frame_size)
bde0705c
                                 do_video_stats(os, ost, frame_size);
                             break;
72415b2a
                         case AVMEDIA_TYPE_SUBTITLE:
bde0705c
                             do_subtitle_out(os, ost, ist, &subtitle,
                                             pkt->pts);
                             break;
                         default:
0f4e8165
                             abort();
bde0705c
                         }
                     } else {
                         AVFrame avframe; //FIXME/XXX remove this
ac41f3b0
                         AVPicture pict;
bde0705c
                         AVPacket opkt;
cdf38a17
                         int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
 
bde0705c
                         av_init_packet(&opkt);
 
cc947f04
                         if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
a7844c58
 #if !CONFIG_AVFILTER
                             continue;
 #else
5c20c81b
                             goto cont;
a7844c58
 #endif
7cacf1e8
 
bde0705c
                         /* no reencoding needed : output the packet directly */
                         /* force the input stream PTS */
 
                         avcodec_get_frame_defaults(&avframe);
                         ost->st->codec->coded_frame= &avframe;
cc947f04
                         avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
bde0705c
 
72415b2a
                         if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
bde0705c
                             audio_size += data_size;
72415b2a
                         else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
bde0705c
                             video_size += data_size;
                             ost->sync_opts++;
                         }
 
                         opkt.stream_index= ost->index;
                         if(pkt->pts != AV_NOPTS_VALUE)
cdf38a17
                             opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
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);
cdf38a17
                         opkt.dts -= ost_tb_start_time;
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
5bfe91e6
                         if(   ost->st->codec->codec_id != CODEC_ID_H264
                            && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
                            && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
                            ) {
cc947f04
                             if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
9f907d85
                                 opkt.destruct= av_destruct_packet;
d310d56a
                         } else {
                             opkt.data = data_buf;
                             opkt.size = data_size;
                         }
bde0705c
 
ac41f3b0
                         if (os->oformat->flags & AVFMT_RAWPICTURE) {
                             /* store AVPicture in AVPacket, as expected by the output format */
                             avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
                             opkt.data = (uint8_t *)&pict;
                             opkt.size = sizeof(AVPicture);
                             opkt.flags |= AV_PKT_FLAG_KEY;
                         }
0b6d358a
                         write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
bde0705c
                         ost->st->codec->frame_number++;
                         ost->frame_number++;
                         av_free_packet(&opkt);
a700a6ae
                     }
1762d9ce
 #if CONFIG_AVFILTER
a7844c58
                     cont:
1762d9ce
                     frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
                                        ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
32881039
                     avfilter_unref_buffer(ost->picref);
1762d9ce
                 }
 #endif
a700a6ae
                 }
bde0705c
             }
46847a33
 
bde0705c
         av_free(buffer_to_free);
         /* XXX: allocate the subtitles in the codec ? */
         if (subtitle_to_free) {
1d6233d3
             avsubtitle_free(subtitle_to_free);
bde0705c
             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
 
72415b2a
                 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
6f824977
                     continue;
72415b2a
                 if(ost->st->codec->codec_type == AVMEDIA_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) {
72415b2a
                         case AVMEDIA_TYPE_AUDIO:
41dd680d
                             fifo_bytes = av_fifo_size(ost->fifo);
cef7cc72
                             ret = 0;
                             /* encode any samples remaining in fifo */
b10d7e4e
                             if (fifo_bytes > 0) {
c445e9dc
                                 int osize = av_get_bytes_per_sample(enc->sample_fmt);
cef7cc72
                                 int fs_tmp = enc->frame_size;
b10d7e4e
 
79c85beb
                                 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
b10d7e4e
                                 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
                                     enc->frame_size = fifo_bytes / (osize * enc->channels);
                                 } else { /* pad */
                                     int frame_bytes = enc->frame_size*osize*enc->channels;
79c85beb
                                     if (allocated_audio_buf_size < frame_bytes)
639e4ec8
                                         ffmpeg_exit(1);
14cf0fd2
                                     generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
b10d7e4e
                                 }
 
79c85beb
                                 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
7c8689ef
                                 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
                                                           ost->st->time_base.num, enc->sample_rate);
cef7cc72
                                 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");
639e4ec8
                                 ffmpeg_exit(1);
528271ff
                             }
6f824977
                             audio_size += ret;
cc947f04
                             pkt.flags |= AV_PKT_FLAG_KEY;
6f824977
                             break;
72415b2a
                         case AVMEDIA_TYPE_VIDEO:
8a6cb114
                             ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
528271ff
                             if (ret < 0) {
                                 fprintf(stderr, "Video encoding failed\n");
639e4ec8
                                 ffmpeg_exit(1);
528271ff
                             }
6f824977
                             video_size += ret;
                             if(enc->coded_frame && enc->coded_frame->key_frame)
cc947f04
                                 pkt.flags |= AV_PKT_FLAG_KEY;
6f824977
                             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);
0b6d358a
                         write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
6f824977
                     }
                 }
             }
         }
     }
115329f1
 
a700a6ae
     return 0;
  fail_decode:
     return -1;
 }
 
6d1ba1ac
 static void print_sdp(AVFormatContext **avc, int n)
 {
     char sdp[2048];
 
c3675dfe
     av_sdp_create(avc, n, sdp, sizeof(sdp));
6d1ba1ac
     printf("SDP:\n%s\n", sdp);
536cd1db
     fflush(stdout);
6d1ba1ac
 }
a700a6ae
 
7a39f142
 static int copy_chapters(int infile, int outfile)
 {
07633154
     AVFormatContext *is = input_files[infile].ctx;
7a39f142
     AVFormatContext *os = output_files[outfile];
     int i;
 
     for (i = 0; i < is->nb_chapters; i++) {
         AVChapter *in_ch = is->chapters[i], *out_ch;
         int64_t ts_off   = av_rescale_q(start_time - input_files_ts_offset[infile],
                                       AV_TIME_BASE_Q, in_ch->time_base);
         int64_t rt       = (recording_time == INT64_MAX) ? INT64_MAX :
                            av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
 
 
         if (in_ch->end < ts_off)
             continue;
         if (rt != INT64_MAX && in_ch->start > rt + ts_off)
             break;
 
         out_ch = av_mallocz(sizeof(AVChapter));
         if (!out_ch)
             return AVERROR(ENOMEM);
 
         out_ch->id        = in_ch->id;
         out_ch->time_base = in_ch->time_base;
         out_ch->start     = FFMAX(0,  in_ch->start - ts_off);
         out_ch->end       = FFMIN(rt, in_ch->end   - ts_off);
 
d0abe80a
         if (metadata_chapters_autocopy)
d2d67e42
             av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
7a39f142
 
         os->nb_chapters++;
         os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
         if (!os->chapters)
             return AVERROR(ENOMEM);
         os->chapters[os->nb_chapters - 1] = out_ch;
     }
     return 0;
 }
 
4ad08021
 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
                                     AVCodecContext *avctx)
 {
     char *p;
     int n = 1, i;
     int64_t t;
 
     for (p = kf; *p; p++)
         if (*p == ',')
             n++;
     ost->forced_kf_count = n;
     ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
     if (!ost->forced_kf_pts) {
         av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
         ffmpeg_exit(1);
     }
     for (i = 0; i < n; i++) {
         p = i ? strchr(p, ',') + 1 : kf;
         t = parse_time_or_die("force_key_frames", p, 1);
         ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
     }
 }
 
85f07f22
 /*
  * The following code is the main loop of the file converter
  */
3aace1bc
 static int transcode(AVFormatContext **output_files,
065a20cb
                      int nb_output_files,
07633154
                      AVInputFile *input_files,
065a20cb
                      int nb_input_files,
                      AVStreamMap *stream_maps, int nb_stream_maps)
85f07f22
 {
bb9b7bc6
     int ret = 0, i, j, k, n, nb_ostreams = 0, step;
39e4206d
 
85f07f22
     AVFormatContext *is, *os;
     AVCodecContext *codec, *icodec;
     AVOutputStream *ost, **ost_table = NULL;
07633154
     AVInputStream *ist;
002c95d7
     char error[1024];
cb09b2ed
     int key;
6d1ba1ac
     int want_sdp = 1;
545465ec
     uint8_t no_packet[MAX_FILES]={0};
     int no_packet_count=0;
b25d931a
     int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
     int nb_streams[AVMEDIA_TYPE_NB]={0};
bdc4796f
 
07633154
     if (rate_emu)
         for (i = 0; i < nb_input_streams; i++)
             input_streams[i].start = av_gettime();
85f07f22
 
     /* output stream init */
     nb_ostreams = 0;
     for(i=0;i<nb_output_files;i++) {
         os = output_files[i];
bb62d5c1
         if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
0ebf4754
             av_dump_format(output_files[i], i, output_files[i]->filename, 1);
fc5d0db5
             fprintf(stderr, "Output file #%d does not contain any stream\n", i);
d62ccec8
             ret = AVERROR(EINVAL);
             goto fail;
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");
d62ccec8
         ret = AVERROR(EINVAL);
         goto fail;
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 ||
08ddfb77
             si < 0 || si > input_files[fi].nb_streams - 1) {
bd073980
             fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
d62ccec8
             ret = AVERROR(EINVAL);
             goto fail;
bd073980
         }
b4a3389e
         fi = stream_maps[i].sync_file_index;
         si = stream_maps[i].sync_stream_index;
         if (fi < 0 || fi > nb_input_files - 1 ||
fa750933
             si < 0 || si > input_files[fi].nb_streams - 1) {
b4a3389e
             fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
d62ccec8
             ret = AVERROR(EINVAL);
             goto fail;
b4a3389e
         }
bd073980
     }
115329f1
 
85f07f22
     ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
     if (!ost_table)
         goto fail;
b25d931a
 
     for(k=0;k<nb_output_files;k++) {
         os = output_files[k];
         for(i=0;i<os->nb_streams;i++,n++) {
             nb_streams[os->streams[i]->codec->codec_type]++;
         }
     }
     for(step=1<<30; step; step>>=1){
         int found_streams[AVMEDIA_TYPE_NB]={0};
         for(j=0; j<AVMEDIA_TYPE_NB; j++)
             nb_frame_threshold[j] += step;
 
39e4206d
         for(j=0; j<nb_input_streams; j++) {
b25d931a
             int skip=0;
39e4206d
             ist = &input_streams[j];
b25d931a
             if(opt_programid){
                 int pi,si;
39e4206d
                 AVFormatContext *f= input_files[ ist->file_index ].ctx;
b25d931a
                 skip=1;
                 for(pi=0; pi<f->nb_programs; pi++){
                     AVProgram *p= f->programs[pi];
                     if(p->id == opt_programid)
                         for(si=0; si<p->nb_stream_indexes; si++){
                             if(f->streams[ p->stream_index[si] ] == ist->st)
                                 skip=0;
                         }
                 }
             }
             if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
                 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
                 found_streams[ist->st->codec->codec_type]++;
             }
         }
         for(j=0; j<AVMEDIA_TYPE_NB; j++)
             if(found_streams[j] < nb_streams[j])
                 nb_frame_threshold[j] -= step;
     }
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;
9fdf4b58
             ost = ost_table[n] = output_streams_for_file[k][i];
85f07f22
             ost->st = os->streams[i];
             if (nb_stream_maps > 0) {
07633154
                 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
de427ff4
                     stream_maps[n].stream_index;
115329f1
 
bd073980
                 /* Sanity check that the stream types match */
07633154
                 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
150d5a25
                     int i= ost->file_index;
0ebf4754
                     av_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);
639e4ec8
                     ffmpeg_exit(1);
bd073980
                 }
115329f1
 
85f07f22
             } else {
3f1710e7
                 /* get corresponding input stream index : we select the first one with the right type */
                 found = 0;
07633154
                 for (j = 0; j < nb_input_streams; j++) {
3f1710e7
                     int skip=0;
07633154
                     ist = &input_streams[j];
3f1710e7
                     if(opt_programid){
                         int pi,si;
07633154
                         AVFormatContext *f = input_files[ist->file_index].ctx;
3f1710e7
                         skip=1;
                         for(pi=0; pi<f->nb_programs; pi++){
                             AVProgram *p= f->programs[pi];
                             if(p->id == opt_programid)
                                 for(si=0; si<p->nb_stream_indexes; si++){
                                     if(f->streams[ p->stream_index[si] ] == ist->st)
                                         skip=0;
                                 }
6d3d3b83
                         }
3f1710e7
                     }
                     if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
b25d931a
                         ist->st->codec->codec_type == ost->st->codec->codec_type &&
                         nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
3f1710e7
                             ost->source_index = j;
                             found = 1;
b25d931a
                             break;
85f07f22
                     }
3f1710e7
                 }
a15bc651
 
                 if (!found) {
                     if(! opt_programid) {
                         /* try again and reuse existing stream */
07633154
                         for (j = 0; j < nb_input_streams; j++) {
                             ist = &input_streams[j];
6d3d3b83
                             if (   ist->st->codec->codec_type == ost->st->codec->codec_type
                                 && ist->st->discard != AVDISCARD_ALL) {
a15bc651
                                 ost->source_index = j;
                                 found = 1;
                             }
                         }
50e143c4
                     }
85f07f22
                     if (!found) {
462cca10
                         int i= ost->file_index;
0ebf4754
                         av_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);
639e4ec8
                         ffmpeg_exit(1);
85f07f22
                     }
                 }
             }
07633154
             ist = &input_streams[ost->source_index];
85f07f22
             ist->discard = 0;
b4a3389e
             ost->sync_ist = (nb_stream_maps > 0) ?
07633154
                 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
de427ff4
                          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++) {
         ost = ost_table[i];
365515ac
         os = output_files[ost->file_index];
07633154
         ist = &input_streams[ost->source_index];
85f07f22
 
01f4895c
         codec = ost->st->codec;
         icodec = ist->st->codec;
85f07f22
 
d0abe80a
         if (metadata_streams_autocopy)
d2d67e42
             av_dict_copy(&ost->st->metadata, ist->st->metadata,
                          AV_DICT_DONT_OVERWRITE);
8e0d882b
 
90c2295b
         ost->st->disposition = ist->st->disposition;
a39b76ea
         codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
de961801
         codec->chroma_sample_location = icodec->chroma_sample_location;
90c2295b
 
1629626f
         if (ost->st->stream_copy) {
b659c8b4
             uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
 
             if (extra_size > INT_MAX)
                 goto fail;
 
1629626f
             /* 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
37ce3d6b
                    || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
365515ac
                    || 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;
2dec2bb8
             codec->rc_max_rate    = icodec->rc_max_rate;
             codec->rc_buffer_size = icodec->rc_buffer_size;
b659c8b4
             codec->extradata= av_mallocz(extra_size);
             if (!codec->extradata)
                 goto fail;
             memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
dffbfd06
             codec->extradata_size= icodec->extradata_size;
59e2118e
             if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
d29de719
                 codec->time_base = icodec->time_base;
3797c74b
                 codec->time_base.num *= icodec->ticks_per_frame;
8abcbf2d
                 av_reduce(&codec->time_base.num, &codec->time_base.den,
                           codec->time_base.num, codec->time_base.den, INT_MAX);
3797c74b
             }else
d29de719
                 codec->time_base = ist->st->time_base;
1629626f
             switch(codec->codec_type) {
72415b2a
             case AVMEDIA_TYPE_AUDIO:
d08e3e91
                 if(audio_volume != 256) {
                     fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
639e4ec8
                     ffmpeg_exit(1);
d08e3e91
                 }
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;
34b47d7c
                 codec->audio_service_type = icodec->audio_service_type;
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;
72415b2a
             case AVMEDIA_TYPE_VIDEO:
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;
abf8342a
                 if (!codec->sample_aspect_ratio.num) {
                     codec->sample_aspect_ratio =
                     ost->st->sample_aspect_ratio =
                         ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
                         ist->st->codec->sample_aspect_ratio.num ?
                         ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
                 }
1629626f
                 break;
72415b2a
             case AVMEDIA_TYPE_SUBTITLE:
d43b26ea
                 codec->width = icodec->width;
                 codec->height = icodec->height;
cf7fc795
                 break;
e3b540b4
             case AVMEDIA_TYPE_DATA:
                 break;
1629626f
             default:
0f4e8165
                 abort();
1629626f
             }
         } else {
62940bb4
             if (!ost->enc)
                 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1629626f
             switch(codec->codec_type) {
72415b2a
             case AVMEDIA_TYPE_AUDIO:
41dd680d
                 ost->fifo= av_fifo_alloc(1024);
                 if(!ost->fifo)
85f07f22
                     goto fail;
5d6e4c16
                 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
d7ee4402
                 if (!codec->sample_rate) {
                     codec->sample_rate = icodec->sample_rate;
                     if (icodec->lowres)
                         codec->sample_rate >>= icodec->lowres;
                 }
62940bb4
                 choose_sample_rate(ost->st, ost->enc);
d7ee4402
                 codec->time_base = (AVRational){1, codec->sample_rate};
8f3e9997
                 if (!codec->channels)
                     codec->channels = icodec->channels;
                 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
                     codec->channel_layout = 0;
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;
8afab686
                 ost->resample_sample_fmt  = icodec->sample_fmt;
                 ost->resample_sample_rate = icodec->sample_rate;
                 ost->resample_channels    = icodec->channels;
1629626f
                 break;
72415b2a
             case AVMEDIA_TYPE_VIDEO:
10de86b8
                 if (codec->pix_fmt == PIX_FMT_NONE)
                     codec->pix_fmt = icodec->pix_fmt;
                 choose_pixel_fmt(ost->st, ost->enc);
 
761c8c92
                 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
562f22a6
                     fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
639e4ec8
                     ffmpeg_exit(1);
761c8c92
                 }
20829cf8
 
                 if (!codec->width || !codec->height) {
                     codec->width  = icodec->width;
                     codec->height = icodec->height;
                 }
 
c438c907
                 ost->video_resample = codec->width   != icodec->width  ||
                                       codec->height  != icodec->height ||
                                       codec->pix_fmt != icodec->pix_fmt;
c3f11d19
                 if (ost->video_resample) {
100a6b7c
                     codec->bits_per_raw_sample= frame_bits_per_raw_sample;
85f07f22
                 }
20829cf8
 
5879ea6d
                 ost->resample_height = icodec->height;
                 ost->resample_width  = icodec->width;
b83ccbff
                 ost->resample_pix_fmt= icodec->pix_fmt;
85f07f22
                 ost->encoding_needed = 1;
                 ist->decoding_needed = 1;
46847a33
 
a6286bda
                 if (!ost->frame_rate.num)
                     ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
62940bb4
                 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
                     int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
                     ost->frame_rate = ost->enc->supported_framerates[idx];
a6286bda
                 }
                 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
cfbaeb31
                 if(   av_q2d(codec->time_base) < 0.001 && video_sync_method
                    && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
                     av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
                                                "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
                 }
a6286bda
 
46847a33
 #if CONFIG_AVFILTER
5381823e
                 if (configure_video_filters(ist, ost)) {
46847a33
                     fprintf(stderr, "Error opening filters!\n");
                     exit(1);
                 }
 #endif
1629626f
                 break;
72415b2a
             case AVMEDIA_TYPE_SUBTITLE:
cf7fc795
                 ost->encoding_needed = 1;
                 ist->decoding_needed = 1;
                 break;
1629626f
             default:
0f4e8165
                 abort();
cf7fc795
                 break;
85f07f22
             }
1629626f
             /* two pass mode */
2c18893a
             if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
1629626f
                 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
                 char logfilename[1024];
                 FILE *f;
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) {
c56e9e05
                     f = fopen(logfilename, "wb");
1629626f
                     if (!f) {
42d1d06e
                         fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
639e4ec8
                         ffmpeg_exit(1);
1629626f
                     }
                     ost->logfile = f;
                 } else {
458b062d
                     char  *logbuffer;
                     size_t logbuffer_size;
                     if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
                         fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
639e4ec8
                         ffmpeg_exit(1);
1629626f
                     }
                     codec->stats_in = logbuffer;
5abdb4b1
                 }
             }
         }
72415b2a
         if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
6109974c
             /* maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)*/
8a6cb114
             int size= codec->width * codec->height;
6109974c
             bit_buffer_size= FFMAX(bit_buffer_size, 7*size + 10000);
8a6cb114
         }
85f07f22
     }
 
8a6cb114
     if (!bit_buffer)
         bit_buffer = av_malloc(bit_buffer_size);
002c95d7
     if (!bit_buffer) {
50f3fabc
         fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
                 bit_buffer_size);
002c95d7
         ret = AVERROR(ENOMEM);
8a6cb114
         goto fail;
1629626f
     }
 
85f07f22
     /* open each encoder */
     for(i=0;i<nb_ostreams;i++) {
         ost = ost_table[i];
         if (ost->encoding_needed) {
9446d759
             AVCodec *codec = ost->enc;
07633154
             AVCodecContext *dec = input_streams[ost->source_index].st->codec;
85f07f22
             if (!codec) {
f356fc57
                 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
                          ost->st->codec->codec_id, ost->file_index, ost->index);
002c95d7
                 ret = AVERROR(EINVAL);
                 goto dump_format;
85f07f22
             }
cb2c971d
             if (dec->subtitle_header) {
                 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
                 if (!ost->st->codec->subtitle_header) {
                     ret = AVERROR(ENOMEM);
                     goto dump_format;
                 }
                 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
                 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
             }
01f4895c
             if (avcodec_open(ost->st->codec, codec) < 0) {
f356fc57
                 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
85f07f22
                         ost->file_index, ost->index);
002c95d7
                 ret = AVERROR(EINVAL);
                 goto dump_format;
85f07f22
             }
01f4895c
             extra_size += ost->st->codec->extradata_size;
85f07f22
         }
     }
 
     /* open each decoder */
07633154
     for (i = 0; i < nb_input_streams; i++) {
         ist = &input_streams[i];
85f07f22
         if (ist->decoding_needed) {
311e223f
             AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
6488cf9b
             if (!codec)
fd2b356a
                 codec = avcodec_find_decoder(ist->st->codec->codec_id);
85f07f22
             if (!codec) {
f356fc57
                 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
d2bc4da1
                         ist->st->codec->codec_id, ist->file_index, ist->st->index);
002c95d7
                 ret = AVERROR(EINVAL);
                 goto dump_format;
85f07f22
             }
01f4895c
             if (avcodec_open(ist->st->codec, codec) < 0) {
f356fc57
                 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
d2bc4da1
                         ist->file_index, ist->st->index);
002c95d7
                 ret = AVERROR(EINVAL);
                 goto dump_format;
85f07f22
             }
72415b2a
             //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
01f4895c
             //    ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
85f07f22
         }
     }
 
     /* init pts */
07633154
     for (i = 0; i < nb_input_streams; i++) {
b8c93c48
         AVStream *st;
07633154
         ist = &input_streams[i];
b8c93c48
         st= ist->st;
         ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
48291040
         ist->next_pts = AV_NOPTS_VALUE;
ff4905a5
         ist->is_start = 1;
85f07f22
     }
c5e1e982
 
0a38bafd
     /* set meta data information from input file if required */
     for (i=0;i<nb_meta_data_maps;i++) {
1829e195
         AVFormatContext *files[2];
d2d67e42
         AVDictionary    **meta[2];
1829e195
         int j;
0a38bafd
 
1829e195
 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
         if ((index) < 0 || (index) >= (nb_elems)) {\
             snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
                      (desc), (index));\
             ret = AVERROR(EINVAL);\
             goto dump_format;\
115329f1
         }
 
1829e195
         int out_file_index = meta_data_maps[i][0].file;
         int in_file_index = meta_data_maps[i][1].file;
7b393736
         if (in_file_index < 0 || out_file_index < 0)
             continue;
1829e195
         METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
         METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
0a38bafd
 
1829e195
         files[0] = output_files[out_file_index];
07633154
         files[1] = input_files[in_file_index].ctx;
1829e195
 
         for (j = 0; j < 2; j++) {
             AVMetaDataMap *map = &meta_data_maps[i][j];
 
             switch (map->type) {
             case 'g':
                 meta[j] = &files[j]->metadata;
                 break;
             case 's':
                 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
                 meta[j] = &files[j]->streams[map->index]->metadata;
                 break;
             case 'c':
                 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
                 meta[j] = &files[j]->chapters[map->index]->metadata;
                 break;
             case 'p':
                 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
                 meta[j] = &files[j]->programs[map->index]->metadata;
                 break;
             }
         }
a5926d85
 
d2d67e42
         av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
0a38bafd
     }
115329f1
 
477b1aea
     /* copy global metadata by default */
     if (metadata_global_autocopy) {
 
8e8a3cc2
         for (i = 0; i < nb_output_files; i++)
d2d67e42
             av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
                          AV_DICT_DONT_OVERWRITE);
477b1aea
     }
 
91e96eba
     /* copy chapters according to chapter maps */
     for (i = 0; i < nb_chapter_maps; i++) {
         int infile  = chapter_maps[i].in_file;
         int outfile = chapter_maps[i].out_file;
 
         if (infile < 0 || outfile < 0)
             continue;
         if (infile >= nb_input_files) {
             snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
             ret = AVERROR(EINVAL);
             goto dump_format;
         }
         if (outfile >= nb_output_files) {
             snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
             ret = AVERROR(EINVAL);
             goto dump_format;
         }
         copy_chapters(infile, outfile);
     }
 
7a39f142
     /* copy chapters from the first input file that has them*/
91e96eba
     if (!nb_chapter_maps)
a9c2bf9d
         for (i = 0; i < nb_input_files; i++) {
07633154
             if (!input_files[i].ctx->nb_chapters)
a9c2bf9d
                 continue;
7a39f142
 
a9c2bf9d
             for (j = 0; j < nb_output_files; j++)
                 if ((ret = copy_chapters(i, j)) < 0)
                     goto dump_format;
09f47fa4
             break;
a9c2bf9d
         }
7a39f142
 
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) {
002c95d7
             snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
8fa36ae0
             ret = AVERROR(EINVAL);
002c95d7
             goto dump_format;
a38469e1
         }
6d1ba1ac
         if (strcmp(output_files[i]->oformat->name, "rtp")) {
             want_sdp = 0;
         }
     }
002c95d7
 
  dump_format:
     /* dump the file output parameters - cannot be done before in case
        of stream copy */
     for(i=0;i<nb_output_files;i++) {
0ebf4754
         av_dump_format(output_files[i], i, output_files[i]->filename, 1);
002c95d7
     }
 
     /* dump the stream mapping */
     if (verbose >= 0) {
         fprintf(stderr, "Stream mapping:\n");
         for(i=0;i<nb_ostreams;i++) {
             ost = ost_table[i];
             fprintf(stderr, "  Stream #%d.%d -> #%d.%d",
07633154
                     input_streams[ost->source_index].file_index,
                     input_streams[ost->source_index].st->index,
002c95d7
                     ost->file_index,
                     ost->index);
07633154
             if (ost->sync_ist != &input_streams[ost->source_index])
002c95d7
                 fprintf(stderr, " [sync #%d.%d]",
                         ost->sync_ist->file_index,
d2bc4da1
                         ost->sync_ist->st->index);
002c95d7
             fprintf(stderr, "\n");
         }
     }
 
     if (ret) {
         fprintf(stderr, "%s\n", error);
         goto fail;
     }
 
6d1ba1ac
     if (want_sdp) {
         print_sdp(output_files, nb_output_files);
85f07f22
     }
 
90552407
     if (!using_stdin) {
         if(verbose >= 0)
34e83808
             fprintf(stderr, "Press [q] to stop, [?] for help\n");
80c6e238
         avio_set_interrupt_cb(decode_interrupt_cb);
b51469a0
     }
a38469e1
     term_init();
 
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;
0f6a8579
             if (key == '+') verbose++;
             if (key == '-') verbose--;
             if (key == 's') qp_hist     ^= 1;
             if (key == 'h'){
                 if (do_hex_dump){
                     do_hex_dump = do_pkt_dump = 0;
                 } else if(do_pkt_dump){
                     do_hex_dump = 1;
                 } else
                     do_pkt_dump = 1;
                 av_log_set_level(AV_LOG_DEBUG);
             }
90bb2c78
             if (key == 'd' || key == 'D'){
                 int debug=0;
                 if(key == 'D') {
39e4206d
                     debug = input_streams[0].st->codec->debug<<1;
90bb2c78
                     if(!debug) debug = 1;
                     while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
                         debug += debug;
                 }else
                     scanf("%d", &debug);
39e4206d
                 for(i=0;i<nb_input_streams;i++) {
                     input_streams[i].st->codec->debug = debug;
90bb2c78
                 }
                 for(i=0;i<nb_ostreams;i++) {
                     ost = ost_table[i];
                     ost->st->codec->debug = debug;
                 }
                 if(debug) av_log_set_level(AV_LOG_DEBUG);
                 fprintf(stderr,"debug=%d\n", debug);
             }
34e83808
             if (key == '?'){
                 fprintf(stderr, "key    function\n"
                                 "?      show this help\n"
                                 "+      increase verbosity\n"
                                 "-      decrease verbosity\n"
90bb2c78
                                 "D      cycle through available debug modes\n"
34e83808
                                 "h      dump packets/hex press to cycle through the 3 states\n"
                                 "q      quit\n"
                                 "s      Show QP histogram\n"
                 );
             }
cb09b2ed
         }
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];
07633154
             ist = &input_streams[ost->source_index];
55a7e946
             if(ist->is_past_recording_time || no_packet[ist->file_index])
545465ec
                 continue;
c0df9d75
                 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
23ffe323
             ipts = (double)ist->pts;
07633154
             if (!input_files[ist->file_index].eof_reached){
23ffe323
                 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) {
545465ec
             if(no_packet_count){
                 no_packet_count=0;
                 memset(no_packet, 0, sizeof(no_packet));
d61f30a7
                 usleep(10000);
545465ec
                 continue;
             }
85f07f22
             break;
ec5517d5
         }
 
b6e16b86
         /* finish if limit size exhausted */
384c9c2f
         if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
b6e16b86
             break;
 
254abc2e
         /* read a frame from it and output it in the fifo */
07633154
         is = input_files[file_index].ctx;
ad51c68c
         ret= av_read_frame(is, &pkt);
b9edbe99
         if(ret == AVERROR(EAGAIN)){
545465ec
             no_packet[file_index]=1;
             no_packet_count++;
ad51c68c
             continue;
545465ec
         }
ad51c68c
         if (ret < 0) {
07633154
             input_files[file_index].eof_reached = 1;
d24ce947
             if (opt_shortest)
                 break;
             else
                 continue;
85f07f22
         }
303e50e6
 
545465ec
         no_packet_count=0;
         memset(no_packet, 0, sizeof(no_packet));
 
254abc2e
         if (do_pkt_dump) {
d34ffd3c
             av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
                              is->streams[pkt.stream_index]);
817b23ff
         }
79fdaa4c
         /* the following test is needed in case new streams appear
            dynamically in stream : we ignore them */
08ddfb77
         if (pkt.stream_index >= input_files[file_index].nb_streams)
bf5af568
             goto discard_packet;
07633154
         ist_index = input_files[file_index].ist_index + pkt.stream_index;
         ist = &input_streams[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);
 
2c6958aa
         if (pkt.stream_index < nb_input_files_ts_scale[file_index]
             && input_files_ts_scale[file_index][pkt.stream_index]){
8833f375
             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
             }
         }
 
f8ccf720
         /* finish if recording time exhausted */
6abda15f
         if (recording_time != INT64_MAX &&
39dbe9b6
             (pkt.pts != AV_NOPTS_VALUE ?
eeaba924
                 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
                     :
                 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
             )>= 0) {
55a7e946
             ist->is_past_recording_time = 1;
f8ccf720
             goto discard_packet;
55a7e946
         }
f8ccf720
 
d2bc4da1
         //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->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",
d2bc4da1
                         ist->file_index, ist->st->index);
f2abc559
             if (exit_on_error)
639e4ec8
                 ffmpeg_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 */
07633154
     for (i = 0; i < nb_input_streams; i++) {
         ist = &input_streams[i];
a700a6ae
         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
         }
1762d9ce
 #if CONFIG_AVFILTER
         avfilter_graph_free(&ost->graph);
 #endif
85f07f22
     }
115329f1
 
85f07f22
     /* close each decoder */
07633154
     for (i = 0; i < nb_input_streams; i++) {
         ist = &input_streams[i];
85f07f22
         if (ist->decoding_needed) {
01f4895c
             avcodec_close(ist->st->codec);
85f07f22
         }
     }
 
     /* finished ! */
00b7fbdc
     ret = 0;
115329f1
 
002c95d7
  fail:
83b07470
     av_freep(&bit_buffer);
bdc4796f
 
85f07f22
     if (ost_table) {
         for(i=0;i<nb_ostreams;i++) {
             ost = ost_table[i];
             if (ost) {
b659c8b4
                 if (ost->st->stream_copy)
                     av_freep(&ost->st->codec->extradata);
5abdb4b1
                 if (ost->logfile) {
                     fclose(ost->logfile);
                     ost->logfile = NULL;
                 }
41dd680d
                 av_fifo_free(ost->fifo); /* works even if fifo is not
f5a478f6
                                              initialized but set to zero */
cb2c971d
                 av_freep(&ost->st->codec->subtitle_header);
2beac7c3
                 av_free(ost->resample_frame.data[0]);
4ad08021
                 av_free(ost->forced_kf_pts);
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;
 }
 
eb8bc572
 static int opt_format(const char *opt, const char *arg)
85f07f22
 {
a5abfd8f
     last_asked_format = arg;
eb8bc572
     return 0;
85f07f22
 }
 
eb8bc572
 static int opt_video_rc_override_string(const char *opt, const char *arg)
ac2830ec
 {
     video_rc_override_string = arg;
eb8bc572
     return 0;
ac2830ec
 }
 
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);
c48da33c
     return 0;
f068206e
 }
 
2fc3866d
 static int opt_frame_rate(const char *opt, const char *arg)
85f07f22
 {
126b638e
     if (av_parse_video_rate(&frame_rate, arg) < 0) {
2fc3866d
         fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
639e4ec8
         ffmpeg_exit(1);
445f1b83
     }
2fc3866d
     return 0;
85f07f22
 }
 
ebde2a2c
 static int opt_bitrate(const char *opt, const char *arg)
1b1656c6
 {
72415b2a
     int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
1b1656c6
 
     opt_default(opt, arg);
 
636f1c4c
     if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
1b1656c6
         fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
ebde2a2c
 
     return 0;
1b1656c6
 }
 
5879ea6d
 static int opt_frame_crop(const char *opt, const char *arg)
ab6d194a
 {
5879ea6d
     fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
     return AVERROR(EINVAL);
ab6d194a
 }
 
eb8bc572
 static int opt_frame_size(const char *opt, const char *arg)
85f07f22
 {
126b638e
     if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
85f07f22
         fprintf(stderr, "Incorrect frame size\n");
eb8bc572
         return AVERROR(EINVAL);
85f07f22
     }
eb8bc572
     return 0;
85f07f22
 }
 
9f434b65
 static int opt_pad(const char *opt, const char *arg) {
     fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
     return -1;
1ff93ffc
 }
 
eb8bc572
 static int opt_frame_pix_fmt(const char *opt, const char *arg)
63167088
 {
90da2b50
     if (strcmp(arg, "list")) {
718c7b18
         frame_pix_fmt = av_get_pix_fmt(arg);
90da2b50
         if (frame_pix_fmt == PIX_FMT_NONE) {
             fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
eb8bc572
             return AVERROR(EINVAL);
90da2b50
         }
     } else {
7d704f51
         opt_pix_fmts(NULL, NULL);
639e4ec8
         ffmpeg_exit(0);
c3b95b1d
     }
eb8bc572
     return 0;
63167088
 }
 
eb8bc572
 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
5fe03e38
 {
     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");
eb8bc572
         return AVERROR(EINVAL);
5fe03e38
     }
     frame_aspect_ratio = ar;
eb8bc572
     return 0;
5fe03e38
 }
 
a5926d85
 static int opt_metadata(const char *opt, const char *arg)
 {
     char *mid= strchr(arg, '=');
 
     if(!mid){
         fprintf(stderr, "Missing =\n");
639e4ec8
         ffmpeg_exit(1);
a5926d85
     }
     *mid++= 0;
 
d2d67e42
     av_dict_set(&metadata, arg, mid, 0);
a5926d85
 
     return 0;
 }
 
bdf3d3bf
 static int opt_qscale(const char *opt, const char *arg)
85f07f22
 {
bdf3d3bf
     video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
     if (video_qscale <= 0 || video_qscale > 255) {
4e64bead
         fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
bdf3d3bf
         return AVERROR(EINVAL);
85f07f22
     }
bdf3d3bf
     return 0;
85f07f22
 }
 
bdf3d3bf
 static int opt_top_field_first(const char *opt, const char *arg)
bb198e19
 {
bdf3d3bf
     top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
9763420b
     opt_default(opt, arg);
bdf3d3bf
     return 0;
bb198e19
 }
 
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
 }
 
eb8bc572
 static int opt_audio_sample_fmt(const char *opt, const char *arg)
ce1ee094
 {
6c18f1cd
     if (strcmp(arg, "list")) {
ba7d6e79
         audio_sample_fmt = av_get_sample_fmt(arg);
6c18f1cd
         if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
             av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
eb8bc572
             return AVERROR(EINVAL);
6c18f1cd
         }
     } else {
0c55c6d3
         int i;
         char fmt_str[128];
         for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
             printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
639e4ec8
         ffmpeg_exit(0);
ce1ee094
     }
eb8bc572
     return 0;
ce1ee094
 }
 
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
 }
 
bdf3d3bf
 static int opt_video_channel(const char *opt, const char *arg)
a5df11ab
 {
bdf3d3bf
     video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
     return 0;
a5df11ab
 }
 
eb8bc572
 static int opt_video_standard(const char *opt, const char *arg)
e3ee3283
 {
     video_standard = av_strdup(arg);
eb8bc572
     return 0;
e3ee3283
 }
 
f712f6c8
 static int opt_codec(const char *opt, const char *arg)
85f07f22
 {
f712f6c8
     int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
 
     if      (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy;    pcodec_name = &audio_codec_name;    codec_type = AVMEDIA_TYPE_AUDIO;    }
     else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy;    pcodec_name = &video_codec_name;    codec_type = AVMEDIA_TYPE_VIDEO;    }
     else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
     else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy;     pcodec_name = &data_codec_name;     codec_type = AVMEDIA_TYPE_DATA;     }
 
4a897224
     av_freep(pcodec_name);
1629626f
     if (!strcmp(arg, "copy")) {
cf7fc795
         *pstream_copy = 1;
85f07f22
     } else {
4a897224
         *pcodec_name = av_strdup(arg);
85f07f22
     }
eb8bc572
     return 0;
85f07f22
 }
 
0d0778b0
 static int opt_codec_tag(const char *opt, const char *arg)
27ad7d3a
 {
     char *tail;
d0242e74
     uint32_t *codec_tag;
 
     codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
                 !strcmp(opt, "vtag") ? &video_codec_tag :
                 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
0d0778b0
     if (!codec_tag)
         return -1;
27ad7d3a
 
d0242e74
     *codec_tag = strtol(arg, &tail, 0);
     if (!tail || *tail)
2839dc97
         *codec_tag = AV_RL32(arg);
0d0778b0
 
     return 0;
27ad7d3a
 }
 
eb8bc572
 static int opt_map(const char *opt, const char *arg)
85f07f22
 {
     AVStreamMap *m;
815f98cc
     char *p;
85f07f22
 
3a8e8824
     stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
     m = &stream_maps[nb_stream_maps-1];
85f07f22
 
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;
     }
eb8bc572
     return 0;
85f07f22
 }
 
c961fb3c
 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
1829e195
 {
     *endptr = arg;
     if (*arg == ',') {
         *type = *(++arg);
         switch (*arg) {
         case 'g':
             break;
         case 's':
         case 'c':
         case 'p':
             *index = strtol(++arg, endptr, 0);
             break;
         default:
             fprintf(stderr, "Invalid metadata type %c.\n", *arg);
             ffmpeg_exit(1);
         }
     } else
         *type = 'g';
 }
 
eb8bc572
 static int opt_map_metadata(const char *opt, const char *arg)
0a38bafd
 {
1829e195
     AVMetaDataMap *m, *m1;
815f98cc
     char *p;
115329f1
 
63e856df
     meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
                                 &nb_meta_data_maps, nb_meta_data_maps + 1);
0a38bafd
 
1829e195
     m = &meta_data_maps[nb_meta_data_maps - 1][0];
     m->file = strtol(arg, &p, 0);
     parse_meta_type(p, &m->type, &m->index, &p);
0a38bafd
     if (*p)
         p++;
 
1829e195
     m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
     m1->file = strtol(p, &p, 0);
     parse_meta_type(p, &m1->type, &m1->index, &p);
d0abe80a
 
477b1aea
     if (m->type == 'g' || m1->type == 'g')
         metadata_global_autocopy = 0;
d0abe80a
     if (m->type == 's' || m1->type == 's')
         metadata_streams_autocopy = 0;
     if (m->type == 'c' || m1->type == 'c')
         metadata_chapters_autocopy = 0;
eb8bc572
 
     return 0;
0a38bafd
 }
 
eb8bc572
 static int opt_map_meta_data(const char *opt, const char *arg)
4a908866
 {
     fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
                     "Use -map_metadata instead.\n");
eb8bc572
     return opt_map_metadata(opt, arg);
4a908866
 }
 
eb8bc572
 static int opt_map_chapters(const char *opt, const char *arg)
91e96eba
 {
     AVChapterMap *c;
     char *p;
 
     chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
                               nb_chapter_maps + 1);
     c = &chapter_maps[nb_chapter_maps - 1];
     c->out_file = strtol(arg, &p, 0);
     if (*p)
         p++;
 
     c->in_file = strtol(p, &p, 0);
eb8bc572
     return 0;
91e96eba
 }
 
eb8bc572
 static int opt_input_ts_scale(const char *opt, const char *arg)
8833f375
 {
     unsigned int stream;
     double scale;
     char *p;
 
     stream = strtol(arg, &p, 0);
     if (*p)
         p++;
     scale= strtod(p, &p);
 
     if(stream >= MAX_STREAMS)
639e4ec8
         ffmpeg_exit(1);
8833f375
 
2c6958aa
     input_files_ts_scale[nb_input_files] = grow_array(input_files_ts_scale[nb_input_files], sizeof(*input_files_ts_scale[nb_input_files]), &nb_input_files_ts_scale[nb_input_files], stream + 1);
8833f375
     input_files_ts_scale[nb_input_files][stream]= scale;
eb8bc572
     return 0;
8833f375
 }
 
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
 }
 
25d34458
 static int opt_recording_timestamp(const char *opt, const char *arg)
4568325a
 {
25d34458
     recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
b19221c8
     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
 }
 
4e605bc3
 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
4a897224
 {
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);
639e4ec8
         ffmpeg_exit(1);
4a897224
     }
     if(codec->type != type) {
49a06a4d
         fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
639e4ec8
         ffmpeg_exit(1);
4a897224
     }
4e605bc3
     if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
        strict > FF_COMPLIANCE_EXPERIMENTAL) {
         fprintf(stderr, "%s '%s' is experimental and might produce bad "
                 "results.\nAdd '-strict experimental' if you want to use it.\n",
                 codec_string, codec->name);
770e50ae
         codec = encoder ?
             avcodec_find_encoder(codec->id) :
             avcodec_find_decoder(codec->id);
         if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
             fprintf(stderr, "Or use the non experimental %s '%s'.\n",
                     codec_string, codec->name);
639e4ec8
         ffmpeg_exit(1);
4e605bc3
     }
4a897224
     return codec->id;
 }
 
eb8bc572
 static int opt_input_file(const char *opt, const char *filename)
85f07f22
 {
     AVFormatContext *ic;
     AVFormatParameters params, *ap = &params;
a5abfd8f
     AVInputFormat *file_iformat = NULL;
14bea432
     int err, i, ret, rfps, rfps_base;
bd1b79a1
     int64_t timestamp;
85f07f22
 
a5abfd8f
     if (last_asked_format) {
8c8bf9ec
         if (!(file_iformat = av_find_input_format(last_asked_format))) {
             fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
639e4ec8
             ffmpeg_exit(1);
8c8bf9ec
         }
a5abfd8f
         last_asked_format = NULL;
     }
 
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();
7ef61879
     if (!ic) {
         print_error(filename, AVERROR(ENOMEM));
639e4ec8
         ffmpeg_exit(1);
7ef61879
     }
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;
0c22311b
     ap->width = frame_width;
     ap->height = frame_height;
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;
79fdaa4c
 
0093ebc2
     set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
62600469
 
4e605bc3
     ic->video_codec_id   =
         find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0,
                           avcodec_opts[AVMEDIA_TYPE_VIDEO   ]->strict_std_compliance);
     ic->audio_codec_id   =
         find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0,
                           avcodec_opts[AVMEDIA_TYPE_AUDIO   ]->strict_std_compliance);
     ic->subtitle_codec_id=
         find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
                           avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
fa119522
     ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
62600469
 
79fdaa4c
     /* open the input file with generic libav function */
     err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
fa119522
     if(err >= 0){
         set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
         err = av_demuxer_open(ic, ap);
         if(err < 0)
             avformat_free_context(ic);
     }
85f07f22
     if (err < 0) {
79fdaa4c
         print_error(filename, err);
639e4ec8
         ffmpeg_exit(1);
85f07f22
     }
50e143c4
     if(opt_programid) {
6d3d3b83
         int i, j;
         int found=0;
         for(i=0; i<ic->nb_streams; i++){
             ic->streams[i]->discard= AVDISCARD_ALL;
         }
         for(i=0; i<ic->nb_programs; i++){
             AVProgram *p= ic->programs[i];
             if(p->id != opt_programid){
                 p->discard = AVDISCARD_ALL;
             }else{
                 found=1;
                 for(j=0; j<p->nb_stream_indexes; j++){
18590be6
                     ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
6d3d3b83
                 }
             }
         }
         if(!found){
             fprintf(stderr, "Specified program id not found\n");
639e4ec8
             ffmpeg_exit(1);
6d3d3b83
         }
         opt_programid=0;
50e143c4
     }
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);
961e4a33
         av_close_input_file(ic);
639e4ec8
         ffmpeg_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++) {
22b16e6a
         AVStream *st = ic->streams[i];
f7bd4a8e
         AVCodecContext *dec = st->codec;
07633154
         AVInputStream *ist;
 
043d2ff2
         dec->thread_count = thread_count;
311e223f
         input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
07633154
 
         input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
         ist = &input_streams[nb_input_streams - 1];
         ist->st = st;
         ist->file_index = nb_input_files;
         ist->discard = 1;
 
f7bd4a8e
         switch (dec->codec_type) {
72415b2a
         case AVMEDIA_TYPE_AUDIO:
311e223f
             input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
19878374
             if(!input_codecs[nb_input_codecs-1])
                 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
311e223f
             set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
f7bd4a8e
             channel_layout    = dec->channel_layout;
             audio_sample_fmt  = dec->sample_fmt;
b4aea108
             if(audio_disable)
22b16e6a
                 st->discard= AVDISCARD_ALL;
85f07f22
             break;
72415b2a
         case AVMEDIA_TYPE_VIDEO:
311e223f
             input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
19878374
             if(!input_codecs[nb_input_codecs-1])
                 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
311e223f
             set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
c0df9d75
             rfps      = ic->streams[i]->r_frame_rate.num;
             rfps_base = ic->streams[i]->r_frame_rate.den;
f7bd4a8e
             if (dec->lowres) {
                 dec->flags |= CODEC_FLAG_EMU_EDGE;
0b7ccad6
                 dec->height >>= dec->lowres;
                 dec->width  >>= dec->lowres;
33946533
             }
f4f3223f
             if(me_threshold)
f7bd4a8e
                 dec->debug |= FF_DEBUG_MV;
d7425f59
 
f7bd4a8e
             if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->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",
f7bd4a8e
                             i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
d8019eb5
 
15bc38e5
                     (float)rfps / rfps_base, rfps, rfps_base);
79fdaa4c
             }
bdfcbbed
 
b4aea108
             if(video_disable)
22b16e6a
                 st->discard= AVDISCARD_ALL;
f3356e9c
             else if(video_discard)
22b16e6a
                 st->discard= video_discard;
85f07f22
             break;
72415b2a
         case AVMEDIA_TYPE_DATA:
254abc2e
             break;
72415b2a
         case AVMEDIA_TYPE_SUBTITLE:
311e223f
             input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
19878374
             if(!input_codecs[nb_input_codecs-1])
                 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
11bf3847
             if(subtitle_disable)
22b16e6a
                 st->discard = AVDISCARD_ALL;
cf7fc795
             break;
72415b2a
         case AVMEDIA_TYPE_ATTACHMENT:
         case AVMEDIA_TYPE_UNKNOWN:
ae38261e
             break;
51bd4565
         default:
0f4e8165
             abort();
85f07f22
         }
     }
115329f1
 
bd1b79a1
     input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
85f07f22
     /* dump the file content */
d8019eb5
     if (verbose >= 0)
0ebf4754
         av_dump_format(ic, nb_input_files, filename, 0);
d8019eb5
 
07633154
     input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
     input_files[nb_input_files - 1].ctx        = ic;
     input_files[nb_input_files - 1].ist_index  = nb_input_streams - ic->nb_streams;
08ddfb77
     input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
bdfcbbed
 
a4b6000b
     top_field_first = -1;
2905e3ff
     video_channel = 0;
a6286bda
     frame_rate    = (AVRational){0, 0};
10de86b8
     frame_pix_fmt = PIX_FMT_NONE;
0b7ccad6
     frame_height = 0;
     frame_width  = 0;
d7ee4402
     audio_sample_rate = 0;
8f3e9997
     audio_channels    = 0;
115329f1
 
a06a18c5
     av_freep(&video_codec_name);
     av_freep(&audio_codec_name);
     av_freep(&subtitle_codec_name);
19615089
     uninit_opts();
     init_opts();
eb8bc572
     return 0;
85f07f22
 }
 
e3b540b4
 static void check_inputs(int *has_video_ptr,
                          int *has_audio_ptr,
                          int *has_subtitle_ptr,
                          int *has_data_ptr)
919f448d
 {
e3b540b4
     int has_video, has_audio, has_subtitle, has_data, i, j;
919f448d
     AVFormatContext *ic;
 
     has_video = 0;
     has_audio = 0;
11bf3847
     has_subtitle = 0;
e3b540b4
     has_data = 0;
 
919f448d
     for(j=0;j<nb_input_files;j++) {
07633154
         ic = input_files[j].ctx;
919f448d
         for(i=0;i<ic->nb_streams;i++) {
01f4895c
             AVCodecContext *enc = ic->streams[i]->codec;
919f448d
             switch(enc->codec_type) {
72415b2a
             case AVMEDIA_TYPE_AUDIO:
919f448d
                 has_audio = 1;
                 break;
72415b2a
             case AVMEDIA_TYPE_VIDEO:
919f448d
                 has_video = 1;
                 break;
72415b2a
             case AVMEDIA_TYPE_SUBTITLE:
11bf3847
                 has_subtitle = 1;
                 break;
72415b2a
             case AVMEDIA_TYPE_DATA:
             case AVMEDIA_TYPE_ATTACHMENT:
             case AVMEDIA_TYPE_UNKNOWN:
e3b540b4
                 has_data = 1;
6fb316d5
                 break;
51bd4565
             default:
0f4e8165
                 abort();
919f448d
             }
         }
     }
     *has_video_ptr = has_video;
     *has_audio_ptr = has_audio;
11bf3847
     *has_subtitle_ptr = has_subtitle;
e3b540b4
     *has_data_ptr = has_data;
919f448d
 }
 
ca8064d2
 static void new_video_stream(AVFormatContext *oc, int file_idx)
85f07f22
 {
     AVStream *st;
9fdf4b58
     AVOutputStream *ost;
cf7fc795
     AVCodecContext *video_enc;
4618637a
     enum CodecID codec_id = CODEC_ID_NONE;
0093ebc2
     AVCodec *codec= NULL;
115329f1
 
e640f261
     st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
cf7fc795
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
639e4ec8
         ffmpeg_exit(1);
cf7fc795
     }
9fdf4b58
     ost = new_output_stream(oc, file_idx);
0093ebc2
 
     if(!video_stream_copy){
         if (video_codec_name) {
             codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
                                          avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
             codec = avcodec_find_encoder_by_name(video_codec_name);
9446d759
             ost->enc = codec;
0093ebc2
         } else {
             codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
             codec = avcodec_find_encoder(codec_id);
         }
abf8342a
         ost->frame_aspect_ratio = frame_aspect_ratio;
         frame_aspect_ratio = 0;
a7844c58
 #if CONFIG_AVFILTER
f8ae3a21
         ost->avfilter = vfilters;
9d5fa618
         vfilters = NULL;
a7844c58
 #endif
0093ebc2
     }
 
     avcodec_get_context_defaults3(st->codec, codec);
0b6d358a
     ost->bitstream_filters = video_bitstream_filters;
748c2fca
     video_bitstream_filters= NULL;
 
043d2ff2
     st->codec->thread_count= thread_count;
115329f1
 
01f4895c
     video_enc = st->codec;
115329f1
 
cf7fc795
     if(video_codec_tag)
         video_enc->codec_tag= video_codec_tag;
115329f1
 
71cc331c
     if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
cf7fc795
         video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
72415b2a
         avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
637b5326
     }
90ad92b3
 
cf7fc795
     if (video_stream_copy) {
         st->stream_copy = 1;
72415b2a
         video_enc->codec_type = AVMEDIA_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;
115329f1
 
a6286bda
         if (frame_rate.num)
             ost->frame_rate = frame_rate;
cf7fc795
         video_enc->codec_id = codec_id;
0093ebc2
         set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
115329f1
 
0c22311b
         video_enc->width = frame_width;
         video_enc->height = frame_height;
cf7fc795
         video_enc->pix_fmt = frame_pix_fmt;
100a6b7c
         video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
c30a4489
         st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
cf7fc795
 
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;
 
         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");
639e4ec8
                 ffmpeg_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;
             }
         }
4ad08021
 
         if (forced_key_frames)
             parse_forced_key_frames(forced_key_frames, ost, video_enc);
cf7fc795
     }
0fc2c0f6
     if (video_language) {
d2d67e42
         av_dict_set(&st->metadata, "language", video_language, 0);
0fc2c0f6
         av_freep(&video_language);
     }
cf7fc795
 
     /* reset some key parameters */
     video_disable = 0;
4a897224
     av_freep(&video_codec_name);
4ad08021
     av_freep(&forced_key_frames);
cf7fc795
     video_stream_copy = 0;
49b60982
     frame_pix_fmt = PIX_FMT_NONE;
cf7fc795
 }
 
ca8064d2
 static void new_audio_stream(AVFormatContext *oc, int file_idx)
cf7fc795
 {
     AVStream *st;
9fdf4b58
     AVOutputStream *ost;
0093ebc2
     AVCodec *codec= NULL;
cf7fc795
     AVCodecContext *audio_enc;
4618637a
     enum CodecID codec_id = CODEC_ID_NONE;
115329f1
 
e640f261
     st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
cf7fc795
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
639e4ec8
         ffmpeg_exit(1);
cf7fc795
     }
9fdf4b58
     ost = new_output_stream(oc, file_idx);
0093ebc2
 
     if(!audio_stream_copy){
         if (audio_codec_name) {
             codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
                                          avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
             codec = avcodec_find_encoder_by_name(audio_codec_name);
9446d759
             ost->enc = codec;
0093ebc2
         } else {
             codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
             codec = avcodec_find_encoder(codec_id);
         }
     }
 
     avcodec_get_context_defaults3(st->codec, codec);
748c2fca
 
0b6d358a
     ost->bitstream_filters = audio_bitstream_filters;
748c2fca
     audio_bitstream_filters= NULL;
 
043d2ff2
     st->codec->thread_count= thread_count;
115329f1
 
01f4895c
     audio_enc = st->codec;
72415b2a
     audio_enc->codec_type = AVMEDIA_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;
72415b2a
         avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
637b5326
     }
cf7fc795
     if (audio_stream_copy) {
         st->stream_copy = 1;
     } else {
         audio_enc->codec_id = codec_id;
0093ebc2
         set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
115329f1
 
c57c770d
         if (audio_qscale > QSCALE_NONE) {
             audio_enc->flags |= CODEC_FLAG_QSCALE;
             audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
         }
8f3e9997
         if (audio_channels)
             audio_enc->channels = audio_channels;
a79db0f7
         audio_enc->sample_fmt = audio_sample_fmt;
d7ee4402
         if (audio_sample_rate)
             audio_enc->sample_rate = audio_sample_rate;
13367a46
         audio_enc->channel_layout = channel_layout;
aa1de0d9
         choose_sample_fmt(st, codec);
cf7fc795
     }
     if (audio_language) {
d2d67e42
         av_dict_set(&st->metadata, "language", audio_language, 0);
e6db28ce
         av_freep(&audio_language);
cf7fc795
     }
 
     /* reset some key parameters */
     audio_disable = 0;
4a897224
     av_freep(&audio_codec_name);
cf7fc795
     audio_stream_copy = 0;
 }
 
e3b540b4
 static void new_data_stream(AVFormatContext *oc, int file_idx)
 {
     AVStream *st;
     AVCodec *codec=NULL;
     AVCodecContext *data_enc;
 
     st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
         ffmpeg_exit(1);
     }
e65ab9d9
     new_output_stream(oc, file_idx);
e3b540b4
     data_enc = st->codec;
     if (!data_stream_copy) {
         fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
         ffmpeg_exit(1);
     }
     avcodec_get_context_defaults3(st->codec, codec);
 
     data_enc->codec_type = AVMEDIA_TYPE_DATA;
 
     if (data_codec_tag)
         data_enc->codec_tag= data_codec_tag;
 
     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
         data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
         avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
     if (data_stream_copy) {
         st->stream_copy = 1;
     }
 
     data_disable = 0;
     av_freep(&data_codec_name);
     data_stream_copy = 0;
 }
 
ca8064d2
 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
cf7fc795
 {
     AVStream *st;
9fdf4b58
     AVOutputStream *ost;
0093ebc2
     AVCodec *codec=NULL;
cf7fc795
     AVCodecContext *subtitle_enc;
4618637a
     enum CodecID codec_id = CODEC_ID_NONE;
115329f1
 
e640f261
     st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
cf7fc795
     if (!st) {
         fprintf(stderr, "Could not alloc stream\n");
639e4ec8
         ffmpeg_exit(1);
cf7fc795
     }
9fdf4b58
     ost = new_output_stream(oc, file_idx);
0093ebc2
     subtitle_enc = st->codec;
     if(!subtitle_stream_copy){
118ccae0
         if (subtitle_codec_name) {
             codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
d4a9f379
                                          avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
9446d759
             codec = avcodec_find_encoder_by_name(subtitle_codec_name);
             ost->enc = codec;
118ccae0
         } else {
             codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
             codec = avcodec_find_encoder(codec_id);
         }
0093ebc2
     }
     avcodec_get_context_defaults3(st->codec, codec);
cf7fc795
 
0b6d358a
     ost->bitstream_filters = subtitle_bitstream_filters;
e1cc8339
     subtitle_bitstream_filters= NULL;
 
72415b2a
     subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
27ad7d3a
 
     if(subtitle_codec_tag)
         subtitle_enc->codec_tag= subtitle_codec_tag;
 
8f55616f
     if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
         subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
         avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
cf7fc795
     if (subtitle_stream_copy) {
         st->stream_copy = 1;
     } else {
118ccae0
         subtitle_enc->codec_id = codec_id;
0093ebc2
         set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
cf7fc795
     }
 
     if (subtitle_language) {
d2d67e42
         av_dict_set(&st->metadata, "language", subtitle_language, 0);
e6db28ce
         av_freep(&subtitle_language);
cf7fc795
     }
 
11bf3847
     subtitle_disable = 0;
4a897224
     av_freep(&subtitle_codec_name);
cf7fc795
     subtitle_stream_copy = 0;
 }
 
6d342149
 static int opt_new_stream(const char *opt, const char *arg)
cf7fc795
 {
     AVFormatContext *oc;
ca8064d2
     int file_idx = nb_output_files - 1;
cf7fc795
     if (nb_output_files <= 0) {
         fprintf(stderr, "At least one output file must be specified\n");
639e4ec8
         ffmpeg_exit(1);
cf7fc795
     }
ca8064d2
     oc = output_files[file_idx];
cf7fc795
 
ca8064d2
     if      (!strcmp(opt, "newvideo"   )) new_video_stream   (oc, file_idx);
     else if (!strcmp(opt, "newaudio"   )) new_audio_stream   (oc, file_idx);
     else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
e3b540b4
     else if (!strcmp(opt, "newdata"    )) new_data_stream    (oc, file_idx);
b926b628
     else av_assert0(0);
6d342149
     return 0;
11bf3847
 }
 
006e8108
 /* arg format is "output-stream-index:streamid-value". */
6d342149
 static int opt_streamid(const char *opt, const char *arg)
006e8108
 {
     int idx;
     char *p;
     char idx_str[16];
 
1a5e4fd8
     av_strlcpy(idx_str, arg, sizeof(idx_str));
006e8108
     p = strchr(idx_str, ':');
     if (!p) {
         fprintf(stderr,
                 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
                 arg, opt);
639e4ec8
         ffmpeg_exit(1);
006e8108
     }
     *p++ = '\0';
     idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
e640f261
     streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
006e8108
     streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
6d342149
     return 0;
006e8108
 }
 
96f931ad
 static int opt_output_file(const char *opt, const char *filename)
cf7fc795
 {
     AVFormatContext *oc;
e3b540b4
     int err, use_video, use_audio, use_subtitle, use_data;
     int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
817b23ff
     AVFormatParameters params, *ap = &params;
a5abfd8f
     AVOutputFormat *file_oformat;
85f07f22
 
bfd3b70a
     if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
         fprintf(stderr, "Too many output files\n");
         ffmpeg_exit(1);
     }
 
85f07f22
     if (!strcmp(filename, "-"))
         filename = "pipe:";
 
5ecdfd00
     err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
7d727f13
     last_asked_format = NULL;
7ef61879
     if (!oc) {
5ecdfd00
         print_error(filename, err);
639e4ec8
         ffmpeg_exit(1);
7ef61879
     }
7d727f13
     file_oformat= oc->oformat;
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);
639e4ec8
             ffmpeg_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;
e3b540b4
         use_data = data_stream_copy ||  data_codec_name; /* XXX once generic data codec will be available add a ->data_codec reference and use it here */
919f448d
 
e30a2846
         /* disable if no corresponding type found and at least one
            input file */
         if (nb_input_files > 0) {
e3b540b4
             check_inputs(&input_has_video,
                          &input_has_audio,
                          &input_has_subtitle,
                          &input_has_data);
 
e30a2846
             if (!input_has_video)
                 use_video = 0;
             if (!input_has_audio)
                 use_audio = 0;
11bf3847
             if (!input_has_subtitle)
                 use_subtitle = 0;
e3b540b4
             if (!input_has_data)
                 use_data = 0;
e30a2846
         }
919f448d
 
         /* manual disable */
3f2a7e42
         if (audio_disable)    use_audio    = 0;
         if (video_disable)    use_video    = 0;
         if (subtitle_disable) use_subtitle = 0;
e3b540b4
         if (data_disable)     use_data     = 0;
85f07f22
 
3f2a7e42
         if (use_video)    new_video_stream(oc, nb_output_files);
         if (use_audio)    new_audio_stream(oc, nb_output_files);
         if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
e3b540b4
         if (use_data)     new_data_stream(oc, nb_output_files);
11bf3847
 
25d34458
         oc->timestamp = recording_timestamp;
115329f1
 
d2d67e42
         av_dict_copy(&oc->metadata, metadata, 0);
         av_dict_free(&metadata);
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)) {
79157f40
             print_error(oc->filename, AVERROR(EINVAL));
639e4ec8
             ffmpeg_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))) {
55815edc
             if (avio_check(filename, 0) == 0) {
9d58e0a9
                 if (!using_stdin) {
d9a916e2
                     fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                     fflush(stderr);
29c66386
                     if (!read_yesno()) {
d9a916e2
                         fprintf(stderr, "Not overwriting - exiting\n");
639e4ec8
                         ffmpeg_exit(1);
d9a916e2
                     }
9d58e0a9
                 }
                 else {
d9a916e2
                     fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
639e4ec8
                     ffmpeg_exit(1);
9d58e0a9
                 }
85f07f22
             }
         }
115329f1
 
85f07f22
         /* open the file */
59d96941
         if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
a31e7956
             print_error(filename, err);
639e4ec8
             ffmpeg_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);
639e4ec8
         ffmpeg_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
 
0093ebc2
     set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
006e8108
 
a6286bda
     frame_rate    = (AVRational){0, 0};
0b7ccad6
     frame_width   = 0;
     frame_height  = 0;
d7ee4402
     audio_sample_rate = 0;
8f3e9997
     audio_channels    = 0;
d7ee4402
 
4ad08021
     av_freep(&forced_key_frames);
19615089
     uninit_opts();
     init_opts();
96f931ad
     return 0;
85f07f22
 }
 
5abdb4b1
 /* same option as mencoder */
bdf3d3bf
 static int opt_pass(const char *opt, const char *arg)
5abdb4b1
 {
bdf3d3bf
     do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
     return 0;
5abdb4b1
 }
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
 
fc5607f8
 static int64_t getmaxrss(void)
 {
 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
     struct rusage rusage;
     getrusage(RUSAGE_SELF, &rusage);
     return (int64_t)rusage.ru_maxrss * 1024;
 #elif HAVE_GETPROCESSMEMORYINFO
     HANDLE proc;
     PROCESS_MEMORY_COUNTERS memcounters;
     proc = GetCurrentProcess();
     memcounters.cb = sizeof(memcounters);
     GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
     return memcounters.PeakPagefileUsage;
 #else
     return 0;
 #endif
 }
 
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);
639e4ec8
             ffmpeg_exit(1);
84f608f4
         }
         p++;
     }
 }
 
7d704f51
 static int opt_inter_matrix(const char *opt, const char *arg)
84f608f4
 {
     inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
     parse_matrix_coeffs(inter_matrix, arg);
7d704f51
     return 0;
84f608f4
 }
 
7d704f51
 static int opt_intra_matrix(const char *opt, const char *arg)
84f608f4
 {
     intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
     parse_matrix_coeffs(intra_matrix, arg);
7d704f51
     return 0;
84f608f4
 }
 
0c2a18cb
 static void show_usage(void)
3b855466
 {
27daa420
     printf("Hyper fast Audio and Video encoder\n");
8319aefe
     printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3b855466
     printf("\n");
0c2a18cb
 }
 
7d704f51
 static int opt_help(const char *opt, const char *arg)
0c2a18cb
 {
5d7870dc
     AVCodec *c;
ef2b2243
     AVOutputFormat *oformat = NULL;
5d7870dc
 
0c2a18cb
     av_log_set_callback(log_callback_help);
     show_usage();
3b855466
     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");
e44c0156
     av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
e992fba4
     printf("\n");
5d7870dc
 
     /* individual codec options */
     c = NULL;
     while ((c = av_codec_next(c))) {
         if (c->priv_class) {
             av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
             printf("\n");
         }
     }
 
e44c0156
     av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
e992fba4
     printf("\n");
ef2b2243
 
     /* individual muxer options */
     while ((oformat = av_oformat_next(oformat))) {
         if (oformat->priv_class) {
             av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
             printf("\n");
         }
     }
 
e44c0156
     av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
7d704f51
     return 0;
3b855466
 }
 
eb8bc572
 static int opt_target(const char *opt, const char *arg)
e0595741
 {
01558ee6
     enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
88730be6
     static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
e0595741
 
     if(!strncmp(arg, "pal-", 4)) {
01558ee6
         norm = PAL;
e0595741
         arg += 4;
     } else if(!strncmp(arg, "ntsc-", 5)) {
01558ee6
         norm = NTSC;
e0595741
         arg += 5;
ed2d7a34
     } else if(!strncmp(arg, "film-", 5)) {
01558ee6
         norm = FILM;
ed2d7a34
         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) {
01558ee6
             norm = PAL;
e0595741
         } else if((fr == 29970) || (fr == 23976)) {
01558ee6
             norm = NTSC;
e0595741
         } else {
             /* Try to determine PAL/NTSC by peeking in the input files */
             if(nb_input_files) {
                 int i, j;
07633154
                 for (j = 0; j < nb_input_files; j++) {
                     for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
                         AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
72415b2a
                         if(c->codec_type != AVMEDIA_TYPE_VIDEO)
e0595741
                             continue;
c0df9d75
                         fr = c->time_base.den * 1000 / c->time_base.num;
e0595741
                         if(fr == 25000) {
01558ee6
                             norm = PAL;
e0595741
                             break;
                         } else if((fr == 29970) || (fr == 23976)) {
01558ee6
                             norm = NTSC;
e0595741
                             break;
                         }
                     }
01558ee6
                     if(norm != UNKNOWN)
e0595741
                         break;
                 }
             }
         }
17ee7b55
         if(verbose > 0 && norm != UNKNOWN)
06a3c9c4
             fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
e0595741
     }
 
01558ee6
     if(norm == UNKNOWN) {
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");
639e4ec8
         ffmpeg_exit(1);
e0595741
     }
 
     if(!strcmp(arg, "vcd")) {
f712f6c8
         opt_codec("vcodec", "mpeg1video");
e4e2db9c
         opt_codec("acodec", "mp2");
eb8bc572
         opt_format("f", "vcd");
e0595741
 
eb8bc572
         opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
         opt_frame_rate("r", frame_rates[norm]);
06a3c9c4
         opt_default("g", norm == PAL ? "15" : "18");
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")) {
 
f712f6c8
         opt_codec("vcodec", "mpeg2video");
         opt_codec("acodec", "mp2");
eb8bc572
         opt_format("f", "svcd");
e0595741
 
eb8bc572
         opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
         opt_frame_rate("r", frame_rates[norm]);
f6e2af4f
         opt_frame_pix_fmt("pix_fmt", "yuv420p");
06a3c9c4
         opt_default("g", norm == PAL ? "15" : "18");
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")) {
 
f712f6c8
         opt_codec("vcodec", "mpeg2video");
e4e2db9c
         opt_codec("acodec", "ac3");
eb8bc572
         opt_format("f", "dvd");
e0595741
 
eb8bc572
         opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
         opt_frame_rate("r", frame_rates[norm]);
f6e2af4f
         opt_frame_pix_fmt("pix_fmt", "yuv420p");
06a3c9c4
         opt_default("g", norm == PAL ? "15" : "18");
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
 
eb8bc572
         opt_format("f", "dv");
ff52bc3e
 
eb8bc572
         opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
         opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
                           norm == PAL ? "yuv420p" : "yuv411p");
         opt_frame_rate("r", frame_rates[norm]);
ff52bc3e
 
         audio_sample_rate = 48000;
         audio_channels = 2;
 
e0595741
     } else {
         fprintf(stderr, "Unknown target: %s\n", arg);
eb8bc572
         return AVERROR(EINVAL);
e0595741
     }
eb8bc572
     return 0;
e0595741
 }
 
eb8bc572
 static int opt_vstats_file(const char *opt, const char *arg)
b60d1379
 {
     av_free (vstats_filename);
     vstats_filename=av_strdup (arg);
eb8bc572
     return 0;
b60d1379
 }
 
eb8bc572
 static int opt_vstats(const char *opt, const char *arg)
b60d1379
 {
     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);
eb8bc572
     return opt_vstats_file(opt, filename);
b60d1379
 }
 
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);
639e4ec8
         ffmpeg_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];
6e872935
     char *codec_name = *opt == 'v' ? video_codec_name :
                        *opt == 'a' ? audio_codec_name :
                                      subtitle_codec_name;
d9f1b68c
 
6e872935
     if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
9ac1c884
         fprintf(stderr, "File for preset '%s' not found\n", arg);
639e4ec8
         ffmpeg_exit(1);
d9f1b68c
     }
 
     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);
639e4ec8
             ffmpeg_exit(1);
d9f1b68c
         }
f712f6c8
         if (!strcmp(tmp, "acodec") ||
             !strcmp(tmp, "vcodec") ||
             !strcmp(tmp, "scodec") ||
             !strcmp(tmp, "dcodec")) {
             opt_codec(tmp, 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);
639e4ec8
             ffmpeg_exit(1);
b7353317
         }
d9f1b68c
     }
 
     fclose(f);
 
     return 0;
 }
 
39aafa5e
 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
 {
 }
 
7d704f51
 static int opt_passlogfile(const char *opt, const char *arg)
2c18893a
 {
     pass_logfilename_prefix = arg;
2ff36ef5
 #if CONFIG_LIBX264_ENCODER
7d704f51
     return opt_default("passlogfile", arg);
 #else
     return 0;
2ff36ef5
 #endif
2c18893a
 }
 
580a6c57
 static const OptionDef options[] = {
02d504a7
     /* main options */
992f8eae
 #include "cmdutils_common_opts.h"
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" },
17a4ec8e
     { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4a908866
     { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
       "outfile[,metadata]:infile[,metadata]" },
     { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
       "outfile[,metadata]:infile[,metadata]" },
91e96eba
     { "map_chapters",  HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters},  "set chapters mapping", "outfile:infile" },
eb8bc572
     { "t", 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" }, //
eb8bc572
     { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
     { "itsoffset", 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" },
eb8bc572
     { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
     { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
72415b2a
     { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_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" },
eb8bc572
     { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
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)", "" },
eb8bc572
     { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
06ab9cff
     { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
eb8bc572
     { "threads",  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" },
72bd8100
     { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
0f27e6b4
     { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying" },
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 */
26513856
     { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
     { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
72415b2a
     { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
26513856
     { "r", 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" },
100a6b7c
     { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
eb8bc572
     { "croptop",  HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
     { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
     { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
     { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
     { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
     { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
     { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
     { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
     { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "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" },
eb8bc572
     { "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" },
f712f6c8
     { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
eb8bc572
     { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold",  "threshold" },
115329f1
     { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
8af3167b
       "use same quantizer as source (implies VBR)" },
eb8bc572
     { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
2c18893a
     { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "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" },
46847a33
 #if CONFIG_AVFILTER
521cfa4a
     { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
46847a33
 #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" },
eb8bc572
     { "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" },
eb8bc572
     { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
     { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
0fc2c0f6
     { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
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" },
eb8bc572
     { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4ad08021
     { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
02d504a7
 
     /* audio options */
eb8bc572
     { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
72415b2a
     { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_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", },
eb8bc572
     { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
     { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
02d504a7
     { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
f712f6c8
     { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
eb8bc572
     { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
a9aa3467
     { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
eb8bc572
     { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
cf7fc795
     { "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" },
f712f6c8
     { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
eb8bc572
     { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
cf7fc795
     { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
eb8bc572
     { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
115329f1
 
02d504a7
     /* grab options */
eb8bc572
     { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
02d504a7
     { "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
 
eb8bc572
     { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
     { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
     { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
748c2fca
 
eb8bc572
     { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
     { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
     { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
     { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
e3b540b4
     /* data codec support */
f712f6c8
     { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_codec}, "force data codec ('copy' to copy stream)", "codec" },
d9f1b68c
 
eb8bc572
     { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
85f07f22
     { NULL, },
 };
 
f71163d7
 int main(int argc, char **argv)
 {
     int64_t ti;
 
6b6bca64
     av_log_set_flags(AV_LOG_SKIP_REPEATED);
 
39aafa5e
     if(argc>1 && !strcmp(argv[1], "-d")){
3c483620
         run_as_daemon=1;
39aafa5e
         verbose=-1;
         av_log_set_callback(log_callback_null);
         argc--;
         argv++;
     }
 
c721d803
     avcodec_register_all();
9b157b0c
 #if CONFIG_AVDEVICE
c721d803
     avdevice_register_all();
9b157b0c
 #endif
46847a33
 #if CONFIG_AVFILTER
     avfilter_register_all();
 #endif
f71163d7
     av_register_all();
 
a2f4324b
 #if HAVE_ISATTY
b86f5a02
     if(isatty(STDIN_FILENO))
80c6e238
         avio_set_interrupt_cb(decode_interrupt_cb);
a2f4324b
 #endif
b86f5a02
 
a5c33faa
     init_opts();
f71163d7
 
e8940321
     if(verbose>=0)
         show_banner();
f71163d7
 
     /* parse options */
     parse_options(argc, argv, options, opt_output_file);
 
7f11e745
     if(nb_output_files <= 0 && nb_input_files == 0) {
         show_usage();
         fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
639e4ec8
         ffmpeg_exit(1);
7f11e745
     }
e4637d6a
 
f71163d7
     /* file converter / grab */
     if (nb_output_files <= 0) {
bdb9fd9b
         fprintf(stderr, "At least one output file must be specified\n");
639e4ec8
         ffmpeg_exit(1);
f71163d7
     }
 
     if (nb_input_files == 0) {
bdb9fd9b
         fprintf(stderr, "At least one input file must be specified\n");
639e4ec8
         ffmpeg_exit(1);
f71163d7
     }
 
     ti = getutime();
3aace1bc
     if (transcode(output_files, nb_output_files, input_files, nb_input_files,
065a20cb
                   stream_maps, nb_stream_maps) < 0)
639e4ec8
         ffmpeg_exit(1);
f71163d7
     ti = getutime() - ti;
     if (do_benchmark) {
fc5607f8
         int maxrss = getmaxrss() / 1024;
         printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
f71163d7
     }
 
639e4ec8
     return ffmpeg_exit(0);
f71163d7
 }