ffmpeg.c 144.2 KB
Newer Older
F
merge  
Fabrice Bellard 已提交
1
/*
2
 * FFmpeg main
F
Fabrice Bellard 已提交
3
 * Copyright (c) 2000-2003 Fabrice Bellard
F
merge  
Fabrice Bellard 已提交
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.
F
merge  
Fabrice Bellard 已提交
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
F
merge  
Fabrice Bellard 已提交
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.
F
merge  
Fabrice Bellard 已提交
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
F
merge  
Fabrice Bellard 已提交
20
 */
21

22
/* needed for usleep() */
23
#define _XOPEN_SOURCE 600
24

25 26 27 28 29 30
#include "config.h"
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <errno.h>
R
Ramiro Polla 已提交
31
#include <signal.h>
32
#include <limits.h>
33
#include <unistd.h>
34 35 36 37
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswscale/swscale.h"
#include "libavcodec/opt.h"
38
#include "libavcodec/audioconvert.h"
39
#include "libavcodec/colorspace.h"
40 41 42
#include "libavutil/fifo.h"
#include "libavutil/avstring.h"
#include "libavformat/os_support.h"
43

44
#if HAVE_SYS_RESOURCE_H
45
#include <sys/types.h>
46
#include <sys/resource.h>
47
#elif HAVE_GETPROCESSTIMES
48 49 50
#include <windows.h>
#endif

51
#if HAVE_SYS_SELECT_H
52 53 54
#include <sys/select.h>
#endif

55
#if HAVE_TERMIOS_H
F
merge  
Fabrice Bellard 已提交
56 57 58 59
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
60
#elif HAVE_CONIO_H
R
Ramiro Polla 已提交
61
#include <conio.h>
F
Fabrice Bellard 已提交
62
#endif
M
10000l  
Michael Niedermayer 已提交
63
#undef time //needed because HAVE_AV_CONFIG_H is defined on top
64
#include <time.h>
F
merge  
Fabrice Bellard 已提交
65

F
Fabrice Bellard 已提交
66 67
#include "cmdutils.h"

68 69 70
#undef NDEBUG
#include <assert.h>

M
Michael Niedermayer 已提交
71 72
#undef exit

73
const char program_name[] = "FFmpeg";
74
const int program_birth_year = 2000;
75

F
merge  
Fabrice Bellard 已提交
76 77 78 79
/* select an input stream for an output stream */
typedef struct AVStreamMap {
    int file_index;
    int stream_index;
80 81
    int sync_file_index;
    int sync_stream_index;
F
merge  
Fabrice Bellard 已提交
82 83
} AVStreamMap;

84 85 86 87 88 89
/** select an input file for an output file */
typedef struct AVMetaDataMap {
    int out_file;
    int in_file;
} AVMetaDataMap;

90
static const OptionDef options[];
F
merge  
Fabrice Bellard 已提交
91 92 93

#define MAX_FILES 20

94
static const char *last_asked_format = NULL;
F
merge  
Fabrice Bellard 已提交
95
static AVFormatContext *input_files[MAX_FILES];
96
static int64_t input_files_ts_offset[MAX_FILES];
97
static double input_files_ts_scale[MAX_FILES][MAX_STREAMS];
A
Aurelien Jacobs 已提交
98
static AVCodec *input_codecs[MAX_FILES*MAX_STREAMS];
F
merge  
Fabrice Bellard 已提交
99
static int nb_input_files = 0;
A
Aurelien Jacobs 已提交
100
static int nb_icodecs;
F
merge  
Fabrice Bellard 已提交
101 102

static AVFormatContext *output_files[MAX_FILES];
A
Aurelien Jacobs 已提交
103
static AVCodec *output_codecs[MAX_FILES*MAX_STREAMS];
F
merge  
Fabrice Bellard 已提交
104
static int nb_output_files = 0;
A
Aurelien Jacobs 已提交
105
static int nb_ocodecs;
F
merge  
Fabrice Bellard 已提交
106

107
static AVStreamMap stream_maps[MAX_FILES*MAX_STREAMS];
F
merge  
Fabrice Bellard 已提交
108 109
static int nb_stream_maps;

110 111 112
static AVMetaDataMap meta_data_maps[MAX_FILES];
static int nb_meta_data_maps;

M
Michael Niedermayer 已提交
113 114
static int frame_width  = 0;
static int frame_height = 0;
115
static float frame_aspect_ratio = 0;
116
static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
117
static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
118 119 120 121 122
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 */
123 124 125 126
static int frame_topBand  = 0;
static int frame_bottomBand = 0;
static int frame_leftBand  = 0;
static int frame_rightBand = 0;
127
static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
128
static AVRational frame_rate;
129
static float video_qscale = 0;
130 131
static uint16_t *intra_matrix = NULL;
static uint16_t *inter_matrix = NULL;
132
static const char *video_rc_override_string=NULL;
F
merge  
Fabrice Bellard 已提交
133
static int video_disable = 0;
134
static int video_discard = 0;
135
static char *video_codec_name = NULL;
M
Michael Niedermayer 已提交
136
static int video_codec_tag = 0;
F
merge  
Fabrice Bellard 已提交
137
static int same_quality = 0;
138
static int do_deinterlace = 0;
M
Michael Niedermayer 已提交
139
static int top_field_first = -1;
140
static int me_threshold = 0;
M
-cbp  
Michael Niedermayer 已提交
141
static int intra_dc_precision = 8;
142
static int loop_input = 0;
143
static int loop_output = AVFMT_NOOUTPUTLOOP;
144
static int qp_hist = 0;
F
merge  
Fabrice Bellard 已提交
145 146 147

static int intra_only = 0;
static int audio_sample_rate = 44100;
148
static int64_t channel_layout = 0;
149 150
#define QSCALE_NONE -99999
static float audio_qscale = QSCALE_NONE;
F
merge  
Fabrice Bellard 已提交
151 152
static int audio_disable = 0;
static int audio_channels = 1;
153
static char  *audio_codec_name = NULL;
M
Michael Niedermayer 已提交
154
static int audio_codec_tag = 0;
155 156
static char *audio_language = NULL;

157
static int subtitle_disable = 0;
158
static char *subtitle_codec_name = NULL;
159
static char *subtitle_language = NULL;
160
static int subtitle_codec_tag = 0;
F
merge  
Fabrice Bellard 已提交
161

162 163
static float mux_preload= 0.5;
static float mux_max_delay= 0.7;
164

165
static int64_t recording_time = INT64_MAX;
166
static int64_t start_time = 0;
167
static int64_t rec_timestamp = 0;
168
static int64_t input_ts_offset = 0;
F
merge  
Fabrice Bellard 已提交
169
static int file_overwrite = 0;
170 171
static int metadata_count;
static AVMetadataTag *metadata;
F
Fabrice Bellard 已提交
172
static int do_benchmark = 0;
173
static int do_hex_dump = 0;
174
static int do_pkt_dump = 0;
175
static int do_psnr = 0;
176
static int do_pass = 0;
S
Stefano Sabatini 已提交
177
static char *pass_logfilename_prefix = NULL;
178 179
static int audio_stream_copy = 0;
static int video_stream_copy = 0;
180
static int subtitle_stream_copy = 0;
181
static int video_sync_method= -1;
182
static int audio_sync_method= 0;
M
Michael Niedermayer 已提交
183
static float audio_drift_threshold= 0.1;
184
static int copy_ts= 0;
185
static int opt_shortest = 0;
186
static int video_global_header = 0;
187
static char *vstats_filename;
188
static FILE *vstats_file;
189
static int opt_programid = 0;
190
static int copy_initial_nonkeyframes = 0;
191

192 193
static int rate_emu = 0;

194
static int  video_channel = 0;
195
static char *video_standard;
196

197
static int audio_volume = 256;
198

199
static int exit_on_error = 0;
200
static int using_stdin = 0;
201
static int verbose = 1;
202
static int thread_count= 1;
203
static int q_pressed = 0;
204 205 206
static int64_t video_size = 0;
static int64_t audio_size = 0;
static int64_t extra_size = 0;
207 208
static int nb_frames_dup = 0;
static int nb_frames_drop = 0;
209
static int input_sync;
210
static uint64_t limit_filesize = 0;
211
static int force_fps = 0;
212

213
static int pgmyuv_compatibility_hack=0;
214
static float dts_delta_threshold = 10;
215

M
Michael Niedermayer 已提交
216
static unsigned int sws_flags = SWS_BICUBIC;
217

B
Benoit Fouet 已提交
218
static int64_t timer_start;
M
Michael Niedermayer 已提交
219

220 221
static uint8_t *audio_buf;
static uint8_t *audio_out;
222
unsigned int allocated_audio_out_size, allocated_audio_buf_size;
223 224 225

static short *samples;

226 227
static AVBitStreamFilterContext *video_bitstream_filters=NULL;
static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
228
static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
229
static AVBitStreamFilterContext *bitstream_filters[MAX_FILES][MAX_STREAMS];
230

S
Stefano Sabatini 已提交
231
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
F
merge  
Fabrice Bellard 已提交
232

233 234
struct AVInputStream;

F
merge  
Fabrice Bellard 已提交
235 236 237 238 239
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 */
240 241 242 243
    int encoding_needed;     /* true if encoding needed for this stream */
    int frame_number;
    /* input pts and corresponding output pts
       for A/V sync */
244 245
    //double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
    struct AVInputStream *sync_ist; /* input stream to sync against */
246
    int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
F
merge  
Fabrice Bellard 已提交
247
    /* video only */
248
    int video_resample;
249
    AVFrame pict_tmp;      /* temporary image for resampling */
250 251
    struct SwsContext *img_resample_ctx; /* for image resampling */
    int resample_height;
252
    int resample_width;
253
    int resample_pix_fmt;
254

255 256 257 258 259
    /* full frame size of first frame */
    int original_height;
    int original_width;

    /* cropping area sizes */
260
    int video_crop;
261 262
    int topBand;
    int bottomBand;
263
    int leftBand;
264 265 266 267 268 269 270
    int rightBand;

    /* cropping area of first frame */
    int original_topBand;
    int original_bottomBand;
    int original_leftBand;
    int original_rightBand;
271

272
    /* padding area sizes */
273
    int video_pad;
274
    int padtop;
275 276 277
    int padbottom;
    int padleft;
    int padright;
278

F
merge  
Fabrice Bellard 已提交
279 280 281
    /* audio only */
    int audio_resample;
    ReSampleContext *resample; /* for audio resampling */
282 283
    int reformat_pair;
    AVAudioConvert *reformat_ctx;
284
    AVFifoBuffer *fifo;     /* for compression: one audio fifo per codec */
285
    FILE *logfile;
F
merge  
Fabrice Bellard 已提交
286 287 288 289 290 291 292 293
} 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' */
294
    int64_t sample_index;      /* current sample */
295 296

    int64_t       start;     /* time when read started */
297 298
    int64_t       next_pts;  /* synthetic pts for cases where pkt.pts
                                is not defined */
299
    int64_t       pts;       /* current pts */
300
    int is_start;            /* is 1 at the start and after a discontinuity */
F
merge  
Fabrice Bellard 已提交
301 302 303 304 305 306
} 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 */
307
    int nb_streams;       /* nb streams we are aware of */
F
merge  
Fabrice Bellard 已提交
308 309
} AVInputFile;

310
#if HAVE_TERMIOS_H
F
Fabrice Bellard 已提交
311

F
merge  
Fabrice Bellard 已提交
312 313
/* init terminal so that we can grab keys */
static struct termios oldtty;
R
Ramiro Polla 已提交
314
#endif
F
merge  
Fabrice Bellard 已提交
315 316 317

static void term_exit(void)
{
318
#if HAVE_TERMIOS_H
F
merge  
Fabrice Bellard 已提交
319
    tcsetattr (0, TCSANOW, &oldtty);
R
Ramiro Polla 已提交
320
#endif
F
merge  
Fabrice Bellard 已提交
321 322
}

323
static volatile int received_sigterm = 0;
324 325 326 327 328 329 330 331

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

F
merge  
Fabrice Bellard 已提交
332 333
static void term_init(void)
{
334
#if HAVE_TERMIOS_H
F
merge  
Fabrice Bellard 已提交
335 336 337 338 339 340 341 342 343 344 345 346 347
    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;
348

F
merge  
Fabrice Bellard 已提交
349
    tcsetattr (0, TCSANOW, &tty);
R
Ramiro Polla 已提交
350 351
    signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
#endif
F
merge  
Fabrice Bellard 已提交
352

353 354 355 356 357
    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */
    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
    /*
    register a function to be called at normal program termination
    */
F
merge  
Fabrice Bellard 已提交
358
    atexit(term_exit);
359
#if CONFIG_BEOS_NETSERVER
360 361
    fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
#endif
F
merge  
Fabrice Bellard 已提交
362 363 364 365 366
}

/* read a key without blocking */
static int read_key(void)
{
367
#if HAVE_TERMIOS_H
368
    int n = 1;
F
merge  
Fabrice Bellard 已提交
369
    unsigned char ch;
370
#if !CONFIG_BEOS_NETSERVER
371
    struct timeval tv;
F
merge  
Fabrice Bellard 已提交
372 373 374 375 376 377 378
    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);
379
#endif
F
merge  
Fabrice Bellard 已提交
380
    if (n > 0) {
381 382
        n = read(0, &ch, 1);
        if (n == 1)
F
merge  
Fabrice Bellard 已提交
383
            return ch;
384 385

        return n;
F
merge  
Fabrice Bellard 已提交
386
    }
387
#elif HAVE_CONIO_H
R
Ramiro Polla 已提交
388 389
    if(kbhit())
        return(getch());
R
Ramiro Polla 已提交
390
#endif
F
merge  
Fabrice Bellard 已提交
391 392 393
    return -1;
}

394 395 396 397 398
static int decode_interrupt_cb(void)
{
    return q_pressed || (q_pressed = read_key() == 'q');
}

399
static int av_exit(int ret)
400 401 402 403 404 405 406 407
{
    int i;

    /* close files */
    for(i=0;i<nb_output_files;i++) {
        /* maybe av_close_output_file ??? */
        AVFormatContext *s = output_files[i];
        int j;
R
Ramiro Polla 已提交
408
        if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
409 410
            url_fclose(s->pb);
        for(j=0;j<s->nb_streams;j++) {
411
            av_metadata_free(&s->streams[j]->metadata);
412 413 414
            av_free(s->streams[j]->codec);
            av_free(s->streams[j]);
        }
415 416 417 418 419 420 421
        for(j=0;j<s->nb_programs;j++) {
            av_metadata_free(&s->programs[j]->metadata);
        }
        for(j=0;j<s->nb_chapters;j++) {
            av_metadata_free(&s->chapters[j]->metadata);
        }
        av_metadata_free(&s->metadata);
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
        av_free(s);
    }
    for(i=0;i<nb_input_files;i++)
        av_close_input_file(input_files[i]);

    av_free(intra_matrix);
    av_free(inter_matrix);

    if (vstats_file)
        fclose(vstats_file);
    av_free(vstats_filename);

    av_free(opt_names);

    av_free(video_codec_name);
    av_free(audio_codec_name);
    av_free(subtitle_codec_name);

    av_free(video_standard);

442
#if CONFIG_POWERPC_PERF
443
    void powerpc_display_perf_report(void);
444 445 446
    powerpc_display_perf_report();
#endif /* CONFIG_POWERPC_PERF */

447 448 449 450
    for (i=0;i<CODEC_TYPE_NB;i++)
        av_free(avcodec_opts[i]);
    av_free(avformat_opts);
    av_free(sws_opts);
451 452
    av_free(audio_buf);
    av_free(audio_out);
453
    allocated_audio_buf_size= allocated_audio_out_size= 0;
454
    av_free(samples);
455

456 457 458 459 460 461 462
    if (received_sigterm) {
        fprintf(stderr,
            "Received signal %d: terminating.\n",
            (int) received_sigterm);
        exit (255);
    }

463 464
    exit(ret); /* not all OS-es handle main() return value */
    return ret;
465 466
}

