ffmpeg.c 137 KB
Newer Older
Fabrice Bellard's avatar
Fabrice Bellard committed
1
/*
2
 * FFmpeg main
Fabrice Bellard's avatar
Fabrice Bellard committed
3
 * Copyright (c) 2000-2003 Fabrice Bellard
Fabrice Bellard's avatar
Fabrice Bellard committed
4
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
Fabrice Bellard's avatar
Fabrice Bellard committed
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
Fabrice Bellard's avatar
Fabrice Bellard committed
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
Fabrice Bellard's avatar
Fabrice Bellard committed
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Fabrice Bellard's avatar
Fabrice Bellard committed
20
 */
21

22 23 24 25 26 27
#include "config.h"
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <errno.h>
28
#include <signal.h>
29
#include <limits.h>
30
#include "avformat.h"
Luca Abeni's avatar
Luca Abeni committed
31
#include "avdevice.h"
32
#include "swscale.h"
33
#include "framehook.h"
34
#include "opt.h"
35
#include "fifo.h"
36
#include "avstring.h"
37
#include "os_support.h"
38

39 40 41 42
#if !defined(HAVE_GETRUSAGE) && defined(HAVE_GETPROCESSTIMES)
#include <windows.h>
#endif

43
#if defined(HAVE_TERMIOS_H)
Fabrice Bellard's avatar
Fabrice Bellard committed
44 45 46 47 48
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
49
#include <sys/resource.h>
50 51
#elif defined(HAVE_CONIO_H)
#include <conio.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
52
#endif
Michael Niedermayer's avatar
Michael Niedermayer committed
53
#undef time //needed because HAVE_AV_CONFIG_H is defined on top
54
#include <time.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
55

56
#include "version.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
57 58
#include "cmdutils.h"

59 60 61
#undef NDEBUG
#include <assert.h>

62 63
#undef exit

64 65 66
static const char program_name[] = "FFmpeg";
static const int program_birth_year = 2000;

Fabrice Bellard's avatar
Fabrice Bellard committed
67 68 69 70
/* select an input stream for an output stream */
typedef struct AVStreamMap {
    int file_index;
    int stream_index;
71 72
    int sync_file_index;
    int sync_stream_index;
Fabrice Bellard's avatar
Fabrice Bellard committed
73 74
} AVStreamMap;

75 76 77 78 79 80
/** select an input file for an output file */
typedef struct AVMetaDataMap {
    int out_file;
    int in_file;
} AVMetaDataMap;

Fabrice Bellard's avatar
Fabrice Bellard committed
81 82 83 84 85
extern const OptionDef options[];

#define MAX_FILES 20

static AVFormatContext *input_files[MAX_FILES];
86
static int64_t input_files_ts_offset[MAX_FILES];
Fabrice Bellard's avatar
Fabrice Bellard committed
87 88 89 90 91 92 93 94
static int nb_input_files = 0;

static AVFormatContext *output_files[MAX_FILES];
static int nb_output_files = 0;

static AVStreamMap stream_maps[MAX_FILES];
static int nb_stream_maps;

95 96 97
static AVMetaDataMap meta_data_maps[MAX_FILES];
static int nb_meta_data_maps;

98 99
static AVInputFormat *file_iformat;
static AVOutputFormat *file_oformat;
100 101
static int frame_width  = 0;
static int frame_height = 0;
102
static float frame_aspect_ratio = 0;
103
static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
104 105 106 107 108
static int frame_padtop  = 0;
static int frame_padbottom = 0;
static int frame_padleft  = 0;
static int frame_padright = 0;
static int padcolor[3] = {16,128,128}; /* default to black */
109 110 111 112
static int frame_topBand  = 0;
static int frame_bottomBand = 0;
static int frame_leftBand  = 0;
static int frame_rightBand = 0;
113
static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
114
static AVRational frame_rate = (AVRational) {0,0};
115
static float video_qscale = 0;
116
static int video_qdiff = 3;
117 118
static uint16_t *intra_matrix = NULL;
static uint16_t *inter_matrix = NULL;
119
#if 0 //experimental, (can be removed)
120 121 122
static float video_rc_qsquish=1.0;
static float video_rc_qmod_amp=0;
static int video_rc_qmod_freq=0;
123
#endif
124
static const char *video_rc_override_string=NULL;
Fabrice Bellard's avatar
Fabrice Bellard committed
125
static int video_disable = 0;
126
static int video_discard = 0;
127
static char *video_codec_name = NULL;
128
static int video_codec_tag = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
129
static int same_quality = 0;
130
static int do_deinterlace = 0;
131
static int strict = 0;
132
static int top_field_first = -1;
133
static int me_threshold = 0;
Michael Niedermayer's avatar
Michael Niedermayer committed
134
static int intra_dc_precision = 8;
135
static int loop_input = 0;
136
static int loop_output = AVFMT_NOOUTPUTLOOP;
137
static int qp_hist = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
138 139 140

static int intra_only = 0;
static int audio_sample_rate = 44100;
141 142
#define QSCALE_NONE -99999
static float audio_qscale = QSCALE_NONE;
Fabrice Bellard's avatar
Fabrice Bellard committed
143 144
static int audio_disable = 0;
static int audio_channels = 1;
145
static char  *audio_codec_name = NULL;
146
static int audio_codec_tag = 0;
147 148
static char *audio_language = NULL;

149
static int subtitle_disable = 0;
150
static char *subtitle_codec_name = NULL;
151
static char *subtitle_language = NULL;
Fabrice Bellard's avatar
Fabrice Bellard committed
152

153 154
static float mux_preload= 0.5;
static float mux_max_delay= 0.7;
155

156
static int64_t recording_time = 0;
157
static int64_t start_time = 0;
158
static int64_t rec_timestamp = 0;
159
static int64_t input_ts_offset = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
160 161 162 163 164
static int file_overwrite = 0;
static char *str_title = NULL;
static char *str_author = NULL;
static char *str_copyright = NULL;
static char *str_comment = NULL;
165
static char *str_genre = NULL;
166
static char *str_album = NULL;
Fabrice Bellard's avatar
Fabrice Bellard committed
167
static int do_benchmark = 0;
168
static int do_hex_dump = 0;
169
static int do_pkt_dump = 0;
170
static int do_psnr = 0;
171 172
static int do_pass = 0;
static char *pass_logfilename = NULL;
173 174
static int audio_stream_copy = 0;
static int video_stream_copy = 0;
175
static int subtitle_stream_copy = 0;
176 177
static int video_sync_method= 1;
static int audio_sync_method= 0;
178
static float audio_drift_threshold= 0.1;
179
static int copy_ts= 0;
180
static int opt_shortest = 0; //
181
static int video_global_header = 0;
182
static char *vstats_filename;
183
static FILE *vstats_file;
184
static int opt_programid = 0;
185

186 187
static int rate_emu = 0;

188
static int  video_channel = 0;
189
static char *video_standard;
190

191
static int audio_volume = 256;
192

193
static int using_stdin = 0;
194
static int using_vhook = 0;
195
static int verbose = 1;
196
static int thread_count= 1;
197
static int q_pressed = 0;
198 199 200
static int64_t video_size = 0;
static int64_t audio_size = 0;
static int64_t extra_size = 0;
201 202
static int nb_frames_dup = 0;
static int nb_frames_drop = 0;
203
static int input_sync;
204
static uint64_t limit_filesize = 0; //
205

206
static int pgmyuv_compatibility_hack=0;
207
static float dts_delta_threshold = 10;
208

209
static unsigned int sws_flags = SWS_BICUBIC;
210

Benoit Fouet's avatar
Benoit Fouet committed
211 212 213 214 215 216
static const char **opt_names;
static int opt_name_count;
static AVCodecContext *avctx_opts[CODEC_TYPE_NB];
static AVFormatContext *avformat_opts;
static struct SwsContext *sws_opts;
static int64_t timer_start;
217

218 219
static AVBitStreamFilterContext *video_bitstream_filters=NULL;
static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
220
static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
221
static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
222

223
#define DEFAULT_PASS_LOGFILENAME "ffmpeg2pass"
Fabrice Bellard's avatar
Fabrice Bellard committed
224

225 226
struct AVInputStream;

Fabrice Bellard's avatar
Fabrice Bellard committed
227 228 229 230 231
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 */
232 233 234 235
    int encoding_needed;     /* true if encoding needed for this stream */
    int frame_number;
    /* input pts and corresponding output pts
       for A/V sync */
236 237
    //double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
    struct AVInputStream *sync_ist; /* input stream to sync against */
238
    int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
Fabrice Bellard's avatar
Fabrice Bellard committed
239
    /* video only */
240
    int video_resample;
241
    AVFrame pict_tmp;      /* temporary image for resampling */
242 243
    struct SwsContext *img_resample_ctx; /* for image resampling */
    int resample_height;
244

245
    int video_crop;
246 247
    int topBand;             /* cropping area sizes */
    int leftBand;
248

249
    int video_pad;
250 251 252 253
    int padtop;              /* padding area sizes */
    int padbottom;
    int padleft;
    int padright;
254

Fabrice Bellard's avatar
Fabrice Bellard committed
255 256 257
    /* audio only */
    int audio_resample;
    ReSampleContext *resample; /* for audio resampling */
258
    AVFifoBuffer fifo;     /* for compression: one audio fifo per codec */
259
    FILE *logfile;
Fabrice Bellard's avatar
Fabrice Bellard committed
260 261 262 263 264 265 266 267
} AVOutputStream;

typedef struct AVInputStream {
    int file_index;
    int index;
    AVStream *st;
    int discard;             /* true if stream data should be discarded */
    int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */
268
    int64_t sample_index;      /* current sample */
269 270 271

    int64_t       start;     /* time when read started */
    unsigned long frame;     /* current frame */
272 273
    int64_t       next_pts;  /* synthetic pts for cases where pkt.pts
                                is not defined */
274
    int64_t       pts;       /* current pts */
275
    int is_start;            /* is 1 at the start and after a discontinuity */
Fabrice Bellard's avatar
Fabrice Bellard committed
276 277 278 279 280 281
} AVInputStream;

typedef struct AVInputFile {
    int eof_reached;      /* true if eof reached */
    int ist_index;        /* index of first stream in ist_table */
    int buffer_size;      /* current total buffer size */
282
    int nb_streams;       /* nb streams we are aware of */
Fabrice Bellard's avatar
Fabrice Bellard committed
283 284
} AVInputFile;

285
#ifdef HAVE_TERMIOS_H
Fabrice Bellard's avatar
Fabrice Bellard committed
286

Fabrice Bellard's avatar
Fabrice Bellard committed
287 288
/* init terminal so that we can grab keys */
static struct termios oldtty;
289
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
290 291 292

static void term_exit(void)
{
293
#ifdef HAVE_TERMIOS_H
Fabrice Bellard's avatar
Fabrice Bellard committed
294
    tcsetattr (0, TCSANOW, &oldtty);
295
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
296 297
}

298 299 300 301 302 303 304 305 306
static volatile sig_atomic_t received_sigterm = 0;

static void
sigterm_handler(int sig)
{
    received_sigterm = sig;
    term_exit();
}

Fabrice Bellard's avatar
Fabrice Bellard committed
307 308
static void term_init(void)
{
309
#ifdef HAVE_TERMIOS_H
Fabrice Bellard's avatar
Fabrice Bellard committed
310 311 312 313 314 315 316 317 318 319 320 321 322
    struct termios tty;

    tcgetattr (0, &tty);
    oldtty = tty;

    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
                          |INLCR|IGNCR|ICRNL|IXON);
    tty.c_oflag |= OPOST;
    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
    tty.c_cflag &= ~(CSIZE|PARENB);
    tty.c_cflag |= CS8;
    tty.c_cc[VMIN] = 1;
    tty.c_cc[VTIME] = 0;
323

Fabrice Bellard's avatar
Fabrice Bellard committed
324
    tcsetattr (0, TCSANOW, &tty);
325 326
    signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
327

328 329 330 331 332
    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */
    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
    /*
    register a function to be called at normal program termination
    */
Fabrice Bellard's avatar
Fabrice Bellard committed
333
    atexit(term_exit);
334 335 336
#ifdef CONFIG_BEOS_NETSERVER
    fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
337 338 339 340 341
}

/* read a key without blocking */
static int read_key(void)
{
342
#if defined(HAVE_TERMIOS_H)
343
    int n = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
344
    unsigned char ch;
345 346
#ifndef CONFIG_BEOS_NETSERVER
    struct timeval tv;
Fabrice Bellard's avatar
Fabrice Bellard committed
347 348 349 350 351 352 353
    fd_set rfds;

    FD_ZERO(&rfds);
    FD_SET(0, &rfds);
    tv.tv_sec = 0;
    tv.tv_usec = 0;
    n = select(1, &rfds, NULL, NULL, &tv);
354
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
355
    if (n > 0) {
356 357
        n = read(0, &ch, 1);
        if (n == 1)
Fabrice Bellard's avatar
Fabrice Bellard committed
358
            return ch;
359 360

        return n;
Fabrice Bellard's avatar
Fabrice Bellard committed
361
    }
362 363 364
#elif defined(HAVE_CONIO_H)
    if(kbhit())
        return(getch());
365
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
366 367 368
    return -1;
}

369 370 371 372 373
static int decode_interrupt_cb(void)
{
    return q_pressed || (q_pressed = read_key() == 'q');
}

374
static int read_ffserver_streams(AVFormatContext *s, const char *filename)
Fabrice Bellard's avatar
Fabrice Bellard committed
375
{
376
    int i, err;
Fabrice Bellard's avatar
Fabrice Bellard committed
377 378
    AVFormatContext *ic;

379 380 381
    err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
    if (err < 0)
        return err;
Fabrice Bellard's avatar
Fabrice Bellard committed
382 383 384 385
    /* copy stream format */
    s->nb_streams = ic->nb_streams;
    for(i=0;i<ic->nb_streams;i++) {
        AVStream *st;
Michael Niedermayer's avatar
Michael Niedermayer committed
386

387
        // FIXME: a more elegant solution is needed
388
        st = av_mallocz(sizeof(AVStream));
Fabrice Bellard's avatar
Fabrice Bellard committed
389
        memcpy(st, ic->streams[i], sizeof(AVStream));
390 391
        st->codec = avcodec_alloc_context();
        memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
Fabrice Bellard's avatar
Fabrice Bellard committed
392 393 394 395 396 397 398
        s->streams[i] = st;
    }

    av_close_input_file(ic);
    return 0;
}

399 400 401 402
static double
get_sync_ipts(const AVOutputStream *ost)
{
    const AVInputStream *ist = ost->sync_ist;
403
    return (double)(ist->pts - start_time)/AV_TIME_BASE;
404 405
}

406
static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
407 408
    int ret;

409 410 411 412 413 414
    while(bsfc){
        AVPacket new_pkt= *pkt;
        int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
                                          &new_pkt.data, &new_pkt.size,
                                          pkt->data, pkt->size,
                                          pkt->flags & PKT_FLAG_KEY);
415
        if(a>0){
416 417
            av_free_packet(pkt);
            new_pkt.destruct= av_destruct_packet;
418
        } else if(a<0){
419 420 421
            fprintf(stderr, "%s failed for stream %d, codec %s",
                    bsfc->filter->name, pkt->stream_index,
                    avctx->codec ? avctx->codec->name : "copy");
422
            print_error("", a);
423 424 425 426 427 428
        }
        *pkt= new_pkt;

        bsfc= bsfc->next;
    }

429 430 431 432 433
    ret= av_interleaved_write_frame(s, pkt);
    if(ret < 0){
        print_error("av_interleaved_write_frame()", ret);
        exit(1);
    }
434 435
}

436
#define MAX_AUDIO_PACKET_SIZE (128 * 1024)
Fabrice Bellard's avatar
Fabrice Bellard committed
437

438 439
static void do_audio_out(AVFormatContext *s,
                         AVOutputStream *ost,
Fabrice Bellard's avatar
Fabrice Bellard committed
440 441 442
                         AVInputStream *ist,
                         unsigned char *buf, int size)
{
443
    uint8_t *buftmp;
444 445
    static uint8_t *audio_buf = NULL;
    static uint8_t *audio_out = NULL;
Michael Niedermayer's avatar
Michael Niedermayer committed
446
    const int audio_out_size= 4*MAX_AUDIO_PACKET_SIZE;
447

Fabrice Bellard's avatar
Fabrice Bellard committed
448
    int size_out, frame_bytes, ret;
449
    AVCodecContext *enc= ost->st->codec;
450
    AVCodecContext *dec= ist->st->codec;
Fabrice Bellard's avatar
Fabrice Bellard committed
451

452 453 454 455
    /* SC: dynamic allocation of buffers */
    if (!audio_buf)
        audio_buf = av_malloc(2*MAX_AUDIO_PACKET_SIZE);
    if (!audio_out)
Michael Niedermayer's avatar
Michael Niedermayer committed
456
        audio_out = av_malloc(audio_out_size);
457 458 459
    if (!audio_buf || !audio_out)
        return;               /* Should signal an error ! */

460 461 462 463 464 465 466 467 468 469 470 471 472 473
    if (enc->channels != dec->channels)
        ost->audio_resample = 1;

    if (ost->audio_resample && !ost->resample) {
        ost->resample = audio_resample_init(enc->channels,    dec->channels,
                                            enc->sample_rate, dec->sample_rate);
        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);
            exit(1);
        }
    }

474
    if(audio_sync_method){
475
        double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
476
                - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2);
477 478
        double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
        int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
479