467
static int read_ffserver_streams(AVFormatContext *s, const char *filename)
F
merge  
Fabrice Bellard 已提交
468
{
469
    int i, err;
F
merge  
Fabrice Bellard 已提交
470
    AVFormatContext *ic;
471
    int nopts = 0;
F
merge  
Fabrice Bellard 已提交
472

473 474 475
    err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
    if (err < 0)
        return err;
F
merge  
Fabrice Bellard 已提交
476 477 478 479
    /* copy stream format */
    s->nb_streams = ic->nb_streams;
    for(i=0;i<ic->nb_streams;i++) {
        AVStream *st;
M
cleanup  
Michael Niedermayer 已提交
480

481
        // FIXME: a more elegant solution is needed
482
        st = av_mallocz(sizeof(AVStream));
F
merge  
Fabrice Bellard 已提交
483
        memcpy(st, ic->streams[i], sizeof(AVStream));
484
        st->codec = avcodec_alloc_context();
485 486 487 488
        if (!st->codec) {
            print_error(filename, AVERROR(ENOMEM));
            av_exit(1);
        }
489
        memcpy(st->codec, ic->streams[i]->codec, sizeof(AVCodecContext));
F
merge  
Fabrice Bellard 已提交
490
        s->streams[i] = st;
491 492 493 494 495 496

        if (st->codec->codec_type == CODEC_TYPE_AUDIO && audio_stream_copy)
            st->stream_copy = 1;
        else if (st->codec->codec_type == CODEC_TYPE_VIDEO && video_stream_copy)
            st->stream_copy = 1;

B
Baptiste Coudurier 已提交
497 498 499 500 501
        if(!st->codec->thread_count)
            st->codec->thread_count = 1;
        if(st->codec->thread_count>1)
            avcodec_thread_init(st->codec, st->codec->thread_count);

502 503
        if(st->codec->flags & CODEC_FLAG_BITEXACT)
            nopts = 1;
F
merge  
Fabrice Bellard 已提交
504 505
    }

506 507 508
    if (!nopts)
        s->timestamp = av_gettime();

F
merge  
Fabrice Bellard 已提交
509 510 511 512
    av_close_input_file(ic);
    return 0;
}

513 514 515 516
static double
get_sync_ipts(const AVOutputStream *ost)
{
    const AVInputStream *ist = ost->sync_ist;
517
    return (double)(ist->pts - start_time)/AV_TIME_BASE;
518 519
}

520
static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
521 522
    int ret;

523 524 525 526 527 528
    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);
529
        if(a>0){
530 531
            av_free_packet(pkt);
            new_pkt.destruct= av_destruct_packet;
532
        } else if(a<0){
533 534 535
            fprintf(stderr, "%s failed for stream %d, codec %s",
                    bsfc->filter->name, pkt->stream_index,
                    avctx->codec ? avctx->codec->name : "copy");
536
            print_error("", a);
537 538
            if (exit_on_error)
                av_exit(1);
539 540 541 542 543 544
        }
        *pkt= new_pkt;

        bsfc= bsfc->next;
    }

545 546 547
    ret= av_interleaved_write_frame(s, pkt);
    if(ret < 0){
        print_error("av_interleaved_write_frame()", ret);
548
        av_exit(1);
549
    }
550 551
}

552
#define MAX_AUDIO_PACKET_SIZE (128 * 1024)
F
merge  
Fabrice Bellard 已提交
553

554 555
static void do_audio_out(AVFormatContext *s,
                         AVOutputStream *ost,
F
merge  
Fabrice Bellard 已提交
556 557 558
                         AVInputStream *ist,
                         unsigned char *buf, int size)
{
559
    uint8_t *buftmp;
560
    int64_t audio_out_size, audio_buf_size;
561

F
merge  
Fabrice Bellard 已提交
562
    int size_out, frame_bytes, ret;
563
    AVCodecContext *enc= ost->st->codec;
564
    AVCodecContext *dec= ist->st->codec;
565 566
    int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
    int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
567 568 569 570
    const int coded_bps = av_get_bits_per_sample(enc->codec->id);

    audio_buf_size= (size + isize*dec->channels - 1) / (isize*dec->channels);
    audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
V
Vitor Sessak 已提交
571
    audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
572 573 574 575 576 577 578 579 580 581 582
    audio_buf_size*= osize*enc->channels;

    audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
    if(coded_bps > 8*osize)
        audio_out_size= audio_out_size * coded_bps / (8*osize);
    audio_out_size += FF_MIN_BUFFER_SIZE;

    if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
        fprintf(stderr, "Buffer sizes too large\n");
        av_exit(1);
    }
F
merge  
Fabrice Bellard 已提交
583

584 585
    av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
    av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
586 587 588 589
    if (!audio_buf || !audio_out){
        fprintf(stderr, "Out of memory in do_audio_out\n");
        av_exit(1);
    }
590

591 592 593 594
    if (enc->channels != dec->channels)
        ost->audio_resample = 1;

    if (ost->audio_resample && !ost->resample) {
595 596 597 598 599 600
        if (dec->sample_fmt != SAMPLE_FMT_S16)
            fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
        ost->resample = av_audio_resample_init(enc->channels,    dec->channels,
                                               enc->sample_rate, dec->sample_rate,
                                               enc->sample_fmt,  dec->sample_fmt,
                                               16, 10, 0, 0.8);
601 602 603 604
        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);
605
            av_exit(1);
606 607 608
        }
    }

609
#define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
610
    if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
611 612 613 614 615 616 617 618 619 620 621 622 623 624
        MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
        if (ost->reformat_ctx)
            av_audio_convert_free(ost->reformat_ctx);
        ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
                                                   dec->sample_fmt, 1, NULL, 0);
        if (!ost->reformat_ctx) {
            fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
                avcodec_get_sample_fmt_name(dec->sample_fmt),
                avcodec_get_sample_fmt_name(enc->sample_fmt));
            av_exit(1);
        }
        ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
    }

625
    if(audio_sync_method){
626
        double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
627
                - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2);
628 629
        double idelta= delta*ist->st->codec->sample_rate / enc->sample_rate;
        int byte_delta= ((int)idelta)*2*ist->st->codec->channels;
630

631 632
        //FIXME resample delay
        if(fabs(delta) > 50){
M
Michael Niedermayer 已提交
633
            if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
634
                if(byte_delta < 0){
635
                    byte_delta= FFMAX(byte_delta, -size);
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659
                    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){
660
                int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
661 662 663
                assert(ost->audio_resample);
                if(verbose > 2)
                    fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
664
//                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));
665 666
                av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
            }
667
        }
668
    }else
669
        ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
670
                        - av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2); //FIXME wrong
F
merge  
Fabrice Bellard 已提交
671 672 673

    if (ost->audio_resample) {
        buftmp = audio_buf;
674
        size_out = audio_resample(ost->resample,
F
merge  
Fabrice Bellard 已提交
675
                                  (short *)buftmp, (short *)buf,
676 677
                                  size / (ist->st->codec->channels * isize));
        size_out = size_out * enc->channels * osize;
F
merge  
Fabrice Bellard 已提交
678 679 680 681 682
    } else {
        buftmp = buf;
        size_out = size;
    }

683
    if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
684
        const void *ibuf[6]= {buftmp};
685
        void *obuf[6]= {audio_buf};
686 687
        int istride[6]= {isize};
        int ostride[6]= {osize};
688 689 690
        int len= size_out/istride[0];
        if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
            printf("av_audio_convert() failed\n");
691 692
            if (exit_on_error)
                av_exit(1);
693 694
            return;
        }
695
        buftmp = audio_buf;
696
        size_out = len*osize;
697 698
    }

F
merge  
Fabrice Bellard 已提交
699
    /* now encode as many frames as possible */
700
    if (enc->frame_size > 1) {
F
merge  
Fabrice Bellard 已提交
701
        /* output resampled raw samples */
702
        if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
703 704 705
            fprintf(stderr, "av_fifo_realloc2() failed\n");
            av_exit(1);
        }
706
        av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
F
merge  
Fabrice Bellard 已提交
707

708
        frame_bytes = enc->frame_size * osize * enc->channels;
709

710
        while (av_fifo_size(ost->fifo) >= frame_bytes) {
711 712 713
            AVPacket pkt;
            av_init_packet(&pkt);

714
            av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
715

716 717
            //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()

718
            ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
719
                                       (short *)audio_buf);
720 721 722 723
            if (ret < 0) {
                fprintf(stderr, "Audio encoding failed\n");
                av_exit(1);
            }
724
            audio_size += ret;
725 726 727
            pkt.stream_index= ost->index;
            pkt.data= audio_out;
            pkt.size= ret;
728
            if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
729
                pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
730
            pkt.flags |= PKT_FLAG_KEY;
731
            write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
732

733
            ost->sync_opts += enc->frame_size;
F
merge  
Fabrice Bellard 已提交
734 735
        }
    } else {
736 737
        AVPacket pkt;
        av_init_packet(&pkt);
738

739
        ost->sync_opts += size_out / (osize * enc->channels);
740

741
        /* output a pcm frame */
742 743 744
        /* determine the size of the coded buffer */
        size_out /= osize;
        if (coded_bps)
745
            size_out = size_out*coded_bps/8;
746

747 748 749 750 751
        if(size_out > audio_out_size){
            fprintf(stderr, "Internal error, buffer size too small\n");
            av_exit(1);
        }

752
        //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
753
        ret = avcodec_encode_audio(enc, audio_out, size_out,
754
                                   (short *)buftmp);
755 756 757 758
        if (ret < 0) {
            fprintf(stderr, "Audio encoding failed\n");
            av_exit(1);
        }
759
        audio_size += ret;
760 761 762
        pkt.stream_index= ost->index;
        pkt.data= audio_out;
        pkt.size= ret;
763
        if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
764
            pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
765
        pkt.flags |= PKT_FLAG_KEY;
766
        write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
F
merge  
Fabrice Bellard 已提交
767 768 769
    }
}

770 771 772 773 774
static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
{
    AVCodecContext *dec;
    AVPicture *picture2;
    AVPicture picture_tmp;
775
    uint8_t *buf = 0;
776

777
    dec = ist->st->codec;
778 779

    /* deinterlace : must be done before any resize */
780
    if (do_deinterlace) {
781 782 783 784 785 786 787
        int size;

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

789 790 791
        picture2 = &picture_tmp;
        avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);

R
indent  
Ramiro Polla 已提交
792 793 794 795 796 797 798 799
        if(avpicture_deinterlace(picture2, picture,
                                 dec->pix_fmt, dec->width, dec->height) < 0) {
            /* if error, do not deinterlace */
            fprintf(stderr, "Deinterlacing failed\n");
            av_free(buf);
            buf = NULL;
            picture2 = picture;
        }
800 801 802 803 804 805 806 807 808
    } else {
        picture2 = picture;
    }

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

809 810
/* we begin to correct av delay at this threshold */
#define AV_DELAY_MAX 0.100
F
merge  
Fabrice Bellard 已提交
811

812 813
static void do_subtitle_out(AVFormatContext *s,
                            AVOutputStream *ost,
814 815 816 817 818
                            AVInputStream *ist,
                            AVSubtitle *sub,
                            int64_t pts)
{
    static uint8_t *subtitle_out = NULL;
819
    int subtitle_out_max_size = 1024 * 1024;
820 821 822 823 824 825
    int subtitle_out_size, nb, i;
    AVCodecContext *enc;
    AVPacket pkt;

    if (pts == AV_NOPTS_VALUE) {
        fprintf(stderr, "Subtitle packets must have a pts\n");
826 827
        if (exit_on_error)
            av_exit(1);
828 829 830
        return;
    }

831
    enc = ost->st->codec;
832 833 834 835 836 837 838 839 840 841 842 843 844 845

    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++) {
846
        sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
847 848 849 850
        // start_display_time is required to be 0
        sub->pts              += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
        sub->end_display_time -= sub->start_display_time;
        sub->start_display_time = 0;
851
        subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
852
                                                    subtitle_out_max_size, sub);
853 854 855 856
        if (subtitle_out_size < 0) {
            fprintf(stderr, "Subtitle encoding failed\n");
            av_exit(1);
        }
857

858 859 860 861
        av_init_packet(&pkt);
        pkt.stream_index = ost->index;
        pkt.data = subtitle_out;
        pkt.size = subtitle_out_size;
862
        pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
863 864 865 866 867 868 869 870
        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;
        }
871
        write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
872 873 874
    }
}

875
static int bit_buffer_size= 1024*256;
876
static uint8_t *bit_buffer= NULL;
877

878 879
static void do_video_out(AVFormatContext *s,
                         AVOutputStream *ost,
F
merge  
Fabrice Bellard 已提交
880
                         AVInputStream *ist,
881
                         AVFrame *in_picture,
882
                         int *frame_size)
F
merge  
Fabrice Bellard 已提交
883
{
884
    int nb_frames, i, ret;
885
    int64_t topBand, bottomBand, leftBand, rightBand;
886
    AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
887
    AVFrame picture_crop_temp, picture_pad_temp;
888
    AVCodecContext *enc, *dec;
889

890
    avcodec_get_frame_defaults(&picture_crop_temp);
891
    avcodec_get_frame_defaults(&picture_pad_temp);
892

893 894
    enc = ost->st->codec;
    dec = ist->st->codec;
F
merge  
Fabrice Bellard 已提交
895

896 897 898
    /* by default, we output a single frame */
    nb_frames = 1;

899 900
    *frame_size = 0;

901
    if(video_sync_method){
902
        double vdelta;
903
        vdelta = get_sync_ipts(ost) / av_q2d(enc->time_base) - ost->sync_opts;
904 905 906
        //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
        if (vdelta < -1.1)
            nb_frames = 0;
907 908 909 910
        else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
            if(vdelta<=-0.6){
                nb_frames=0;
            }else if(vdelta>0.6)
911
            ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
912
        }else if (vdelta > 1.1)
M
Michael Niedermayer 已提交
913
            nb_frames = lrintf(vdelta);
914
//fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
915 916 917 918
        if (nb_frames == 0){
            ++nb_frames_drop;
            if (verbose>2)
                fprintf(stderr, "*** drop!\n");
919
        }else if (nb_frames > 1) {
920
            nb_frames_dup += nb_frames - 1;
921
            if (verbose>2)
922
                fprintf(stderr, "*** %d dup!\n", nb_frames-1);
923 924
        }
    }else
925
        ost->sync_opts= lrintf(get_sync_ipts(ost) / av_q2d(enc->time_base));
926

927
    nb_frames= FFMIN(nb_frames, max_frames[CODEC_TYPE_VIDEO] - ost->frame_number);
928
    if (nb_frames <= 0)
F
merge  
Fabrice Bellard 已提交
929
        return;
930

931
    if (ost->video_crop) {
932
        if (av_picture_crop((AVPicture *)&picture_crop_temp, (AVPicture *)in_picture, dec->pix_fmt, ost->topBand, ost->leftBand) < 0) {
933
            fprintf(stderr, "error cropping picture\n");
934 935
            if (exit_on_error)
                av_exit(1);
L
Limin Wang 已提交
936
            return;
937 938
        }
        formatted_picture = &picture_crop_temp;
939 940
    } else {
        formatted_picture = in_picture;
941 942 943 944 945 946 947 948
    }

    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) {
949
            if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
950
                fprintf(stderr, "error padding picture\n");
951 952
                if (exit_on_error)
                    av_exit(1);
L
Limin Wang 已提交
953
                return;
954 955 956 957 958
            }
            resampling_dst = &picture_pad_temp;
        }
    }

959 960 961 962 963 964 965 966 967
    if(    (ost->resample_height != (ist->st->codec->height - (ost->topBand  + ost->bottomBand)))
        || (ost->resample_width  != (ist->st->codec->width  - (ost->leftBand + ost->rightBand)))
        || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {

        fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width,     ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
        if(!ost->video_resample)
            av_exit(1);
    }

F
merge  
Fabrice Bellard 已提交
968
    if (ost->video_resample) {
969
        padding_src = NULL;
970
        final_picture = &ost->pict_tmp;
971
        if(  (ost->resample_height != (ist->st->codec->height - (ost->topBand  + ost->bottomBand)))
972 973
          || (ost->resample_width  != (ist->st->codec->width  - (ost->leftBand + ost->rightBand)))
          || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993

            /* keep bands proportional to the frame size */
            topBand    = ((int64_t)ist->st->codec->height * ost->original_topBand    / ost->original_height) & ~1;
            bottomBand = ((int64_t)ist->st->codec->height * ost->original_bottomBand / ost->original_height) & ~1;
            leftBand   = ((int64_t)ist->st->codec->width  * ost->original_leftBand   / ost->original_width)  & ~1;
            rightBand  = ((int64_t)ist->st->codec->width  * ost->original_rightBand  / ost->original_width)  & ~1;

            /* sanity check to ensure no bad band sizes sneak in */
            assert(topBand    <= INT_MAX && topBand    >= 0);
            assert(bottomBand <= INT_MAX && bottomBand >= 0);
            assert(leftBand   <= INT_MAX && leftBand   >= 0);
            assert(rightBand  <= INT_MAX && rightBand  >= 0);

            ost->topBand    = topBand;
            ost->bottomBand = bottomBand;
            ost->leftBand   = leftBand;
            ost->rightBand  = rightBand;

            ost->resample_height = ist->st->codec->height - (ost->topBand  + ost->bottomBand);
            ost->resample_width  = ist->st->codec->width  - (ost->leftBand + ost->rightBand);
994
            ost->resample_pix_fmt= ist->st->codec->pix_fmt;
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011

            /* initialize a new scaler context */
            sws_freeContext(ost->img_resample_ctx);
            sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
            ost->img_resample_ctx = sws_getContext(
                ist->st->codec->width  - (ost->leftBand + ost->rightBand),
                ist->st->codec->height - (ost->topBand  + ost->bottomBand),
                ist->st->codec->pix_fmt,
                ost->st->codec->width  - (ost->padleft  + ost->padright),
                ost->st->codec->height - (ost->padtop   + ost->padbottom),
                ost->st->codec->pix_fmt,
                sws_flags, NULL, NULL, NULL);
            if (ost->img_resample_ctx == NULL) {
                fprintf(stderr, "Cannot get resampling context\n");
                av_exit(1);
            }
        }
1012 1013
        sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
              0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1014
    }
1015 1016

    if (ost->video_pad) {
1017
        av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
1018 1019
                enc->height, enc->width, enc->pix_fmt,
                ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
F
merge  
Fabrice Bellard 已提交
1020
    }
1021

F
merge  
Fabrice Bellard 已提交
1022
    /* duplicates frame if needed */
1023
    for(i=0;i<nb_frames;i++) {
1024 1025 1026 1027
        AVPacket pkt;
        av_init_packet(&pkt);
        pkt.stream_index= ost->index;

1028 1029 1030 1031
        if (s->oformat->flags & AVFMT_RAWPICTURE) {
            /* raw pictures are written as AVPicture structure to
               avoid any copies. We support temorarily the older
               method. */
1032
            AVFrame* old_frame = enc->coded_frame;
1033
            enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1034 1035
            pkt.data= (uint8_t *)final_picture;
            pkt.size=  sizeof(AVPicture);
1036 1037
            pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
            pkt.flags |= PKT_FLAG_KEY;
1038

1039
            write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1040
            enc->coded_frame = old_frame;
1041
        } else {
M
Michael Niedermayer 已提交
1042
            AVFrame big_picture;
1043 1044

            big_picture= *final_picture;
1045 1046 1047
            /* better than nothing: use input picture interlaced
               settings */
            big_picture.interlaced_frame = in_picture->interlaced_frame;
1048
            if(avcodec_opts[CODEC_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
M
Michael Niedermayer 已提交
1049 1050 1051
                if(top_field_first == -1)
                    big_picture.top_field_first = in_picture->top_field_first;
                else
M
Michael Niedermayer 已提交
1052
                    big_picture.top_field_first = top_field_first;
M
Michael Niedermayer 已提交
1053
            }
1054

F
merge  
Fabrice Bellard 已提交
1055 1056 1057
            /* handles sameq here. This is not correct because it may
               not be a global option */
            if (same_quality) {
M
cleanup  
Michael Niedermayer 已提交
1058 1059 1060
                big_picture.quality = ist->st->quality;
            }else
                big_picture.quality = ost->st->quality;
1061 1062
            if(!me_threshold)
                big_picture.pict_type = 0;
1063
//            big_picture.pts = AV_NOPTS_VALUE;
1064 1065
            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);
1066
//av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1067
            ret = avcodec_encode_video(enc,
1068
                                       bit_buffer, bit_buffer_size,
M
cleanup  
Michael Niedermayer 已提交
1069
                                       &big_picture);
1070
            if (ret < 0) {
1071
                fprintf(stderr, "Video encoding failed\n");
1072
                av_exit(1);
1073
            }
1074

M
Michael Niedermayer 已提交
1075
            if(ret>0){
1076
                pkt.data= bit_buffer;
1077
                pkt.size= ret;
1078
                if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1079
                    pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1080
/*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1081 1082
   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);*/
1083

1084
                if(enc->coded_frame->key_frame)
1085
                    pkt.flags |= PKT_FLAG_KEY;
1086
                write_frame(s, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1087
                *frame_size = ret;
1088
                video_size += ret;
1089 1090
                //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
                //        enc->frame_number-1, ret, enc->pict_type);
1091 1092 1093 1094
                /* if two pass, output log */
                if (ost->logfile && enc->stats_out) {
                    fprintf(ost->logfile, "%s", enc->stats_out);
                }
1095
            }
F
merge  
Fabrice Bellard 已提交
1096
        }
1097
        ost->sync_opts++;
1098
        ost->frame_number++;
F
merge  
Fabrice Bellard 已提交
1099 1100 1101
    }
}

1102
static double psnr(double d){
1103
    return -10.0*log(d)/log(10.0);
1104 1105
}

1106
static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1107
                           int frame_size)
1108 1109 1110 1111
{
    AVCodecContext *enc;
    int frame_number;
    double ti1, bitrate, avg_bitrate;
1112

1113
    /* this is executed just the first time do_video_stats is called */
1114 1115 1116
    if (!vstats_file) {
        vstats_file = fopen(vstats_filename, "w");
        if (!vstats_file) {
1117
            perror("fopen");
1118
            av_exit(1);
1119 1120 1121
        }
    }

1122
    enc = ost->st->codec;
1123
    if (enc->codec_type == CODEC_TYPE_VIDEO) {
1124
        frame_number = ost->frame_number;
1125
        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1126
        if (enc->flags&CODEC_FLAG_PSNR)
1127
            fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1128

1129
        fprintf(vstats_file,"f_size= %6d ", frame_size);
1130
        /* compute pts value */
1131
        ti1 = ost->sync_opts * av_q2d(enc->time_base);
1132 1133
        if (ti1 < 0.01)
            ti1 = 0.01;
1134

1135
        bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1136
        avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1137
        fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1138
            (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1139
        fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1140
    }
1141 1142
}

1143
static void print_report(AVFormatContext **output_files,
1144 1145
                         AVOutputStream **ost_table, int nb_ostreams,
                         int is_last_report)
1146 1147 1148
{
    char buf[1024];
    AVOutputStream *ost;
1149
    AVFormatContext *oc;
1150
    int64_t total_size;
1151 1152 1153
    AVCodecContext *enc;
    int frame_number, vid, i;
    double bitrate, ti1, pts;
1154
    static int64_t last_time = -1;
1155
    static int qp_histogram[52];
1156

1157
    if (!is_last_report) {
1158
        int64_t cur_time;
1159 1160 1161 1162 1163
        /* display the report every 0.5 seconds */
        cur_time = av_gettime();
        if (last_time == -1) {
            last_time = cur_time;
            return;
1164
        }
1165 1166 1167 1168 1169
        if ((cur_time - last_time) < 500000)
            return;
        last_time = cur_time;
    }

1170

1171 1172
    oc = output_files[0];

1173
    total_size = url_fsize(oc->pb);
1174
    if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1175
        total_size= url_ftell(oc->pb);
1176

1177 1178 1179 1180 1181
    buf[0] = '\0';
    ti1 = 1e10;
    vid = 0;
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
1182
        enc = ost->st->codec;
1183
        if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1184
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1185
                     !ost->st->stream_copy ?
1186
                     enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1187
        }
1188
        if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
1189 1190
            float t = (av_gettime()-timer_start) / 1000000.0;

1191
            frame_number = ost->frame_number;
1192 1193
            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,
1194
                     !ost->st->stream_copy ?
1195
                     enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1196
            if(is_last_report)
1197
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1198
            if(qp_hist){
1199 1200
                int j;
                int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1201
                if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1202 1203 1204 1205
                    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)));
            }
1206 1207 1208 1209 1210
            if (enc->flags&CODEC_FLAG_PSNR){
                int j;
                double error, error_sum=0;
                double scale, scale_sum=0;
                char type[3]= {'Y','U','V'};
1211
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222
                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;
1223
                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1224
                }
1225
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1226
            }
1227 1228 1229
            vid = 1;
        }
        /* compute min output value */
1230
        pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1231
        if ((pts < ti1) && (pts > 0))
1232 1233 1234 1235
            ti1 = pts;
    }
    if (ti1 < 0.01)
        ti1 = 0.01;
1236

1237 1238
    if (verbose || is_last_report) {
        bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1239 1240

        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1241
            "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1242
            (double)total_size / 1024, ti1, bitrate);
1243

1244
        if (nb_frames_dup || nb_frames_drop)
1245 1246
          snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
                  nb_frames_dup, nb_frames_drop);
1247

1248 1249 1250
        if (verbose >= 0)
            fprintf(stderr, "%s    \r", buf);

1251 1252
        fflush(stderr);
    }
1253

1254 1255
    if (is_last_report && verbose >= 0){
        int64_t raw= audio_size + video_size + extra_size;
1256
        fprintf(stderr, "\n");
1257 1258 1259 1260 1261 1262 1263
        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
        );
    }
1264 1265
}

1266 1267 1268
/* pkt = NULL means EOF (needed to flush decoder buffers) */
static int output_packet(AVInputStream *ist, int ist_index,
                         AVOutputStream **ost_table, int nb_ostreams,
1269
                         const AVPacket *pkt)
1270 1271 1272
{
    AVFormatContext *os;
    AVOutputStream *ost;
1273
    int ret, i;
1274 1275 1276 1277
    uint8_t *data_buf;
    int data_size, got_picture;
    AVFrame picture;
    void *buffer_to_free;
1278
    static unsigned int samples_size= 0;
1279 1280
    AVSubtitle subtitle, *subtitle_to_free;
    int got_subtitle;
1281
    AVPacket avpkt;
1282
    int bps = av_get_bits_per_sample_format(ist->st->codec->sample_fmt)>>3;
1283

1284 1285 1286
    if(ist->next_pts == AV_NOPTS_VALUE)
        ist->next_pts= ist->pts;

1287 1288
    if (pkt == NULL) {
        /* EOF handling */
1289
        av_init_packet(&avpkt);
1290 1291
        avpkt.data = NULL;
        avpkt.size = 0;
1292
        goto handle_eof;
1293 1294
    } else {
        avpkt = *pkt;
1295 1296
    }

M
Michael Niedermayer 已提交
1297 1298 1299
    if(pkt->dts != AV_NOPTS_VALUE)
        ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);

1300
    //while we have more to decode or while the decoder did output something on EOF
1301
    while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1302
    handle_eof:
M
Michael Niedermayer 已提交
1303
        ist->pts= ist->next_pts;
1304

1305 1306
        if(avpkt.size && avpkt.size != pkt->size &&
           !(ist->st->codec->codec->capabilities & CODEC_CAP_SUBFRAMES) && verbose>0)
1307 1308
            fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);

1309 1310 1311
        /* decode the packet if needed */
        data_buf = NULL; /* fail safe */
        data_size = 0;
1312
        subtitle_to_free = NULL;
1313
        if (ist->decoding_needed) {
1314
            switch(ist->st->codec->codec_type) {
M
Michael Niedermayer 已提交
1315
            case CODEC_TYPE_AUDIO:{
1316 1317 1318 1319 1320
                if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
                    samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
                    av_free(samples);
                    samples= av_malloc(samples_size);
                }
1321
                data_size= samples_size;
1322 1323
                    /* XXX: could avoid copy if PCM 16 bits with same
                       endianness as CPU */
1324 1325
                ret = avcodec_decode_audio3(ist->st->codec, samples, &data_size,
                                            &avpkt);
1326 1327
                if (ret < 0)
                    goto fail_decode;
1328 1329
                avpkt.data += ret;
                avpkt.size -= ret;
1330 1331 1332 1333 1334 1335 1336
                /* 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;
1337
                ist->next_pts += ((int64_t)AV_TIME_BASE/bps * data_size) /
1338
                    (ist->st->codec->sample_rate * ist->st->codec->channels);
M
Michael Niedermayer 已提交
1339
                break;}
1340
            case CODEC_TYPE_VIDEO:
1341
                    data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1342
                    /* XXX: allocate picture correctly */
1343 1344
                    avcodec_get_frame_defaults(&picture);

1345 1346
                    ret = avcodec_decode_video2(ist->st->codec,
                                                &picture, &got_picture, &avpkt);
1347
                    ist->st->quality= picture.quality;
1348
                    if (ret < 0)
1349 1350 1351 1352 1353
                        goto fail_decode;
                    if (!got_picture) {
                        /* no picture yet */
                        goto discard_packet;
                    }
1354
                    if (ist->st->codec->time_base.num != 0) {
1355
                        int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1356
                        ist->next_pts += ((int64_t)AV_TIME_BASE *
1357
                                          ist->st->codec->time_base.num * ticks) /
1358
                            ist->st->codec->time_base.den;
1359
                    }
1360
                    avpkt.size = 0;
1361
                    break;
1362
            case CODEC_TYPE_SUBTITLE:
1363 1364
                ret = avcodec_decode_subtitle2(ist->st->codec,
                                               &subtitle, &got_subtitle, &avpkt);
1365
                if (ret < 0)
1366
                    goto fail_decode;
1367 1368
                if (!got_subtitle) {
                    goto discard_packet;
1369
                }
1370
                subtitle_to_free = &subtitle;
1371
                avpkt.size = 0;
1372 1373 1374 1375 1376
                break;
            default:
                goto fail_decode;
            }
        } else {
1377 1378 1379
            switch(ist->st->codec->codec_type) {
            case CODEC_TYPE_AUDIO:
                ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1380
                    ist->st->codec->sample_rate;
1381 1382 1383
                break;
            case CODEC_TYPE_VIDEO:
                if (ist->st->codec->time_base.num != 0) {
1384
                    int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1385
                    ist->next_pts += ((int64_t)AV_TIME_BASE *
1386
                                      ist->st->codec->time_base.num * ticks) /
1387
                        ist->st->codec->time_base.den;
1388
                }
1389
                break;
1390
            }
1391 1392 1393 1394
            data_buf = avpkt.data;
            data_size = avpkt.size;
            ret = avpkt.size;
            avpkt.size = 0;
1395
        }
1396

1397 1398 1399 1400 1401
        buffer_to_free = NULL;
        if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO) {
            pre_process_video_frame(ist, (AVPicture *)&picture,
                                    &buffer_to_free);
        }
1402

1403 1404 1405 1406 1407 1408 1409 1410 1411 1412
        // 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;
1413 1414
                }
            }
1415
        }
1416

1417
        /* frame rate emulation */
1418
        if (rate_emu) {
1419
            int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1420 1421 1422 1423
            int64_t now = av_gettime() - ist->start;
            if (pts > now)
                usleep(pts - now);
        }
1424

1425 1426 1427 1428 1429
        /* 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;
1430

1431 1432 1433
                ost = ost_table[i];
                if (ost->source_index == ist_index) {
                    os = output_files[ost->file_index];
1434

1435 1436 1437 1438 1439 1440 1441 1442 1443 1444
                    /* 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);
1445
                            if (vstats_filename && frame_size)
1446 1447 1448 1449 1450 1451 1452
                                do_video_stats(os, ost, frame_size);
                            break;
                        case CODEC_TYPE_SUBTITLE:
                            do_subtitle_out(os, ost, ist, &subtitle,
                                            pkt->pts);
                            break;
                        default:
1453
                            abort();
1454 1455 1456 1457
                        }
                    } else {
                        AVFrame avframe; //FIXME/XXX remove this
                        AVPacket opkt;
1458 1459
                        int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);

1460 1461
                        av_init_packet(&opkt);

1462
                        if ((!ost->frame_number && !(pkt->flags & PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1463 1464
                            continue;

1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
                        /* 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)
1481
                            opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1482 1483 1484
                        else
                            opkt.pts= AV_NOPTS_VALUE;

B
Baptiste Coudurier 已提交
1485
                        if (pkt->dts == AV_NOPTS_VALUE)
1486
                            opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
B
Baptiste Coudurier 已提交
1487 1488
                        else
                            opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1489
                        opkt.dts -= ost_tb_start_time;
1490

1491
                        opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1492 1493 1494
                        opkt.flags= pkt->flags;

                        //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1495
                        if(ost->st->codec->codec_id != CODEC_ID_H264) {
1496 1497
                        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;
1498 1499 1500 1501
                        } else {
                            opkt.data = data_buf;
                            opkt.size = data_size;
                        }
1502

1503
                        write_frame(os, &opkt, ost->st->codec, bitstream_filters[ost->file_index][opkt.stream_index]);
1504 1505 1506
                        ost->st->codec->frame_number++;
                        ost->frame_number++;
                        av_free_packet(&opkt);
1507 1508
                    }
                }
1509 1510 1511 1512 1513 1514
            }
        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++) {
1515 1516
                    av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
                    av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1517
                    av_freep(&subtitle_to_free->rects[i]);
1518
                }
1519
                av_freep(&subtitle_to_free->rects);
1520
            }
1521 1522
            subtitle_to_free->num_rects = 0;
            subtitle_to_free = NULL;
1523
        }
1524
    }
1525
 discard_packet:
1526 1527
    if (pkt == NULL) {
        /* EOF handling */