480 481
        //FIXME resample delay
        if(fabs(delta) > 50){
482
            if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
483
                if(byte_delta < 0){
484
                    byte_delta= FFMAX(byte_delta, -size);
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
                    size += byte_delta;
                    buf  -= byte_delta;
                    if(verbose > 2)
                        fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
                    if(!size)
                        return;
                    ist->is_start=0;
                }else{
                    static uint8_t *input_tmp= NULL;
                    input_tmp= av_realloc(input_tmp, byte_delta + size);

                    if(byte_delta + size <= MAX_AUDIO_PACKET_SIZE)
                        ist->is_start=0;
                    else
                        byte_delta= MAX_AUDIO_PACKET_SIZE - size;

                    memset(input_tmp, 0, byte_delta);
                    memcpy(input_tmp + byte_delta, buf, size);
                    buf= input_tmp;
                    size += byte_delta;
                    if(verbose > 2)
                        fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
                }
            }else if(audio_sync_method>1){
509
                int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
510 511 512
                assert(ost->audio_resample);
                if(verbose > 2)
                    fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
513
//                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));
514 515
                av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
            }
516
        }
517
    }else
518
        ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
519
                        - av_fifo_size(&ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
Fabrice Bellard's avatar
Fabrice Bellard committed
520 521 522

    if (ost->audio_resample) {
        buftmp = audio_buf;
523
        size_out = audio_resample(ost->resample,
Fabrice Bellard's avatar
Fabrice Bellard committed
524
                                  (short *)buftmp, (short *)buf,
525
                                  size / (ist->st->codec->channels * 2));
Fabrice Bellard's avatar
Fabrice Bellard committed
526 527 528 529 530 531 532
        size_out = size_out * enc->channels * 2;
    } else {
        buftmp = buf;
        size_out = size;
    }

    /* now encode as many frames as possible */
533
    if (enc->frame_size > 1) {
Fabrice Bellard's avatar
Fabrice Bellard committed
534
        /* output resampled raw samples */
Michael Niedermayer's avatar
Michael Niedermayer committed
535
        av_fifo_realloc(&ost->fifo, av_fifo_size(&ost->fifo) + size_out + 1);
536
        av_fifo_write(&ost->fifo, buftmp, size_out);
Fabrice Bellard's avatar
Fabrice Bellard committed
537 538

        frame_bytes = enc->frame_size * 2 * enc->channels;
539

540
        while (av_fifo_read(&ost->fifo, audio_buf, frame_bytes) == 0) {
541 542 543
            AVPacket pkt;
            av_init_packet(&pkt);

544 545
            //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()

546
            ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
547
                                       (short *)audio_buf);
548
            audio_size += ret;
549 550 551
            pkt.stream_index= ost->index;
            pkt.data= audio_out;
            pkt.size= ret;
552
            if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
553
                pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
554
            pkt.flags |= PKT_FLAG_KEY;
555
            write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
556

557
            ost->sync_opts += enc->frame_size;
Fabrice Bellard's avatar
Fabrice Bellard committed
558 559
        }
    } else {
560 561
        AVPacket pkt;
        av_init_packet(&pkt);
562

563
        ost->sync_opts += size_out / (2 * enc->channels);
564

565 566 567
        /* output a pcm frame */
        /* XXX: change encoding codec API to avoid this ? */
        switch(enc->codec->id) {
568 569 570 571 572 573 574 575 576 577 578 579 580
        case CODEC_ID_PCM_S32LE:
        case CODEC_ID_PCM_S32BE:
        case CODEC_ID_PCM_U32LE:
        case CODEC_ID_PCM_U32BE:
            size_out = size_out << 1;
            break;
        case CODEC_ID_PCM_S24LE:
        case CODEC_ID_PCM_S24BE:
        case CODEC_ID_PCM_U24LE:
        case CODEC_ID_PCM_U24BE:
        case CODEC_ID_PCM_S24DAUD:
            size_out = size_out / 2 * 3;
            break;
581 582 583 584 585 586 587 588 589
        case CODEC_ID_PCM_S16LE:
        case CODEC_ID_PCM_S16BE:
        case CODEC_ID_PCM_U16LE:
        case CODEC_ID_PCM_U16BE:
            break;
        default:
            size_out = size_out >> 1;
            break;
        }
590
        //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
591
        ret = avcodec_encode_audio(enc, audio_out, size_out,
592
                                   (short *)buftmp);
593
        audio_size += ret;
594 595 596
        pkt.stream_index= ost->index;
        pkt.data= audio_out;
        pkt.size= ret;
597
        if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
598
            pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
599
        pkt.flags |= PKT_FLAG_KEY;
600
        write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
Fabrice Bellard's avatar
Fabrice Bellard committed
601 602 603
    }
}

604 605 606 607 608
static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
{
    AVCodecContext *dec;
    AVPicture *picture2;
    AVPicture picture_tmp;
609
    uint8_t *buf = 0;
610

611
    dec = ist->st->codec;
612 613

    /* deinterlace : must be done before any resize */
614
    if (do_deinterlace || using_vhook) {
615 616 617 618 619 620 621
        int size;

        /* create temporary picture */
        size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
        buf = av_malloc(size);
        if (!buf)
            return;
622

623 624 625
        picture2 = &picture_tmp;
        avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);

Michael Niedermayer's avatar
Michael Niedermayer committed
626
        if (do_deinterlace){
627
            if(avpicture_deinterlace(picture2, picture,
Michael Niedermayer's avatar
Michael Niedermayer committed
628 629 630 631 632 633 634
                                     dec->pix_fmt, dec->width, dec->height) < 0) {
                /* if error, do not deinterlace */
                av_free(buf);
                buf = NULL;
                picture2 = picture;
            }
        } else {
635
            av_picture_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height);
636
        }
637 638 639 640
    } else {
        picture2 = picture;
    }

641
    if (ENABLE_VHOOK)
Diego Biurrun's avatar
Diego Biurrun committed
642 643
        frame_hook_process(picture2, dec->pix_fmt, dec->width, dec->height,
                           1000000 * ist->pts / AV_TIME_BASE);
644 645 646 647 648 649

    if (picture != picture2)
        *picture = *picture2;
    *bufp = buf;
}

650 651
/* we begin to correct av delay at this threshold */
#define AV_DELAY_MAX 0.100
Fabrice Bellard's avatar
Fabrice Bellard committed
652

653 654
static void do_subtitle_out(AVFormatContext *s,
                            AVOutputStream *ost,
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
                            AVInputStream *ist,
                            AVSubtitle *sub,
                            int64_t pts)
{
    static uint8_t *subtitle_out = NULL;
    int subtitle_out_max_size = 65536;
    int subtitle_out_size, nb, i;
    AVCodecContext *enc;
    AVPacket pkt;

    if (pts == AV_NOPTS_VALUE) {
        fprintf(stderr, "Subtitle packets must have a pts\n");
        return;
    }

670
    enc = ost->st->codec;
671 672 673 674 675 676 677 678 679 680 681 682 683 684

    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++) {
685
        subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
686
                                                    subtitle_out_max_size, sub);
687

688 689 690 691
        av_init_packet(&pkt);
        pkt.stream_index = ost->index;
        pkt.data = subtitle_out;
        pkt.size = subtitle_out_size;
692
        pkt.pts = av_rescale_q(pts, ist->st->time_base, ost->st->time_base);
693 694 695 696 697 698 699 700
        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;
        }
701
        write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
702 703 704
    }
}

705
static int bit_buffer_size= 1024*256;
706
static uint8_t *bit_buffer= NULL;
707

708 709
static void do_video_out(AVFormatContext *s,
                         AVOutputStream *ost,
Fabrice Bellard's avatar
Fabrice Bellard committed
710
                         AVInputStream *ist,
711
                         AVFrame *in_picture,
712
                         int *frame_size)
Fabrice Bellard's avatar
Fabrice Bellard committed
713
{
714
    int nb_frames, i, ret;
715
    AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
716
    AVFrame picture_crop_temp, picture_pad_temp;
717
    AVCodecContext *enc, *dec;
718

719
    avcodec_get_frame_defaults(&picture_crop_temp);
720
    avcodec_get_frame_defaults(&picture_pad_temp);
721

722 723
    enc = ost->st->codec;
    dec = ist->st->codec;
Fabrice Bellard's avatar
Fabrice Bellard committed
724

725 726 727
    /* by default, we output a single frame */
    nb_frames = 1;

728 729
    *frame_size = 0;

730
    if(video_sync_method){
731
        double vdelta;
732
        vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
733 734 735
        //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
        if (vdelta < -1.1)
            nb_frames = 0;
736 737
        else if (video_sync_method == 2)
            ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
738
        else if (vdelta > 1.1)
739
            nb_frames = lrintf(vdelta);
740
//fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, ost->sync_ipts, nb_frames);
741 742 743 744
        if (nb_frames == 0){
            ++nb_frames_drop;
            if (verbose>2)
                fprintf(stderr, "*** drop!\n");
745 746
        }else if (nb_frames > 1) {
            nb_frames_dup += nb_frames;
747
            if (verbose>2)
748
                fprintf(stderr, "*** %d dup!\n", nb_frames-1);
749 750
        }
    }else
751
        ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
752

753
    nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
754
    if (nb_frames <= 0)
Fabrice Bellard's avatar
Fabrice Bellard committed
755
        return;
756

757
    if (ost->video_crop) {
758
        if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
759
            av_log(NULL, AV_LOG_ERROR, "error cropping picture\n");
760
            return;
761 762
        }
        formatted_picture = &picture_crop_temp;
763 764
    } else {
        formatted_picture = in_picture;
765 766 767 768 769 770 771 772
    }

    final_picture = formatted_picture;
    padding_src = formatted_picture;
    resampling_dst = &ost->pict_tmp;
    if (ost->video_pad) {
        final_picture = &ost->pict_tmp;
        if (ost->video_resample) {
773
            if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
774
                av_log(NULL, AV_LOG_ERROR, "error padding picture\n");
775
                return;
776 777 778 779 780
            }
            resampling_dst = &picture_pad_temp;
        }
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
781
    if (ost->video_resample) {
782
        padding_src = NULL;
783
        final_picture = &ost->pict_tmp;
784 785
        sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
              0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
786
    }
787 788

    if (ost->video_pad) {
789
        av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
790 791
                enc->height, enc->width, enc->pix_fmt,
                ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
Fabrice Bellard's avatar
Fabrice Bellard committed
792
    }
793

Fabrice Bellard's avatar
Fabrice Bellard committed
794
    /* duplicates frame if needed */
795
    for(i=0;i<nb_frames;i++) {
796 797 798 799
        AVPacket pkt;
        av_init_packet(&pkt);
        pkt.stream_index= ost->index;

800 801 802 803
        if (s->oformat->flags & AVFMT_RAWPICTURE) {
            /* raw pictures are written as AVPicture structure to
               avoid any copies. We support temorarily the older
               method. */
804
            AVFrame* old_frame = enc->coded_frame;
805
            enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
806 807
            pkt.data= (uint8_t *)final_picture;
            pkt.size=  sizeof(AVPicture);
808 809
            pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
            pkt.flags |= PKT_FLAG_KEY;
810

811
            write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
812
            enc->coded_frame = old_frame;
813
        } else {
814
            AVFrame big_picture;
815 816

            big_picture= *final_picture;
817 818 819
            /* better than nothing: use input picture interlaced
               settings */
            big_picture.interlaced_frame = in_picture->interlaced_frame;
820
            if(avctx_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
821 822 823
                if(top_field_first == -1)
                    big_picture.top_field_first = in_picture->top_field_first;
                else
Michael Niedermayer's avatar
Michael Niedermayer committed
824
                    big_picture.top_field_first = top_field_first;
825
            }
826

Fabrice Bellard's avatar
Fabrice Bellard committed
827 828 829
            /* handles sameq here. This is not correct because it may
               not be a global option */
            if (same_quality) {
Michael Niedermayer's avatar
Michael Niedermayer committed
830 831 832
                big_picture.quality = ist->st->quality;
            }else
                big_picture.quality = ost->st->quality;
833 834
            if(!me_threshold)
                big_picture.pict_type = 0;
835
//            big_picture.pts = AV_NOPTS_VALUE;
836 837
            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);
838
//av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
839
            ret = avcodec_encode_video(enc,
840
                                       bit_buffer, bit_buffer_size,
Michael Niedermayer's avatar
Michael Niedermayer committed
841
                                       &big_picture);
842 843 844 845
            if (ret == -1) {
                fprintf(stderr, "Video encoding failed\n");
                exit(1);
            }
846
            //enc->frame_number = enc->real_pict_num;
847
            if(ret>0){
848
                pkt.data= bit_buffer;
849
                pkt.size= ret;
850
                if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
851
                    pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
852
/*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
853 854
   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);*/
855

856 857
                if(enc->coded_frame && enc->coded_frame->key_frame)
                    pkt.flags |= PKT_FLAG_KEY;
858
                write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
859 860 861 862 863 864 865 866
                *frame_size = ret;
                //fprintf(stderr,"\nFrame: %3d %3d size: %5d type: %d",
                //        enc->frame_number-1, enc->real_pict_num, ret,
                //        enc->pict_type);
                /* if two pass, output log */
                if (ost->logfile && enc->stats_out) {
                    fprintf(ost->logfile, "%s", enc->stats_out);
                }
867
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
868
        }
869
        ost->sync_opts++;
870
        ost->frame_number++;
Fabrice Bellard's avatar
Fabrice Bellard committed
871 872 873
    }
}

874
static double psnr(double d){
875
    return -10.0*log(d)/log(10.0);
876 877
}

878
static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
879
                           int frame_size)
880 881 882 883
{
    AVCodecContext *enc;
    int frame_number;
    double ti1, bitrate, avg_bitrate;
884

885
    /* this is executed just the first time do_video_stats is called */
886 887 888
    if (!vstats_file) {
        vstats_file = fopen(vstats_filename, "w");
        if (!vstats_file) {
889 890 891 892 893
            perror("fopen");
            exit(1);
        }
    }

894
    enc = ost->st->codec;
895
    if (enc->codec_type == CODEC_TYPE_VIDEO) {
896
        frame_number = ost->frame_number;
897
        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
898
        if (enc->flags&CODEC_FLAG_PSNR)
899
            fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
900

901
        fprintf(vstats_file,"f_size= %6d ", frame_size);
902
        /* compute pts value */
903
        ti1 = ost->sync_opts * av_q2d(enc->time_base);
904 905
        if (ti1 < 0.01)
            ti1 = 0.01;
906

907
        bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
908
        avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
909
        fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
910
            (double)video_size / 1024, ti1, bitrate, avg_bitrate);
911
        fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
912
    }
913 914
}

915
static void print_report(AVFormatContext **output_files,
916 917
                         AVOutputStream **ost_table, int nb_ostreams,
                         int is_last_report)
918 919 920 921
{
    char buf[1024];
    AVOutputStream *ost;
    AVFormatContext *oc, *os;
922
    int64_t total_size;
923 924 925
    AVCodecContext *enc;
    int frame_number, vid, i;
    double bitrate, ti1, pts;
926
    static int64_t last_time = -1;
927
    static int qp_histogram[52];
928

929
    if (!is_last_report) {
930
        int64_t cur_time;
931 932 933 934 935
        /* display the report every 0.5 seconds */
        cur_time = av_gettime();
        if (last_time == -1) {
            last_time = cur_time;
            return;
936
        }
937 938 939 940 941
        if ((cur_time - last_time) < 500000)
            return;
        last_time = cur_time;
    }

942

943 944
    oc = output_files[0];

945
    total_size = url_fsize(oc->pb);
946
    if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
947
        total_size= url_ftell(oc->pb);
948

949 950 951 952 953 954
    buf[0] = '\0';
    ti1 = 1e10;
    vid = 0;
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
        os = output_files[ost->file_index];
955
        enc = ost->st->codec;
956
        if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
957
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
958 959
                     enc->coded_frame && !ost->st->stream_copy ?
                     enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
960
        }
961
        if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
962 963
            float t = (av_gettime()-timer_start) / 1000000.0;

964
            frame_number = ost->frame_number;
965 966
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
                     frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
967 968
                     enc->coded_frame && !ost->st->stream_copy ?
                     enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
969
            if(is_last_report)
970
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
971 972 973 974 975 976 977 978
            if(qp_hist && enc->coded_frame){
                int j;
                int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
                if(qp>=0 && qp<sizeof(qp_histogram)/sizeof(int))
                    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)));
            }
979 980 981 982 983
            if (enc->flags&CODEC_FLAG_PSNR){
                int j;
                double error, error_sum=0;
                double scale, scale_sum=0;
                char type[3]= {'Y','U','V'};
984
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
985 986 987 988 989 990 991 992 993 994 995
                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;
996
                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
997
                }
998
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
999
            }
1000 1001 1002
            vid = 1;
        }
        /* compute min output value */
1003
        pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1004
        if ((pts < ti1) && (pts > 0))
1005 1006 1007 1008
            ti1 = pts;
    }
    if (ti1 < 0.01)
        ti1 = 0.01;
1009

1010 1011
    if (verbose || is_last_report) {
        bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1012 1013

        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1014 1015
            "size=%8.0fkB time=%0.1f bitrate=%6.1fkbits/s",
            (double)total_size / 1024, ti1, bitrate);
1016

1017 1018 1019
        if (verbose > 1)
          snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
                  nb_frames_dup, nb_frames_drop);
1020

1021 1022 1023
        if (verbose >= 0)
            fprintf(stderr, "%s    \r", buf);

1024 1025
        fflush(stderr);
    }
1026