1528

1529 1530 1531
        for(i=0;i<nb_ostreams;i++) {
            ost = ost_table[i];
            if (ost->source_index == ist_index) {
1532
                AVCodecContext *enc= ost->st->codec;
1533
                os = output_files[ost->file_index];
1534

1535
                if(ost->st->codec->codec_type == CODEC_TYPE_AUDIO && enc->frame_size <=1)
1536
                    continue;
1537
                if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1538 1539 1540 1541 1542
                    continue;

                if (ost->encoding_needed) {
                    for(;;) {
                        AVPacket pkt;
1543
                        int fifo_bytes;
1544 1545
                        av_init_packet(&pkt);
                        pkt.stream_index= ost->index;
1546

1547
                        switch(ost->st->codec->codec_type) {
1548
                        case CODEC_TYPE_AUDIO:
1549
                            fifo_bytes = av_fifo_size(ost->fifo);
1550 1551
                            ret = 0;
                            /* encode any samples remaining in fifo */
1552
                            if (fifo_bytes > 0) {
1553
                                int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1554
                                int fs_tmp = enc->frame_size;
1555

1556
                                av_fifo_generic_read(ost->fifo, samples, fifo_bytes, NULL);
1557 1558 1559 1560 1561 1562 1563 1564 1565
                                if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
                                    enc->frame_size = fifo_bytes / (osize * enc->channels);
                                } else { /* pad */
                                    int frame_bytes = enc->frame_size*osize*enc->channels;
                                    if (samples_size < frame_bytes)
                                        av_exit(1);
                                    memset((uint8_t*)samples+fifo_bytes, 0, frame_bytes - fifo_bytes);
                                }

B
Baptiste Coudurier 已提交
1566
                                ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
1567 1568
                                pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
                                                          ost->st->time_base.num, enc->sample_rate);
1569
                                enc->frame_size = fs_tmp;
M
Michael Niedermayer 已提交
1570 1571
                            }
                            if(ret <= 0) {
1572 1573
                                ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
                            }
1574 1575 1576 1577
                            if (ret < 0) {
                                fprintf(stderr, "Audio encoding failed\n");
                                av_exit(1);
                            }
1578 1579 1580 1581
                            audio_size += ret;
                            pkt.flags |= PKT_FLAG_KEY;
                            break;
                        case CODEC_TYPE_VIDEO:
1582
                            ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1583 1584 1585 1586
                            if (ret < 0) {
                                fprintf(stderr, "Video encoding failed\n");
                                av_exit(1);
                            }
1587 1588 1589 1590 1591 1592 1593 1594 1595 1596
                            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;
                        }
1597

1598 1599
                        if(ret<=0)
                            break;
1600
                        pkt.data= bit_buffer;
1601
                        pkt.size= ret;
1602
                        if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1603
                            pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1604
                        write_frame(os, &pkt, ost->st->codec, bitstream_filters[ost->file_index][pkt.stream_index]);
1605 1606 1607 1608 1609
                    }
                }
            }
        }
    }
1610

1611 1612 1613 1614 1615
    return 0;
 fail_decode:
    return -1;
}

1616 1617 1618 1619 1620 1621
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);
L
Luca Barbato 已提交
1622
    fflush(stdout);
1623
}
1624

1625 1626 1627 1628 1629 1630 1631
static int stream_index_from_inputs(AVFormatContext **input_files,
                                    int nb_input_files,
                                    AVInputFile *file_table,
                                    AVInputStream **ist_table,
                                    enum CodecType type,
                                    int programid)
{
1632
    int p, q, z;
1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
    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;
}

F
merge  
Fabrice Bellard 已提交
1651 1652 1653 1654 1655 1656 1657 1658 1659
/*
 * 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)
{
1660
    int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
F
merge  
Fabrice Bellard 已提交
1661 1662 1663 1664
    AVFormatContext *is, *os;
    AVCodecContext *codec, *icodec;
    AVOutputStream *ost, **ost_table = NULL;
    AVInputStream *ist, **ist_table = NULL;
F
Fabrice Bellard 已提交
1665
    AVInputFile *file_table;
1666
    char error[1024];
1667
    int key;
1668
    int want_sdp = 1;
1669 1670
    uint8_t no_packet[MAX_FILES]={0};
    int no_packet_count=0;
F
Fabrice Bellard 已提交
1671

1672
    file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
F
Fabrice Bellard 已提交
1673 1674
    if (!file_table)
        goto fail;
1675

F
merge  
Fabrice Bellard 已提交
1676 1677 1678 1679 1680
    /* input stream init */
    j = 0;
    for(i=0;i<nb_input_files;i++) {
        is = input_files[i];
        file_table[i].ist_index = j;
1681
        file_table[i].nb_streams = is->nb_streams;
F
merge  
Fabrice Bellard 已提交
1682 1683 1684 1685 1686 1687
        j += is->nb_streams;
    }
    nb_istreams = j;

    ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
    if (!ist_table)
F
Fabrice Bellard 已提交
1688
        goto fail;
1689

F
merge  
Fabrice Bellard 已提交
1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
    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) */
1706

1707
            if (rate_emu) {
1708 1709
                ist->start = av_gettime();
            }
F
merge  
Fabrice Bellard 已提交
1710 1711 1712 1713 1714 1715 1716
        }
    }

    /* output stream init */
    nb_ostreams = 0;
    for(i=0;i<nb_output_files;i++) {
        os = output_files[i];
1717
        if (!os->nb_streams) {
1718 1719
            dump_format(output_files[i], i, output_files[i]->filename, 1);
            fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1720
            av_exit(1);
1721
        }
F
merge  
Fabrice Bellard 已提交
1722 1723 1724 1725
        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");
1726
        av_exit(1);
F
merge  
Fabrice Bellard 已提交
1727 1728
    }

1729 1730 1731 1732
    /* 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;
1733

1734 1735 1736
        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);
1737
            av_exit(1);
1738
        }
1739 1740 1741 1742 1743
        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);
1744
            av_exit(1);
1745
        }
1746
    }
1747

F
merge  
Fabrice Bellard 已提交
1748 1749 1750 1751 1752 1753 1754 1755 1756
    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;
    }
1757

F
merge  
Fabrice Bellard 已提交
1758 1759 1760
    n = 0;
    for(k=0;k<nb_output_files;k++) {
        os = output_files[k];
1761
        for(i=0;i<os->nb_streams;i++,n++) {
F
merge  
Fabrice Bellard 已提交
1762
            int found;
1763
            ost = ost_table[n];
F
merge  
Fabrice Bellard 已提交
1764 1765 1766 1767
            ost->file_index = k;
            ost->index = i;
            ost->st = os->streams[i];
            if (nb_stream_maps > 0) {
1768 1769
                ost->source_index = file_table[stream_maps[n].file_index].ist_index +
                    stream_maps[n].stream_index;
1770

1771
                /* Sanity check that the stream types match */
1772
                if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1773 1774
                    int i= ost->file_index;
                    dump_format(output_files[i], i, output_files[i]->filename, 1);
1775
                    fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1776
                        stream_maps[n].file_index, stream_maps[n].stream_index,
1777
                        ost->file_index, ost->index);
1778
                    av_exit(1);
1779
                }
1780

F
merge  
Fabrice Bellard 已提交
1781
            } else {
1782 1783 1784 1785 1786 1787 1788 1789
                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 {
N
Nico Sabbi 已提交
1790 1791
                    /* get corresponding input stream index : we select the first one with the right type */
                    found = 0;
F
merge  
Fabrice Bellard 已提交
1792 1793
                    for(j=0;j<nb_istreams;j++) {
                        ist = ist_table[j];
N
Nico Sabbi 已提交
1794 1795
                        if (ist->discard &&
                            ist->st->codec->codec_type == ost->st->codec->codec_type) {
F
merge  
Fabrice Bellard 已提交
1796 1797
                            ost->source_index = j;
                            found = 1;
N
Nico Sabbi 已提交
1798
                            break;
F
merge  
Fabrice Bellard 已提交
1799 1800
                        }
                    }
N
Nico Sabbi 已提交
1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
                }

                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;
                            }
                        }
1813
                    }
F
merge  
Fabrice Bellard 已提交
1814
                    if (!found) {
1815 1816
                        int i= ost->file_index;
                        dump_format(output_files[i], i, output_files[i]->filename, 1);
F
merge  
Fabrice Bellard 已提交
1817 1818
                        fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
                                ost->file_index, ost->index);
1819
                        av_exit(1);
F
merge  
Fabrice Bellard 已提交
1820 1821 1822 1823 1824
                    }
                }
            }
            ist = ist_table[ost->source_index];
            ist->discard = 0;
1825
            ost->sync_ist = (nb_stream_maps > 0) ?
1826 1827
                ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
                         stream_maps[n].sync_stream_index] : ist;
F
merge  
Fabrice Bellard 已提交
1828 1829 1830 1831 1832
        }
    }

    /* for each output stream, we compute the right encoding parameters */
    for(i=0;i<nb_ostreams;i++) {
1833
        AVMetadataTag *lang;
F
merge  
Fabrice Bellard 已提交
1834
        ost = ost_table[i];
1835
        os = output_files[ost->file_index];
F
merge  
Fabrice Bellard 已提交
1836 1837
        ist = ist_table[ost->source_index];

1838 1839
        codec = ost->st->codec;
        icodec = ist->st->codec;
F
merge  
Fabrice Bellard 已提交
1840

1841 1842 1843
        if ((lang=av_metadata_get(ist->st->metadata, "language", NULL, 0))
            &&   !av_metadata_get(ost->st->metadata, "language", NULL, 0))
            av_metadata_set(&ost->st->metadata, "language", lang->value);
1844

1845
        ost->st->disposition = ist->st->disposition;
1846
        codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1847
        codec->chroma_sample_location = icodec->chroma_sample_location;
1848

1849 1850 1851 1852
        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;
1853 1854 1855 1856 1857 1858 1859 1860

            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;
            }

1861
            codec->bit_rate = icodec->bit_rate;
1862 1863
            codec->extradata= icodec->extradata;
            codec->extradata_size= icodec->extradata_size;
1864
            if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
1865
                codec->time_base = icodec->time_base;
1866 1867
                codec->time_base.num *= icodec->ticks_per_frame;
            }else
1868
                codec->time_base = ist->st->time_base;
1869 1870
            switch(codec->codec_type) {
            case CODEC_TYPE_AUDIO:
1871 1872 1873 1874
                if(audio_volume != 256) {
                    fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
                    av_exit(1);
                }
1875
                codec->channel_layout = icodec->channel_layout;
1876 1877
                codec->sample_rate = icodec->sample_rate;
                codec->channels = icodec->channels;
1878
                codec->frame_size = icodec->frame_size;
M
Michael Niedermayer 已提交
1879
                codec->block_align= icodec->block_align;
1880 1881
                if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
                    codec->block_align= 0;
1882 1883
                if(codec->codec_id == CODEC_ID_AC3)
                    codec->block_align= 0;
1884 1885
                break;
            case CODEC_TYPE_VIDEO:
1886
                codec->pix_fmt = icodec->pix_fmt;
1887 1888
                codec->width = icodec->width;
                codec->height = icodec->height;
1889
                codec->has_b_frames = icodec->has_b_frames;
1890
                break;
1891
            case CODEC_TYPE_SUBTITLE:
1892 1893
                codec->width = icodec->width;
                codec->height = icodec->height;
1894
                break;
1895
            default:
1896
                abort();
1897 1898 1899 1900
            }
        } else {
            switch(codec->codec_type) {
            case CODEC_TYPE_AUDIO:
1901 1902
                ost->fifo= av_fifo_alloc(1024);
                if(!ost->fifo)
F
merge  
Fabrice Bellard 已提交
1903
                    goto fail;
1904
                ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
1905 1906
                ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
                icodec->request_channels = codec->channels;
F
merge  
Fabrice Bellard 已提交
1907 1908
                ist->decoding_needed = 1;
                ost->encoding_needed = 1;
1909 1910
                break;
            case CODEC_TYPE_VIDEO:
1911 1912 1913 1914
                if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
                    fprintf(stderr, "Video pixel format is unknown, stream cannot be decoded\n");
                    av_exit(1);
                }
1915 1916 1917 1918 1919 1920 1921
                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) +
1922 1923
                                (frame_padtop + frame_padbottom)) ||
                        (codec->pix_fmt != icodec->pix_fmt));
1924
                if (ost->video_crop) {
1925 1926 1927 1928
                    ost->topBand    = ost->original_topBand    = frame_topBand;
                    ost->bottomBand = ost->original_bottomBand = frame_bottomBand;
                    ost->leftBand   = ost->original_leftBand   = frame_leftBand;
                    ost->rightBand  = ost->original_rightBand  = frame_rightBand;
1929 1930
                }
                if (ost->video_pad) {
1931 1932 1933 1934
                    ost->padtop = frame_padtop;
                    ost->padleft = frame_padleft;
                    ost->padbottom = frame_padbottom;
                    ost->padright = frame_padright;
1935 1936
                    if (!ost->video_resample) {
                        avcodec_get_frame_defaults(&ost->pict_tmp);
1937 1938
                        if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
                                         codec->width, codec->height))
1939 1940 1941 1942
                            goto fail;
                    }
                }
                if (ost->video_resample) {
M
Michael Niedermayer 已提交
1943
                    avcodec_get_frame_defaults(&ost->pict_tmp);
1944 1945
                    if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
                                         codec->width, codec->height)) {
B
Baptiste Coudurier 已提交
1946
                        fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1947
                        av_exit(1);
B
Baptiste Coudurier 已提交
1948
                    }
1949
                    sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1950 1951 1952 1953
                    ost->img_resample_ctx = sws_getContext(
                            icodec->width - (frame_leftBand + frame_rightBand),
                            icodec->height - (frame_topBand + frame_bottomBand),
                            icodec->pix_fmt,
1954 1955
                            codec->width - (frame_padleft + frame_padright),
                            codec->height - (frame_padtop + frame_padbottom),
1956 1957
                            codec->pix_fmt,
                            sws_flags, NULL, NULL, NULL);
1958 1959
                    if (ost->img_resample_ctx == NULL) {
                        fprintf(stderr, "Cannot get resampling context\n");
1960
                        av_exit(1);
1961
                    }
1962 1963 1964 1965

                    ost->original_height = icodec->height;
                    ost->original_width  = icodec->width;

1966
                    codec->bits_per_raw_sample= 0;
F
merge  
Fabrice Bellard 已提交
1967
                }
1968 1969 1970
                ost->resample_height = icodec->height - (frame_topBand  + frame_bottomBand);
                ost->resample_width  = icodec->width  - (frame_leftBand + frame_rightBand);
                ost->resample_pix_fmt= icodec->pix_fmt;
F
merge  
Fabrice Bellard 已提交
1971 1972
                ost->encoding_needed = 1;
                ist->decoding_needed = 1;
1973
                break;
1974 1975 1976 1977
            case CODEC_TYPE_SUBTITLE:
                ost->encoding_needed = 1;
                ist->decoding_needed = 1;
                break;
1978
            default:
1979
                abort();
1980
                break;
F
merge  
Fabrice Bellard 已提交
1981
            }
1982
            /* two pass mode */
1983
            if (ost->encoding_needed &&
1984 1985 1986 1987 1988
                (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
                char logfilename[1024];
                FILE *f;
                int size;
                char *logbuffer;
1989 1990

                snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1991 1992
                         pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
                         i);
1993 1994 1995
                if (codec->flags & CODEC_FLAG_PASS1) {
                    f = fopen(logfilename, "w");
                    if (!f) {
1996
                        fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
1997
                        av_exit(1);
1998 1999 2000 2001 2002 2003
                    }
                    ost->logfile = f;
                } else {
                    /* read the log file */
                    f = fopen(logfilename, "r");
                    if (!f) {
2004
                        fprintf(stderr, "Cannot read log file '%s' for pass-2 encoding: %s\n", logfilename, strerror(errno));
2005
                        av_exit(1);
2006 2007 2008 2009 2010 2011 2012
                    }
                    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");
2013
                        av_exit(1);
2014
                    }
2015
                    size = fread(logbuffer, 1, size, f);
2016 2017 2018
                    fclose(f);
                    logbuffer[size] = '\0';
                    codec->stats_in = logbuffer;
2019 2020 2021
                }
            }
        }
2022 2023
        if(codec->codec_type == CODEC_TYPE_VIDEO){
            int size= codec->width * codec->height;
2024
            bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2025
        }
F
merge  
Fabrice Bellard 已提交
2026 2027
    }

2028 2029
    if (!bit_buffer)
        bit_buffer = av_malloc(bit_buffer_size);
2030
    if (!bit_buffer) {
2031 2032
        fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
                bit_buffer_size);
2033
        ret = AVERROR(ENOMEM);
2034
        goto fail;
2035 2036
    }

F
merge  
Fabrice Bellard 已提交
2037 2038 2039 2040
    /* open each encoder */
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
        if (ost->encoding_needed) {
A
Aurelien Jacobs 已提交
2041 2042
            AVCodec *codec = output_codecs[i];
            if (!codec)
A
Aurelien Jacobs 已提交
2043
                codec = avcodec_find_encoder(ost->st->codec->codec_id);
F
merge  
Fabrice Bellard 已提交
2044
            if (!codec) {
2045 2046
                snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
                         ost->st->codec->codec_id, ost->file_index, ost->index);
2047 2048
                ret = AVERROR(EINVAL);
                goto dump_format;
F
merge  
Fabrice Bellard 已提交
2049
            }
2050
            if (avcodec_open(ost->st->codec, codec) < 0) {
2051
                snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
F
merge  
Fabrice Bellard 已提交
2052
                        ost->file_index, ost->index);
2053 2054
                ret = AVERROR(EINVAL);
                goto dump_format;
F
merge  
Fabrice Bellard 已提交
2055
            }
2056
            extra_size += ost->st->codec->extradata_size;
F
merge  
Fabrice Bellard 已提交
2057 2058 2059 2060 2061 2062 2063
        }
    }

    /* open each decoder */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
        if (ist->decoding_needed) {
A
Aurelien Jacobs 已提交
2064 2065
            AVCodec *codec = input_codecs[i];
            if (!codec)
A
Aurelien Jacobs 已提交
2066
                codec = avcodec_find_decoder(ist->st->codec->codec_id);
F
merge  
Fabrice Bellard 已提交
2067
            if (!codec) {
2068
                snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2069
                        ist->st->codec->codec_id, ist->file_index, ist->index);
2070 2071
                ret = AVERROR(EINVAL);
                goto dump_format;
F
merge  
Fabrice Bellard 已提交
2072
            }
2073
            if (avcodec_open(ist->st->codec, codec) < 0) {
2074
                snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
F
merge  
Fabrice Bellard 已提交
2075
                        ist->file_index, ist->index);
2076 2077
                ret = AVERROR(EINVAL);
                goto dump_format;
F
merge  
Fabrice Bellard 已提交
2078
            }
2079 2080
            //if (ist->st->codec->codec_type == CODEC_TYPE_VIDEO)
            //    ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
F
merge  
Fabrice Bellard 已提交
2081 2082 2083 2084 2085 2086
        }
    }

    /* init pts */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
2087
        ist->pts = 0;
2088
        ist->next_pts = AV_NOPTS_VALUE;
2089
        ist->is_start = 1;
F
merge  
Fabrice Bellard 已提交
2090
    }
M
Michael Niedermayer 已提交
2091

2092 2093 2094 2095
    /* set meta data information from input file if required */
    for (i=0;i<nb_meta_data_maps;i++) {
        AVFormatContext *out_file;
        AVFormatContext *in_file;
2096
        AVMetadataTag *mtag;
2097 2098 2099

        int out_file_index = meta_data_maps[i].out_file;
        int in_file_index = meta_data_maps[i].in_file;
2100
        if (out_file_index < 0 || out_file_index >= nb_output_files) {
2101 2102
            snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
                     out_file_index, out_file_index, in_file_index);
2103
            ret = AVERROR(EINVAL);
2104
            goto dump_format;
2105
        }
2106
        if (in_file_index < 0 || in_file_index >= nb_input_files) {
2107 2108
            snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
                     in_file_index, out_file_index, in_file_index);
2109
            ret = AVERROR(EINVAL);
2110
            goto dump_format;
2111 2112
        }

2113 2114 2115
        out_file = output_files[out_file_index];
        in_file = input_files[in_file_index];

2116 2117 2118 2119 2120 2121

        mtag=NULL;
        while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
            av_metadata_set(&out_file->metadata, mtag->key, mtag->value);
        av_metadata_conv(out_file, out_file->oformat->metadata_conv,
                                    in_file->iformat->metadata_conv);
2122
    }
2123

F
merge  
Fabrice Bellard 已提交
2124 2125 2126
    /* open files and write file headers */
    for(i=0;i<nb_output_files;i++) {
        os = output_files[i];
2127
        if (av_write_header(os) < 0) {
2128
            snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2129
            ret = AVERROR(EINVAL);
2130
            goto dump_format;
2131
        }
2132 2133 2134 2135
        if (strcmp(output_files[i]->oformat->name, "rtp")) {
            want_sdp = 0;
        }
    }
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 2165 2166

 dump_format:
    /* 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 */
    if (verbose >= 0) {
        fprintf(stderr, "Stream mapping:\n");
        for(i=0;i<nb_ostreams;i++) {
            ost = ost_table[i];
            fprintf(stderr, "  Stream #%d.%d -> #%d.%d",
                    ist_table[ost->source_index]->file_index,
                    ist_table[ost->source_index]->index,
                    ost->file_index,
                    ost->index);
            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");
        }
    }

    if (ret) {
        fprintf(stderr, "%s\n", error);
        goto fail;
    }

2167 2168
    if (want_sdp) {
        print_sdp(output_files, nb_output_files);
F
merge  
Fabrice Bellard 已提交
2169 2170
    }

2171
    if (!using_stdin && verbose >= 0) {
2172
        fprintf(stderr, "Press [q] to stop encoding\n");
2173 2174
        url_set_interrupt_cb(decode_interrupt_cb);
    }
2175 2176
    term_init();

2177
    timer_start = av_gettime();
2178

2179
    for(; received_sigterm == 0;) {
F
merge  
Fabrice Bellard 已提交
2180 2181
        int file_index, ist_index;
        AVPacket pkt;
2182 2183
        double ipts_min;
        double opts_min;
M
Michael Niedermayer 已提交
2184

F
merge  
Fabrice Bellard 已提交
2185
    redo:
2186 2187
        ipts_min= 1e100;
        opts_min= 1e100;
2188
        /* if 'q' pressed, exits */
2189
        if (!using_stdin) {
2190 2191
            if (q_pressed)
                break;
2192 2193 2194 2195 2196
            /* read_key() returns 0 on EOF */
            key = read_key();
            if (key == 'q')
                break;
        }
2197

2198 2199
        /* select the stream that we must read now by looking at the
           smallest output pts */
F
merge  
Fabrice Bellard 已提交
2200
        file_index = -1;
2201
        for(i=0;i<nb_ostreams;i++) {
M
Michael Niedermayer 已提交
2202
            double ipts, opts;
2203 2204 2205
            ost = ost_table[i];
            os = output_files[ost->file_index];
            ist = ist_table[ost->source_index];
2206 2207
            if(no_packet[ist->file_index])
                continue;
2208 2209
            if(ost->st->codec->codec_type == CODEC_TYPE_VIDEO)
                opts = ost->sync_opts * av_q2d(ost->st->codec->time_base);
M
Michael Niedermayer 已提交
2210
            else
2211
                opts = ost->st->pts.val * av_q2d(ost->st->time_base);
M
Michael Niedermayer 已提交
2212 2213 2214 2215 2216 2217 2218 2219 2220 2221
            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;
                }
F
merge  
Fabrice Bellard 已提交
2222
            }
2223
            if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2224 2225 2226
                file_index= -1;
                break;
            }
F
merge  
Fabrice Bellard 已提交
2227 2228
        }
        /* if none, if is finished */
2229
        if (file_index < 0) {
2230 2231 2232
            if(no_packet_count){
                no_packet_count=0;
                memset(no_packet, 0, sizeof(no_packet));
2233
                usleep(10000);
2234 2235
                continue;
            }
F
merge  
Fabrice Bellard 已提交
2236
            break;
2237 2238
        }

F
merge  
Fabrice Bellard 已提交
2239
        /* finish if recording time exhausted */
2240
        if (opts_min >= (recording_time / 1000000.0))
F
merge  
Fabrice Bellard 已提交
2241
            break;
2242

2243
        /* finish if limit size exhausted */
2244
        if (limit_filesize != 0 && limit_filesize < url_ftell(output_files[0]->pb))
2245 2246
            break;

2247
        /* read a frame from it and output it in the fifo */
F
merge  
Fabrice Bellard 已提交
2248
        is = input_files[file_index];
2249
        ret= av_read_frame(is, &pkt);
2250
        if(ret == AVERROR(EAGAIN)){
2251 2252
            no_packet[file_index]=1;
            no_packet_count++;
2253
            continue;
2254
        }
2255
        if (ret < 0) {
F
merge  
Fabrice Bellard 已提交
2256
            file_table[file_index].eof_reached = 1;
A
Alex Beregszaszi 已提交
2257 2258 2259 2260
            if (opt_shortest)
                break;
            else
                continue;
F
merge  
Fabrice Bellard 已提交
2261
        }
2262

2263 2264 2265
        no_packet_count=0;
        memset(no_packet, 0, sizeof(no_packet));

2266
        if (do_pkt_dump) {
2267
            av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2268
        }
2269 2270 2271
        /* 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)
2272
            goto discard_packet;
F
merge  
Fabrice Bellard 已提交
2273 2274
        ist_index = file_table[file_index].ist_index + pkt.stream_index;
        ist = ist_table[ist_index];
2275 2276
        if (ist->discard)
            goto discard_packet;
F
merge  
Fabrice Bellard 已提交
2277

2278 2279 2280 2281 2282
        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);

2283 2284 2285 2286 2287 2288 2289
        if(input_files_ts_scale[file_index][pkt.stream_index]){
            if(pkt.pts != AV_NOPTS_VALUE)
                pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
            if(pkt.dts != AV_NOPTS_VALUE)
                pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
        }

2290
//        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);
2291 2292
        if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
            && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2293 2294 2295
            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){
2296 2297
                input_files_ts_offset[ist->file_index]-= delta;
                if (verbose > 2)
2298
                    fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2299 2300 2301
                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);
2302 2303 2304
            }
        }

2305
        //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2306
        if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2307 2308 2309 2310

            if (verbose >= 0)
                fprintf(stderr, "Error while decoding stream #%d.%d\n",
                        ist->file_index, ist->index);
2311 2312
            if (exit_on_error)
                av_exit(1);
2313 2314
            av_free_packet(&pkt);
            goto redo;
M
Michael Niedermayer 已提交
2315
        }
2316

2317
    discard_packet:
F
merge  
Fabrice Bellard 已提交
2318
        av_free_packet(&pkt);
2319

2320 2321
        /* dump report by using the output first video and audio streams */
        print_report(output_files, ost_table, nb_ostreams, 0);
F
merge  
Fabrice Bellard 已提交
2322
    }
2323 2324 2325 2326 2327 2328 2329 2330 2331

    /* 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);
        }
    }

2332
    term_exit();
F
merge  
Fabrice Bellard 已提交
2333

2334 2335 2336 2337 2338 2339
    /* write the trailer if needed and close file */
    for(i=0;i<nb_output_files;i++) {
        os = output_files[i];
        av_write_trailer(os);
    }

2340 2341 2342
    /* dump report by using the first video and audio streams */
    print_report(output_files, ost_table, nb_ostreams, 1);

F
merge  
Fabrice Bellard 已提交
2343 2344 2345 2346
    /* close each encoder */
    for(i=0;i<nb_ostreams;i++) {
        ost = ost_table[i];
        if (ost->encoding_needed) {
2347 2348
            av_freep(&ost->st->codec->stats_in);
            avcodec_close(ost->st->codec);
F
merge  
Fabrice Bellard 已提交
2349 2350
        }
    }
2351

F
merge  
Fabrice Bellard 已提交
2352 2353 2354 2355
    /* close each decoder */
    for(i=0;i<nb_istreams;i++) {
        ist = ist_table[i];
        if (ist->decoding_needed) {
2356
            avcodec_close(ist->st->codec);
F
merge  
Fabrice Bellard 已提交
2357 2358 2359 2360
        }
    }

    /* finished ! */
2361
    ret = 0;
2362

2363
 fail:
M
Michael Niedermayer 已提交
2364
    av_freep(&bit_buffer);
F
Fabrice Bellard 已提交
2365
    av_free(file_table);
F
Fabrice Bellard 已提交
2366

F
merge  
Fabrice Bellard 已提交
2367 2368 2369
    if (ist_table) {
        for(i=0;i<nb_istreams;i++) {
            ist = ist_table[i];
F
Fabrice Bellard 已提交
2370
            av_free(ist);
F
merge  
Fabrice Bellard 已提交
2371
        }
F
Fabrice Bellard 已提交
2372
        av_free(ist_table);
F
merge  
Fabrice Bellard 已提交
2373 2374 2375 2376 2377
    }
    if (ost_table) {
        for(i=0;i<nb_ostreams;i++) {
            ost = ost_table[i];
            if (ost) {
2378 2379 2380 2381
                if (ost->logfile) {
                    fclose(ost->logfile);
                    ost->logfile = NULL;
                }
2382
                av_fifo_free(ost->fifo); /* works even if fifo is not
2383
                                             initialized but set to zero */
F
Fabrice Bellard 已提交
2384
                av_free(ost->pict_tmp.data[0]);
F
merge  
Fabrice Bellard 已提交
2385
                if (ost->video_resample)
2386
                    sws_freeContext(ost->img_resample_ctx);
2387
                if (ost->resample)
F
merge  
Fabrice Bellard 已提交
2388
                    audio_resample_close(ost->resample);
2389 2390
                if (ost->reformat_ctx)
                    av_audio_convert_free(ost->reformat_ctx);
F
Fabrice Bellard 已提交
2391
                av_free(ost);
F
merge  
Fabrice Bellard 已提交
2392 2393
            }
        }
F
Fabrice Bellard 已提交
2394
        av_free(ost_table);
F
merge  
Fabrice Bellard 已提交
2395 2396 2397 2398
    }
    return ret;
}

2399
static void opt_format(const char *arg)
F
merge  
Fabrice Bellard 已提交
2400
{
2401 2402
    /* compatibility stuff for pgmyuv */
    if (!strcmp(arg, "pgmyuv")) {
2403
        pgmyuv_compatibility_hack=1;
2404
//        opt_image_format(arg);
2405
        arg = "image2";
2406
        fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2407 2408
    }

2409
    last_asked_format = arg;
F
merge  
Fabrice Bellard 已提交
2410 2411
}

2412
static void opt_video_rc_override_string(const char *arg)
2413 2414 2415 2416
{
    video_rc_override_string = arg;
}

2417
static int opt_me_threshold(const char *opt, const char *arg)
2418
{
2419 2420
    me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
    return 0;
2421 2422
}

2423
static int opt_verbose(const char *opt, const char *arg)
2424
{
2425
    verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2426
    return 0;
2427 2428
}

2429
static int opt_frame_rate(const char *opt, const char *arg)
F
merge  
Fabrice Bellard 已提交
2430
{
2431
    if (av_parse_video_frame_rate(&frame_rate, arg) < 0) {
2432
        fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2433
        av_exit(1);
2434
    }
2435
    return 0;
F
merge  
Fabrice Bellard 已提交
2436 2437
}

2438
static int opt_bitrate(const char *opt, const char *arg)
2439 2440 2441 2442 2443
{
    int codec_type = opt[0]=='a' ? CODEC_TYPE_AUDIO : CODEC_TYPE_VIDEO;

    opt_default(opt, arg);

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

    return 0;
2448 2449
}

2450
static void opt_frame_crop_top(const char *arg)
2451
{
2452
    frame_topBand = atoi(arg);
2453 2454
    if (frame_topBand < 0) {
        fprintf(stderr, "Incorrect top crop size\n");
2455
        av_exit(1);
2456 2457
    }
    if ((frame_topBand) >= frame_height){
2458
        fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2459
        av_exit(1);
2460 2461 2462 2463
    }
    frame_height -= frame_topBand;
}