1027 1028
    if (is_last_report && verbose >= 0){
        int64_t raw= audio_size + video_size + extra_size;
1029
        fprintf(stderr, "\n");
1030 1031 1032 1033 1034 1035 1036
        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
        );
    }
1037 1038
}

1039 1040 1041
/* pkt = NULL means EOF (needed to flush decoder buffers) */
static int output_packet(AVInputStream *ist, int ist_index,
                         AVOutputStream **ost_table, int nb_ostreams,
1042
                         const AVPacket *pkt)
1043 1044 1045 1046 1047 1048 1049 1050 1051
{
    AVFormatContext *os;
    AVOutputStream *ost;
    uint8_t *ptr;
    int len, ret, i;
    uint8_t *data_buf;
    int data_size, got_picture;
    AVFrame picture;
    void *buffer_to_free;
1052
    static unsigned int samples_size= 0;
1053
    static short *samples= NULL;
1054 1055
    AVSubtitle subtitle, *subtitle_to_free;
    int got_subtitle;
1056

1057 1058 1059
    if(ist->next_pts == AV_NOPTS_VALUE)
        ist->next_pts= ist->pts;

1060 1061 1062 1063 1064 1065 1066
    if (pkt == NULL) {
        /* EOF handling */
        ptr = NULL;
        len = 0;
        goto handle_eof;
    }

1067 1068 1069
    if(pkt->dts != AV_NOPTS_VALUE)
        ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);

1070 1071 1072 1073
    len = pkt->size;
    ptr = pkt->data;
    while (len > 0) {
    handle_eof:
1074
        ist->pts= ist->next_pts;
1075

1076 1077 1078
        if(len && len != pkt->size && verbose>0)
            fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);

1079 1080 1081
        /* decode the packet if needed */
        data_buf = NULL; /* fail safe */
        data_size = 0;
1082
        subtitle_to_free = NULL;
1083
        if (ist->decoding_needed) {
1084
            switch(ist->st->codec->codec_type) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1085
            case CODEC_TYPE_AUDIO:{
1086
                if(pkt)
1087
                    samples= av_fast_realloc(samples, &samples_size, FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE));
1088
                data_size= samples_size;
1089 1090
                    /* XXX: could avoid copy if PCM 16 bits with same
                       endianness as CPU */
1091
                ret = avcodec_decode_audio2(ist->st->codec, samples, &data_size,
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
                                           ptr, len);
                if (ret < 0)
                    goto fail_decode;
                ptr += ret;
                len -= ret;
                /* Some bug in mpeg audio decoder gives */
                /* data_size < 0, it seems they are overflows */
                if (data_size <= 0) {
                    /* no audio frame */
                    continue;
                }
                data_buf = (uint8_t *)samples;
1104
                ist->next_pts += ((int64_t)AV_TIME_BASE/2 * data_size) /
1105
                    (ist->st->codec->sample_rate * ist->st->codec->channels);
Michael Niedermayer's avatar
Michael Niedermayer committed
1106
                break;}
1107
            case CODEC_TYPE_VIDEO:
1108
                    data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1109
                    /* XXX: allocate picture correctly */
1110 1111
                    avcodec_get_frame_defaults(&picture);

1112
                    ret = avcodec_decode_video(ist->st->codec,
1113 1114
                                               &picture, &got_picture, ptr, len);
                    ist->st->quality= picture.quality;
1115
                    if (ret < 0)
1116 1117 1118 1119 1120
                        goto fail_decode;
                    if (!got_picture) {
                        /* no picture yet */
                        goto discard_packet;
                    }
1121
                    if (ist->st->codec->time_base.num != 0) {
1122
                        ist->next_pts += ((int64_t)AV_TIME_BASE *
1123 1124
                                          ist->st->codec->time_base.num) /
                            ist->st->codec->time_base.den;
1125 1126 1127
                    }
                    len = 0;
                    break;
1128
            case CODEC_TYPE_SUBTITLE:
1129
                ret = avcodec_decode_subtitle(ist->st->codec,
1130 1131
                                              &subtitle, &got_subtitle, ptr, len);
                if (ret < 0)
1132
                    goto fail_decode;
1133 1134
                if (!got_subtitle) {
                    goto discard_packet;
1135
                }
1136 1137 1138 1139 1140 1141 1142
                subtitle_to_free = &subtitle;
                len = 0;
                break;
            default:
                goto fail_decode;
            }
        } else {
1143 1144 1145
            switch(ist->st->codec->codec_type) {
            case CODEC_TYPE_AUDIO:
                ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1146
                    ist->st->codec->sample_rate;
1147 1148 1149 1150 1151 1152
                break;
            case CODEC_TYPE_VIDEO:
                if (ist->st->codec->time_base.num != 0) {
                    ist->next_pts += ((int64_t)AV_TIME_BASE *
                                      ist->st->codec->time_base.num) /
                        ist->st->codec->time_base.den;
1153
                }
1154
                break;
1155
            }
1156 1157 1158 1159 1160
            data_buf = ptr;
            data_size = len;
            ret = len;
            len = 0;
        }
1161

1162 1163 1164 1165 1166
        buffer_to_free = NULL;
        if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
            pre_process_video_frame(ist, (AVPicture *)&picture,
                                    &buffer_to_free);
        }
1167

1168 1169 1170 1171 1172 1173 1174 1175 1176 1177
        // preprocess audio (volume)
        if (ist->st->codec->codec_type == CODEC_TYPE_AUDIO) {
            if (audio_volume != 256) {
                short *volp;
                volp = samples;
                for(i=0;i<(data_size / sizeof(short));i++) {
                    int v = ((*volp) * audio_volume + 128) >> 8;
                    if (v < -32768) v = -32768;
                    if (v >  32767) v = 32767;
                    *volp++ = v;
1178 1179
                }
            }
1180
        }
1181

1182 1183 1184 1185 1186 1187
        /* frame rate emulation */
        if (ist->st->codec->rate_emu) {
            int64_t pts = av_rescale((int64_t) ist->frame * ist->st->codec->time_base.num, 1000000, ist->st->codec->time_base.den);
            int64_t now = av_gettime() - ist->start;
            if (pts > now)
                usleep(pts - now);
1188

1189 1190
            ist->frame++;
        }
1191 1192

#if 0
1193 1194 1195 1196 1197 1198 1199 1200 1201
        /* mpeg PTS deordering : if it is a P or I frame, the PTS
           is the one of the next displayed one */
        /* XXX: add mpeg4 too ? */
        if (ist->st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
            if (ist->st->codec->pict_type != B_TYPE) {
                int64_t tmp;
                tmp = ist->last_ip_pts;
                ist->last_ip_pts  = ist->frac_pts.val;
                ist->frac_pts.val = tmp;
1202
            }
1203
        }
1204
#endif
1205 1206 1207 1208 1209
        /* 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;
1210

1211 1212 1213
                ost = ost_table[i];
                if (ost->source_index == ist_index) {
                    os = output_files[ost->file_index];
1214 1215

#if 0
1216 1217 1218 1219
                    printf("%d: got pts=%0.3f %0.3f\n", i,
                           (double)pkt->pts / AV_TIME_BASE,
                           ((double)ist->pts / AV_TIME_BASE) -
                           ((double)ost->st->pts.val * ost->st->time_base.num / ost->st->time_base.den));
1220
#endif
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231
                    /* set the input output pts pairs */
                    //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;

                    if (ost->encoding_needed) {
                        switch(ost->st->codec->codec_type) {
                        case CODEC_TYPE_AUDIO:
                            do_audio_out(os, ost, ist, data_buf, data_size);
                            break;
                        case CODEC_TYPE_VIDEO:
                            do_video_out(os, ost, ist, &picture, &frame_size);
                            video_size += frame_size;
1232
                            if (vstats_filename && frame_size)
1233 1234 1235 1236 1237 1238 1239
                                do_video_stats(os, ost, frame_size);
                            break;
                        case CODEC_TYPE_SUBTITLE:
                            do_subtitle_out(os, ost, ist, &subtitle,
                                            pkt->pts);
                            break;
                        default:
1240
                            abort();
1241 1242 1243 1244 1245 1246
                        }
                    } else {
                        AVFrame avframe; //FIXME/XXX remove this
                        AVPacket opkt;
                        av_init_packet(&opkt);

1247 1248 1249
                        if (!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY))
                            continue;

1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265
                        /* no reencoding needed : output the packet directly */
                        /* force the input stream PTS */

                        avcodec_get_frame_defaults(&avframe);
                        ost->st->codec->coded_frame= &avframe;
                        avframe.key_frame = pkt->flags & PKT_FLAG_KEY;

                        if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO)
                            audio_size += data_size;
                        else if (ost->st->codec->codec_type == CODEC_TYPE_VIDEO) {
                            video_size += data_size;
                            ost->sync_opts++;
                        }

                        opkt.stream_index= ost->index;
                        if(pkt->pts != AV_NOPTS_VALUE)
1266
                            opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base);
1267 1268 1269 1270
                        else
                            opkt.pts= AV_NOPTS_VALUE;

                            if (pkt->dts == AV_NOPTS_VALUE)
1271
                                opkt.dts = av_rescale_q(ist->next_pts, AV_TIME_BASE_Q, ost->st->time_base);
1272
                            else
1273 1274
                                opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);

1275
                        opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1276 1277 1278 1279 1280 1281
                        opkt.flags= pkt->flags;

                        //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
                        if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & PKT_FLAG_KEY))
                            opkt.destruct= av_destruct_packet;

1282
                        write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1283 1284 1285
                        ost->st->codec->frame_number++;
                        ost->frame_number++;
                        av_free_packet(&opkt);
1286 1287
                    }
                }
1288 1289 1290 1291 1292 1293 1294 1295
            }
        av_free(buffer_to_free);
        /* XXX: allocate the subtitles in the codec ? */
        if (subtitle_to_free) {
            if (subtitle_to_free->rects != NULL) {
                for (i = 0; i < subtitle_to_free->num_rects; i++) {
                    av_free(subtitle_to_free->rects[i].bitmap);
                    av_free(subtitle_to_free->rects[i].rgba_palette);
1296
                }
1297
                av_freep(&subtitle_to_free->rects);
1298
            }
1299 1300
            subtitle_to_free->num_rects = 0;
            subtitle_to_free = NULL;
1301
        }
1302
    }
1303
 discard_packet:
1304 1305
    if (pkt == NULL) {
        /* EOF handling */
1306

1307 1308 1309
        for(i=0;i<nb_ostreams;i++) {
            ost = ost_table[i];
            if (ost->source_index == ist_index) {
1310
                AVCodecContext *enc= ost->st->codec;
1311
                os = output_files[ost->file_index];
1312

1313
                if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1314
                    continue;
1315
                if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1316 1317 1318 1319 1320
                    continue;

                if (ost->encoding_needed) {
                    for(;;) {
                        AVPacket pkt;
1321
                        int fifo_bytes;
1322 1323
                        av_init_packet(&pkt);
                        pkt.stream_index= ost->index;
1324

1325
                        switch(ost->st->codec->codec_type) {
1326
                        case CODEC_TYPE_AUDIO:
1327
                            fifo_bytes = av_fifo_size(&ost->fifo);
1328 1329 1330 1331 1332
                            ret = 0;
                            /* encode any samples remaining in fifo */
                            if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
                                int fs_tmp = enc->frame_size;
                                enc->frame_size = fifo_bytes / (2 * enc->channels);
1333
                                if(av_fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes) == 0) {
1334 1335 1336
                                    ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
                                }
                                enc->frame_size = fs_tmp;
Michael Niedermayer's avatar
Michael Niedermayer committed
1337 1338
                            }
                            if(ret <= 0) {
1339 1340
                                ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
                            }
1341 1342 1343 1344
                            audio_size += ret;
                            pkt.flags |= PKT_FLAG_KEY;
                            break;
                        case CODEC_TYPE_VIDEO:
1345
                            ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
                            video_size += ret;
                            if(enc->coded_frame && enc->coded_frame->key_frame)
                                pkt.flags |= PKT_FLAG_KEY;
                            if (ost->logfile && enc->stats_out) {
                                fprintf(ost->logfile, "%s", enc->stats_out);
                            }
                            break;
                        default:
                            ret=-1;
                        }
1356

1357 1358
                        if(ret<=0)
                            break;
1359
                        pkt.data= bit_buffer;
1360
                        pkt.size= ret;
1361
                        if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1362
                            pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1363
                        write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1364 1365 1366 1367 1368
                    }
                }
            }
        }
    }
1369

1370 1371 1372 1373 1374
    return 0;
 fail_decode:
    return -1;
}

1375 1376 1377 1378 1379 1380 1381
static void print_sdp(AVFormatContext **avc, int n)
{
    char sdp[2048];

    avf_sdp_create(avc, n, sdp, sizeof(sdp));
    printf("SDP:\n%s\n", sdp);
}
1382

1383 1384 1385 1386 1387 1388 1389
static int stream_index_from_inputs(AVFormatContext **input_files,
                                    int nb_input_files,
                                    AVInputFile *file_table,
                                    AVInputStream **ist_table,
                                    enum CodecType type,
                                    int programid)
{
1390
    int p, q, z;
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
    for(z=0; z<nb_input_files; z++) {
        AVFormatContext *ic = input_files[z];
        for(p=0; p<ic->nb_programs; p++) {
            AVProgram *program = ic->programs[p];
            if(program->id != programid)
                continue;
            for(q=0; q<program->nb_stream_indexes; q++) {
                int sidx = program->stream_index[q];
                int ris = file_table[z].ist_index + sidx;
                if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type)
                    return ris;
            }
        }
    }

    return -1;
}

Fabrice Bellard's avatar
Fabrice Bellard committed
1409 1410 1411 1412 1413 1414 1415 1416 1417
/*
 * The following code is the main loop of the file converter
 */
static int av_encode(AVFormatContext **output_files,
                     int nb_output_files,
                     AVFormatContext **input_files,
                     int nb_input_files,
                     AVStreamMap *stream_maps, int nb_stream_maps)
{
1418
    int ret, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
1419 1420 1421 1422
    AVFormatContext *is, *os;
    AVCodecContext *codec, *icodec;
    AVOutputStream *ost, **ost_table = NULL;
    AVInputStream *ist, **ist_table = NULL;
Fabrice Bellard's avatar
Fabrice Bellard committed
1423
    AVInputFile *file_table;
1424
    int key;
1425
    int want_sdp = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
1426

1427
    file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
Fabrice Bellard's avatar
Fabrice Bellard committed
1428 1429
    if (!file_table)
        goto fail;
1430

Fabrice Bellard's avatar
Fabrice Bellard committed
1431 1432 1433 1434 1435
    /* input stream init */
    j = 0;
    for(i=0;i<nb_input_files;i++) {
        is = input_files[i];
        file_table[i].ist_index = j;
1436
        file_table[i].nb_streams = is->nb_streams;
Fabrice Bellard's avatar
Fabrice Bellard committed
1437 1438 1439 1440 1441 1442
        j += is->nb_streams;
    }
    nb_istreams = j;

    ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
    if (!ist_table)
Fabrice Bellard's avatar
Fabrice Bellard committed
1443
        goto fail;
1444

Fabrice Bellard's avatar
Fabrice Bellard committed
1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
    for(i=0;i<nb_istreams;i++) {
        ist = av_mallocz(sizeof(AVInputStream));
        if (!ist)
            goto fail;
        ist_table[i] = ist;
    }
    j = 0;
    for(i=0;i<nb_input_files;i++) {
        is = input_files[i];
        for(k=0;k<is->nb_streams;k++) {
            ist = ist_table[j++];
            ist->st = is->streams[k];
            ist->file_index = i;
            ist->index = k;
            ist->discard = 1; /* the stream is discarded by default
                                 (changed later) */
1461

1462
            if (ist->st->codec->rate_emu) {
1463 1464 1465
                ist->start = av_gettime();
                ist->frame = 0;
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
1466 1467 1468 1469 1470 1471 1472
        }
    }

    /* output stream init */
    nb_ostreams = 0;
    for(i=0;i<nb_output_files;i++) {
        os = output_files[i];
1473 1474 1475 1476
        if (!os->nb_streams) {
            fprintf(stderr, "Output file does not contain any stream\n");
            exit(1);
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
1477 1478 1479 1480 1481 1482 1483
        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");
        exit(1);
    }

1484 1485 1486 1487
    /* 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;
1488

1489 1490 1491 1492 1493
        if (fi < 0 || fi > nb_input_files - 1 ||
            si < 0 || si > file_table[fi].nb_streams - 1) {
            fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
            exit(1);
        }
1494 1495 1496 1497 1498 1499 1500
        fi = stream_maps[i].sync_file_index;
        si = stream_maps[i].sync_stream_index;
        if (fi < 0 || fi > nb_input_files - 1 ||
            si < 0 || si > file_table[fi].nb_streams - 1) {
            fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
            exit(1);
        }
1501
    }
1502

Fabrice Bellard's avatar
Fabrice Bellard committed
1503 1504 1505 1506 1507 1508 1509 1510 1511
    ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
    if (!ost_table)
        goto fail;
    for(i=0;i<nb_ostreams;i++) {
        ost = av_mallocz(sizeof(AVOutputStream));
        if (!ost)
            goto fail;
        ost_table[i] = ost;
    }
1512

Fabrice Bellard's avatar
Fabrice Bellard committed
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
    n = 0;
    for(k=0;k<nb_output_files;k++) {
        os = output_files[k];
        for(i=0;i<os->nb_streams;i++) {
            int found;
            ost = ost_table[n++];
            ost->file_index = k;
            ost->index = i;
            ost->st = os->streams[i];
            if (nb_stream_maps > 0) {
1523
                ost->source_index = file_table[stream_maps[n-1].file_index].ist_index +
Fabrice Bellard's avatar
Fabrice Bellard committed
1524
                    stream_maps[n-1].stream_index;
1525

1526
                /* Sanity check that the stream types match */
1527
                if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1528 1529 1530 1531 1532
                    fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
                        stream_maps[n-1].file_index, stream_maps[n-1].stream_index,
                        ost->file_index, ost->index);
                    exit(1);
                }
1533

Fabrice Bellard's avatar
Fabrice Bellard committed
1534
            } else {
1535 1536 1537 1538 1539 1540 1541 1542
                if(opt_programid) {
                    found = 0;
                    j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid);
                    if(j != -1) {
                        ost->source_index = j;
                        found = 1;
                    }
                } else {
1543 1544
                    /* get corresponding input stream index : we select the first one with the right type */
                    found = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
1545 1546
                    for(j=0;j<nb_istreams;j++) {
                        ist = ist_table[j];
1547 1548
                        if (ist->discard &&
                            ist->st->codec->codec_type == ost->st->codec->codec_type) {
Fabrice Bellard's avatar
Fabrice Bellard committed
1549 1550
                            ost->source_index = j;
                            found = 1;
1551
                            break;
Fabrice Bellard's avatar
Fabrice Bellard committed
1552 1553
                        }
                    }
1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565
                }

                if (!found) {
                    if(! opt_programid) {
                        /* try again and reuse existing stream */
                        for(j=0;j<nb_istreams;j++) {
                            ist = ist_table[j];
                            if (ist->st->codec->codec_type == ost->st->codec->codec_type) {
                                ost->source_index = j;
                                found = 1;
                            }
                        }
1566
                    }
Fabrice Bellard's avatar
Fabrice Bellard committed
1567 1568 1569 1570 1571 1572 1573 1574 1575
                    if (!found) {
                        fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
                                ost->file_index, ost->index);
                        exit(1);
                    }
                }
            }
            ist = ist_table[ost->source_index];
            ist->discard = 0;