2464
static void opt_frame_crop_bottom(const char *arg)
2465 2466 2467 2468
{
    frame_bottomBand = atoi(arg);
    if (frame_bottomBand < 0) {
        fprintf(stderr, "Incorrect bottom crop size\n");
2469
        av_exit(1);
2470 2471
    }
    if ((frame_bottomBand) >= frame_height){
2472
        fprintf(stderr, "Vertical crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2473
        av_exit(1);
2474 2475 2476 2477
    }
    frame_height -= frame_bottomBand;
}

2478
static void opt_frame_crop_left(const char *arg)
2479 2480 2481 2482
{
    frame_leftBand = atoi(arg);
    if (frame_leftBand < 0) {
        fprintf(stderr, "Incorrect left crop size\n");
2483
        av_exit(1);
2484 2485
    }
    if ((frame_leftBand) >= frame_width){
2486
        fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2487
        av_exit(1);
2488 2489 2490 2491
    }
    frame_width -= frame_leftBand;
}

2492
static void opt_frame_crop_right(const char *arg)
2493 2494 2495 2496
{
    frame_rightBand = atoi(arg);
    if (frame_rightBand < 0) {
        fprintf(stderr, "Incorrect right crop size\n");
2497
        av_exit(1);
2498 2499
    }
    if ((frame_rightBand) >= frame_width){
2500
        fprintf(stderr, "Horizontal crop dimensions are outside the range of the original image.\nRemember to crop first and scale second.\n");
2501
        av_exit(1);
2502 2503 2504 2505
    }
    frame_width -= frame_rightBand;
}

2506
static void opt_frame_size(const char *arg)
F
merge  
Fabrice Bellard 已提交
2507
{
2508
    if (av_parse_video_frame_size(&frame_width, &frame_height, arg) < 0) {
F
merge  
Fabrice Bellard 已提交
2509
        fprintf(stderr, "Incorrect frame size\n");
2510
        av_exit(1);
F
merge  
Fabrice Bellard 已提交
2511 2512 2513
    }
}

2514 2515 2516 2517 2518
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;
2519 2520

    r = (rgb >> 16);
2521 2522 2523 2524 2525 2526 2527 2528 2529 2530
    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)
{
2531
    frame_padtop = atoi(arg);
2532 2533
    if (frame_padtop < 0) {
        fprintf(stderr, "Incorrect top pad size\n");
2534
        av_exit(1);
2535 2536 2537 2538 2539
    }
}

static void opt_frame_pad_bottom(const char *arg)
{
2540
    frame_padbottom = atoi(arg);
2541 2542
    if (frame_padbottom < 0) {
        fprintf(stderr, "Incorrect bottom pad size\n");
2543
        av_exit(1);
2544 2545 2546 2547 2548 2549
    }
}


static void opt_frame_pad_left(const char *arg)
{
2550
    frame_padleft = atoi(arg);
2551 2552
    if (frame_padleft < 0) {
        fprintf(stderr, "Incorrect left pad size\n");
2553
        av_exit(1);
2554 2555 2556 2557 2558 2559
    }
}


static void opt_frame_pad_right(const char *arg)
{
2560
    frame_padright = atoi(arg);
2561 2562
    if (frame_padright < 0) {
        fprintf(stderr, "Incorrect right pad size\n");
2563
        av_exit(1);
2564 2565 2566
    }
}

2567 2568
static void opt_frame_pix_fmt(const char *arg)
{
2569
    if (strcmp(arg, "list")) {
2570
        frame_pix_fmt = avcodec_get_pix_fmt(arg);
2571 2572 2573 2574 2575
        if (frame_pix_fmt == PIX_FMT_NONE) {
            fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
            av_exit(1);
        }
    } else {
2576
        list_fmts(avcodec_pix_fmt_string, PIX_FMT_NB);
2577
        av_exit(0);
2578
    }
2579 2580
}

2581 2582 2583 2584 2585
static void opt_frame_aspect_ratio(const char *arg)
{
    int x = 0, y = 0;
    double ar = 0;
    const char *p;
2586
    char *end;
2587

2588 2589
    p = strchr(arg, ':');
    if (p) {
2590 2591 2592
        x = strtol(arg, &end, 10);
        if (end == p)
            y = strtol(end+1, &end, 10);
2593 2594
        if (x > 0 && y > 0)
            ar = (double)x / (double)y;
2595
    } else
2596
        ar = strtod(arg, NULL);
2597 2598 2599

    if (!ar) {
        fprintf(stderr, "Incorrect aspect ratio specification.\n");
2600
        av_exit(1);
2601 2602 2603 2604
    }
    frame_aspect_ratio = ar;
}

2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622
static int opt_metadata(const char *opt, const char *arg)
{
    char *mid= strchr(arg, '=');

    if(!mid){
        fprintf(stderr, "Missing =\n");
        av_exit(1);
    }
    *mid++= 0;

    metadata_count++;
    metadata= av_realloc(metadata, sizeof(*metadata)*metadata_count);
    metadata[metadata_count-1].key  = av_strdup(arg);
    metadata[metadata_count-1].value= av_strdup(mid);

    return 0;
}

2623
static void opt_qscale(const char *arg)
F
merge  
Fabrice Bellard 已提交
2624
{
2625
    video_qscale = atof(arg);
L
Loren Merritt 已提交
2626
    if (video_qscale <= 0 ||
2627
        video_qscale > 255) {
L
Loren Merritt 已提交
2628
        fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2629
        av_exit(1);
F
merge  
Fabrice Bellard 已提交
2630 2631 2632
    }
}

M
Michael Niedermayer 已提交
2633 2634 2635 2636 2637
static void opt_top_field_first(const char *arg)
{
    top_field_first= atoi(arg);
}

2638
static int opt_thread_count(const char *opt, const char *arg)
2639
{
2640
    thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2641
#if !HAVE_THREADS
2642 2643
    if (verbose >= 0)
        fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
M
Michael Niedermayer 已提交
2644
#endif
2645
    return 0;
2646 2647
}

2648 2649 2650 2651 2652 2653 2654 2655 2656 2657
static void opt_audio_sample_fmt(const char *arg)
{
    if (strcmp(arg, "list"))
        audio_sample_fmt = avcodec_get_sample_fmt(arg);
    else {
        list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
        av_exit(0);
    }
}

2658
static int opt_audio_rate(const char *opt, const char *arg)
F
merge  
Fabrice Bellard 已提交
2659
{
2660 2661
    audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
    return 0;
F
merge  
Fabrice Bellard 已提交
2662 2663
}

2664
static int opt_audio_channels(const char *opt, const char *arg)
F
merge  
Fabrice Bellard 已提交
2665
{
2666 2667
    audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
    return 0;
F
merge  
Fabrice Bellard 已提交
2668 2669
}

2670
static void opt_video_channel(const char *arg)
2671 2672 2673 2674
{
    video_channel = strtol(arg, NULL, 0);
}

2675 2676 2677 2678 2679
static void opt_video_standard(const char *arg)
{
    video_standard = av_strdup(arg);
}

2680
static void opt_codec(int *pstream_copy, char **pcodec_name,
2681
                      int codec_type, const char *arg)
F
merge  
Fabrice Bellard 已提交
2682
{
2683
    av_freep(pcodec_name);
2684
    if (!strcmp(arg, "copy")) {
2685
        *pstream_copy = 1;
F
merge  
Fabrice Bellard 已提交
2686
    } else {
2687
        *pcodec_name = av_strdup(arg);
F
merge  
Fabrice Bellard 已提交
2688 2689 2690
    }
}

2691 2692
static void opt_audio_codec(const char *arg)
{
2693
    opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg);
2694 2695
}

M
Michael Niedermayer 已提交
2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713
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);
}

2714
static void opt_video_codec(const char *arg)
F
merge  
Fabrice Bellard 已提交
2715
{
2716
    opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg);
2717
}
F
merge  
Fabrice Bellard 已提交
2718

2719 2720
static void opt_subtitle_codec(const char *arg)
{
2721
    opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg);
F
merge  
Fabrice Bellard 已提交
2722 2723
}

2724 2725 2726 2727 2728 2729 2730 2731 2732
static void opt_subtitle_tag(const char *arg)
{
    char *tail;
    subtitle_codec_tag= strtol(arg, &tail, 0);

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

2733
static void opt_map(const char *arg)
F
merge  
Fabrice Bellard 已提交
2734 2735
{
    AVStreamMap *m;
2736
    char *p;
F
merge  
Fabrice Bellard 已提交
2737 2738 2739

    m = &stream_maps[nb_stream_maps++];

2740
    m->file_index = strtol(arg, &p, 0);
F
merge  
Fabrice Bellard 已提交
2741 2742
    if (*p)
        p++;
J
Juanjo 已提交
2743

2744
    m->stream_index = strtol(p, &p, 0);
2745 2746
    if (*p) {
        p++;
2747
        m->sync_file_index = strtol(p, &p, 0);
2748 2749
        if (*p)
            p++;
2750
        m->sync_stream_index = strtol(p, &p, 0);
2751 2752 2753 2754
    } else {
        m->sync_file_index = m->file_index;
        m->sync_stream_index = m->stream_index;
    }
F
merge  
Fabrice Bellard 已提交
2755 2756
}

2757 2758 2759
static void opt_map_meta_data(const char *arg)
{
    AVMetaDataMap *m;
2760
    char *p;
2761

2762 2763
    m = &meta_data_maps[nb_meta_data_maps++];

2764
    m->out_file = strtol(arg, &p, 0);
2765 2766 2767
    if (*p)
        p++;

2768
    m->in_file = strtol(p, &p, 0);
2769 2770
}

2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787
static void opt_input_ts_scale(const char *arg)
{
    unsigned int stream;
    double scale;
    char *p;

    stream = strtol(arg, &p, 0);
    if (*p)
        p++;
    scale= strtod(p, &p);

    if(stream >= MAX_STREAMS)
        av_exit(1);

    input_files_ts_scale[nb_input_files][stream]= scale;
}

2788
static int opt_recording_time(const char *opt, const char *arg)
F
merge  
Fabrice Bellard 已提交
2789
{
2790 2791
    recording_time = parse_time_or_die(opt, arg, 1);
    return 0;
F
merge  
Fabrice Bellard 已提交
2792 2793
}

2794
static int opt_start_time(const char *opt, const char *arg)
2795
{
2796 2797
    start_time = parse_time_or_die(opt, arg, 1);
    return 0;
2798 2799
}

2800
static int opt_rec_timestamp(const char *opt, const char *arg)
2801
{
2802 2803
    rec_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
    return 0;
2804 2805
}

2806
static int opt_input_ts_offset(const char *opt, const char *arg)
2807
{
2808 2809
    input_ts_offset = parse_time_or_die(opt, arg, 1);
    return 0;
2810 2811
}

2812 2813
static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
{
M
const  
Michael Niedermayer 已提交
2814
    const char *codec_string = encoder ? "encoder" : "decoder";
2815 2816 2817 2818 2819 2820 2821 2822
    AVCodec *codec;

    if(!name)
        return CODEC_ID_NONE;
    codec = encoder ?
        avcodec_find_encoder_by_name(name) :
        avcodec_find_decoder_by_name(name);
    if(!codec) {
2823
        fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2824
        av_exit(1);
2825 2826
    }
    if(codec->type != type) {
2827
        fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2828
        av_exit(1);
2829 2830 2831 2832
    }
    return codec->id;
}

2833
static void opt_input_file(const char *filename)
F
merge  
Fabrice Bellard 已提交
2834 2835 2836
{
    AVFormatContext *ic;
    AVFormatParameters params, *ap = &params;
2837
    AVInputFormat *file_iformat = NULL;
2838
    int err, i, ret, rfps, rfps_base;
M
Michael Niedermayer 已提交
2839
    int64_t timestamp;
F
merge  
Fabrice Bellard 已提交
2840

2841 2842 2843 2844 2845
    if (last_asked_format) {
        file_iformat = av_find_input_format(last_asked_format);
        last_asked_format = NULL;
    }

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

2849
    using_stdin |= !strncmp(filename, "pipe:", 5) ||
2850
                    !strcmp(filename, "/dev/stdin");
2851

F
merge  
Fabrice Bellard 已提交
2852
    /* get default parameters from command line */
2853
    ic = avformat_alloc_context();
2854 2855 2856 2857
    if (!ic) {
        print_error(filename, AVERROR(ENOMEM));
        av_exit(1);
    }
2858

2859
    memset(ap, 0, sizeof(*ap));
2860
    ap->prealloced_context = 1;
2861 2862
    ap->sample_rate = audio_sample_rate;
    ap->channels = audio_channels;
2863 2864
    ap->time_base.den = frame_rate.num;
    ap->time_base.num = frame_rate.den;
2865 2866
    ap->width = frame_width + frame_padleft + frame_padright;
    ap->height = frame_height + frame_padtop + frame_padbottom;
2867
    ap->pix_fmt = frame_pix_fmt;
2868
   // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
2869 2870
    ap->channel = video_channel;
    ap->standard = video_standard;
2871 2872
    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);
2873 2874
    if(pgmyuv_compatibility_hack)
        ap->video_codec_id= CODEC_ID_PGMYUV;
2875

2876
    set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
M
Michael Niedermayer 已提交
2877 2878 2879 2880

    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);
2881
    ic->flags |= AVFMT_FLAG_NONBLOCK;
M
Michael Niedermayer 已提交
2882

2883 2884
    /* open the input file with generic libav function */
    err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
F
merge  
Fabrice Bellard 已提交
2885
    if (err < 0) {
2886
        print_error(filename, err);
2887
        av_exit(1);
F
merge  
Fabrice Bellard 已提交
2888
    }
2889 2890 2891 2892 2893 2894
    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;
    }
2895

2896 2897
    ic->loop_input = loop_input;

2898 2899 2900
    /* 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);
2901
    if (ret < 0 && verbose >= 0) {
F
merge  
Fabrice Bellard 已提交
2902
        fprintf(stderr, "%s: could not find codec parameters\n", filename);
2903
        av_exit(1);
F
merge  
Fabrice Bellard 已提交
2904 2905
    }

M
Michael Niedermayer 已提交
2906 2907 2908 2909 2910
    timestamp = start_time;
    /* add the stream start time */
    if (ic->start_time != AV_NOPTS_VALUE)
        timestamp += ic->start_time;

2911 2912
    /* if seeking requested, we execute it */
    if (start_time != 0) {
2913
        ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2914
        if (ret < 0) {
2915
            fprintf(stderr, "%s: could not seek to position %0.3f\n",
2916 2917 2918 2919 2920 2921
                    filename, (double)timestamp / AV_TIME_BASE);
        }
        /* reset seek info */
        start_time = 0;
    }

F
merge  
Fabrice Bellard 已提交
2922 2923
    /* update the current parameters so that they match the one of the input stream */
    for(i=0;i<ic->nb_streams;i++) {
2924 2925
        AVStream *st = ic->streams[i];
        AVCodecContext *enc = st->codec;
2926 2927 2928
        if(thread_count>1)
            avcodec_thread_init(enc, thread_count);
        enc->thread_count= thread_count;
F
merge  
Fabrice Bellard 已提交
2929 2930
        switch(enc->codec_type) {
        case CODEC_TYPE_AUDIO:
2931
            set_context_opts(enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
2932
            //fprintf(stderr, "\nInput Audio channels: %d", enc->channels);
2933
            channel_layout = enc->channel_layout;
F
merge  
Fabrice Bellard 已提交
2934 2935
            audio_channels = enc->channels;
            audio_sample_rate = enc->sample_rate;
2936
            audio_sample_fmt = enc->sample_fmt;
A
Aurelien Jacobs 已提交
2937
            input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(audio_codec_name);
2938
            if(audio_disable)
2939
                st->discard= AVDISCARD_ALL;
F
merge  
Fabrice Bellard 已提交
2940 2941
            break;
        case CODEC_TYPE_VIDEO:
2942
            set_context_opts(enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM);
F
merge  
Fabrice Bellard 已提交
2943 2944
            frame_height = enc->height;
            frame_width = enc->width;
2945 2946 2947 2948 2949
            if(ic->streams[i]->sample_aspect_ratio.num)
                frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
            else
                frame_aspect_ratio=av_q2d(enc->sample_aspect_ratio);
            frame_aspect_ratio *= (float) enc->width / enc->height;
2950
            frame_pix_fmt = enc->pix_fmt;
2951 2952
            rfps      = ic->streams[i]->r_frame_rate.num;
            rfps_base = ic->streams[i]->r_frame_rate.den;
2953 2954 2955 2956 2957
            if(enc->lowres) {
                enc->flags |= CODEC_FLAG_EMU_EDGE;
                frame_height >>= enc->lowres;
                frame_width  >>= enc->lowres;
            }
2958 2959
            if(me_threshold)
                enc->debug |= FF_DEBUG_MV;
2960

2961
            if (enc->time_base.den != rfps || enc->time_base.num != rfps_base) {
2962 2963

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

2967
                    (float)rfps / rfps_base, rfps, rfps_base);
2968
            }
2969
            /* update the current frame rate to match the stream frame rate */
2970 2971
            frame_rate.num = rfps;
            frame_rate.den = rfps_base;
2972

A
Aurelien Jacobs 已提交
2973
            input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(video_codec_name);
2974
            if(video_disable)
2975
                st->discard= AVDISCARD_ALL;
2976
            else if(video_discard)
2977
                st->discard= video_discard;
F
merge  
Fabrice Bellard 已提交
2978
            break;
2979 2980
        case CODEC_TYPE_DATA:
            break;
2981
        case CODEC_TYPE_SUBTITLE:
A
Aurelien Jacobs 已提交
2982
            input_codecs[nb_icodecs++] = avcodec_find_decoder_by_name(subtitle_codec_name);
2983
            if(subtitle_disable)
2984
                st->discard = AVDISCARD_ALL;
2985
            break;
2986
        case CODEC_TYPE_ATTACHMENT:
2987
        case CODEC_TYPE_UNKNOWN:
A
Aurelien Jacobs 已提交
2988
            nb_icodecs++;
2989
            break;
2990
        default:
2991
            abort();
F
merge  
Fabrice Bellard 已提交
2992 2993
        }
    }
2994

F
merge  
Fabrice Bellard 已提交
2995
    input_files[nb_input_files] = ic;
M
Michael Niedermayer 已提交
2996
    input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
F
merge  
Fabrice Bellard 已提交
2997
    /* dump the file content */
2998 2999 3000
    if (verbose >= 0)
        dump_format(ic, nb_input_files, filename, 0);

F
merge  
Fabrice Bellard 已提交
3001
    nb_input_files++;
3002

3003
    video_channel = 0;
3004

3005 3006 3007
    av_freep(&video_codec_name);
    av_freep(&audio_codec_name);
    av_freep(&subtitle_codec_name);
F
merge  
Fabrice Bellard 已提交
3008 3009
}

3010 3011
static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
                                         int *has_subtitle_ptr)
3012
{
3013
    int has_video, has_audio, has_subtitle, i, j;
3014 3015 3016 3017
    AVFormatContext *ic;

    has_video = 0;
    has_audio = 0;
3018
    has_subtitle = 0;
3019 3020 3021
    for(j=0;j<nb_input_files;j++) {
        ic = input_files[j];
        for(i=0;i<ic->nb_streams;i++) {
3022
            AVCodecContext *enc = ic->streams[i]->codec;
3023 3024 3025 3026 3027 3028 3029
            switch(enc->codec_type) {
            case CODEC_TYPE_AUDIO:
                has_audio = 1;
                break;
            case CODEC_TYPE_VIDEO:
                has_video = 1;
                break;
3030 3031 3032
            case CODEC_TYPE_SUBTITLE:
                has_subtitle = 1;
                break;
3033
            case CODEC_TYPE_DATA:
3034
            case CODEC_TYPE_ATTACHMENT:
3035
            case CODEC_TYPE_UNKNOWN:
3036
                break;
3037
            default:
3038
                abort();
3039 3040 3041 3042 3043
            }
        }
    }
    *has_video_ptr = has_video;
    *has_audio_ptr = has_audio;
3044
    *has_subtitle_ptr = has_subtitle;
3045 3046
}

3047
static void new_video_stream(AVFormatContext *oc)
F
merge  
Fabrice Bellard 已提交
3048 3049
{
    AVStream *st;
3050
    AVCodecContext *video_enc;
3051
    enum CodecID codec_id;
3052

3053 3054 3055
    st = av_new_stream(oc, oc->nb_streams);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
3056
        av_exit(1);
3057
    }
3058
    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_VIDEO);
3059 3060 3061
    bitstream_filters[nb_output_files][oc->nb_streams - 1]= video_bitstream_filters;
    video_bitstream_filters= NULL;

3062
    if(thread_count>1)
3063
        avcodec_thread_init(st->codec, thread_count);
3064

3065
    video_enc = st->codec;
3066

3067 3068
    if(video_codec_tag)
        video_enc->codec_tag= video_codec_tag;
3069

3070
    if(   (video_global_header&1)
3071
       || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3072
        video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3073
        avcodec_opts[CODEC_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3074 3075
    }
    if(video_global_header&2){
3076
        video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3077
        avcodec_opts[CODEC_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3078
    }
3079

3080 3081 3082
    if (video_stream_copy) {
        st->stream_copy = 1;
        video_enc->codec_type = CODEC_TYPE_VIDEO;
3083
        video_enc->sample_aspect_ratio =
3084
        st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3085
    } else {
3086
        const char *p;
3087 3088
        int i;
        AVCodec *codec;
3089
        AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3090

A
Aurelien Jacobs 已提交
3091
        if (video_codec_name) {
3092
            codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1);
A
Aurelien Jacobs 已提交
3093 3094 3095 3096 3097 3098
            codec = avcodec_find_encoder_by_name(video_codec_name);
            output_codecs[nb_ocodecs] = codec;
        } else {
            codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO);
            codec = avcodec_find_encoder(codec_id);
        }
3099

3100
        video_enc->codec_id = codec_id;
3101

3102
        set_context_opts(video_enc, avcodec_opts[CODEC_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3103

3104 3105
        if (codec && codec->supported_framerates && !force_fps)
            fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3106 3107
        video_enc->time_base.den = fps.num;
        video_enc->time_base.num = fps.den;
3108

3109 3110
        video_enc->width = frame_width + frame_padright + frame_padleft;
        video_enc->height = frame_height + frame_padtop + frame_padbottom;
L
Luca Abeni 已提交
3111
        video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3112
        video_enc->pix_fmt = frame_pix_fmt;
3113
        st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124

        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];
        }

3125
        if (intra_only)
3126 3127 3128
            video_enc->gop_size = 0;
        if (video_qscale || same_quality) {
            video_enc->flags |= CODEC_FLAG_QSCALE;
3129
            video_enc->global_quality=
3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144
                st->quality = FF_QP2LAMBDA * video_qscale;
        }

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

        video_enc->thread_count = thread_count;
        p= video_rc_override_string;
        for(i=0; p; i++){
            int start, end, q;
            int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
            if(e!=3){
                fprintf(stderr, "error parsing rc_override\n");
3145
                av_exit(1);
3146
            }
3147 3148
            video_enc->rc_override=
                av_realloc(video_enc->rc_override,
3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163
                           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;
3164 3165
        if (!video_enc->rc_initial_buffer_occupancy)
            video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3166 3167 3168 3169 3170
        video_enc->me_threshold= me_threshold;
        video_enc->intra_dc_precision= intra_dc_precision - 8;

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

3172 3173 3174 3175 3176 3177 3178 3179 3180
        /* two pass mode */
        if (do_pass) {
            if (do_pass == 1) {
                video_enc->flags |= CODEC_FLAG_PASS1;
            } else {
                video_enc->flags |= CODEC_FLAG_PASS2;
            }
        }
    }
A
Aurelien Jacobs 已提交
3181
    nb_ocodecs++;
3182 3183 3184

    /* reset some key parameters */
    video_disable = 0;
3185
    av_freep(&video_codec_name);
3186 3187 3188 3189 3190 3191 3192
    video_stream_copy = 0;
}

static void new_audio_stream(AVFormatContext *oc)
{
    AVStream *st;
    AVCodecContext *audio_enc;
3193
    enum CodecID codec_id;
3194

3195 3196 3197
    st = av_new_stream(oc, oc->nb_streams);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
3198
        av_exit(1);
3199
    }
3200
    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_AUDIO);
3201 3202 3203 3204

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

3205
    if(thread_count>1)
3206
        avcodec_thread_init(st->codec, thread_count);
3207

3208
    audio_enc = st->codec;
3209
    audio_enc->codec_type = CODEC_TYPE_AUDIO;
3210

3211 3212
    if(audio_codec_tag)
        audio_enc->codec_tag= audio_codec_tag;
3213

3214
    if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3215
        audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3216
        avcodec_opts[CODEC_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3217
    }
3218 3219 3220 3221
    if (audio_stream_copy) {
        st->stream_copy = 1;
        audio_enc->channels = audio_channels;
    } else {
3222
        AVCodec *codec;
3223

3224
        set_context_opts(audio_enc, avcodec_opts[CODEC_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3225

A
Aurelien Jacobs 已提交
3226
        if (audio_codec_name) {
3227
            codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);
A
Aurelien Jacobs 已提交
3228 3229 3230 3231 3232 3233
            codec = avcodec_find_encoder_by_name(audio_codec_name);
            output_codecs[nb_ocodecs] = codec;
        } else {
            codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_AUDIO);
            codec = avcodec_find_encoder(codec_id);
        }
3234
        audio_enc->codec_id = codec_id;
3235

3236 3237 3238 3239
        if (audio_qscale > QSCALE_NONE) {
            audio_enc->flags |= CODEC_FLAG_QSCALE;
            audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
        }
3240
        audio_enc->thread_count = thread_count;
3241
        audio_enc->channels = audio_channels;
3242
        audio_enc->sample_fmt = audio_sample_fmt;
3243
        audio_enc->channel_layout = channel_layout;
3244 3245
        if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
            audio_enc->channel_layout = 0;
3246 3247 3248 3249 3250 3251 3252 3253 3254 3255

        if(codec && codec->sample_fmts){
            const enum SampleFormat *p= codec->sample_fmts;
            for(; *p!=-1; p++){
                if(*p == audio_enc->sample_fmt)
                    break;
            }
            if(*p == -1)
                audio_enc->sample_fmt = codec->sample_fmts[0];
        }
3256
    }
A
Aurelien Jacobs 已提交
3257
    nb_ocodecs++;
3258
    audio_enc->sample_rate = audio_sample_rate;
3259
    audio_enc->time_base= (AVRational){1, audio_sample_rate};
3260
    if (audio_language) {
3261
        av_metadata_set(&st->metadata, "language", audio_language);
3262
        av_freep(&audio_language);
3263 3264 3265 3266
    }

    /* reset some key parameters */
    audio_disable = 0;
3267
    av_freep(&audio_codec_name);
3268 3269 3270
    audio_stream_copy = 0;
}

3271
static void new_subtitle_stream(AVFormatContext *oc)
3272 3273 3274
{
    AVStream *st;
    AVCodecContext *subtitle_enc;
3275

3276 3277 3278
    st = av_new_stream(oc, oc->nb_streams);
    if (!st) {
        fprintf(stderr, "Could not alloc stream\n");
3279
        av_exit(1);
3280
    }
3281
    avcodec_get_context_defaults2(st->codec, CODEC_TYPE_SUBTITLE);
3282

3283 3284 3285
    bitstream_filters[nb_output_files][oc->nb_streams - 1]= subtitle_bitstream_filters;
    subtitle_bitstream_filters= NULL;

3286
    subtitle_enc = st->codec;
3287
    subtitle_enc->codec_type = CODEC_TYPE_SUBTITLE;
3288 3289 3290 3291

    if(subtitle_codec_tag)
        subtitle_enc->codec_tag= subtitle_codec_tag;

3292 3293 3294
    if (subtitle_stream_copy) {
        st->stream_copy = 1;
    } else {
3295
        set_context_opts(avcodec_opts[CODEC_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
3296
        subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1);
A
Aurelien Jacobs 已提交
3297
        output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
3298
    }
A
Aurelien Jacobs 已提交
3299
    nb_ocodecs++;
3300 3301

    if (subtitle_language) {
3302
        av_metadata_set(&st->metadata, "language", subtitle_language);
3303
        av_freep(&subtitle_language);
3304 3305
    }

3306
    subtitle_disable = 0;
3307
    av_freep(&subtitle_codec_name);
3308 3309 3310 3311 3312 3313 3314 3315
    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");
3316
        av_exit(1);
3317 3318 3319 3320 3321 3322 3323 3324 3325 3326
    }
    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");
3327
        av_exit(1);
3328 3329 3330 3331 3332
    }
    oc = output_files[nb_output_files - 1];
    new_video_stream(oc);
}

3333 3334 3335 3336 3337
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");
3338
        av_exit(1);
3339 3340 3341 3342 3343
    }
    oc = output_files[nb_output_files - 1];
    new_subtitle_stream(oc);
}

3344 3345 3346
static void opt_output_file(const char *filename)
{
    AVFormatContext *oc;
3347
    int use_video, use_audio, use_subtitle;
3348
    int input_has_video, input_has_audio, input_has_subtitle;
3349
    AVFormatParameters params, *ap = &params;
3350
    AVOutputFormat *file_oformat;
F
merge  
Fabrice Bellard 已提交
3351 3352 3353 3354

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

3355
    oc = avformat_alloc_context();
3356 3357 3358 3359
    if (!oc) {
        print_error(filename, AVERROR(ENOMEM));
        av_exit(1);
    }
F
merge  
Fabrice Bellard 已提交
3360

3361 3362 3363 3364 3365 3366 3367 3368
    if (last_asked_format) {
        file_oformat = guess_format(last_asked_format, NULL, NULL);
        if (!file_oformat) {
            fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
            av_exit(1);
        }
        last_asked_format = NULL;
    } else {
3369 3370
        file_oformat = guess_format(NULL, filename, NULL);
        if (!file_oformat) {
3371
            fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3372
                    filename);
3373
            av_exit(1);
3374
        }
F
merge  
Fabrice Bellard 已提交
3375
    }
3376

3377
    oc->oformat = file_oformat;
3378
    av_strlcpy(oc->filename, filename, sizeof(oc->filename));
F
merge  
Fabrice Bellard 已提交
3379

3380
    if (!strcmp(file_oformat->name, "ffm") &&
3381
        av_strstart(filename, "http:", NULL)) {
F
merge  
Fabrice Bellard 已提交
3382 3383
        /* special case for files sent to ffserver: we get the stream
           parameters from ffserver */
3384 3385 3386
        int err = read_ffserver_streams(oc, filename);
        if (err < 0) {
            print_error(filename, err);
3387
            av_exit(1);
F
merge  
Fabrice Bellard 已提交
3388 3389
        }
    } else {
3390 3391 3392
        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;
3393

3394 3395 3396
        /* disable if no corresponding type found and at least one
           input file */
        if (nb_input_files > 0) {
3397 3398
            check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
                                         &input_has_subtitle);
3399 3400 3401 3402
            if (!input_has_video)
                use_video = 0;
            if (!input_has_audio)
                use_audio = 0;
3403 3404
            if (!input_has_subtitle)
                use_subtitle = 0;
3405
        }
3406 3407

        /* manual disable */
F
merge  
Fabrice Bellard 已提交
3408 3409 3410 3411 3412 3413
        if (audio_disable) {
            use_audio = 0;
        }
        if (video_disable) {
            use_video = 0;
        }
3414 3415 3416
        if (subtitle_disable) {
            use_subtitle = 0;
        }
3417

F
merge  
Fabrice Bellard 已提交
3418
        if (use_video) {
3419
            new_video_stream(oc);
F
merge  
Fabrice Bellard 已提交
3420
        }
3421

F
merge  
Fabrice Bellard 已提交
3422
        if (use_audio) {
3423
            new_audio_stream(oc);
F
merge  
Fabrice Bellard 已提交
3424 3425
        }

3426 3427 3428 3429
        if (use_subtitle) {
            new_subtitle_stream(oc);
        }

3430
        oc->timestamp = rec_timestamp;
3431

3432 3433 3434 3435 3436
        for(; metadata_count>0; metadata_count--){
            av_metadata_set(&oc->metadata, metadata[metadata_count-1].key,
                                           metadata[metadata_count-1].value);
        }
        av_metadata_conv(oc, oc->oformat->metadata_conv, NULL);
F
merge  
Fabrice Bellard 已提交
3437 3438
    }

3439
    output_files[nb_output_files++] = oc;
F
merge  
Fabrice Bellard 已提交
3440

3441
    /* check filename in case of an image number is expected */
3442
    if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3443
        if (!av_filename_number_test(oc->filename)) {
3444
            print_error(oc->filename, AVERROR_NUMEXPECTED);
3445
            av_exit(1);
3446
        }
3447 3448
    }