1576 1577 1578
            ost->sync_ist = (nb_stream_maps > 0) ?
                ist_table[file_table[stream_maps[n-1].sync_file_index].ist_index +
                         stream_maps[n-1].sync_stream_index] : ist;
Fabrice Bellard's avatar
Fabrice Bellard committed
1579 1580 1581 1582 1583 1584
        }
    }

    /* for each output stream, we compute the right encoding parameters */
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
1585
        os = output_files[ost->file_index];
Fabrice Bellard's avatar
Fabrice Bellard committed
1586 1587
        ist = ist_table[ost->source_index];

1588 1589
        codec = ost->st->codec;
        icodec = ist->st->codec;
Fabrice Bellard's avatar
Fabrice Bellard committed
1590

1591 1592 1593 1594
        if (!ost->st->language[0])
            av_strlcpy(ost->st->language, ist->st->language,
                       sizeof(ost->st->language));

1595 1596
        ost->st->disposition = ist->st->disposition;

1597 1598 1599 1600
        if (ost->st->stream_copy) {
            /* if stream_copy is selected, no need to decode or encode */
            codec->codec_id = icodec->codec_id;
            codec->codec_type = icodec->codec_type;
1601 1602 1603 1604 1605 1606 1607 1608

            if(!codec->codec_tag){
                if(   !os->oformat->codec_tag
                   || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) > 0
                   || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
                    codec->codec_tag = icodec->codec_tag;
            }

1609
            codec->bit_rate = icodec->bit_rate;
1610 1611
            codec->extradata= icodec->extradata;
            codec->extradata_size= icodec->extradata_size;
1612
            if(av_q2d(icodec->time_base) > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000)
1613 1614 1615
                codec->time_base = icodec->time_base;
            else
                codec->time_base = ist->st->time_base;
1616 1617 1618 1619
            switch(codec->codec_type) {
            case CODEC_TYPE_AUDIO:
                codec->sample_rate = icodec->sample_rate;
                codec->channels = icodec->channels;
1620
                codec->frame_size = icodec->frame_size;
1621
                codec->block_align= icodec->block_align;
1622 1623
                if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
                    codec->block_align= 0;
1624 1625
                break;
            case CODEC_TYPE_VIDEO:
1626 1627 1628 1629
                if(using_vhook) {
                    fprintf(stderr,"-vcodec copy and -vhook are incompatible (frames are not decoded)\n");
                    exit(1);
                }
1630
                codec->pix_fmt = icodec->pix_fmt;
1631 1632
                codec->width = icodec->width;
                codec->height = icodec->height;
1633
                codec->has_b_frames = icodec->has_b_frames;
1634
                break;
1635 1636
            case CODEC_TYPE_SUBTITLE:
                break;
1637
            default:
1638
                abort();
1639 1640 1641 1642
            }
        } else {
            switch(codec->codec_type) {
            case CODEC_TYPE_AUDIO:
1643
                if (av_fifo_init(&ost->fifo, 1024))
Fabrice Bellard's avatar
Fabrice Bellard committed
1644
                    goto fail;
1645 1646
                ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
                icodec->request_channels = codec->channels;
Fabrice Bellard's avatar
Fabrice Bellard committed
1647 1648
                ist->decoding_needed = 1;
                ost->encoding_needed = 1;
1649 1650
                break;
            case CODEC_TYPE_VIDEO:
1651 1652 1653 1654 1655 1656 1657
                ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
                ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
                ost->video_resample = ((codec->width != icodec->width -
                                (frame_leftBand + frame_rightBand) +
                                (frame_padleft + frame_padright)) ||
                        (codec->height != icodec->height -
                                (frame_topBand  + frame_bottomBand) +
1658 1659
                                (frame_padtop + frame_padbottom)) ||
                        (codec->pix_fmt != icodec->pix_fmt));
1660
                if (ost->video_crop) {
1661 1662
                    ost->topBand = frame_topBand;
                    ost->leftBand = frame_leftBand;
1663 1664
                }
                if (ost->video_pad) {
1665 1666 1667 1668
                    ost->padtop = frame_padtop;
                    ost->padleft = frame_padleft;
                    ost->padbottom = frame_padbottom;
                    ost->padright = frame_padright;
1669 1670 1671 1672 1673 1674 1675 1676
                    if (!ost->video_resample) {
                        avcodec_get_frame_defaults(&ost->pict_tmp);
                        if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
                                         codec->width, codec->height ) )
                            goto fail;
                    }
                }
                if (ost->video_resample) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1677
                    avcodec_get_frame_defaults(&ost->pict_tmp);
1678
                    if( avpicture_alloc( (AVPicture*)&ost->pict_tmp, codec->pix_fmt,
Baptiste Coudurier's avatar
Baptiste Coudurier committed
1679 1680
                                         codec->width, codec->height ) ) {
                        fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1681
                        exit(1);
Baptiste Coudurier's avatar
Baptiste Coudurier committed
1682
                    }
1683
                    sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1684 1685 1686 1687
                    ost->img_resample_ctx = sws_getContext(
                            icodec->width - (frame_leftBand + frame_rightBand),
                            icodec->height - (frame_topBand + frame_bottomBand),
                            icodec->pix_fmt,
1688 1689
                            codec->width - (frame_padleft + frame_padright),
                            codec->height - (frame_padtop + frame_padbottom),
1690 1691
                            codec->pix_fmt,
                            sws_flags, NULL, NULL, NULL);
1692 1693 1694 1695
                    if (ost->img_resample_ctx == NULL) {
                        fprintf(stderr, "Cannot get resampling context\n");
                        exit(1);
                    }
1696
                    ost->resample_height = icodec->height - (frame_topBand + frame_bottomBand);
Fabrice Bellard's avatar
Fabrice Bellard committed
1697 1698 1699
                }
                ost->encoding_needed = 1;
                ist->decoding_needed = 1;
1700
                break;
1701 1702 1703 1704
            case CODEC_TYPE_SUBTITLE:
                ost->encoding_needed = 1;
                ist->decoding_needed = 1;
                break;
1705
            default:
1706
                abort();
1707
                break;
Fabrice Bellard's avatar
Fabrice Bellard committed
1708
            }
1709
            /* two pass mode */
1710
            if (ost->encoding_needed &&
1711 1712 1713 1714 1715
                (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
                char logfilename[1024];
                FILE *f;
                int size;
                char *logbuffer;
1716 1717 1718

                snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
                         pass_logfilename ?
1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741
                         pass_logfilename : DEFAULT_PASS_LOGFILENAME, i);
                if (codec->flags & CODEC_FLAG_PASS1) {
                    f = fopen(logfilename, "w");
                    if (!f) {
                        perror(logfilename);
                        exit(1);
                    }
                    ost->logfile = f;
                } else {
                    /* read the log file */
                    f = fopen(logfilename, "r");
                    if (!f) {
                        perror(logfilename);
                        exit(1);
                    }
                    fseek(f, 0, SEEK_END);
                    size = ftell(f);
                    fseek(f, 0, SEEK_SET);
                    logbuffer = av_malloc(size + 1);
                    if (!logbuffer) {
                        fprintf(stderr, "Could not allocate log buffer\n");
                        exit(1);
                    }
1742
                    size = fread(logbuffer, 1, size, f);
1743 1744 1745
                    fclose(f);
                    logbuffer[size] = '\0';
                    codec->stats_in = logbuffer;
1746 1747 1748
                }
            }
        }
1749 1750 1751 1752
        if(codec->codec_type == CODEC_TYPE_VIDEO){
            int size= codec->width * codec->height;
            bit_buffer_size= FFMAX(bit_buffer_size, 4*size);
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
1753 1754
    }

1755 1756 1757 1758 1759
    if (!bit_buffer)
        bit_buffer = av_malloc(bit_buffer_size);
    if (!bit_buffer)
        goto fail;

1760 1761 1762 1763 1764 1765 1766
    /* dump the file output parameters - cannot be done before in case
       of stream copy */
    for(i=0;i<nb_output_files;i++) {
        dump_format(output_files[i], i, output_files[i]->filename, 1);
    }

    /* dump the stream mapping */
1767 1768 1769 1770
    if (verbose >= 0) {
        fprintf(stderr, "Stream mapping:\n");
        for(i=0;i<nb_ostreams;i++) {
            ost = ost_table[i];
1771
            fprintf(stderr, "  Stream #%d.%d -> #%d.%d",
1772 1773
                    ist_table[ost->source_index]->file_index,
                    ist_table[ost->source_index]->index,
1774
                    ost->file_index,
1775
                    ost->index);
1776 1777 1778 1779 1780
            if (ost->sync_ist != ist_table[ost->source_index])
                fprintf(stderr, " [sync #%d.%d]",
                        ost->sync_ist->file_index,
                        ost->sync_ist->index);
            fprintf(stderr, "\n");
1781
        }
1782 1783
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
1784 1785 1786 1787 1788
    /* open each encoder */
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
        if (ost->encoding_needed) {
            AVCodec *codec;
1789
            codec = avcodec_find_encoder(ost->st->codec->codec_id);
Fabrice Bellard's avatar
Fabrice Bellard committed
1790
            if (!codec) {
1791
                fprintf(stderr, "Unsupported codec for output stream #%d.%d\n",
Fabrice Bellard's avatar
Fabrice Bellard committed
1792 1793 1794
                        ost->file_index, ost->index);
                exit(1);
            }
1795
            if (avcodec_open(ost->st->codec, codec) < 0) {
1796
                fprintf(stderr, "Error while opening codec for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height\n",
Fabrice Bellard's avatar
Fabrice Bellard committed
1797 1798 1799
                        ost->file_index, ost->index);
                exit(1);
            }
1800
            extra_size += ost->st->codec->extradata_size;
Fabrice Bellard's avatar
Fabrice Bellard committed
1801 1802 1803 1804 1805 1806 1807 1808
        }
    }

    /* open each decoder */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
        if (ist->decoding_needed) {
            AVCodec *codec;
1809
            codec = avcodec_find_decoder(ist->st->codec->codec_id);
Fabrice Bellard's avatar
Fabrice Bellard committed
1810
            if (!codec) {
1811
                fprintf(stderr, "Unsupported codec (id=%d) for input stream #%d.%d\n",
1812
                        ist->st->codec->codec_id, ist->file_index, ist->index);
Fabrice Bellard's avatar
Fabrice Bellard committed
1813 1814
                exit(1);
            }
1815
            if (avcodec_open(ist->st->codec, codec) < 0) {
1816
                fprintf(stderr, "Error while opening codec for input stream #%d.%d\n",
Fabrice Bellard's avatar
Fabrice Bellard committed
1817 1818 1819
                        ist->file_index, ist->index);
                exit(1);
            }
1820 1821
            //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
            //    ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
Fabrice Bellard's avatar
Fabrice Bellard committed
1822 1823 1824 1825 1826 1827
        }
    }

    /* init pts */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
1828
        is = input_files[ist->file_index];
1829
        ist->pts = 0;
1830
        ist->next_pts = AV_NOPTS_VALUE;
1831
        ist->is_start = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
1832
    }
1833

1834 1835 1836 1837 1838 1839 1840 1841 1842
    /* set meta data information from input file if required */
    for (i=0;i<nb_meta_data_maps;i++) {
        AVFormatContext *out_file;
        AVFormatContext *in_file;

        int out_file_index = meta_data_maps[i].out_file;
        int in_file_index = meta_data_maps[i].in_file;
        if ( out_file_index < 0 || out_file_index >= nb_output_files ) {
            fprintf(stderr, "Invalid output file index %d map_meta_data(%d,%d)\n", out_file_index, out_file_index, in_file_index);
1843
            ret = AVERROR(EINVAL);
1844 1845 1846 1847
            goto fail;
        }
        if ( in_file_index < 0 || in_file_index >= nb_input_files ) {
            fprintf(stderr, "Invalid input file index %d map_meta_data(%d,%d)\n", in_file_index, out_file_index, in_file_index);
1848
            ret = AVERROR(EINVAL);
1849
            goto fail;
1850 1851
        }

1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863
        out_file = output_files[out_file_index];
        in_file = input_files[in_file_index];

        strcpy(out_file->title, in_file->title);
        strcpy(out_file->author, in_file->author);
        strcpy(out_file->copyright, in_file->copyright);
        strcpy(out_file->comment, in_file->comment);
        strcpy(out_file->album, in_file->album);
        out_file->year = in_file->year;
        out_file->track = in_file->track;
        strcpy(out_file->genre, in_file->genre);
    }
1864

Fabrice Bellard's avatar
Fabrice Bellard committed
1865 1866 1867
    /* open files and write file headers */
    for(i=0;i<nb_output_files;i++) {
        os = output_files[i];
1868
        if (av_write_header(os) < 0) {
1869
            fprintf(stderr, "Could not write header for output file #%d (incorrect codec parameters ?)\n", i);
1870
            ret = AVERROR(EINVAL);
1871 1872
            goto fail;
        }
1873 1874 1875 1876 1877 1878
        if (strcmp(output_files[i]->oformat->name, "rtp")) {
            want_sdp = 0;
        }
    }
    if (want_sdp) {
        print_sdp(output_files, nb_output_files);
Fabrice Bellard's avatar
Fabrice Bellard committed
1879 1880
    }

1881
    if ( !using_stdin && verbose >= 0) {
1882
        fprintf(stderr, "Press [q] to stop encoding\n");
1883 1884
        url_set_interrupt_cb(decode_interrupt_cb);
    }
1885 1886
    term_init();

1887
    key = -1;
1888
    timer_start = av_gettime();
1889

1890
    for(; received_sigterm == 0;) {
Fabrice Bellard's avatar
Fabrice Bellard committed
1891 1892
        int file_index, ist_index;
        AVPacket pkt;
1893 1894
        double ipts_min;
        double opts_min;
1895

Fabrice Bellard's avatar
Fabrice Bellard committed
1896
    redo:
1897 1898
        ipts_min= 1e100;
        opts_min= 1e100;
1899
        /* if 'q' pressed, exits */
1900
        if (!using_stdin) {
1901 1902
            if (q_pressed)
                break;
1903 1904 1905 1906 1907
            /* read_key() returns 0 on EOF */
            key = read_key();
            if (key == 'q')
                break;
        }
1908

1909 1910
        /* select the stream that we must read now by looking at the
           smallest output pts */
Fabrice Bellard's avatar
Fabrice Bellard committed
1911
        file_index = -1;
1912
        for(i=0;i<nb_ostreams;i++) {
1913
            double ipts, opts;
1914 1915 1916
            ost = ost_table[i];
            os = output_files[ost->file_index];
            ist = ist_table[ost->source_index];
1917 1918
            if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
                opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
1919
            else
1920
                opts = ost->st->pts.val * av_q2d(ost->st->time_base);
1921 1922 1923 1924 1925 1926 1927 1928 1929 1930
            ipts = (double)ist->pts;
            if (!file_table[ist->file_index].eof_reached){
                if(ipts < ipts_min) {
                    ipts_min = ipts;
                    if(input_sync ) file_index = ist->file_index;
                }
                if(opts < opts_min) {
                    opts_min = opts;
                    if(!input_sync) file_index = ist->file_index;
                }
Fabrice Bellard's avatar
Fabrice Bellard committed
1931
            }
1932
            if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
1933 1934 1935
                file_index= -1;
                break;
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
1936 1937
        }
        /* if none, if is finished */
1938
        if (file_index < 0) {
Fabrice Bellard's avatar
Fabrice Bellard committed
1939
            break;
1940 1941
        }

Fabrice Bellard's avatar
Fabrice Bellard committed
1942
        /* finish if recording time exhausted */
1943
        if (recording_time > 0 && opts_min >= (recording_time / 1000000.0))
Fabrice Bellard's avatar
Fabrice Bellard committed
1944
            break;
1945

1946
        /* finish if limit size exhausted */
1947
        if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
1948 1949
            break;

1950
        /* read a frame from it and output it in the fifo */
Fabrice Bellard's avatar
Fabrice Bellard committed
1951
        is = input_files[file_index];
1952
        if (av_read_frame(is, &pkt) < 0) {
Fabrice Bellard's avatar
Fabrice Bellard committed
1953
            file_table[file_index].eof_reached = 1;
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1954 1955 1956 1957
            if (opt_shortest)
                break;
            else
                continue;
Fabrice Bellard's avatar
Fabrice Bellard committed
1958
        }
1959

1960
        if (do_pkt_dump) {
1961
            av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
1962
        }
1963 1964 1965
        /* the following test is needed in case new streams appear
           dynamically in stream : we ignore them */
        if (pkt.stream_index >= file_table[file_index].nb_streams)
1966
            goto discard_packet;
Fabrice Bellard's avatar
Fabrice Bellard committed
1967 1968
        ist_index = file_table[file_index].ist_index + pkt.stream_index;
        ist = ist_table[ist_index];
1969 1970
        if (ist->discard)
            goto discard_packet;
Fabrice Bellard's avatar
Fabrice Bellard committed
1971

1972 1973 1974 1975 1976
        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);