3449
    if (!(oc->oformat->flags & AVFMT_NOFILE)) {
F
merge  
Fabrice Bellard 已提交
3450
        /* test if it already exists to avoid loosing precious files */
3451
        if (!file_overwrite &&
F
merge  
Fabrice Bellard 已提交
3452
            (strchr(filename, ':') == NULL ||
3453
             filename[1] == ':' ||
3454
             av_strstart(filename, "file:", NULL))) {
F
merge  
Fabrice Bellard 已提交
3455
            if (url_exist(filename)) {
3456
                if (!using_stdin) {
3457 3458
                    fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                    fflush(stderr);
3459
                    if (!read_yesno()) {
3460
                        fprintf(stderr, "Not overwriting - exiting\n");
3461
                        av_exit(1);
3462
                    }
3463 3464
                }
                else {
3465
                    fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3466
                    av_exit(1);
3467
                }
F
merge  
Fabrice Bellard 已提交
3468 3469
            }
        }
3470

F
merge  
Fabrice Bellard 已提交
3471 3472 3473
        /* open the file */
        if (url_fopen(&oc->pb, filename, URL_WRONLY) < 0) {
            fprintf(stderr, "Could not open '%s'\n", filename);
3474
            av_exit(1);
F
merge  
Fabrice Bellard 已提交
3475 3476 3477
        }
    }

3478 3479 3480 3481
    memset(ap, 0, sizeof(*ap));
    if (av_set_parameters(oc, ap) < 0) {
        fprintf(stderr, "%s: Invalid encoding parameters\n",
                oc->filename);
3482
        av_exit(1);
3483 3484
    }

3485 3486
    oc->preload= (int)(mux_preload*AV_TIME_BASE);
    oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3487
    oc->loop_output = loop_output;
3488
    oc->flags |= AVFMT_FLAG_NONBLOCK;
3489

3490
    set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM);
F
merge  
Fabrice Bellard 已提交
3491 3492
}

3493
/* same option as mencoder */
3494
static void opt_pass(const char *pass_str)
3495 3496 3497 3498 3499
{
    int pass;
    pass = atoi(pass_str);
    if (pass != 1 && pass != 2) {
        fprintf(stderr, "pass number can be only 1 or 2\n");
3500
        av_exit(1);
3501 3502 3503
    }
    do_pass = pass;
}
3504

3505
static int64_t getutime(void)
F
Fabrice Bellard 已提交
3506
{
3507
#if HAVE_GETRUSAGE
3508 3509 3510 3511
    struct rusage rusage;

    getrusage(RUSAGE_SELF, &rusage);
    return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3512
#elif HAVE_GETPROCESSTIMES
3513 3514 3515 3516 3517 3518
    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
R
Indent  
Ramiro Polla 已提交
3519
    return av_gettime();
R
Ramiro Polla 已提交
3520
#endif
F
Fabrice Bellard 已提交
3521
}
F
Fabrice Bellard 已提交
3522

D
Dieter 已提交
3523
static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3524 3525 3526 3527 3528 3529 3530 3531 3532 3533
{
    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);
3534
            av_exit(1);
3535 3536 3537 3538 3539
        }
        p++;
    }
}

D
Dieter 已提交
3540
static void opt_inter_matrix(const char *arg)
3541 3542 3543 3544 3545
{
    inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
    parse_matrix_coeffs(inter_matrix, arg);
}

D
Dieter 已提交
3546
static void opt_intra_matrix(const char *arg)
3547 3548 3549 3550 3551
{
    intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
    parse_matrix_coeffs(intra_matrix, arg);
}

3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567
/**
 * 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",
3568
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3569 3570 3571
    show_help_options(options, "\nAdvanced options:\n",
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
                      OPT_EXPERT);
3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589
    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);
3590
    printf("\n");
3591
    av_opt_show(avcodec_opts[0], NULL);
3592
    printf("\n");
3593
    av_opt_show(avformat_opts, NULL);
3594
    printf("\n");
3595 3596 3597
    av_opt_show(sws_opts, NULL);
}

3598 3599
static void opt_target(const char *arg)
{
3600
    enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3601
    static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3602 3603

    if(!strncmp(arg, "pal-", 4)) {
3604
        norm = PAL;
3605 3606
        arg += 4;
    } else if(!strncmp(arg, "ntsc-", 5)) {
3607
        norm = NTSC;
3608
        arg += 5;
3609
    } else if(!strncmp(arg, "film-", 5)) {
3610
        norm = FILM;
3611
        arg += 5;
3612 3613 3614
    } else {
        int fr;
        /* Calculate FR via float to avoid int overflow */
3615
        fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3616
        if(fr == 25000) {
3617
            norm = PAL;
3618
        } else if((fr == 29970) || (fr == 23976)) {
3619
            norm = NTSC;
3620 3621 3622 3623 3624 3625
        } 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++) {
3626
                        AVCodecContext *c = input_files[j]->streams[i]->codec;
3627 3628
                        if(c->codec_type != CODEC_TYPE_VIDEO)
                            continue;
3629
                        fr = c->time_base.den * 1000 / c->time_base.num;
3630
                        if(fr == 25000) {
3631
                            norm = PAL;
3632 3633
                            break;
                        } else if((fr == 29970) || (fr == 23976)) {
3634
                            norm = NTSC;
3635 3636 3637
                            break;
                        }
                    }
3638
                    if(norm != UNKNOWN)
3639 3640 3641 3642
                        break;
                }
            }
        }
3643 3644
        if(verbose && norm != UNKNOWN)
            fprintf(stderr, "Assuming %s for target.\n", norm != PAL ? "NTSC" : "PAL");
3645 3646
    }

3647
    if(norm == UNKNOWN) {
3648 3649
        fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
        fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3650
        fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3651
        av_exit(1);
3652 3653 3654 3655 3656 3657 3658 3659
    }

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

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

3660
        opt_frame_size(norm != PAL ? "352x240" : "352x288");
3661
        opt_frame_rate(NULL, frame_rates[norm]);
3662
        opt_default("g", norm != PAL ? "18" : "15");
3663

3664
        opt_default("b", "1150000");
3665 3666
        opt_default("maxrate", "1150000");
        opt_default("minrate", "1150000");
3667
        opt_default("bufsize", "327680"); // 40*1024*8;
3668

3669
        opt_default("ab", "224000");
3670
        audio_sample_rate = 44100;
M
Michel Bardiaux 已提交
3671
        audio_channels = 2;
3672

3673
        opt_default("packetsize", "2324");
3674
        opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3675

3676 3677 3678 3679 3680 3681
        /* 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
3682 3683 3684 3685
    } else if(!strcmp(arg, "svcd")) {

        opt_video_codec("mpeg2video");
        opt_audio_codec("mp2");
3686
        opt_format("svcd");
3687

3688
        opt_frame_size(norm != PAL ? "480x480" : "480x576");
3689
        opt_frame_rate(NULL, frame_rates[norm]);
3690
        opt_default("g", norm != PAL ? "18" : "15");
3691

3692
        opt_default("b", "2040000");
3693 3694
        opt_default("maxrate", "2516000");
        opt_default("minrate", "0"); //1145000;
3695
        opt_default("bufsize", "1835008"); //224*1024*8;
3696
        opt_default("flags", "+scan_offset");
3697

3698

3699
        opt_default("ab", "224000");
3700 3701
        audio_sample_rate = 44100;

3702
        opt_default("packetsize", "2324");
3703

3704 3705 3706 3707
    } else if(!strcmp(arg, "dvd")) {

        opt_video_codec("mpeg2video");
        opt_audio_codec("ac3");
3708
        opt_format("dvd");
3709

3710
        opt_frame_size(norm != PAL ? "720x480" : "720x576");
3711
        opt_frame_rate(NULL, frame_rates[norm]);
3712
        opt_default("g", norm != PAL ? "18" : "15");
3713

3714
        opt_default("b", "6000000");
3715 3716
        opt_default("maxrate", "9000000");
        opt_default("minrate", "0"); //1500000;
3717
        opt_default("bufsize", "1835008"); //224*1024*8;
3718

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

3722
        opt_default("ab", "448000");
3723 3724
        audio_sample_rate = 48000;

3725
    } else if(!strncmp(arg, "dv", 2)) {
3726 3727 3728

        opt_format("dv");

3729
        opt_frame_size(norm != PAL ? "720x480" : "720x576");
3730
        opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3731
                                             (norm != PAL ? "yuv411p" : "yuv420p"));
3732
        opt_frame_rate(NULL, frame_rates[norm]);
3733 3734 3735 3736

        audio_sample_rate = 48000;
        audio_channels = 2;

3737 3738
    } else {
        fprintf(stderr, "Unknown target: %s\n", arg);
3739
        av_exit(1);
3740 3741 3742
    }
}

3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759
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);
}

3760
static int opt_bsf(const char *opt, const char *arg)
3761 3762 3763 3764 3765
{
    AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
    AVBitStreamFilterContext **bsfp;

    if(!bsfc){
A
Alex Beregszaszi 已提交
3766
        fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3767
        av_exit(1);
3768 3769
    }

3770 3771 3772
    bsfp= *opt == 'v' ? &video_bitstream_filters :
          *opt == 'a' ? &audio_bitstream_filters :
                        &subtitle_bitstream_filters;
3773 3774 3775 3776
    while(*bsfp)
        bsfp= &(*bsfp)->next;

    *bsfp= bsfc;
3777 3778

    return 0;
3779 3780
}

M
Michael Niedermayer 已提交
3781 3782
static int opt_preset(const char *opt, const char *arg)
{
3783
    FILE *f=NULL;
3784
    char filename[1000], tmp[1000], tmp2[1000], line[1000];
3785
    int i;
3786 3787
    const char *base[2]= { getenv("HOME"),
                           FFMPEG_DATADIR,
3788
                         };
M
Michael Niedermayer 已提交
3789

3790
    if (*opt != 'f') {
R
Indent.  
Ramiro Polla 已提交
3791 3792
        for(i=!base[0]; i<2 && !f; i++){
            snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i ? "" : "/.ffmpeg", arg);
3793
            f= fopen(filename, "r");
R
Indent.  
Ramiro Polla 已提交
3794 3795 3796 3797 3798 3799 3800
            if(!f){
                char *codec_name= *opt == 'v' ? video_codec_name :
                                  *opt == 'a' ? audio_codec_name :
                                                subtitle_codec_name;
                snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i],  i ? "" : "/.ffmpeg", codec_name, arg);
                f= fopen(filename, "r");
            }
M
indent  
Michael Niedermayer 已提交
3801
        }
3802
    } else {
3803
        av_strlcpy(filename, arg, sizeof(filename));
3804
        f= fopen(filename, "r");
3805
    }
M
Michael Niedermayer 已提交
3806 3807

    if(!f){
3808
        fprintf(stderr, "File for preset '%s' not found\n", arg);
M
Michael Niedermayer 已提交
3809 3810 3811 3812
        av_exit(1);
    }

    while(!feof(f)){
3813 3814 3815 3816 3817
        int e= fscanf(f, "%999[^\n]\n", line) - 1;
        if(line[0] == '#' && !e)
            continue;
        e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
        if(e){
3818
            fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
M
Michael Niedermayer 已提交
3819 3820
            av_exit(1);
        }
3821 3822 3823 3824 3825 3826
        if(!strcmp(tmp, "acodec")){
            opt_audio_codec(tmp2);
        }else if(!strcmp(tmp, "vcodec")){
            opt_video_codec(tmp2);
        }else if(!strcmp(tmp, "scodec")){
            opt_subtitle_codec(tmp2);
3827
        }else if(opt_default(tmp, tmp2) < 0){
3828
            fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
3829 3830
            av_exit(1);
        }
M
Michael Niedermayer 已提交
3831 3832 3833 3834 3835 3836 3837
    }

    fclose(f);

    return 0;
}

3838
static const OptionDef options[] = {
3839
    /* main options */
3840
#include "cmdutils_common_opts.h"
F
Fabrice Bellard 已提交
3841 3842 3843
    { "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" },
3844
    { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
3845
    { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
3846
    { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3847
    { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
3848 3849
    { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
    { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
3850
    { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
3851 3852
    { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_rec_timestamp}, "set the timestamp ('now' to set the current time)", "time" },
    { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
3853
    { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[CODEC_TYPE_DATA]}, "set the number of data frames to record", "number" },
3854
    { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
F
Fabrice Bellard 已提交
3855
      "add timings for benchmarking" },
3856
    { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3857
      "dump each input packet" },
3858
    { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3859
      "when dumping packets, also dump the payload" },
F
Fabrice Bellard 已提交
3860
    { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
3861
    { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
3862
    { "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)", "" },
3863
    { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
3864
    { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3865
    { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
3866 3867
    { "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", "" },
3868
    { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3869
    { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
3870
    { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
3871
    { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3872
    { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3873
    { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
3874
    { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3875
    { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)&copy_initial_nonkeyframes}, "copy initial non-keyframes" },
3876 3877

    /* video options */
3878 3879
    { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
    { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3880
    { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
3881
    { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3882 3883
    { "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" },
3884
    { "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" },
3885 3886 3887 3888
    { "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" },
3889 3890 3891 3892 3893
    { "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" },
3894 3895
    { "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
Måns Rullgård 已提交
3896
    { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
D
Diego Biurrun 已提交
3897
    { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
F
Fabrice Bellard 已提交
3898
    { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
3899
    { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3900
    { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold",  "threshold" },
3901
    { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
3902 3903
      "use same video quality as source (implies VBR)" },
    { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
S
Stefano Sabatini 已提交
3904
    { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3905
    { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3906 3907
      "deinterlace pictures" },
    { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
3908 3909
    { "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" },
3910 3911
    { "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" },
M
Michael Niedermayer 已提交
3912
    { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
3913
    { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
M
Michael Niedermayer 已提交
3914
    { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3915
    { "newvideo", OPT_VIDEO, {(void*)opt_new_video_stream}, "add a new video stream to the current output stream" },
3916
    { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3917
    { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
3918 3919

    /* audio options */
3920
    { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
3921
    { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[CODEC_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
3922
    { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
3923 3924
    { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
    { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
3925 3926
    { "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" },
M
Michael Niedermayer 已提交
3927
    { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3928
    { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3929 3930
    { "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" },
3931
    { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
3932

3933
    /* subtitle options */
3934
    { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
3935 3936 3937
    { "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" },
3938
    { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
3939

3940 3941 3942
    /* 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" },
3943
    { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
3944 3945

    /* muxer options */
3946 3947
    { "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" },
3948

3949 3950 3951
    { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
    { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
    { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
3952

3953 3954 3955
    { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
    { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
    { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
3956
    { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
M
Michael Niedermayer 已提交
3957

M
Michael Niedermayer 已提交
3958
    { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
F
merge  
Fabrice Bellard 已提交
3959 3960 3961
    { NULL, },
};

R
Ramiro Polla 已提交
3962 3963 3964 3965 3966
int main(int argc, char **argv)
{
    int i;
    int64_t ti;

L
Luca Abeni 已提交
3967 3968
    avcodec_register_all();
    avdevice_register_all();
R
Ramiro Polla 已提交
3969 3970
    av_register_all();

M
Martin Storsjö 已提交
3971
#if HAVE_ISATTY
3972 3973
    if(isatty(STDIN_FILENO))
        url_set_interrupt_cb(decode_interrupt_cb);
M
Martin Storsjö 已提交
3974
#endif
3975

R
Ramiro Polla 已提交
3976
    for(i=0; i<CODEC_TYPE_NB; i++){
3977
        avcodec_opts[i]= avcodec_alloc_context2(i);
R
Ramiro Polla 已提交
3978
    }
3979
    avformat_opts = avformat_alloc_context();
R
Ramiro Polla 已提交
3980 3981
    sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL);

3982
    show_banner();
R
Ramiro Polla 已提交
3983 3984 3985 3986

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

3987 3988 3989
    if(nb_output_files <= 0 && nb_input_files == 0)
        show_help();

R
Ramiro Polla 已提交
3990 3991
    /* file converter / grab */
    if (nb_output_files <= 0) {
3992
        fprintf(stderr, "At least one output file must be specified\n");
3993
        av_exit(1);
R
Ramiro Polla 已提交
3994 3995 3996
    }

    if (nb_input_files == 0) {
3997
        fprintf(stderr, "At least one input file must be specified\n");
3998
        av_exit(1);
R
Ramiro Polla 已提交
3999 4000 4001
    }

    ti = getutime();
4002 4003 4004
    if (av_encode(output_files, nb_output_files, input_files, nb_input_files,
                  stream_maps, nb_stream_maps) < 0)
        av_exit(1);
R
Ramiro Polla 已提交
4005 4006 4007 4008 4009
    ti = getutime() - ti;
    if (do_benchmark) {
        printf("bench: utime=%0.3fs\n", ti / 1000000.0);
    }

4010
    return av_exit(0);
R
Ramiro Polla 已提交
4011
}