1977
//        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);
1978
        if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) {
1979 1980 1981
            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){
1982 1983
                input_files_ts_offset[ist->file_index]-= delta;
                if (verbose > 2)
1984
                    fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
1985 1986 1987
                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);
1988 1989 1990
            }
        }

1991
        //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
1992
        if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
1993 1994 1995 1996 1997

            if (verbose >= 0)
                fprintf(stderr, "Error while decoding stream #%d.%d\n",
                        ist->file_index, ist->index);

1998 1999
            av_free_packet(&pkt);
            goto redo;
Michael Niedermayer's avatar
Michael Niedermayer committed
2000
        }
2001

2002
    discard_packet:
Fabrice Bellard's avatar
Fabrice Bellard committed
2003
        av_free_packet(&pkt);
2004

2005 2006
        /* dump report by using the output first video and audio streams */
        print_report(output_files, ost_table, nb_ostreams, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
2007
    }
2008 2009 2010 2011 2012 2013 2014 2015 2016

    /* at the end of stream, we must flush the decoder buffers */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
        if (ist->decoding_needed) {
            output_packet(ist, i, ost_table, nb_ostreams, NULL);
        }
    }

2017
    term_exit();
Fabrice Bellard's avatar
Fabrice Bellard committed
2018

2019 2020 2021 2022 2023 2024
    /* write the trailer if needed and close file */
    for(i=0;i<nb_output_files;i++) {
        os = output_files[i];
        av_write_trailer(os);
    }

2025 2026 2027
    /* dump report by using the first video and audio streams */
    print_report(output_files, ost_table, nb_ostreams, 1);

Fabrice Bellard's avatar
Fabrice Bellard committed
2028 2029 2030 2031
    /* close each encoder */
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
        if (ost->encoding_needed) {
2032 2033
            av_freep(&ost->st->codec->stats_in);
            avcodec_close(ost->st->codec);
Fabrice Bellard's avatar
Fabrice Bellard committed
2034 2035
        }
    }
2036

Fabrice Bellard's avatar
Fabrice Bellard committed
2037 2038 2039 2040
    /* close each decoder */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
        if (ist->decoding_needed) {
2041
            avcodec_close(ist->st->codec);
Fabrice Bellard's avatar
Fabrice Bellard committed
2042 2043 2044 2045
        }
    }

    /* finished ! */
2046

Fabrice Bellard's avatar
Fabrice Bellard committed
2047 2048
    ret = 0;
 fail1:
2049
    av_freep(&bit_buffer);
2050
    av_free(file_table);
Fabrice Bellard's avatar
Fabrice Bellard committed
2051

Fabrice Bellard's avatar
Fabrice Bellard committed
2052 2053 2054
    if (ist_table) {
        for(i=0;i<nb_istreams;i++) {
            ist = ist_table[i];
2055
            av_free(ist);
Fabrice Bellard's avatar
Fabrice Bellard committed
2056
        }
2057
        av_free(ist_table);
Fabrice Bellard's avatar
Fabrice Bellard committed
2058 2059 2060 2061 2062
    }
    if (ost_table) {
        for(i=0;i<nb_ostreams;i++) {
            ost = ost_table[i];
            if (ost) {
2063 2064 2065 2066
                if (ost->logfile) {
                    fclose(ost->logfile);
                    ost->logfile = NULL;
                }
2067 2068
                av_fifo_free(&ost->fifo); /* works even if fifo is not
                                             initialized but set to zero */
2069
                av_free(ost->pict_tmp.data[0]);
Fabrice Bellard's avatar
Fabrice Bellard committed
2070
                if (ost->video_resample)
2071
                    sws_freeContext(ost->img_resample_ctx);
2072
                if (ost->resample)
Fabrice Bellard's avatar
Fabrice Bellard committed
2073
                    audio_resample_close(ost->resample);
2074
                av_free(ost);
Fabrice Bellard's avatar
Fabrice Bellard committed
2075 2076
            }
        }
2077
        av_free(ost_table);
Fabrice Bellard's avatar
Fabrice Bellard committed
2078 2079 2080
    }
    return ret;
 fail:
2081
    ret = AVERROR(ENOMEM);
Fabrice Bellard's avatar
Fabrice Bellard committed
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106
    goto fail1;
}

#if 0
int file_read(const char *filename)
{
    URLContext *h;
    unsigned char buffer[1024];
    int len, i;

    if (url_open(&h, filename, O_RDONLY) < 0) {
        printf("could not open '%s'\n", filename);
        return -1;
    }
    for(;;) {
        len = url_read(h, buffer, sizeof(buffer));
        if (len <= 0)
            break;
        for(i=0;i<len;i++) putchar(buffer[i]);
    }
    url_close(h);
    return 0;
}
#endif

2107
static void opt_format(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2108
{
2109 2110
    /* compatibility stuff for pgmyuv */
    if (!strcmp(arg, "pgmyuv")) {
2111
        pgmyuv_compatibility_hack=1;
2112
//        opt_image_format(arg);
2113
        arg = "image2";
2114
        fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2115 2116
    }

2117 2118 2119 2120
    file_iformat = av_find_input_format(arg);
    file_oformat = guess_format(arg, NULL, NULL);
    if (!file_iformat && !file_oformat) {
        fprintf(stderr, "Unknown input or output format: %s\n", arg);
Fabrice Bellard's avatar
Fabrice Bellard committed
2121 2122 2123 2124
        exit(1);
    }
}

2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164
extern int ffm_nopts;

static int opt_default(const char *opt, const char *arg){
    int type;
    const AVOption *o= NULL;
    int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT_FLAG_SUBTITLE_PARAM, 0};

    for(type=0; type<CODEC_TYPE_NB; type++){
        const AVOption *o2 = av_find_opt(avctx_opts[0], opt, NULL, opt_types[type], opt_types[type]);
        if(o2)
            o = av_set_string(avctx_opts[type], opt, arg);
    }
    if(!o)
        o = av_set_string(avformat_opts, opt, arg);
    if(!o)
        o = av_set_string(sws_opts, opt, arg);
    if(!o){
        if(opt[0] == 'a')
            o = av_set_string(avctx_opts[CODEC_TYPE_AUDIO], opt+1, arg);
        else if(opt[0] == 'v')
            o = av_set_string(avctx_opts[CODEC_TYPE_VIDEO], opt+1, arg);
        else if(opt[0] == 's')
            o = av_set_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt+1, arg);
    }
    if(!o)
        return -1;

//    av_log(NULL, AV_LOG_ERROR, "%s:%s: %f 0x%0X\n", opt, arg, av_get_double(avctx_opts, opt, NULL), (int)av_get_int(avctx_opts, opt, NULL));

    //FIXME we should always use avctx_opts, ... for storing options so there wont be any need to keep track of whats set over this
    opt_names= av_realloc(opt_names, sizeof(void*)*(opt_name_count+1));
    opt_names[opt_name_count++]= o->name;

#if defined(CONFIG_FFM_DEMUXER) || defined(CONFIG_FFM_MUXER)
    /* disable generate of real time pts in ffm (need to be supressed anyway) */
    if(avctx_opts[0]->flags & CODEC_FLAG_BITEXACT)
        ffm_nopts = 1;
#endif

    if(avctx_opts[0]->debug)
2165
        av_log_set_level(AV_LOG_DEBUG);
2166 2167 2168
    return 0;
}

2169
static void opt_video_rc_override_string(const char *arg)
2170 2171 2172 2173
{
    video_rc_override_string = arg;
}

2174 2175 2176 2177 2178
static void opt_me_threshold(const char *arg)
{
    me_threshold = atoi(arg);
}

2179 2180 2181
static void opt_verbose(const char *arg)
{
    verbose = atoi(arg);
2182
    av_log_set_level(verbose);
2183 2184
}

2185
static void opt_frame_rate(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2186
{
2187
    if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2188
        fprintf(stderr, "Incorrect frame rate\n");
2189
        exit(1);
2190
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
2191 2192
}

2193
static int opt_bitrate(const char *opt, const char *arg)
2194 2195 2196 2197 2198 2199 2200
{
    int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;

    opt_default(opt, arg);

    if (av_get_int(avctx_opts[codec_type], "b", NULL) < 1000)
        fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2201 2202

    return 0;
2203 2204
}

2205
static void opt_frame_crop_top(const char *arg)
2206
{
2207
    frame_topBand = atoi(arg);
2208 2209 2210 2211 2212 2213 2214 2215 2216
    if (frame_topBand < 0) {
        fprintf(stderr, "Incorrect top crop size\n");
        exit(1);
    }
    if ((frame_topBand % 2) != 0) {
        fprintf(stderr, "Top crop size must be a multiple of 2\n");
        exit(1);
    }
    if ((frame_topBand) >= frame_height){
2217
        fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2218 2219 2220 2221 2222
        exit(1);
    }
    frame_height -= frame_topBand;
}

2223
static void opt_frame_crop_bottom(const char *arg)
2224 2225 2226 2227 2228 2229 2230 2231
{
    frame_bottomBand = atoi(arg);
    if (frame_bottomBand < 0) {
        fprintf(stderr, "Incorrect bottom crop size\n");
        exit(1);
    }
    if ((frame_bottomBand % 2) != 0) {
        fprintf(stderr, "Bottom crop size must be a multiple of 2\n");
2232
        exit(1);
2233 2234
    }
    if ((frame_bottomBand) >= frame_height){
2235
        fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2236 2237 2238 2239 2240
        exit(1);
    }
    frame_height -= frame_bottomBand;
}

2241
static void opt_frame_crop_left(const char *arg)
2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252
{
    frame_leftBand = atoi(arg);
    if (frame_leftBand < 0) {
        fprintf(stderr, "Incorrect left crop size\n");
        exit(1);
    }
    if ((frame_leftBand % 2) != 0) {
        fprintf(stderr, "Left crop size must be a multiple of 2\n");
        exit(1);
    }
    if ((frame_leftBand) >= frame_width){
2253
        fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2254 2255 2256 2257 2258
        exit(1);
    }
    frame_width -= frame_leftBand;
}

2259
static void opt_frame_crop_right(const char *arg)
2260 2261 2262 2263 2264 2265 2266 2267
{
    frame_rightBand = atoi(arg);
    if (frame_rightBand < 0) {
        fprintf(stderr, "Incorrect right crop size\n");
        exit(1);
    }
    if ((frame_rightBand % 2) != 0) {
        fprintf(stderr, "Right crop size must be a multiple of 2\n");
2268
        exit(1);
2269 2270
    }
    if ((frame_rightBand) >= frame_width){
2271
        fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2272 2273 2274 2275 2276
        exit(1);
    }
    frame_width -= frame_rightBand;
}

2277
static void opt_frame_size(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2278
{
2279
    if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
Fabrice Bellard's avatar
Fabrice Bellard committed
2280 2281 2282 2283 2284 2285 2286 2287 2288
        fprintf(stderr, "Incorrect frame size\n");
        exit(1);
    }
    if ((frame_width % 2) != 0 || (frame_height % 2) != 0) {
        fprintf(stderr, "Frame size must be a multiple of 2\n");
        exit(1);
    }
}

2289 2290 2291

#define SCALEBITS 10
#define ONE_HALF  (1 << (SCALEBITS - 1))
2292
#define FIX(x)    ((int) ((x) * (1<<SCALEBITS) + 0.5))
2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310

#define RGB_TO_Y(r, g, b) \
((FIX(0.29900) * (r) + FIX(0.58700) * (g) + \
  FIX(0.11400) * (b) + ONE_HALF) >> SCALEBITS)

#define RGB_TO_U(r1, g1, b1, shift)\
(((- FIX(0.16874) * r1 - FIX(0.33126) * g1 +         \
     FIX(0.50000) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)

#define RGB_TO_V(r1, g1, b1, shift)\
(((FIX(0.50000) * r1 - FIX(0.41869) * g1 -           \
   FIX(0.08131) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)

static void opt_pad_color(const char *arg) {
    /* Input is expected to be six hex digits similar to
       how colors are expressed in html tags (but without the #) */
    int rgb = strtol(arg, NULL, 16);
    int r,g,b;
2311 2312

    r = (rgb >> 16);
2313 2314 2315 2316 2317 2318 2319 2320 2321 2322
    g = ((rgb >> 8) & 255);
    b = (rgb & 255);

    padcolor[0] = RGB_TO_Y(r,g,b);
    padcolor[1] = RGB_TO_U(r,g,b,0);
    padcolor[2] = RGB_TO_V(r,g,b,0);
}

static void opt_frame_pad_top(const char *arg)
{
2323
    frame_padtop = atoi(arg);
2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335
    if (frame_padtop < 0) {
        fprintf(stderr, "Incorrect top pad size\n");
        exit(1);
    }
    if ((frame_padtop % 2) != 0) {
        fprintf(stderr, "Top pad size must be a multiple of 2\n");
        exit(1);
    }
}

static void opt_frame_pad_bottom(const char *arg)
{
2336
    frame_padbottom = atoi(arg);
2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349
    if (frame_padbottom < 0) {
        fprintf(stderr, "Incorrect bottom pad size\n");
        exit(1);
    }
    if ((frame_padbottom % 2) != 0) {
        fprintf(stderr, "Bottom pad size must be a multiple of 2\n");
        exit(1);
    }
}


static void opt_frame_pad_left(const char *arg)
{
2350
    frame_padleft = atoi(arg);
2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363
    if (frame_padleft < 0) {
        fprintf(stderr, "Incorrect left pad size\n");
        exit(1);
    }
    if ((frame_padleft % 2) != 0) {
        fprintf(stderr, "Left pad size must be a multiple of 2\n");
        exit(1);
    }
}


static void opt_frame_pad_right(const char *arg)
{
2364
    frame_padright = atoi(arg);
2365 2366 2367 2368 2369 2370 2371 2372 2373 2374
    if (frame_padright < 0) {
        fprintf(stderr, "Incorrect right pad size\n");
        exit(1);
    }
    if ((frame_padright % 2) != 0) {
        fprintf(stderr, "Right pad size must be a multiple of 2\n");
        exit(1);
    }
}

2375 2376 2377 2378 2379 2380 2381 2382 2383
void list_pix_fmts(void)
{
    int i;
    char pix_fmt_str[128];
    for (i=-1; i < PIX_FMT_NB; i++) {
        avcodec_pix_fmt_string (pix_fmt_str, sizeof(pix_fmt_str), i);
        fprintf(stdout, "%s\n", pix_fmt_str);
    }
}
2384

2385 2386
static void opt_frame_pix_fmt(const char *arg)
{
2387 2388 2389 2390 2391 2392
    if (strcmp(arg, "list"))
        frame_pix_fmt = avcodec_get_pix_fmt(arg);
    else {
        list_pix_fmts();
        exit(0);
    }
2393 2394
}

2395 2396 2397 2398 2399
static void opt_frame_aspect_ratio(const char *arg)
{
    int x = 0, y = 0;
    double ar = 0;
    const char *p;
2400
    char *end;
2401

2402 2403
    p = strchr(arg, ':');
    if (p) {
2404 2405 2406
        x = strtol(arg, &end, 10);
        if (end == p)
            y = strtol(end+1, &end, 10);
2407 2408
        if (x > 0 && y > 0)
            ar = (double)x / (double)y;
2409
    } else
2410
        ar = strtod(arg, NULL);
2411 2412 2413

    if (!ar) {
        fprintf(stderr, "Incorrect aspect ratio specification.\n");
2414
        exit(1);
2415 2416 2417 2418
    }
    frame_aspect_ratio = ar;
}

2419
static void opt_qscale(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2420
{
2421
    video_qscale = atof(arg);
Loren Merritt's avatar
Loren Merritt committed
2422
    if (video_qscale <= 0 ||
2423
        video_qscale > 255) {
Loren Merritt's avatar
Loren Merritt committed
2424
        fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
2425 2426 2427 2428
        exit(1);
    }
}

2429
static void opt_qdiff(const char *arg)
2430 2431 2432 2433 2434 2435 2436 2437 2438
{
    video_qdiff = atoi(arg);
    if (video_qdiff < 0 ||
        video_qdiff > 31) {
        fprintf(stderr, "qdiff must be >= 1 and <= 31\n");
        exit(1);
    }
}

2439
static void opt_strict(const char *arg)
2440 2441 2442 2443
{
    strict= atoi(arg);
}

2444 2445 2446 2447 2448
static void opt_top_field_first(const char *arg)
{
    top_field_first= atoi(arg);
}

2449 2450 2451
static void opt_thread_count(const char *arg)
{
    thread_count= atoi(arg);
2452
#if !defined(HAVE_THREADS)
2453 2454
    if (verbose >= 0)
        fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2455
#endif
2456 2457
}

2458
static void opt_audio_rate(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2459 2460 2461 2462
{
    audio_sample_rate = atoi(arg);
}

2463
static void opt_audio_channels(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2464 2465 2466 2467
{
    audio_channels = atoi(arg);
}

2468
static void opt_video_channel(const char *arg)
2469 2470 2471 2472
{
    video_channel = strtol(arg, NULL, 0);
}

2473 2474 2475 2476 2477
static void opt_video_standard(const char *arg)
{
    video_standard = av_strdup(arg);
}

2478
static void opt_codec(int *pstream_copy, char **pcodec_name,
2479
                      int codec_type, const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2480
{
2481
    av_freep(pcodec_name);
2482
    if (!strcmp(arg, "copy")) {
2483
        *pstream_copy = 1;
Fabrice Bellard's avatar
Fabrice Bellard committed
2484
    } else {
2485
        *pcodec_name = av_strdup(arg);
Fabrice Bellard's avatar
Fabrice Bellard committed
2486 2487 2488
    }
}

2489 2490
static void opt_audio_codec(const char *arg)
{
2491
    opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2492 2493
}

2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511
static void opt_audio_tag(const char *arg)
{
    char *tail;
    audio_codec_tag= strtol(arg, &tail, 0);

    if(!tail || *tail)
        audio_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
}

static void opt_video_tag(const char *arg)
{
    char *tail;
    video_codec_tag= strtol(arg, &tail, 0);

    if(!tail || *tail)
        video_codec_tag= arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
}

2512
#ifdef CONFIG_VHOOK
2513
static void add_frame_hooker(const char *arg)
2514 2515 2516 2517
{
    int argc = 0;
    char *argv[64];
    int i;
Fabrice Bellard's avatar
Fabrice Bellard committed
2518
    char *args = av_strdup(arg);
2519

2520 2521
    using_vhook = 1;

2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532
    argv[0] = strtok(args, " ");
    while (argc < 62 && (argv[++argc] = strtok(NULL, " "))) {
    }

    i = frame_hook_add(argc, argv);

    if (i != 0) {
        fprintf(stderr, "Failed to add video hook function: %s\n", arg);
        exit(1);
    }
}
2533
#endif
2534

2535
static void opt_video_codec(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2536
{
2537
    opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2538
}
Fabrice Bellard's avatar
Fabrice Bellard committed
2539

2540 2541
static void opt_subtitle_codec(const char *arg)
{
2542
    opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
Fabrice Bellard's avatar
Fabrice Bellard committed
2543 2544
}

2545
static void opt_map(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2546 2547
{
    AVStreamMap *m;
2548
    char *p;
Fabrice Bellard's avatar
Fabrice Bellard committed
2549 2550 2551

    m = &stream_maps[nb_stream_maps++];

2552
    m->file_index = strtol(arg, &p, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
2553 2554
    if (*p)
        p++;
Juanjo's avatar
Juanjo committed
2555

2556
    m->stream_index = strtol(p, &p, 0);
2557 2558
    if (*p) {
        p++;
2559
        m->sync_file_index = strtol(p, &p, 0);
2560 2561
        if (*p)
            p++;
2562
        m->sync_stream_index = strtol(p, &p, 0);
2563 2564 2565 2566
    } else {
        m->sync_file_index = m->file_index;
        m->sync_stream_index = m->stream_index;
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
2567 2568
}

2569 2570 2571
static void opt_map_meta_data(const char *arg)
{
    AVMetaDataMap *m;
2572
    char *p;
2573

2574 2575
    m = &meta_data_maps[nb_meta_data_maps++];

2576
    m->out_file = strtol(arg, &p, 0);
2577 2578 2579
    if (*p)
        p++;

2580
    m->in_file = strtol(p, &p, 0);
2581 2582
}

2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593
static int64_t parse_time_or_die(const char *timestr, int is_duration)
{
    int64_t us = parse_date(timestr, is_duration);
    if (us == INT64_MIN) {
        fprintf(stderr, "Invalid %s specification: %s\n",
                is_duration ? "duration" : "date", timestr);
        exit(1);
    }
    return us;
}

2594
static void opt_recording_time(const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
2595
{
2596
    recording_time = parse_time_or_die(arg, 1);
Fabrice Bellard's avatar
Fabrice Bellard committed
2597 2598
}

2599 2600
static void opt_start_time(const char *arg)
{
2601
    start_time = parse_time_or_die(arg, 1);
2602 2603
}

2604 2605
static void opt_rec_timestamp(const char *arg)
{
2606
    rec_timestamp = parse_time_or_die(arg, 0) / 1000000;
2607 2608
}

2609 2610
static void opt_input_ts_offset(const char *arg)
{
2611
    input_ts_offset = parse_time_or_die(arg, 1);
2612 2613
}

2614 2615
static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
{
Michael Niedermayer's avatar
Michael Niedermayer committed
2616
    const char *codec_string = encoder ? "encoder" : "decoder";
2617 2618 2619 2620 2621 2622 2623 2624
    AVCodec *codec;

    if(!name)
        return CODEC_ID_NONE;
    codec = encoder ?
        avcodec_find_encoder_by_name(name) :
        avcodec_find_decoder_by_name(name);
    if(!codec) {
2625
        av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2626 2627 2628
        exit(1);
    }
    if(codec->type != type) {
2629
        av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2630 2631 2632 2633 2634
        exit(1);
    }
    return codec->id;
}

2635
static void opt_input_file(const char *filename)
Fabrice Bellard's avatar
Fabrice Bellard committed
2636 2637 2638
{
    AVFormatContext *ic;
    AVFormatParameters params, *ap = &params;
2639
    int err, i, ret, rfps, rfps_base;
2640
    int64_t timestamp;
Fabrice Bellard's avatar
Fabrice Bellard committed
2641

2642 2643 2644
    if (!strcmp(filename, "-"))
        filename = "pipe:";

2645
    using_stdin |= !strncmp(filename, "pipe:", 5) ||
2646 2647
                   !strcmp( filename, "/dev/stdin" );

Fabrice Bellard's avatar
Fabrice Bellard committed
2648
    /* get default parameters from command line */
2649 2650
    ic = av_alloc_format_context();

2651
    memset(ap, 0, sizeof(*ap));
2652
    ap->prealloced_context = 1;
2653 2654
    ap->sample_rate = audio_sample_rate;
    ap->channels = audio_channels;
2655 2656
    ap->time_base.den = frame_rate.num;
    ap->time_base.num = frame_rate.den;
2657 2658
    ap->width = frame_width + frame_padleft + frame_padright;
    ap->height = frame_height + frame_padtop + frame_padbottom;
2659
    ap->pix_fmt = frame_pix_fmt;
2660 2661
    ap->channel = video_channel;
    ap->standard = video_standard;
2662 2663
    ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0);
    ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0);
2664 2665
    if(pgmyuv_compatibility_hack)
        ap->video_codec_id= CODEC_ID_PGMYUV;
2666

2667
    for(i=0; i<opt_name_count; i++){
2668
        char buf[256];
2669
        const AVOption *opt;
2670
        const char *str= av_get_string(avformat_opts, opt_names[i], &opt, buf, sizeof(buf));
2671 2672
        if(str && (opt->flags & AV_OPT_FLAG_DECODING_PARAM))
            av_set_string(ic, opt_names[i], str);
2673
    }
2674 2675 2676 2677 2678

    ic->video_codec_id   = find_codec_or_die(video_codec_name   , CODEC_TYPE_VIDEO   , 0);
    ic->audio_codec_id   = find_codec_or_die(audio_codec_name   , CODEC_TYPE_AUDIO   , 0);
    ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);

2679 2680
    /* open the input file with generic libav function */
    err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
Fabrice Bellard's avatar
Fabrice Bellard committed
2681
    if (err < 0) {
2682
        print_error(filename, err);
Fabrice Bellard's avatar
Fabrice Bellard committed
2683 2684
        exit(1);
    }
2685 2686 2687 2688 2689 2690
    if(opt_programid) {
        int i;
        for(i=0; i<ic->nb_programs; i++)
            if(ic->programs[i]->id != opt_programid)
                ic->programs[i]->discard = AVDISCARD_ALL;
    }
2691

2692 2693
    ic->loop_input = loop_input;

2694 2695 2696
    /* 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);
2697
    if (ret < 0 && verbose >= 0) {
Fabrice Bellard's avatar
Fabrice Bellard committed
2698 2699 2700 2701
        fprintf(stderr, "%s: could not find codec parameters\n", filename);
        exit(1);
    }

2702 2703 2704 2705 2706
    timestamp = start_time;
    /* add the stream start time */
    if (ic->start_time != AV_NOPTS_VALUE)
        timestamp += ic->start_time;

2707 2708
    /* if seeking requested, we execute it */
    if (start_time != 0) {
2709
        ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2710
        if (ret < 0) {
2711
            fprintf(stderr, "%s: could not seek to position %0.3f\n",
2712 2713 2714 2715 2716 2717
                    filename, (double)timestamp / AV_TIME_BASE);
        }
        /* reset seek info */
        start_time = 0;
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
2718 2719
    /* update the current parameters so that they match the one of the input stream */
    for(i=0;i<ic->nb_streams;i++) {
2720
        int j;
2721
        AVCodecContext *enc = ic->streams[i]->codec;
2722 2723 2724
        if(thread_count>1)
            avcodec_thread_init(enc, thread_count);
        enc->thread_count= thread_count;
Fabrice Bellard's avatar
Fabrice Bellard committed
2725 2726
        switch(enc->codec_type) {
        case CODEC_TYPE_AUDIO:
2727
            for(j=0; j<opt_name_count; j++){
2728
                char buf[256];
2729
                const AVOption *opt;
2730
                const char *str= av_get_string(avctx_opts[CODEC_TYPE_AUDIO], opt_names[j], &opt, buf, sizeof(buf));
2731 2732
                if(str && (opt->flags & AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags & AV_OPT_FLAG_DECODING_PARAM))
                    av_set_string(enc, opt_names[j], str);
2733
            }
2734
            //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
Fabrice Bellard's avatar
Fabrice Bellard committed
2735 2736
            audio_channels = enc->channels;
            audio_sample_rate = enc->sample_rate;
2737
            if(audio_disable)
2738
                ic->streams[i]->discard= AVDISCARD_ALL;
Fabrice Bellard's avatar
Fabrice Bellard committed
2739 2740
            break;
        case CODEC_TYPE_VIDEO:
2741
            for(j=0; j<opt_name_count; j++){
2742
                char buf[256];
2743
                const AVOption *opt;
2744
                const char *str= av_get_string(avctx_opts[CODEC_TYPE_VIDEO], opt_names[j], &opt, buf, sizeof(buf));
2745 2746
                if(str && (opt->flags & AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags & AV_OPT_FLAG_DECODING_PARAM))
                    av_set_string(enc, opt_names[j], str);
2747
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
2748 2749
            frame_height = enc->height;
            frame_width = enc->width;
2750 2751
            frame_aspect_ratio = av_q2d(enc->sample_aspect_ratio) * enc->width / enc->height;
            frame_pix_fmt = enc->pix_fmt;
2752 2753
            rfps      = ic->streams[i]->r_frame_rate.num;
            rfps_base = ic->streams[i]->r_frame_rate.den;
2754
            if(enc->lowres) enc->flags |= CODEC_FLAG_EMU_EDGE;
2755 2756
            if(me_threshold)
                enc->debug |= FF_DEBUG_MV;
2757

2758
            if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2759 2760

                if (verbose >= 0)
2761
                    fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2762
                            i, (float)enc->time_base.den / enc->time_base.num, enc->time_base.den, enc->time_base.num,
2763

2764
                    (float)rfps / rfps_base, rfps, rfps_base);
2765
            }
2766
            /* update the current frame rate to match the stream frame rate */
2767 2768
            frame_rate.num = rfps;
            frame_rate.den = rfps_base;
2769 2770

            enc->rate_emu = rate_emu;
2771
            if(video_disable)
2772 2773 2774
                ic->streams[i]->discard= AVDISCARD_ALL;
            else if(video_discard)
                ic->streams[i]->discard= video_discard;
Fabrice Bellard's avatar
Fabrice Bellard committed
2775
            break;
2776 2777
        case CODEC_TYPE_DATA:
            break;
2778
        case CODEC_TYPE_SUBTITLE:
2779 2780
            if(subtitle_disable)
                ic->streams[i]->discard = AVDISCARD_ALL;
2781
            break;
2782
        case CODEC_TYPE_ATTACHMENT:
2783 2784
        case CODEC_TYPE_UNKNOWN:
            break;
2785
        default:
2786
            abort();
Fabrice Bellard's avatar
Fabrice Bellard committed
2787 2788
        }
    }
2789

Fabrice Bellard's avatar
Fabrice Bellard committed
2790
    input_files[nb_input_files] = ic;
2791
    input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
Fabrice Bellard's avatar
Fabrice Bellard committed
2792
    /* dump the file content */
2793 2794 2795
    if (verbose >= 0)
        dump_format(ic, nb_input_files, filename, 0);

Fabrice Bellard's avatar
Fabrice Bellard committed
2796
    nb_input_files++;
2797 2798
    file_iformat = NULL;
    file_oformat = NULL;
2799

2800
    video_channel = 0;
2801

2802
    rate_emu = 0;
2803 2804 2805
    av_freep(&video_codec_name);
    av_freep(&audio_codec_name);
    av_freep(&subtitle_codec_name);
Fabrice Bellard's avatar
Fabrice Bellard committed
2806 2807
}

2808 2809
static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
                                         int *has_subtitle_ptr)
2810
{
2811
    int has_video, has_audio, has_subtitle, i, j;
2812 2813 2814 2815
    AVFormatContext *ic;

    has_video = 0;
    has_audio = 0;
2816
    has_subtitle = 0;
2817 2818 2819
    for(j=0;j<nb_input_files;j++) {
        ic = input_files[j];
        for(i=0;i<ic->nb_streams;i++) {
2820
            AVCodecContext *enc = ic->streams[i]->codec;
2821 2822 2823 2824 2825 2826 2827
            switch(enc->codec_type) {
            case CODEC_TYPE_AUDIO:
                has_audio = 1;
                break;
            case CODEC_TYPE_VIDEO:
                has_video = 1;
                break;
2828 2829 2830
            case CODEC_TYPE_SUBTITLE:
                has_subtitle = 1;
                break;
2831
            case CODEC_TYPE_DATA:
2832
            case CODEC_TYPE_ATTACHMENT:
2833
            case CODEC_TYPE_UNKNOWN:
2834
                break;
2835
            default:
2836
                abort();
2837 2838 2839 2840 2841
            }
        }
    }
    *has_video_ptr = has_video;
    *has_audio_ptr = has_audio;
2842
    *has_subtitle_ptr = has_subtitle;
2843 2844
}

2845
static void new_video_stream(AVFormatContext *oc)
Fabrice Bellard's avatar
Fabrice Bellard committed
2846 2847
{
    AVStream *st;
2848 2849
    AVCodecContext *video_enc;
    int codec_id;
2850

2851 2852 2853 2854 2855
    st = av_new_stream(oc, oc->nb_streams);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
        exit(1);
    }
2856
    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
2857 2858 2859
    bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
    video_bitstream_filters= NULL;

2860
    if(thread_count>1)
2861
        avcodec_thread_init(st->codec, thread_count);
2862

2863
    video_enc = st->codec;
2864

2865 2866
    if(video_codec_tag)
        video_enc->codec_tag= video_codec_tag;
2867

2868
    if(   (video_global_header&1)
2869
       || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
2870
        video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
2871
        avctx_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
2872 2873
    }
    if(video_global_header&2){
2874
        video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
2875
        avctx_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
2876
    }
2877

2878 2879 2880 2881
    if (video_stream_copy) {
        st->stream_copy = 1;
        video_enc->codec_type = CODEC_TYPE_VIDEO;
    } else {
2882
        const char *p;
2883 2884
        int i;
        AVCodec *codec;
2885
        AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
2886

2887
        codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
2888 2889
        if (video_codec_name)
            codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
2890

2891 2892
        video_enc->codec_id = codec_id;
        codec = avcodec_find_encoder(codec_id);
2893

2894
        for(i=0; i<opt_name_count; i++){
2895 2896
            char buf[256];
            const AVOption *opt;
2897
            const char *str= av_get_string(avctx_opts[CODEC_TYPE_VIDEO], opt_names[i], &opt, buf, sizeof(buf));
2898 2899
            if(str && (opt->flags & AV_OPT_FLAG_VIDEO_PARAM) && (opt->flags & AV_OPT_FLAG_ENCODING_PARAM))
                av_set_string(video_enc, opt_names[i], str);
2900
        }
2901

2902 2903
        video_enc->time_base.den = fps.num;
        video_enc->time_base.num = fps.den;
2904 2905 2906 2907 2908
        if(codec && codec->supported_framerates){
            const AVRational *p= codec->supported_framerates;
            const AVRational *best=NULL;
            AVRational best_error= (AVRational){INT_MAX, 1};
            for(; p->den!=0; p++){
2909
                AVRational error= av_sub_q(fps, *p);
2910 2911 2912 2913 2914 2915 2916 2917 2918
                if(error.num <0) error.num *= -1;
                if(av_cmp_q(error, best_error) < 0){
                    best_error= error;
                    best= p;
                }
            }
            video_enc->time_base.den= best->num;
            video_enc->time_base.num= best->den;
        }
2919

2920 2921
        video_enc->width = frame_width + frame_padright + frame_padleft;
        video_enc->height = frame_height + frame_padtop + frame_padbottom;
2922
        video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934
        video_enc->pix_fmt = frame_pix_fmt;

        if(codec && codec->pix_fmts){
            const enum PixelFormat *p= codec->pix_fmts;
            for(; *p!=-1; p++){
                if(*p == video_enc->pix_fmt)
                    break;
            }
            if(*p == -1)
                video_enc->pix_fmt = codec->pix_fmts[0];
        }

2935
        if (intra_only)
2936 2937 2938
            video_enc->gop_size = 0;
        if (video_qscale || same_quality) {
            video_enc->flags |= CODEC_FLAG_QSCALE;
2939
            video_enc->global_quality=
2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957
                st->quality = FF_QP2LAMBDA * video_qscale;
        }

        if(intra_matrix)
            video_enc->intra_matrix = intra_matrix;
        if(inter_matrix)
            video_enc->inter_matrix = inter_matrix;

        video_enc->max_qdiff = video_qdiff;
        video_enc->thread_count = thread_count;
        p= video_rc_override_string;
        for(i=0; p; i++){
            int start, end, q;
            int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
            if(e!=3){
                fprintf(stderr, "error parsing rc_override\n");
                exit(1);
            }
2958 2959
            video_enc->rc_override=
                av_realloc(video_enc->rc_override,
2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974
                           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;
2975 2976
        if (!video_enc->rc_initial_buffer_occupancy)
            video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
2977 2978 2979 2980 2981 2982
        video_enc->me_threshold= me_threshold;
        video_enc->intra_dc_precision= intra_dc_precision - 8;
        video_enc->strict_std_compliance = strict;

        if (do_psnr)
            video_enc->flags|= CODEC_FLAG_PSNR;
2983

2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995
        /* two pass mode */
        if (do_pass) {
            if (do_pass == 1) {
                video_enc->flags |= CODEC_FLAG_PASS1;
            } else {
                video_enc->flags |= CODEC_FLAG_PASS2;
            }
        }
    }

    /* reset some key parameters */
    video_disable = 0;
2996
    av_freep(&video_codec_name);
2997 2998 2999 3000 3001 3002 3003
    video_stream_copy = 0;
}

static void new_audio_stream(AVFormatContext *oc)
{
    AVStream *st;
    AVCodecContext *audio_enc;
3004
    int codec_id, i;
3005

3006 3007 3008 3009 3010
    st = av_new_stream(oc, oc->nb_streams);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
        exit(1);
    }
3011
    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3012 3013 3014 3015

    bitstream_filters[nb_output_files][oc->nb_streams - 1]= audio_bitstream_filters;
    audio_bitstream_filters= NULL;

3016
    if(thread_count>1)
3017
        avcodec_thread_init(st->codec, thread_count);
3018

3019
    audio_enc = st->codec;
3020
    audio_enc->codec_type = CODEC_TYPE_AUDIO;
3021
    audio_enc->strict_std_compliance = strict;
3022

3023 3024
    if(audio_codec_tag)
        audio_enc->codec_tag= audio_codec_tag;
3025

3026
    if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3027
        audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3028
        avctx_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3029
    }
3030 3031 3032 3033 3034
    if (audio_stream_copy) {
        st->stream_copy = 1;
        audio_enc->channels = audio_channels;
    } else {
        codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
3035

3036
        for(i=0; i<opt_name_count; i++){
3037
            char buf[256];
3038
            const AVOption *opt;
3039
            const char *str= av_get_string(avctx_opts[CODEC_TYPE_AUDIO], opt_names[i], &opt, buf, sizeof(buf));
3040 3041
            if(str && (opt->flags & AV_OPT_FLAG_AUDIO_PARAM) && (opt->flags & AV_OPT_FLAG_ENCODING_PARAM))
                av_set_string(audio_enc, opt_names[i], str);
3042
        }
3043

3044 3045
        if (audio_codec_name)
            codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
3046
        audio_enc->codec_id = codec_id;
3047

3048 3049 3050 3051
        if (audio_qscale > QSCALE_NONE) {
            audio_enc->flags |= CODEC_FLAG_QSCALE;
            audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
        }
3052
        audio_enc->thread_count = thread_count;
3053
        audio_enc->channels = audio_channels;
3054 3055
    }
    audio_enc->sample_rate = audio_sample_rate;
3056
    audio_enc->time_base= (AVRational){1, audio_sample_rate};
3057
    if (audio_language) {
3058
        av_strlcpy(st->language, audio_language, sizeof(st->language));
3059 3060 3061 3062 3063 3064
        av_free(audio_language);
        audio_language = NULL;
    }

    /* reset some key parameters */
    audio_disable = 0;
3065
    av_freep(&audio_codec_name);
3066 3067 3068
    audio_stream_copy = 0;
}

3069
static void new_subtitle_stream(AVFormatContext *oc)
3070 3071 3072
{
    AVStream *st;
    AVCodecContext *subtitle_enc;
3073
    int i;
3074

3075 3076 3077 3078 3079
    st = av_new_stream(oc, oc->nb_streams);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
        exit(1);
    }
3080
    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3081

3082 3083 3084
    bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
    subtitle_bitstream_filters= NULL;

3085
    subtitle_enc = st->codec;
3086 3087 3088 3089
    subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
    if (subtitle_stream_copy) {
        st->stream_copy = 1;
    } else {
3090
        for(i=0; i<opt_name_count; i++){
3091 3092
            char buf[256];
            const AVOption *opt;
3093
            const char *str= av_get_string(avctx_opts[CODEC_TYPE_SUBTITLE], opt_names[i], &opt, buf, sizeof(buf));
3094 3095
            if(str && (opt->flags & AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags & AV_OPT_FLAG_ENCODING_PARAM))
                av_set_string(subtitle_enc, opt_names[i], str);
3096
        }
3097
        subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
3098 3099 3100
    }

    if (subtitle_language) {
3101
        av_strlcpy(st->language, subtitle_language, sizeof(st->language));
3102 3103 3104 3105
        av_free(subtitle_language);
        subtitle_language = NULL;
    }

3106
    subtitle_disable = 0;
3107
    av_freep(&subtitle_codec_name);
3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132
    subtitle_stream_copy = 0;
}

static void opt_new_audio_stream(void)
{
    AVFormatContext *oc;
    if (nb_output_files <= 0) {
        fprintf(stderr, "At least one output file must be specified\n");
        exit(1);
    }
    oc = output_files[nb_output_files - 1];
    new_audio_stream(oc);
}

static void opt_new_video_stream(void)
{
    AVFormatContext *oc;
    if (nb_output_files <= 0) {
        fprintf(stderr, "At least one output file must be specified\n");
        exit(1);
    }
    oc = output_files[nb_output_files - 1];
    new_video_stream(oc);
}

3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143
static void opt_new_subtitle_stream(void)
{
    AVFormatContext *oc;
    if (nb_output_files <= 0) {
        fprintf(stderr, "At least one output file must be specified\n");
        exit(1);
    }
    oc = output_files[nb_output_files - 1];
    new_subtitle_stream(oc);
}

3144 3145 3146
static void opt_output_file(const char *filename)
{
    AVFormatContext *oc;
3147 3148
    int use_video, use_audio, use_subtitle;
    int input_has_video, input_has_audio, input_has_subtitle, i;
3149
    AVFormatParameters params, *ap = &params;
Fabrice Bellard's avatar
Fabrice Bellard committed
3150 3151 3152 3153

    if (!strcmp(filename, "-"))
        filename = "pipe:";

3154
    oc = av_alloc_format_context();
Fabrice Bellard's avatar
Fabrice Bellard committed
3155

3156 3157 3158
    if (!file_oformat) {
        file_oformat = guess_format(NULL, filename, NULL);
        if (!file_oformat) {
3159
            fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3160 3161 3162
                    filename);
            exit(1);
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
3163
    }
3164

3165
    oc->oformat = file_oformat;
3166
    av_strlcpy(oc->filename, filename, sizeof(oc->filename));
Fabrice Bellard's avatar
Fabrice Bellard committed
3167

3168
    if (!strcmp(file_oformat->name, "ffm") &&
3169
        av_strstart(filename, "http:", NULL)) {
Fabrice Bellard's avatar
Fabrice Bellard committed
3170 3171 3172 3173 3174 3175 3176
        /* special case for files sent to ffserver: we get the stream
           parameters from ffserver */
        if (read_ffserver_streams(oc, filename) < 0) {
            fprintf(stderr, "Could not read stream parameters from '%s'\n", filename);
            exit(1);
        }
    } else {
3177 3178 3179
        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;
3180

3181 3182 3183
        /* disable if no corresponding type found and at least one
           input file */
        if (nb_input_files > 0) {
3184 3185
            check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
                                         &input_has_subtitle);
3186 3187 3188 3189
            if (!input_has_video)
                use_video = 0;
            if (!input_has_audio)
                use_audio = 0;
3190 3191
            if (!input_has_subtitle)
                use_subtitle = 0;
3192
        }
3193 3194

        /* manual disable */
Fabrice Bellard's avatar
Fabrice Bellard committed
3195 3196 3197 3198 3199 3200
        if (audio_disable) {
            use_audio = 0;
        }
        if (video_disable) {
            use_video = 0;
        }
3201 3202 3203
        if (subtitle_disable) {
            use_subtitle = 0;
        }
3204

Fabrice Bellard's avatar
Fabrice Bellard committed
3205
        if (use_video) {
3206
            new_video_stream(oc);
Fabrice Bellard's avatar
Fabrice Bellard committed
3207
        }
3208

Fabrice Bellard's avatar
Fabrice Bellard committed
3209
        if (use_audio) {
3210
            new_audio_stream(oc);
Fabrice Bellard's avatar
Fabrice Bellard committed
3211 3212
        }

3213 3214 3215 3216
        if (use_subtitle) {
            new_subtitle_stream(oc);
        }

3217
        oc->timestamp = rec_timestamp;
3218

3219
        if (str_title)
3220
            av_strlcpy(oc->title, str_title, sizeof(oc->title));
Fabrice Bellard's avatar
Fabrice Bellard committed
3221
        if (str_author)
3222
            av_strlcpy(oc->author, str_author, sizeof(oc->author));
Fabrice Bellard's avatar
Fabrice Bellard committed
3223
        if (str_copyright)
3224
            av_strlcpy(oc->copyright, str_copyright, sizeof(oc->copyright));
Fabrice Bellard's avatar
Fabrice Bellard committed
3225
        if (str_comment)
3226
            av_strlcpy(oc->comment, str_comment, sizeof(oc->comment));
3227
        if (str_album)
3228
            av_strlcpy(oc->album, str_album, sizeof(oc->album));
3229 3230
        if (str_genre)
            av_strlcpy(oc->genre, str_genre, sizeof(oc->genre));
Fabrice Bellard's avatar
Fabrice Bellard committed
3231 3232
    }

3233
    output_files[nb_output_files++] = oc;
Fabrice Bellard's avatar
Fabrice Bellard committed
3234

3235
    /* check filename in case of an image number is expected */
3236
    if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3237
        if (!av_filename_number_test(oc->filename)) {
3238
            print_error(oc->filename, AVERROR_NUMEXPECTED);
3239
            exit(1);
3240
        }
3241 3242
    }

3243
    if (!(oc->oformat->flags & AVFMT_NOFILE)) {
Fabrice Bellard's avatar
Fabrice Bellard committed
3244
        /* test if it already exists to avoid loosing precious files */
3245
        if (!file_overwrite &&
Fabrice Bellard's avatar
Fabrice Bellard committed
3246
            (strchr(filename, ':') == NULL ||
3247
             filename[1] == ':' ||
3248
             av_strstart(filename, "file:", NULL))) {
Fabrice Bellard's avatar
Fabrice Bellard committed
3249 3250
            if (url_exist(filename)) {
                int c;
3251

3252 3253 3254 3255 3256 3257 3258 3259
                if ( !using_stdin ) {
                    fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                    fflush(stderr);
                    c = getchar();
                    if (toupper(c) != 'Y') {
                        fprintf(stderr, "Not overwriting - exiting\n");
                        exit(1);
                    }
3260 3261
                                }
                                else {
3262
                    fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
Fabrice Bellard's avatar
Fabrice Bellard committed
3263
                    exit(1);
3264
                                }
Fabrice Bellard's avatar
Fabrice Bellard committed
3265 3266
            }
        }
3267

Fabrice Bellard's avatar
Fabrice Bellard committed
3268 3269 3270 3271 3272 3273 3274
        /* open the file */
        if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
            fprintf(stderr, "Could not open '%s'\n", filename);
            exit(1);
        }
    }

3275 3276 3277 3278 3279 3280 3281
    memset(ap, 0, sizeof(*ap));
    if (av_set_parameters(oc, ap) < 0) {
        fprintf(stderr, "%s: Invalid encoding parameters\n",
                oc->filename);
        exit(1);
    }

3282 3283
    oc->preload= (int)(mux_preload*AV_TIME_BASE);
    oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3284
    oc->loop_output = loop_output;
3285

3286
    for(i=0; i<opt_name_count; i++){
3287
        char buf[256];
3288
        const AVOption *opt;
3289
        const char *str= av_get_string(avformat_opts, opt_names[i], &opt, buf, sizeof(buf));
3290 3291
        if(str && (opt->flags & AV_OPT_FLAG_ENCODING_PARAM))
            av_set_string(oc, opt_names[i], str);
3292 3293
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
3294
    /* reset some options */
3295 3296
    file_oformat = NULL;
    file_iformat = NULL;
Fabrice Bellard's avatar
Fabrice Bellard committed
3297 3298
}

3299
/* same option as mencoder */
3300
static void opt_pass(const char *pass_str)
3301 3302 3303 3304 3305 3306 3307 3308 3309
{
    int pass;
    pass = atoi(pass_str);
    if (pass != 1 && pass != 2) {
        fprintf(stderr, "pass number can be only 1 or 2\n");
        exit(1);
    }
    do_pass = pass;
}
3310

3311
static int64_t getutime(void)
Fabrice Bellard's avatar
Fabrice Bellard committed
3312
{
Ramiro Polla's avatar
Ramiro Polla committed
3313
#ifdef HAVE_GETRUSAGE
3314 3315 3316 3317
    struct rusage rusage;

    getrusage(RUSAGE_SELF, &rusage);
    return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3318 3319 3320 3321 3322 3323 3324
#elif defined(HAVE_GETPROCESSTIMES)
    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
Ramiro Polla's avatar
Ramiro Polla committed
3325
    return av_gettime();
Ramiro Polla's avatar
Ramiro Polla committed
3326
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
3327
}
Fabrice Bellard's avatar
Fabrice Bellard committed
3328

3329
static void opt_show_formats(void)
Fabrice Bellard's avatar
Fabrice Bellard committed
3330
{
3331 3332 3333
    AVInputFormat *ifmt=NULL;
    AVOutputFormat *ofmt=NULL;
    URLProtocol *up=NULL;
3334 3335
    AVCodec *p=NULL, *p2;
    AVBitStreamFilter *bsf=NULL;
3336
    const char *last_name;
3337 3338 3339 3340 3341 3342 3343

    printf("File formats:\n");
    last_name= "000";
    for(;;){
        int decode=0;
        int encode=0;
        const char *name=NULL;
3344
        const char *long_name=NULL;
3345

3346
        while((ofmt= av_oformat_next(ofmt))) {
3347 3348 3349
            if((name == NULL || strcmp(ofmt->name, name)<0) &&
                strcmp(ofmt->name, last_name)>0){
                name= ofmt->name;
3350
                long_name= ofmt->long_name;
3351 3352 3353
                encode=1;
            }
        }
3354
        while((ifmt= av_iformat_next(ifmt))) {
3355 3356 3357
            if((name == NULL || strcmp(ifmt->name, name)<0) &&
                strcmp(ifmt->name, last_name)>0){
                name= ifmt->name;
3358
                long_name= ifmt->long_name;
3359 3360 3361 3362 3363 3364 3365 3366
                encode=0;
            }
            if(name && strcmp(ifmt->name, name)==0)
                decode=1;
        }
        if(name==NULL)
            break;
        last_name= name;
3367

3368
        printf(
3369 3370 3371
            " %s%s %-15s %s\n",
            decode ? "D":" ",
            encode ? "E":" ",
3372 3373
            name,
            long_name ? long_name:" ");
3374 3375 3376
    }
    printf("\n");

Fabrice Bellard's avatar
Fabrice Bellard committed
3377
    printf("Codecs:\n");
3378 3379 3380 3381 3382
    last_name= "000";
    for(;;){
        int decode=0;
        int encode=0;
        int cap=0;
3383
        const char *type_str;
3384 3385

        p2=NULL;
3386
        while((p= av_codec_next(p))) {
3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400
            if((p2==NULL || strcmp(p->name, p2->name)<0) &&
                strcmp(p->name, last_name)>0){
                p2= p;
                decode= encode= cap=0;
            }
            if(p2 && strcmp(p->name, p2->name)==0){
                if(p->decode) decode=1;
                if(p->encode) encode=1;
                cap |= p->capabilities;
            }
        }
        if(p2==NULL)
            break;
        last_name= p2->name;
3401

3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415
        switch(p2->type) {
        case CODEC_TYPE_VIDEO:
            type_str = "V";
            break;
        case CODEC_TYPE_AUDIO:
            type_str = "A";
            break;
        case CODEC_TYPE_SUBTITLE:
            type_str = "S";
            break;
        default:
            type_str = "?";
            break;
        }
3416
        printf(
3417 3418 3419
            " %s%s%s%s%s%s %s",
            decode ? "D": (/*p2->decoder ? "d":*/" "),
            encode ? "E":" ",
3420
            type_str,
3421 3422 3423 3424 3425 3426 3427
            cap & CODEC_CAP_DRAW_HORIZ_BAND ? "S":" ",
            cap & CODEC_CAP_DR1 ? "D":" ",
            cap & CODEC_CAP_TRUNCATED ? "T":" ",
            p2->name);
       /* if(p2->decoder && decode==0)
            printf(" use %s for decoding", p2->decoder->name);*/
        printf("\n");
Fabrice Bellard's avatar
Fabrice Bellard committed
3428 3429 3430
    }
    printf("\n");

3431
    printf("Bitstream filters:\n");
3432
    while((bsf = av_bitstream_filter_next(bsf)))
3433 3434 3435
        printf(" %s", bsf->name);
    printf("\n");

3436
    printf("Supported file protocols:\n");
3437
    while((up = av_protocol_next(up)))
Fabrice Bellard's avatar
Fabrice Bellard committed
3438 3439
        printf(" %s:", up->name);
    printf("\n");
3440

3441
    printf("Frame size, frame rate abbreviations:\n ntsc pal qntsc qpal sntsc spal film ntsc-film sqcif qcif cif 4cif\n");
3442
    printf("\n");
3443
    printf(
Diego Biurrun's avatar
Diego Biurrun committed
3444
"Note, the names of encoders and decoders do not always match, so there are\n"
3445
"several cases where the above table shows encoder only or decoder only entries\n"
Diego Biurrun's avatar
Diego Biurrun committed
3446 3447 3448
"even though both encoding and decoding are supported. For example, the h263\n"
"decoder corresponds to the h263 and h263p encoders, for file formats it is even\n"
"worse.\n");
3449
    exit(0);
Fabrice Bellard's avatar
Fabrice Bellard committed
3450 3451
}

3452
static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468
{
    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);
            exit(1);
        }
        p++;
    }
}

3469
static void opt_inter_matrix(const char *arg)
3470 3471 3472 3473 3474
{
    inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
    parse_matrix_coeffs(inter_matrix, arg);
}

3475
static void opt_intra_matrix(const char *arg)
3476 3477 3478 3479 3480
{
    intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
    parse_matrix_coeffs(intra_matrix, arg);
}

3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523
/**
 * Trivial log callback.
 * Only suitable for show_help and similar since it lacks prefix handling.
 */
static void log_callback_help(void* ptr, int level, const char* fmt, va_list vl)
{
    vfprintf(stdout, fmt, vl);
}

static void show_help(void)
{
    av_log_set_callback(log_callback_help);
    printf("usage: ffmpeg [[infile options] -i infile]... {[outfile options] outfile}...\n"
           "Hyper fast Audio and Video encoder\n");
    printf("\n");
    show_help_options(options, "Main options:\n",
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO, 0);
    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);
    show_help_options(options, "\nAdvanced options:\n",
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
                      OPT_EXPERT);
    av_opt_show(avctx_opts[0], NULL);
    av_opt_show(avformat_opts, NULL);
    av_opt_show(sws_opts, NULL);
}

3524 3525 3526 3527 3528 3529
static void opt_show_help(void)
{
    show_help();
    exit(0);
}

3530 3531 3532
static void opt_target(const char *arg)
{
    int norm = -1;
3533
    static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3534 3535 3536 3537 3538 3539 3540

    if(!strncmp(arg, "pal-", 4)) {
        norm = 0;
        arg += 4;
    } else if(!strncmp(arg, "ntsc-", 5)) {
        norm = 1;
        arg += 5;
3541 3542 3543
    } else if(!strncmp(arg, "film-", 5)) {
        norm = 2;
        arg += 5;
3544 3545 3546
    } else {
        int fr;
        /* Calculate FR via float to avoid int overflow */
3547
        fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3548 3549 3550 3551 3552 3553 3554 3555 3556 3557
        if(fr == 25000) {
            norm = 0;
        } else if((fr == 29970) || (fr == 23976)) {
            norm = 1;
        } else {
            /* Try to determine PAL/NTSC by peeking in the input files */
            if(nb_input_files) {
                int i, j;
                for(j = 0; j < nb_input_files; j++) {
                    for(i = 0; i < input_files[j]->nb_streams; i++) {
3558
                        AVCodecContext *c = input_files[j]->streams[i]->codec;
3559 3560
                        if(c->codec_type != CODEC_TYPE_VIDEO)
                            continue;
3561
                        fr = c->time_base.den * 1000 / c->time_base.num;
3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575
                        if(fr == 25000) {
                            norm = 0;
                            break;
                        } else if((fr == 29970) || (fr == 23976)) {
                            norm = 1;
                            break;
                        }
                    }
                    if(norm >= 0)
                        break;
                }
            }
        }
        if(verbose && norm >= 0)
3576
            fprintf(stderr, "Assuming %s for target.\n", norm ? "NTSC" : "PAL");
3577 3578 3579
    }

    if(norm < 0) {
3580 3581
        fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
        fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592
        fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
        exit(1);
    }

    if(!strcmp(arg, "vcd")) {

        opt_video_codec("mpeg1video");
        opt_audio_codec("mp2");
        opt_format("vcd");

        opt_frame_size(norm ? "352x240" : "352x288");
3593
        opt_frame_rate(frame_rates[norm]);
3594
        opt_default("gop", norm ? "18" : "15");
3595

3596
        opt_default("b", "1150000");
3597 3598
        opt_default("maxrate", "1150000");
        opt_default("minrate", "1150000");
3599
        opt_default("bufsize", "327680"); // 40*1024*8;
3600

3601
        opt_default("ab", "224000");
3602
        audio_sample_rate = 44100;
3603
        audio_channels = 2;
3604

3605
        opt_default("packetsize", "2324");
3606
        opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3607

3608 3609 3610 3611 3612 3613
        /* 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
3614 3615 3616 3617
    } else if(!strcmp(arg, "svcd")) {

        opt_video_codec("mpeg2video");
        opt_audio_codec("mp2");
3618
        opt_format("svcd");
3619 3620

        opt_frame_size(norm ? "480x480" : "480x576");
3621
        opt_frame_rate(frame_rates[norm]);
3622
        opt_default("gop", norm ? "18" : "15");
3623

3624
        opt_default("b", "2040000");
3625 3626
        opt_default("maxrate", "2516000");
        opt_default("minrate", "0"); //1145000;
3627
        opt_default("bufsize", "1835008"); //224*1024*8;
3628 3629
        opt_default("flags", "+SCAN_OFFSET");

3630

3631
        opt_default("ab", "224000");
3632 3633
        audio_sample_rate = 44100;

3634
        opt_default("packetsize", "2324");
3635

3636 3637 3638 3639
    } else if(!strcmp(arg, "dvd")) {

        opt_video_codec("mpeg2video");
        opt_audio_codec("ac3");
3640
        opt_format("dvd");
3641 3642

        opt_frame_size(norm ? "720x480" : "720x576");
3643
        opt_frame_rate(frame_rates[norm]);
3644
        opt_default("gop", norm ? "18" : "15");
3645

3646
        opt_default("b", "6000000");
3647 3648
        opt_default("maxrate", "9000000");
        opt_default("minrate", "0"); //1500000;
3649
        opt_default("bufsize", "1835008"); //224*1024*8;
3650

3651
        opt_default("packetsize", "2048");  // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3652
        opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3653

3654
        opt_default("ab", "448000");
3655 3656
        audio_sample_rate = 48000;

3657
    } else if(!strncmp(arg, "dv", 2)) {
3658 3659 3660 3661

        opt_format("dv");

        opt_frame_size(norm ? "720x480" : "720x576");
3662 3663
        opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
                                             (norm ? "yuv411p" : "yuv420p"));
3664 3665 3666 3667 3668
        opt_frame_rate(frame_rates[norm]);

        audio_sample_rate = 48000;
        audio_channels = 2;

3669 3670 3671 3672 3673 3674
    } else {
        fprintf(stderr, "Unknown target: %s\n", arg);
        exit(1);
    }
}

3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691
static void opt_vstats_file (const char *arg)
{
    av_free (vstats_filename);
    vstats_filename=av_strdup (arg);
}

static void opt_vstats (void)
{
    char filename[40];
    time_t today2 = time(NULL);
    struct tm *today = localtime(&today2);

    snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
             today->tm_sec);
    opt_vstats_file(filename);
}

3692
static int opt_bsf(const char *opt, const char *arg)
3693 3694 3695 3696 3697
{
    AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
    AVBitStreamFilterContext **bsfp;

    if(!bsfc){
Alex Beregszaszi's avatar
Alex Beregszaszi committed
3698
        fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3699 3700 3701
        exit(1);
    }

3702 3703 3704
    bsfp= *opt == 'v' ? &video_bitstream_filters :
          *opt == 'a' ? &audio_bitstream_filters :
                        &subtitle_bitstream_filters;
3705 3706 3707 3708
    while(*bsfp)
        bsfp= &(*bsfp)->next;

    *bsfp= bsfc;
3709 3710

    return 0;
3711 3712
}

3713 3714 3715 3716 3717 3718
static void opt_show_license(void)
{
    show_license();
    exit(0);
}

3719
static void opt_show_version(void)
Michael Niedermayer's avatar
Michael Niedermayer committed
3720
{
3721
    show_version(program_name);
3722
    exit(0);
Michael Niedermayer's avatar
Michael Niedermayer committed
3723 3724
}

Fabrice Bellard's avatar
Fabrice Bellard committed
3725
const OptionDef options[] = {
3726
    /* main options */
3727
    { "L", 0, {(void*)opt_show_license}, "show license" },
3728
    { "h", 0, {(void*)opt_show_help}, "show help" },
3729 3730
    { "version", 0, {(void*)opt_show_version}, "show version" },
    { "formats", 0, {(void*)opt_show_formats}, "show available formats, codecs, protocols, ..." },
Fabrice Bellard's avatar
Fabrice Bellard committed
3731 3732 3733
    { "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" },
3734
    { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3735
    { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3736
    { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3737
    { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3738
    { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
3739
    { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
Fabrice Bellard's avatar
Fabrice Bellard committed
3740
    { "title", HAS_ARG | OPT_STRING, {(void*)&str_title}, "set the title", "string" },
3741
    { "timestamp", HAS_ARG, {(void*)&opt_rec_timestamp}, "set the timestamp", "time" },
Fabrice Bellard's avatar
Fabrice Bellard committed
3742 3743 3744
    { "author", HAS_ARG | OPT_STRING, {(void*)&str_author}, "set the author", "string" },
    { "copyright", HAS_ARG | OPT_STRING, {(void*)&str_copyright}, "set the copyright", "string" },
    { "comment", HAS_ARG | OPT_STRING, {(void*)&str_comment}, "set the comment", "string" },
3745
    { "genre", HAS_ARG | OPT_STRING, {(void*)&str_genre}, "set the genre", "string" },
3746
    { "album", HAS_ARG | OPT_STRING, {(void*)&str_album}, "set the album", "string" },
3747
    { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
Fabrice Bellard's avatar
Fabrice Bellard committed
3748
      "add timings for benchmarking" },
3749
    { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3750
      "dump each input packet" },
3751
    { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3752
      "when dumping packets, also dump the payload" },
Fabrice Bellard's avatar
Fabrice Bellard committed
3753
    { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3754
    { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3755
    { "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)", "" },
3756
    { "v", HAS_ARG, {(void*)opt_verbose}, "set the logging verbosity level", "number" },
3757
    { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3758
    { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3759 3760
    { "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", "" },
3761
    { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "" },
3762
    { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3763
    { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3764
    { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3765
    { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
3766
    { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3767 3768

    /* video options */
3769 3770
    { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "" },
    { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "" },
3771 3772
    { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
    { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3773 3774 3775
    { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
    { "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" },
3776
    { "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" },
3777 3778 3779 3780
    { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_top}, "set top crop band size (in pixels)", "size" },
    { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
    { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
    { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
3781 3782 3783 3784 3785
    { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
    { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
    { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
    { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
    { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
3786 3787
    { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
    { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
Måns Rullgård's avatar
Måns Rullgård committed
3788
    { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3789 3790
    { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
    { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantizer scale (VBR)", "q" },
Fabrice Bellard's avatar
Fabrice Bellard committed
3791
    { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3792
    { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3793
    { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold",  "" },
3794
    { "strict", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_strict}, "how strictly to follow the standards", "strictness" },
3795
    { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3796 3797 3798
      "use same video quality as source (implies VBR)" },
    { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
    { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename}, "select two pass log file name", "file" },
3799
    { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3800 3801
      "deinterlace pictures" },
    { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3802 3803
    { "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" },
3804
#ifdef CONFIG_VHOOK
3805
    { "vhook", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)add_frame_hooker}, "insert video processing module", "module" },
3806
#endif
3807 3808
    { "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" },
3809
    { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3810
    { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3811
    { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3812
    { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3813
    { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3814 3815

    /* audio options */
3816
    { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "" },
3817
    { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3818
    { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3819 3820 3821 3822
    { "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" },
    { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
    { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3823
    { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3824
    { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3825 3826
    { "newaudio", OPT_AUDIO, {(void*)opt_new_audio_stream}, "add a new audio stream to the current output stream" },
    { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
3827

3828
    /* subtitle options */
3829
    { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3830 3831 3832
    { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
    { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_subtitle_stream}, "add a new subtitle stream to the current output stream" },
    { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
3833

3834 3835 3836
    /* grab options */
    { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
    { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
3837
    { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3838 3839

    /* muxer options */
3840 3841
    { "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" },
3842

3843 3844
    { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream filter" },
    { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream filter" },
3845
    { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream filter" },
3846

3847
    { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
Fabrice Bellard's avatar
Fabrice Bellard committed
3848 3849 3850
    { NULL, },
};

3851 3852 3853 3854
static int av_exit()
{
    int i;

Fabrice Bellard's avatar
Fabrice Bellard committed
3855 3856
    /* close files */
    for(i=0;i<nb_output_files;i++) {
3857 3858
        /* maybe av_close_output_file ??? */
        AVFormatContext *s = output_files[i];
3859
        int j;
3860
        if (!(s->oformat->flags & AVFMT_NOFILE))
3861
            url_fclose(s->pb);
3862 3863
        for(j=0;j<s->nb_streams;j++) {
            av_free(s->streams[j]->codec);
3864
            av_free(s->streams[j]);
3865
        }
3866
        av_free(s);
Fabrice Bellard's avatar
Fabrice Bellard committed
3867
    }
3868 3869
    for(i=0;i<nb_input_files;i++)
        av_close_input_file(input_files[i]);
Fabrice Bellard's avatar
Fabrice Bellard committed
3870

3871
    av_free_static();
3872

Michael Niedermayer's avatar
Michael Niedermayer committed
3873 3874
    av_free(intra_matrix);
    av_free(inter_matrix);
3875

3876 3877
    if (vstats_file)
        fclose(vstats_file);
3878 3879
    av_free(vstats_filename);

3880
    av_free(opt_names);
3881

3882 3883 3884 3885
    av_free(video_codec_name);
    av_free(audio_codec_name);
    av_free(subtitle_codec_name);

3886 3887
    av_free(video_standard);

3888
#ifdef CONFIG_POWERPC_PERF
3889 3890
    extern void powerpc_display_perf_report(void);
    powerpc_display_perf_report();
3891
#endif /* CONFIG_POWERPC_PERF */
3892

3893 3894 3895 3896 3897 3898
    if (received_sigterm) {
        fprintf(stderr,
            "Received signal %d: terminating.\n",
            (int) received_sigterm);
        exit (255);
    }
3899

3900
    exit(0); /* not all OS-es handle main() return value */
Fabrice Bellard's avatar
Fabrice Bellard committed
3901 3902
    return 0;
}
3903 3904 3905 3906 3907 3908

int main(int argc, char **argv)
{
    int i;
    int64_t ti;

Luca Abeni's avatar
Luca Abeni committed
3909 3910
    avcodec_register_all();
    avdevice_register_all();
3911 3912 3913 3914 3915 3916 3917 3918
    av_register_all();

    for(i=0; i<CODEC_TYPE_NB; i++){
        avctx_opts[i]= avcodec_alloc_context2(i);
    }
    avformat_opts = av_alloc_format_context();
    sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);

3919
    show_banner(program_name, program_birth_year);
3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948
    if (argc <= 1) {
        show_help();
        exit(1);
    }

    /* parse options */
    parse_options(argc, argv, options, opt_output_file);

    /* file converter / grab */
    if (nb_output_files <= 0) {
        fprintf(stderr, "Must supply at least one output file\n");
        exit(1);
    }

    if (nb_input_files == 0) {
        fprintf(stderr, "Must supply at least one input file\n");
        exit(1);
    }

    ti = getutime();
    av_encode(output_files, nb_output_files, input_files, nb_input_files,
              stream_maps, nb_stream_maps);
    ti = getutime() - ti;
    if (do_benchmark) {
        printf("bench: utime=%0.3fs\n", ti / 1000000.0);
    }

    return av_exit();
}