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

21 22 23 24 25
/**
 * @file
 * multimedia converter based on the FFmpeg libraries
 */

26 27 28 29 30 31
#include "config.h"
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <errno.h>
32
#include <signal.h>
33
#include <limits.h>
34
#include <unistd.h>
35 36 37
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
#include "libswscale/swscale.h"
38
#include "libavutil/opt.h"
39
#include "libavcodec/audioconvert.h"
40 41 42
#include "libavutil/audioconvert.h"
#include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h"
43
#include "libavutil/colorspace.h"
44
#include "libavutil/fifo.h"
45
#include "libavutil/intreadwrite.h"
46
#include "libavutil/dict.h"
47
#include "libavutil/mathematics.h"
48
#include "libavutil/pixdesc.h"
49
#include "libavutil/avstring.h"
50
#include "libavutil/libm.h"
51
#include "libavutil/imgutils.h"
52
#include "libavformat/os_support.h"
Michael Niedermayer's avatar
Michael Niedermayer committed
53
#include "libswresample/swresample.h"
54

55 56
#include "libavformat/ffm.h" // not public API

57
#if CONFIG_AVFILTER
58
# include "libavfilter/avcodec.h"
59 60
# include "libavfilter/avfilter.h"
# include "libavfilter/avfiltergraph.h"
61
# include "libavfilter/buffersink.h"
62
# include "libavfilter/buffersrc.h"
63 64 65
# include "libavfilter/vsrc_buffer.h"
#endif

66
#if HAVE_SYS_RESOURCE_H
67
#include <sys/types.h>
68
#include <sys/time.h>
69
#include <sys/resource.h>
70
#elif HAVE_GETPROCESSTIMES
71 72
#include <windows.h>
#endif
73 74 75 76
#if HAVE_GETPROCESSMEMORYINFO
#include <windows.h>
#include <psapi.h>
#endif
77

78
#if HAVE_SYS_SELECT_H
79 80 81
#include <sys/select.h>
#endif

82 83 84 85 86 87
#if HAVE_TERMIOS_H
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <termios.h>
#elif HAVE_KBHIT
88
#include <conio.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
89
#endif
90
#include <time.h>
Fabrice Bellard's avatar
Fabrice Bellard committed
91

Fabrice Bellard's avatar
Fabrice Bellard committed
92 93
#include "cmdutils.h"

94
#include "libavutil/avassert.h"
95

96 97 98 99 100
#define VSYNC_AUTO       -1
#define VSYNC_PASSTHROUGH 0
#define VSYNC_CFR         1
#define VSYNC_VFR         2

101
const char program_name[] = "ffmpeg";
102
const int program_birth_year = 2000;
103

Fabrice Bellard's avatar
Fabrice Bellard committed
104
/* select an input stream for an output stream */
105
typedef struct StreamMap {
106
    int disabled;           /** 1 is this mapping is disabled by a negative map */
Fabrice Bellard's avatar
Fabrice Bellard committed
107 108
    int file_index;
    int stream_index;
109 110
    int sync_file_index;
    int sync_stream_index;
111
} StreamMap;
Fabrice Bellard's avatar
Fabrice Bellard committed
112

113 114 115 116 117
typedef struct {
    int  file_idx,  stream_idx,  channel_idx; // input
    int ofile_idx, ostream_idx;               // output
} AudioChannelMap;

118 119 120
/**
 * select an input file for an output file
 */
121
typedef struct MetadataMap {
122 123 124
    int  file;      ///< file index
    char type;      ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
    int  index;     ///< stream/chapter/program number
125
} MetadataMap;
126

127
static const OptionDef options[];
Fabrice Bellard's avatar
Fabrice Bellard committed
128

129
#define MAX_STREAMS 1024    /* arbitrary sanity check value */
130

131
static int frame_bits_per_raw_sample = 0;
132
static int video_discard = 0;
133
static int same_quant = 0;
134
static int do_deinterlace = 0;
Michael Niedermayer's avatar
Michael Niedermayer committed
135
static int intra_dc_precision = 8;
136
static int loop_input = 0;
137
static int loop_output = AVFMT_NOOUTPUTLOOP;
138
static int qp_hist = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
139
static int intra_only = 0;
140 141 142
static const char *video_codec_name    = NULL;
static const char *audio_codec_name    = NULL;
static const char *subtitle_codec_name = NULL;
Fabrice Bellard's avatar
Fabrice Bellard committed
143 144

static int file_overwrite = 0;
145
static int no_file_overwrite = 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
146
static int do_benchmark = 0;
147
static int do_hex_dump = 0;
148
static int do_pkt_dump = 0;
149
static int do_psnr = 0;
150
static int do_pass = 0;
151
static const char *pass_logfilename_prefix;
152
static int video_sync_method = VSYNC_AUTO;
153 154 155 156
static int audio_sync_method = 0;
static float audio_drift_threshold = 0.1;
static int copy_ts = 0;
static int copy_tb = -1;
157
static int opt_shortest = 0;
158
static char *vstats_filename;
159
static FILE *vstats_file;
160

161
static int audio_volume = 256;
162

163
static int exit_on_error = 0;
164
static int using_stdin = 0;
165
static int run_as_daemon  = 0;
166
static volatile int received_nb_signals = 0;
167 168 169
static int64_t video_size = 0;
static int64_t audio_size = 0;
static int64_t extra_size = 0;
170 171
static int nb_frames_dup = 0;
static int nb_frames_drop = 0;
172
static int input_sync;
173

174
static float dts_delta_threshold = 10;
175

176
static int print_stats = 1;
177

178 179
static uint8_t *audio_buf;
static uint8_t *audio_out;
180
static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
181

182 183
static uint8_t *input_tmp= NULL;

Stefano Sabatini's avatar
Stefano Sabatini committed
184
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
Fabrice Bellard's avatar
Fabrice Bellard committed
185

186 187 188 189 190 191 192 193 194 195 196 197 198
typedef struct FrameBuffer {
    uint8_t *base[4];
    uint8_t *data[4];
    int  linesize[4];

    int h, w;
    enum PixelFormat pix_fmt;

    int refcount;
    struct InputStream *ist;
    struct FrameBuffer *next;
} FrameBuffer;

199 200 201 202 203 204
typedef struct InputStream {
    int file_index;
    AVStream *st;
    int discard;             /* true if stream data should be discarded */
    int decoding_needed;     /* true if the packets must be decoded in 'raw_fifo' */
    AVCodec *dec;
205 206
    AVFrame *decoded_frame;
    AVFrame *filtered_frame;
207 208 209 210 211 212 213 214 215

    int64_t       start;     /* time when read started */
    int64_t       next_pts;  /* synthetic pts for cases where pkt.pts
                                is not defined */
    int64_t       pts;       /* current pts */
    double ts_scale;
    int is_start;            /* is 1 at the start and after a discontinuity */
    int showed_multi_packet_warning;
    AVDictionary *opts;
216 217 218

    /* a pool of free buffers for decoded data */
    FrameBuffer *buffer_pool;
219
    int dr1;
220 221 222 223 224
} InputStream;

typedef struct InputFile {
    AVFormatContext *ctx;
    int eof_reached;      /* true if eof reached */
225
    int ist_index;        /* index of first stream in input_streams */
226 227
    int buffer_size;      /* current total buffer size */
    int64_t ts_offset;
228
    int nb_streams;       /* number of stream that ffmpeg is aware of; may be different
229
                             from ctx.nb_streams if new streams appear during av_read_frame() */
230
    int rate_emu;
231
} InputFile;
232

233
typedef struct OutputStream {
Fabrice Bellard's avatar
Fabrice Bellard committed
234 235
    int file_index;          /* file index */
    int index;               /* stream index in the output file */
236
    int source_index;        /* InputStream index */
Fabrice Bellard's avatar
Fabrice Bellard committed
237
    AVStream *st;            /* stream in the output file */
238 239 240 241
    int encoding_needed;     /* true if encoding needed for this stream */
    int frame_number;
    /* input pts and corresponding output pts
       for A/V sync */
242
    // double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
243
    struct InputStream *sync_ist; /* input stream to sync against */
244
    int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
245
    AVBitStreamFilterContext *bitstream_filters;
246
    AVCodec *enc;
247
    int64_t max_frames;
248

Fabrice Bellard's avatar
Fabrice Bellard committed
249
    /* video only */
250
    int video_resample;
251
    AVFrame resample_frame;              /* temporary frame for image resampling */
252 253
    struct SwsContext *img_resample_ctx; /* for image resampling */
    int resample_height;
254
    int resample_width;
255
    int resample_pix_fmt;
256
    AVRational frame_rate;
257 258
    int force_fps;
    int top_field_first;
259

260
    float frame_aspect_ratio;
261

262 263 264 265 266
    /* forced key frames */
    int64_t *forced_kf_pts;
    int forced_kf_count;
    int forced_kf_index;

Fabrice Bellard's avatar
Fabrice Bellard committed
267 268
    /* audio only */
    int audio_resample;
269 270
    int audio_channels_map[SWR_CH_MAX];  ///< list of the channels id to pick from the source stream
    int audio_channels_mapped;           ///< number of channels in audio_channels_map
271 272 273
    int resample_sample_fmt;
    int resample_channels;
    int resample_sample_rate;
274
    float rematrix_volume;
275
    AVFifoBuffer *fifo;     /* for compression: one audio fifo per codec */
276
    FILE *logfile;
277

Michael Niedermayer's avatar
Michael Niedermayer committed
278 279
    struct SwrContext *swr;

280 281 282 283 284 285 286
#if CONFIG_AVFILTER
    AVFilterContext *output_video_filter;
    AVFilterContext *input_video_filter;
    AVFilterBufferRef *picref;
    char *avfilter;
    AVFilterGraph *graph;
#endif
287

288 289 290 291 292 293
    int64_t sws_flags;
    AVDictionary *opts;
    int is_past_recording_time;
    int stream_copy;
    const char *attachment_filename;
    int copy_initial_nonkeyframes;
294
} OutputStream;
Fabrice Bellard's avatar
Fabrice Bellard committed
295 296


297 298 299 300 301 302
#if HAVE_TERMIOS_H

/* init terminal so that we can grab keys */
static struct termios oldtty;
#endif

303 304 305
typedef struct OutputFile {
    AVFormatContext *ctx;
    AVDictionary *opts;
306
    int ost_index;       /* index of the first stream in output_streams */
307
    int64_t recording_time; /* desired length of the resulting file in microseconds */
308
    int64_t start_time;     /* start time in microseconds */
309
    uint64_t limit_filesize;
310 311
} OutputFile;

312
static InputStream *input_streams   = NULL;
313
static int         nb_input_streams = 0;
314
static InputFile   *input_files     = NULL;
315 316
static int         nb_input_files   = 0;

317 318
static OutputStream *output_streams = NULL;
static int        nb_output_streams = 0;
319 320 321
static OutputFile   *output_files   = NULL;
static int        nb_output_files   = 0;

322 323 324 325 326
typedef struct OptionsContext {
    /* input/output options */
    int64_t start_time;
    const char *format;

327 328
    SpecifierOpt *codec_names;
    int        nb_codec_names;
329 330
    SpecifierOpt *audio_channels;
    int        nb_audio_channels;
331 332
    SpecifierOpt *audio_sample_rate;
    int        nb_audio_sample_rate;
333 334
    SpecifierOpt *rematrix_volume;
    int        nb_rematrix_volume;
335 336 337 338 339 340
    SpecifierOpt *frame_rates;
    int        nb_frame_rates;
    SpecifierOpt *frame_sizes;
    int        nb_frame_sizes;
    SpecifierOpt *frame_pix_fmts;
    int        nb_frame_pix_fmts;
341

342 343
    /* input options */
    int64_t input_ts_offset;
344 345 346 347
    int rate_emu;

    SpecifierOpt *ts_scale;
    int        nb_ts_scale;
348 349
    SpecifierOpt *dump_attachment;
    int        nb_dump_attachment;
350 351 352 353

    /* output options */
    StreamMap *stream_maps;
    int     nb_stream_maps;
354 355
    AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
    int           nb_audio_channel_maps; ///< number of (valid) -map_channel settings
356 357 358 359 360 361
    /* first item specifies output metadata, second is input */
    MetadataMap (*meta_data_maps)[2];
    int nb_meta_data_maps;
    int metadata_global_manual;
    int metadata_streams_manual;
    int metadata_chapters_manual;
362 363
    const char **attachments;
    int       nb_attachments;
364 365

    int chapters_input_file;
366 367 368

    int64_t recording_time;
    uint64_t limit_filesize;
369 370 371
    float mux_preload;
    float mux_max_delay;

372 373 374 375 376
    int video_disable;
    int audio_disable;
    int subtitle_disable;
    int data_disable;

377 378 379 380
    /* indexed by output file stream index */
    int   *streamid_map;
    int nb_streamid_map;

381 382 383 384 385 386
    SpecifierOpt *metadata;
    int        nb_metadata;
    SpecifierOpt *max_frames;
    int        nb_max_frames;
    SpecifierOpt *bitstream_filters;
    int        nb_bitstream_filters;
387 388
    SpecifierOpt *codec_tags;
    int        nb_codec_tags;
389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
    SpecifierOpt *sample_fmts;
    int        nb_sample_fmts;
    SpecifierOpt *qscale;
    int        nb_qscale;
    SpecifierOpt *forced_key_frames;
    int        nb_forced_key_frames;
    SpecifierOpt *force_fps;
    int        nb_force_fps;
    SpecifierOpt *frame_aspect_ratios;
    int        nb_frame_aspect_ratios;
    SpecifierOpt *rc_overrides;
    int        nb_rc_overrides;
    SpecifierOpt *intra_matrices;
    int        nb_intra_matrices;
    SpecifierOpt *inter_matrices;
    int        nb_inter_matrices;
    SpecifierOpt *top_field_first;
    int        nb_top_field_first;
407 408
    SpecifierOpt *metadata_map;
    int        nb_metadata_map;
409 410
    SpecifierOpt *presets;
    int        nb_presets;
411 412
    SpecifierOpt *copy_initial_nonkeyframes;
    int        nb_copy_initial_nonkeyframes;
413 414 415 416
#if CONFIG_AVFILTER
    SpecifierOpt *filters;
    int        nb_filters;
#endif
417 418
} OptionsContext;

419 420 421 422 423 424 425 426 427 428 429 430
#define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
{\
    int i, ret;\
    for (i = 0; i < o->nb_ ## name; i++) {\
        char *spec = o->name[i].specifier;\
        if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
            outvar = o->name[i].u.type;\
        else if (ret < 0)\
            exit_program(1);\
    }\
}

431
static void reset_options(OptionsContext *o, int is_input)
432 433
{
    const OptionDef *po = options;
434
    OptionsContext bak= *o;
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455

    /* all OPT_SPEC and OPT_STRING can be freed in generic way */
    while (po->name) {
        void *dst = (uint8_t*)o + po->u.off;

        if (po->flags & OPT_SPEC) {
            SpecifierOpt **so = dst;
            int i, *count = (int*)(so + 1);
            for (i = 0; i < *count; i++) {
                av_freep(&(*so)[i].specifier);
                if (po->flags & OPT_STRING)
                    av_freep(&(*so)[i].u.str);
            }
            av_freep(so);
            *count = 0;
        } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
            av_freep(dst);
        po++;
    }

    av_freep(&o->stream_maps);
456
    av_freep(&o->audio_channel_maps);
457
    av_freep(&o->meta_data_maps);
458
    av_freep(&o->streamid_map);
459 460 461

    memset(o, 0, sizeof(*o));

462 463
    if(is_input) o->recording_time = bak.recording_time;
    else         o->recording_time = INT64_MAX;
464 465 466
    o->mux_max_delay  = 0.7;
    o->limit_filesize = UINT64_MAX;
    o->chapters_input_file = INT_MAX;
467 468 469 470 471

    uninit_opts();
    init_opts();
}

472 473 474 475
static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
{
    AVCodecContext *s = ist->st->codec;
    FrameBuffer  *buf = av_mallocz(sizeof(*buf));
476
    int ret, i;
477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
    const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
    int h_chroma_shift, v_chroma_shift;
    int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
    int w = s->width, h = s->height;

    if (!buf)
        return AVERROR(ENOMEM);

    if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
        w += 2*edge;
        h += 2*edge;
    }

    avcodec_align_dimensions(s, &w, &h);
    if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
                              s->pix_fmt, 32)) < 0) {
        av_freep(&buf);
        return ret;
    }
    /* XXX this shouldn't be needed, but some tests break without this line
     * those decoders are buggy and need to be fixed.
     * the following tests fail:
     * bethsoft-vid, cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
     */
    memset(buf->base[0], 128, ret);

    avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
504
    for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
        const int h_shift = i==0 ? 0 : h_chroma_shift;
        const int v_shift = i==0 ? 0 : v_chroma_shift;
        if (s->flags & CODEC_FLAG_EMU_EDGE)
            buf->data[i] = buf->base[i];
        else
            buf->data[i] = buf->base[i] +
                           FFALIGN((buf->linesize[i]*edge >> v_shift) +
                                   (pixel_size*edge >> h_shift), 32);
    }
    buf->w       = s->width;
    buf->h       = s->height;
    buf->pix_fmt = s->pix_fmt;
    buf->ist     = ist;

    *pbuf = buf;
    return 0;
}

static void free_buffer_pool(InputStream *ist)
{
    FrameBuffer *buf = ist->buffer_pool;
    while (buf) {
        ist->buffer_pool = buf->next;
        av_freep(&buf->base[0]);
        av_free(buf);
        buf = ist->buffer_pool;
    }
}

static void unref_buffer(InputStream *ist, FrameBuffer *buf)
{
    av_assert0(buf->refcount);
    buf->refcount--;
    if (!buf->refcount) {
        buf->next = ist->buffer_pool;
        ist->buffer_pool = buf;
    }
}

static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
{
    InputStream *ist = s->opaque;
    FrameBuffer *buf;
    int ret, i;

    if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
        return ret;

    buf              = ist->buffer_pool;
    ist->buffer_pool = buf->next;
    buf->next        = NULL;
    if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
        av_freep(&buf->base[0]);
        av_free(buf);
559
        ist->dr1 = 0;
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
        if ((ret = alloc_buffer(ist, &buf)) < 0)
            return ret;
    }
    buf->refcount++;

    frame->opaque        = buf;
    frame->type          = FF_BUFFER_TYPE_USER;
    frame->extended_data = frame->data;
    frame->pkt_pts       = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;

    for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
        frame->base[i]     = buf->base[i];  // XXX h264.c uses base though it shouldn't
        frame->data[i]     = buf->data[i];
        frame->linesize[i] = buf->linesize[i];
    }

    return 0;
}

static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
{
    InputStream *ist = s->opaque;
    FrameBuffer *buf = frame->opaque;
    int i;

585 586 587
    if(frame->type!=FF_BUFFER_TYPE_USER)
        return avcodec_default_release_buffer(s, frame);

588 589 590 591 592 593 594 595 596 597 598 599 600
    for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
        frame->data[i] = NULL;

    unref_buffer(ist, buf);
}

static void filter_release_buffer(AVFilterBuffer *fb)
{
    FrameBuffer *buf = fb->priv;
    av_free(fb);
    unref_buffer(buf->ist, buf);
}

601 602
#if CONFIG_AVFILTER

603
static int configure_video_filters(InputStream *ist, OutputStream *ost)
604
{
605
    AVFilterContext *last_filter, *filter;
606 607 608
    /** filter graph containing all filters including input & output */
    AVCodecContext *codec = ost->st->codec;
    AVCodecContext *icodec = ist->st->codec;
609
    enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
610
    AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
611
    AVRational sample_aspect_ratio;
612
    char args[255];
613
    int ret;
614

615
    ost->graph = avfilter_graph_alloc();
616

617
    if (ist->st->sample_aspect_ratio.num) {
618
        sample_aspect_ratio = ist->st->sample_aspect_ratio;
619
    } else
620 621 622 623 624 625
        sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;

    snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
             ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
             sample_aspect_ratio.num, sample_aspect_ratio.den);

626 627
    ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
                                       "src", args, NULL, ost->graph);
628
    if (ret < 0)
629
        return ret;
630
#if FF_API_OLD_VSINK_API
631 632
    ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
                                       "out", NULL, pix_fmts, ost->graph);
633 634 635 636 637 638
#else
    buffersink_params->pixel_fmts = pix_fmts;
    ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
                                       "out", NULL, buffersink_params, ost->graph);
#endif
    av_freep(&buffersink_params);
639
    if (ret < 0)
640
        return ret;
641
    last_filter = ost->input_video_filter;
642

643
    if (codec->width != icodec->width || codec->height != icodec->height) {
644
        snprintf(args, 255, "%d:%d:flags=0x%X",
645 646
                 codec->width,
                 codec->height,
647
                 (unsigned)ost->sws_flags);
648
        if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
649
                                                NULL, args, NULL, ost->graph)) < 0)
650 651 652
            return ret;
        if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
            return ret;
653
        last_filter = filter;
654 655
    }

656
    snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
657
    ost->graph->scale_sws_opts = av_strdup(args);
658

659
    if (ost->avfilter) {
660 661
        AVFilterInOut *outputs = avfilter_inout_alloc();
        AVFilterInOut *inputs  = avfilter_inout_alloc();
662 663

        outputs->name    = av_strdup("in");
664
        outputs->filter_ctx = last_filter;
665 666 667 668
        outputs->pad_idx = 0;
        outputs->next    = NULL;

        inputs->name    = av_strdup("out");
669
        inputs->filter_ctx = ost->output_video_filter;
670 671 672
        inputs->pad_idx = 0;
        inputs->next    = NULL;

673
        if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
674
            return ret;
675
        av_freep(&ost->avfilter);
676
    } else {
677
        if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
678
            return ret;
679 680
    }

681
    if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
682
        return ret;
683

684 685
    codec->width  = ost->output_video_filter->inputs[0]->w;
    codec->height = ost->output_video_filter->inputs[0]->h;
686
    codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
687
        ost->frame_aspect_ratio ? // overridden by the -aspect cli option
688
        av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
689
        ost->output_video_filter->inputs[0]->sample_aspect_ratio;
690 691 692 693 694

    return 0;
}
#endif /* CONFIG_AVFILTER */

Fabrice Bellard's avatar
Fabrice Bellard committed
695 696
static void term_exit(void)
{
697
    av_log(NULL, AV_LOG_QUIET, "%s", "");
698
#if HAVE_TERMIOS_H
699
    if(!run_as_daemon)
700
        tcsetattr (0, TCSANOW, &oldtty);
701
#endif
702
}
Fabrice Bellard's avatar
Fabrice Bellard committed
703

704
static volatile int received_sigterm = 0;
705

706
static void sigterm_handler(int sig)
707 708
{
    received_sigterm = sig;
709
    received_nb_signals++;
710
    term_exit();
711 712
    if(received_nb_signals > 3)
        exit(123);
713 714
}

Fabrice Bellard's avatar
Fabrice Bellard committed
715 716
static void term_init(void)
{
717
#if HAVE_TERMIOS_H
718
    if(!run_as_daemon){
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
    struct termios tty;

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

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

    tcsetattr (0, TCSANOW, &tty);
    signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
736
    }
737
#endif
738
    avformat_network_deinit();
739

740
    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
741
    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
Måns Rullgård's avatar
Måns Rullgård committed
742 743 744
#ifdef SIGXCPU
    signal(SIGXCPU, sigterm_handler);
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
745 746 747 748 749
}

/* read a key without blocking */
static int read_key(void)
{
750
    unsigned char ch;
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
#if HAVE_TERMIOS_H
    int n = 1;
    struct timeval tv;
    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);
    if (n > 0) {
        n = read(0, &ch, 1);
        if (n == 1)
            return ch;

        return n;
    }
#elif HAVE_KBHIT
769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794
#    if HAVE_PEEKNAMEDPIPE
    static int is_pipe;
    static HANDLE input_handle;
    DWORD dw, nchars;
    if(!input_handle){
        input_handle = GetStdHandle(STD_INPUT_HANDLE);
        is_pipe = !GetConsoleMode(input_handle, &dw);
    }

    if (stdin->_cnt > 0) {
        read(0, &ch, 1);
        return ch;
    }
    if (is_pipe) {
        /* When running under a GUI, you will end here. */
        if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
            return -1;
        //Read it
        if(nchars != 0) {
            read(0, &ch, 1);
            return ch;
        }else{
            return -1;
        }
    }
#    endif
795 796
    if(kbhit())
        return(getch());
797
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
798 799 800
    return -1;
}

801
static int decode_interrupt_cb(void *ctx)
802
{
803
    return received_nb_signals > 1;
804 805
}

806 807
static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };

808
void av_noreturn exit_program(int ret)
809 810 811 812
{
    int i;

    /* close files */
813
    for (i = 0; i < nb_output_files; i++) {
814
        AVFormatContext *s = output_files[i].ctx;
815
        if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
816
            avio_close(s->pb);
817
        avformat_free_context(s);
818
        av_dict_free(&output_files[i].opts);
819
    }
820 821 822 823 824 825 826 827
    for (i = 0; i < nb_output_streams; i++) {
        AVBitStreamFilterContext *bsfc = output_streams[i].bitstream_filters;
        while (bsfc) {
            AVBitStreamFilterContext *next = bsfc->next;
            av_bitstream_filter_close(bsfc);
            bsfc = next;
        }
        output_streams[i].bitstream_filters = NULL;
828
    }
829
    for (i = 0; i < nb_input_files; i++) {
830
        avformat_close_input(&input_files[i].ctx);
831
    }
832 833 834
    for (i = 0; i < nb_input_streams; i++) {
        av_freep(&input_streams[i].decoded_frame);
        av_freep(&input_streams[i].filtered_frame);
835
        av_dict_free(&input_streams[i].opts);
836
        free_buffer_pool(&input_streams[i]);
837
    }
838 839 840 841 842

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

843 844
    av_freep(&input_streams);
    av_freep(&input_files);
845
    av_freep(&output_streams);
846
    av_freep(&output_files);
847

848
    uninit_opts();
849 850
    av_free(audio_buf);
    av_free(audio_out);
851
    allocated_audio_buf_size = allocated_audio_out_size = 0;
852

853 854 855
#if CONFIG_AVFILTER
    avfilter_uninit();
#endif
856
    avformat_network_deinit();
857

858 859
    av_freep(&input_tmp);

860
    if (received_sigterm) {
861 862
        av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
               (int) received_sigterm);
863 864 865
        exit (255);
    }

866
    exit(ret); /* not all OS-es handle main() return value */
867 868
}

869 870 871 872
static void assert_avoptions(AVDictionary *m)
{
    AVDictionaryEntry *t;
    if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
873
        av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
874
        exit_program(1);
875 876 877
    }
}

878 879 880 881 882 883
static void assert_codec_experimental(AVCodecContext *c, int encoder)
{
    const char *codec_string = encoder ? "encoder" : "decoder";
    AVCodec *codec;
    if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
        c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
884
        av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
885 886
                "results.\nAdd '-strict experimental' if you want to use it.\n",
                codec_string, c->codec->name);
887
        codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
888
        if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
889
            av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
890
                   codec_string, codec->name);
891
        exit_program(1);
892 893 894
    }
}

895 896
static void choose_sample_fmt(AVStream *st, AVCodec *codec)
{
897 898 899 900
    if (codec && codec->sample_fmts) {
        const enum AVSampleFormat *p = codec->sample_fmts;
        for (; *p != -1; p++) {
            if (*p == st->codec->sample_fmt)
901 902
                break;
        }
903
        if (*p == -1) {
904
            if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
905
                av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
906
            if(av_get_sample_fmt_name(st->codec->sample_fmt))
907 908 909 910 911
            av_log(NULL, AV_LOG_WARNING,
                   "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
                   av_get_sample_fmt_name(st->codec->sample_fmt),
                   codec->name,
                   av_get_sample_fmt_name(codec->sample_fmts[0]));
912
            st->codec->sample_fmt = codec->sample_fmts[0];
913
        }
914 915 916
    }
}

917 918
static void choose_sample_rate(AVStream *st, AVCodec *codec)
{
919 920 921 922 923 924 925 926 927
    if (codec && codec->supported_samplerates) {
        const int *p  = codec->supported_samplerates;
        int best      = 0;
        int best_dist = INT_MAX;
        for (; *p; p++) {
            int dist = abs(st->codec->sample_rate - *p);
            if (dist < best_dist) {
                best_dist = dist;
                best      = *p;
928 929
            }
        }
930
        if (best_dist) {
931 932
            av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
        }
933
        st->codec->sample_rate = best;
934 935 936
    }
}

937 938
static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
{
939 940
    if (codec && codec->pix_fmts) {
        const enum PixelFormat *p = codec->pix_fmts;
941 942
        int has_alpha= av_pix_fmt_descriptors[st->codec->pix_fmt].nb_components % 2 == 0;
        enum PixelFormat best= PIX_FMT_NONE;
943 944 945 946 947 948
        if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
            if (st->codec->codec_id == CODEC_ID_MJPEG) {
                p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
            } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
                p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
                                                 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
949 950
            }
        }
951
        for (; *p != PIX_FMT_NONE; p++) {
952
            best= avcodec_find_best_pix_fmt2(best, *p, st->codec->pix_fmt, has_alpha, NULL);
953
            if (*p == st->codec->pix_fmt)
954 955
                break;
        }
956
        if (*p == PIX_FMT_NONE) {
957
            if (st->codec->pix_fmt != PIX_FMT_NONE)
958
                av_log(NULL, AV_LOG_WARNING,
959 960 961 962
                       "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
                       av_pix_fmt_descriptors[st->codec->pix_fmt].name,
                       codec->name,
                       av_pix_fmt_descriptors[best].name);
963
            st->codec->pix_fmt = best;
964
        }
965 966 967
    }
}

968
static double get_sync_ipts(const OutputStream *ost)
969
{
970
    const InputStream *ist = ost->sync_ist;
971
    OutputFile *of = &output_files[ost->file_index];
972
    return (double)(ist->pts - of->start_time) / AV_TIME_BASE;
973 974
}

975
static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
976
{
977 978
    AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
    AVCodecContext          *avctx = ost->st->codec;
979 980
    int ret;

981 982 983 984 985 986 987
    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 & AV_PKT_FLAG_KEY);
        if (a > 0) {
988
            av_free_packet(pkt);
989 990
            new_pkt.destruct = av_destruct_packet;
        } else if (a < 0) {
991
            av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
992 993
                   bsfc->filter->name, pkt->stream_index,
                   avctx->codec ? avctx->codec->name : "copy");
994
            print_error("", a);
995
            if (exit_on_error)
996
                exit_program(1);
997
        }
998
        *pkt = new_pkt;
999

1000
        bsfc = bsfc->next;
1001 1002
    }

1003 1004
    ret = av_interleaved_write_frame(s, pkt);
    if (ret < 0) {
1005
        print_error("av_interleaved_write_frame()", ret);
1006
        exit_program(1);
1007
    }
1008
    ost->frame_number++;
1009 1010
}

1011 1012 1013 1014 1015 1016 1017
static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
{
    int fill_char = 0x00;
    if (sample_fmt == AV_SAMPLE_FMT_U8)
        fill_char = 0x80;
    memset(buf, fill_char, size);
}
Fabrice Bellard's avatar
Fabrice Bellard committed
1018

1019 1020
static void do_audio_out(AVFormatContext *s, OutputStream *ost,
                         InputStream *ist, AVFrame *decoded_frame)
Fabrice Bellard's avatar
Fabrice Bellard committed
1021
{
1022
    uint8_t *buftmp;
1023
    int64_t audio_out_size, audio_buf_size, size_out;
1024

1025
    int frame_bytes, ret, resample_changed;
1026 1027
    AVCodecContext *enc = ost->st->codec;
    AVCodecContext *dec = ist->st->codec;
1028 1029
    int osize = av_get_bytes_per_sample(enc->sample_fmt);
    int isize = av_get_bytes_per_sample(dec->sample_fmt);
1030
    const int coded_bps = av_get_bits_per_sample(enc->codec->id);
1031 1032 1033
    uint8_t *buf = decoded_frame->data[0];
    int size     = decoded_frame->nb_samples * dec->channels * isize;
    int64_t allocated_for_size = size;
1034

1035
need_realloc:
1036 1037 1038 1039 1040 1041 1042 1043 1044
    audio_buf_size  = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
    audio_buf_size  = (audio_buf_size * enc->sample_rate + dec->sample_rate) / dec->sample_rate;
    audio_buf_size  = audio_buf_size * 2 + 10000; // safety factors for the deprecated resampling API
    audio_buf_size  = FFMAX(audio_buf_size, enc->frame_size);
    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);
1045 1046
    audio_out_size += FF_MIN_BUFFER_SIZE;

1047
    if (audio_out_size > INT_MAX || audio_buf_size > INT_MAX) {
1048
        av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
1049
        exit_program(1);
1050
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
1051

1052 1053
    av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
    av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
1054
    if (!audio_buf || !audio_out) {
1055
        av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
1056
        exit_program(1);
1057
    }
1058

Michael Niedermayer's avatar
Michael Niedermayer committed
1059
    if (enc->channels != dec->channels
1060 1061 1062
     || enc->sample_fmt != dec->sample_fmt
     || enc->sample_rate!= dec->sample_rate
    )
1063 1064
        ost->audio_resample = 1;

1065 1066 1067 1068
    resample_changed = ost->resample_sample_fmt  != dec->sample_fmt ||
                       ost->resample_channels    != dec->channels   ||
                       ost->resample_sample_rate != dec->sample_rate;

1069
    if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
1070
        if (resample_changed) {
1071
            av_log(NULL, AV_LOG_INFO, "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
1072
                   ist->file_index, ist->st->index,
1073 1074 1075 1076 1077
                   ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
                   dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
            ost->resample_sample_fmt  = dec->sample_fmt;
            ost->resample_channels    = dec->channels;
            ost->resample_sample_rate = dec->sample_rate;
Michael Niedermayer's avatar
Michael Niedermayer committed
1078
            swr_free(&ost->swr);
1079
        }
1080
        /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
1081
        if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
1082
            ost->resample_sample_fmt  == enc->sample_fmt &&
1083 1084
            ost->resample_channels    == enc->channels   &&
            ost->resample_sample_rate == enc->sample_rate) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1085
            //ost->swr = NULL;
1086 1087
            ost->audio_resample = 0;
        } else {
1088 1089 1090 1091
            ost->swr = swr_alloc_set_opts(ost->swr,
                                          enc->channel_layout, enc->sample_fmt, enc->sample_rate,
                                          dec->channel_layout, dec->sample_fmt, dec->sample_rate,
                                          0, NULL);
1092 1093
            if (ost->audio_channels_mapped)
                swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
1094
            av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
1095
            if (ost->audio_channels_mapped) {
1096 1097
                av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
                av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
1098
            }
1099 1100 1101 1102 1103 1104 1105 1106
            if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
                av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
                exit_program(1);
            }
            if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
                av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
                exit_program(1);
            }
1107
            if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
Michael Niedermayer's avatar
Michael Niedermayer committed
1108
            if(ost->swr && swr_init(ost->swr) < 0){
1109
                av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
Michael Niedermayer's avatar
Michael Niedermayer committed
1110 1111 1112 1113
                swr_free(&ost->swr);
            }

            if (!ost->swr) {
1114
                av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
Stefano Sabatini's avatar
Stefano Sabatini committed
1115 1116
                        dec->channels, dec->sample_rate,
                        enc->channels, enc->sample_rate);
1117
                exit_program(1);
Stefano Sabatini's avatar
Stefano Sabatini committed
1118
            }
1119
        }
1120 1121
    }

Michael Niedermayer's avatar
Michael Niedermayer committed
1122
    av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1123

1124 1125 1126
    if (audio_sync_method) {
        double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts -
                       av_fifo_size(ost->fifo) / (enc->channels * osize);
1127 1128
        int idelta = delta * dec->sample_rate / enc->sample_rate;
        int byte_delta = idelta * isize * dec->channels;
1129

1130 1131 1132 1133 1134
        // FIXME resample delay
        if (fabs(delta) > 50) {
            if (ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate) {
                if (byte_delta < 0) {
                    byte_delta = FFMAX(byte_delta, -size);
1135 1136
                    size += byte_delta;
                    buf  -= byte_delta;
1137 1138
                    av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
                           -byte_delta / (isize * dec->channels));
1139
                    if (!size)
1140
                        return;
1141 1142 1143
                    ist->is_start = 0;
                } else {
                    input_tmp = av_realloc(input_tmp, byte_delta + size);
1144

1145 1146
                    if (byte_delta > allocated_for_size - size) {
                        allocated_for_size = byte_delta + (int64_t)size;
1147 1148
                        goto need_realloc;
                    }
1149
                    ist->is_start = 0;
1150

1151
                    generate_silence(input_tmp, dec->sample_fmt, byte_delta);
1152
                    memcpy(input_tmp + byte_delta, buf, size);
1153
                    buf = input_tmp;
1154
                    size += byte_delta;
1155
                    av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
1156
                }
1157 1158
            } else if (audio_sync_method > 1) {
                int comp = av_clip(delta, -audio_sync_method, audio_sync_method);
1159
                av_assert0(ost->audio_resample);
1160 1161
                av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
                       delta, comp, enc->sample_rate);
1162
//                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));
1163
                swr_set_compensation(ost->swr, comp, enc->sample_rate);
1164
            }
1165
        }
1166 1167 1168
    } else
        ost->sync_opts = lrintf(get_sync_ipts(ost) * enc->sample_rate) -
                                av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
Fabrice Bellard's avatar
Fabrice Bellard committed
1169 1170 1171

    if (ost->audio_resample) {
        buftmp = audio_buf;
Michael Niedermayer's avatar
Michael Niedermayer committed
1172 1173
        size_out = swr_convert(ost->swr, (      uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
                                         (const uint8_t*[]){buf   }, size / (dec->channels * isize));
1174
        size_out = size_out * enc->channels * osize;
Fabrice Bellard's avatar
Fabrice Bellard committed
1175 1176 1177 1178 1179
    } else {
        buftmp = buf;
        size_out = size;
    }

Michael Niedermayer's avatar
Michael Niedermayer committed
1180
    av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
1181

Fabrice Bellard's avatar
Fabrice Bellard committed
1182
    /* now encode as many frames as possible */
1183
    if (enc->frame_size > 1) {
Fabrice Bellard's avatar
Fabrice Bellard committed
1184
        /* output resampled raw samples */
1185
        if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
1186
            av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
1187
            exit_program(1);
1188
        }
1189
        av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
Fabrice Bellard's avatar
Fabrice Bellard committed
1190

1191
        frame_bytes = enc->frame_size * osize * enc->channels;
1192

1193
        while (av_fifo_size(ost->fifo) >= frame_bytes) {
1194 1195 1196
            AVPacket pkt;
            av_init_packet(&pkt);

1197
            av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1198

1199
            // FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1200

1201
            ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1202
                                       (short *)audio_buf);
1203
            if (ret < 0) {
1204
                av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1205
                exit_program(1);
1206
            }
1207
            audio_size += ret;
1208 1209 1210 1211 1212
            pkt.stream_index = ost->index;
            pkt.data = audio_out;
            pkt.size = ret;
            if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
                pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1213
            pkt.flags |= AV_PKT_FLAG_KEY;
1214
            write_frame(s, &pkt, ost);
1215

1216
            ost->sync_opts += enc->frame_size;
Fabrice Bellard's avatar
Fabrice Bellard committed
1217 1218
        }
    } else {
1219 1220
        AVPacket pkt;
        av_init_packet(&pkt);
1221

1222
        ost->sync_opts += size_out / (osize * enc->channels);
1223

1224
        /* output a pcm frame */
1225 1226 1227
        /* determine the size of the coded buffer */
        size_out /= osize;
        if (coded_bps)
1228
            size_out = size_out * coded_bps / 8;
1229

1230
        if (size_out > audio_out_size) {
1231
            av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
1232
            exit_program(1);
1233 1234
        }

1235
        // FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1236
        ret = avcodec_encode_audio(enc, audio_out, size_out,
1237
                                   (short *)buftmp);
1238
        if (ret < 0) {
1239
            av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1240
            exit_program(1);
1241
        }
1242
        audio_size += ret;
1243 1244 1245 1246 1247
        pkt.stream_index = ost->index;
        pkt.data = audio_out;
        pkt.size = ret;
        if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
            pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1248
        pkt.flags |= AV_PKT_FLAG_KEY;
1249
        write_frame(s, &pkt, ost);
Fabrice Bellard's avatar
Fabrice Bellard committed
1250 1251 1252
    }
}

1253
static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1254 1255 1256 1257
{
    AVCodecContext *dec;
    AVPicture *picture2;
    AVPicture picture_tmp;
1258
    uint8_t *buf = 0;
1259

1260
    dec = ist->st->codec;
1261 1262

    /* deinterlace : must be done before any resize */
1263
    if (do_deinterlace) {
1264 1265 1266 1267
        int size;

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

1272 1273 1274
        picture2 = &picture_tmp;
        avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);

1275
        if (avpicture_deinterlace(picture2, picture,
Ramiro Polla's avatar
Ramiro Polla committed
1276 1277
                                 dec->pix_fmt, dec->width, dec->height) < 0) {
            /* if error, do not deinterlace */
1278
            av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
Ramiro Polla's avatar
Ramiro Polla committed
1279 1280 1281 1282
            av_free(buf);
            buf = NULL;
            picture2 = picture;
        }
1283 1284 1285 1286 1287 1288 1289 1290 1291
    } else {
        picture2 = picture;
    }

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

1292
static void do_subtitle_out(AVFormatContext *s,
1293 1294
                            OutputStream *ost,
                            InputStream *ist,
1295 1296 1297 1298
                            AVSubtitle *sub,
                            int64_t pts)
{
    static uint8_t *subtitle_out = NULL;
1299
    int subtitle_out_max_size = 1024 * 1024;
1300 1301 1302 1303 1304
    int subtitle_out_size, nb, i;
    AVCodecContext *enc;
    AVPacket pkt;

    if (pts == AV_NOPTS_VALUE) {
1305
        av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1306
        if (exit_on_error)
1307
            exit_program(1);
1308 1309 1310
        return;
    }

1311
    enc = ost->st->codec;
1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324

    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;

1325
    for (i = 0; i < nb; i++) {
1326
        sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1327
        // start_display_time is required to be 0
1328 1329
        sub->pts               += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
        sub->end_display_time  -= sub->start_display_time;
1330
        sub->start_display_time = 0;
1331
        subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1332
                                                    subtitle_out_max_size, sub);
1333
        if (subtitle_out_size < 0) {
1334
            av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1335
            exit_program(1);
1336
        }
1337

1338 1339 1340 1341
        av_init_packet(&pkt);
        pkt.stream_index = ost->index;
        pkt.data = subtitle_out;
        pkt.size = subtitle_out_size;
1342
        pkt.pts  = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1343 1344 1345 1346 1347 1348 1349 1350
        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;
        }
1351
        write_frame(s, &pkt, ost);
1352 1353 1354
    }
}

1355 1356
static int bit_buffer_size = 1024 * 256;
static uint8_t *bit_buffer = NULL;
1357

1358 1359 1360 1361 1362
static void do_video_resample(OutputStream *ost,
                              InputStream *ist,
                              AVFrame *in_picture,
                              AVFrame **out_picture)
{
1363
#if CONFIG_AVFILTER
1364
    *out_picture = in_picture;
1365
#else
1366 1367
    AVCodecContext *dec = ist->st->codec;
    AVCodecContext *enc = ost->st->codec;
1368 1369 1370
    int resample_changed = ost->resample_width   != in_picture->width  ||
                           ost->resample_height  != in_picture->height ||
                           ost->resample_pix_fmt != in_picture->format;
1371

1372
    *out_picture = in_picture;
1373 1374
    if (resample_changed) {
        av_log(NULL, AV_LOG_INFO,
1375
               "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s / frm size:%dx%d fmt:%s\n",
1376 1377
               ist->file_index, ist->st->index,
               ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1378 1379 1380 1381 1382
               dec->width         , dec->height         , av_get_pix_fmt_name(dec->pix_fmt),
               in_picture->width, in_picture->height, av_get_pix_fmt_name(in_picture->format));
        ost->resample_width   = in_picture->width;
        ost->resample_height  = in_picture->height;
        ost->resample_pix_fmt = in_picture->format;
1383 1384
    }

1385 1386 1387
    ost->video_resample = in_picture->width   != enc->width  ||
                          in_picture->height  != enc->height ||
                          in_picture->format  != enc->pix_fmt;
1388 1389 1390 1391 1392 1393 1394 1395 1396

    if (ost->video_resample) {
        *out_picture = &ost->resample_frame;
        if (!ost->img_resample_ctx || resample_changed) {
            /* initialize the destination picture */
            if (!ost->resample_frame.data[0]) {
                avcodec_get_frame_defaults(&ost->resample_frame);
                if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
                                    enc->width, enc->height)) {
1397
                    av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
1398 1399 1400 1401 1402
                    exit_program(1);
                }
            }
            /* initialize a new scaler context */
            sws_freeContext(ost->img_resample_ctx);
1403
            ost->img_resample_ctx = sws_getContext(in_picture->width, in_picture->height, in_picture->format,
1404 1405 1406
                                                   enc->width, enc->height, enc->pix_fmt,
                                                   ost->sws_flags, NULL, NULL, NULL);
            if (ost->img_resample_ctx == NULL) {
1407
                av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1408 1409 1410 1411 1412 1413 1414 1415 1416 1417
                exit_program(1);
            }
        }
        sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
              0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
    }
#endif
}


1418
static void do_video_out(AVFormatContext *s,
1419 1420
                         OutputStream *ost,
                         InputStream *ist,
1421
                         AVFrame *in_picture,
1422
                         int *frame_size, float quality)
Fabrice Bellard's avatar
Fabrice Bellard committed
1423
{
1424
    int nb_frames, i, ret, format_video_sync;
1425
    AVFrame *final_picture;
1426
    AVCodecContext *enc;
1427
    double sync_ipts;
1428
    double duration = 0;
1429

1430
    enc = ost->st->codec;
Fabrice Bellard's avatar
Fabrice Bellard committed
1431

1432 1433 1434 1435 1436 1437 1438 1439
    if (ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
        duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
        if(ist->st->avg_frame_rate.num)
            duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));

        duration /= av_q2d(enc->time_base);
    }

1440 1441
    sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);

1442 1443 1444
    /* by default, we output a single frame */
    nb_frames = 1;

1445 1446
    *frame_size = 0;

1447
    format_video_sync = video_sync_method;
1448 1449
    if (format_video_sync == VSYNC_AUTO)
        format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1450

1451
    if (format_video_sync != VSYNC_PASSTHROUGH) {
1452
        double vdelta = sync_ipts - ost->sync_opts + duration;
1453
        // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1454 1455
        if (vdelta < -1.1)
            nb_frames = 0;
1456
        else if (format_video_sync == VSYNC_VFR) {
1457 1458 1459 1460 1461
            if (vdelta <= -0.6) {
                nb_frames = 0;
            } else if (vdelta > 0.6)
                ost->sync_opts = lrintf(sync_ipts);
        } else if (vdelta > 1.1)
1462
            nb_frames = lrintf(vdelta);
1463
//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);
1464
        if (nb_frames == 0) {
1465
            ++nb_frames_drop;
1466
            av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1467
        } else if (nb_frames > 1) {
1468
            nb_frames_dup += nb_frames - 1;
1469
            av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1470
        }
1471 1472
    } else
        ost->sync_opts = lrintf(sync_ipts);
1473

1474
    nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1475
    if (nb_frames <= 0)
Fabrice Bellard's avatar
Fabrice Bellard committed
1476
        return;
1477

1478
    do_video_resample(ost, ist, in_picture, &final_picture);
1479

Fabrice Bellard's avatar
Fabrice Bellard committed
1480
    /* duplicates frame if needed */
1481
    for (i = 0; i < nb_frames; i++) {
1482 1483
        AVPacket pkt;
        av_init_packet(&pkt);
1484
        pkt.stream_index = ost->index;
1485

1486 1487
        if (s->oformat->flags & AVFMT_RAWPICTURE &&
            enc->codec->id == CODEC_ID_RAWVIDEO) {
1488
            /* raw pictures are written as AVPicture structure to
1489
               avoid any copies. We support temporarily the older
1490
               method. */
1491 1492
            enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
            enc->coded_frame->top_field_first  = in_picture->top_field_first;
1493 1494 1495
            pkt.data   = (uint8_t *)final_picture;
            pkt.size   =  sizeof(AVPicture);
            pkt.pts    = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1496
            pkt.flags |= AV_PKT_FLAG_KEY;
1497

1498
            write_frame(s, &pkt, ost);
1499
        } else {
1500
            AVFrame big_picture;
1501

1502
            big_picture = *final_picture;
1503 1504 1505
            /* better than nothing: use input picture interlaced
               settings */
            big_picture.interlaced_frame = in_picture->interlaced_frame;
1506
            if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1507
                if (ost->top_field_first == -1)
1508 1509
                    big_picture.top_field_first = in_picture->top_field_first;
                else
1510
                    big_picture.top_field_first = !!ost->top_field_first;
1511
            }
1512

1513
            /* handles same_quant here. This is not correct because it may
Fabrice Bellard's avatar
Fabrice Bellard committed
1514
               not be a global option */
1515
            big_picture.quality = quality;
1516
            if (!enc->me_threshold)
1517
                big_picture.pict_type = 0;
1518
//            big_picture.pts = AV_NOPTS_VALUE;
1519
            big_picture.pts = ost->sync_opts;
1520
//            big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1521
// av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1522 1523
            if (ost->forced_kf_index < ost->forced_kf_count &&
                big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1524
                big_picture.pict_type = AV_PICTURE_TYPE_I;
1525 1526
                ost->forced_kf_index++;
            }
1527
            ret = avcodec_encode_video(enc,
1528
                                       bit_buffer, bit_buffer_size,
Michael Niedermayer's avatar
Michael Niedermayer committed
1529
                                       &big_picture);
1530
            if (ret < 0) {
1531
                av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1532
                exit_program(1);
1533
            }
1534

1535 1536 1537 1538 1539
            if (ret > 0) {
                pkt.data = bit_buffer;
                pkt.size = ret;
                if (enc->coded_frame->pts != AV_NOPTS_VALUE)
                    pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1540
/*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1541 1542
   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);*/
1543

1544
                if (enc->coded_frame->key_frame)
1545
                    pkt.flags |= AV_PKT_FLAG_KEY;
1546
                write_frame(s, &pkt, ost);
1547
                *frame_size = ret;
1548
                video_size += ret;
1549 1550
                // fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
                //         enc->frame_number-1, ret, enc->pict_type);
1551 1552 1553 1554
                /* if two pass, output log */
                if (ost->logfile && enc->stats_out) {
                    fprintf(ost->logfile, "%s", enc->stats_out);
                }
1555
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
1556
        }
1557
        ost->sync_opts++;
Fabrice Bellard's avatar
Fabrice Bellard committed
1558 1559 1560
    }
}

1561 1562
static double psnr(double d)
{
1563
    return -10.0 * log(d) / log(10.0);
1564 1565
}

1566
static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1567
                           int frame_size)
1568 1569 1570 1571
{
    AVCodecContext *enc;
    int frame_number;
    double ti1, bitrate, avg_bitrate;
1572

1573
    /* this is executed just the first time do_video_stats is called */
1574 1575 1576
    if (!vstats_file) {
        vstats_file = fopen(vstats_filename, "w");
        if (!vstats_file) {
1577
            perror("fopen");
1578
            exit_program(1);
1579 1580 1581
        }
    }

1582
    enc = ost->st->codec;
1583
    if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1584
        frame_number = ost->frame_number;
1585
        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1586
        if (enc->flags&CODEC_FLAG_PSNR)
1587
            fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1588

1589
        fprintf(vstats_file,"f_size= %6d ", frame_size);
1590
        /* compute pts value */
1591
        ti1 = ost->sync_opts * av_q2d(enc->time_base);
1592 1593
        if (ti1 < 0.01)
            ti1 = 0.01;
1594

1595
        bitrate     = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1596
        avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1597
        fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1598
               (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1599
        fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1600
    }
1601 1602
}

1603
static void print_report(OutputFile *output_files,
1604
                         OutputStream *ost_table, int nb_ostreams,
1605
                         int is_last_report, int64_t timer_start, int64_t cur_time)
1606 1607
{
    char buf[1024];
1608
    OutputStream *ost;
1609
    AVFormatContext *oc;
1610
    int64_t total_size;
1611 1612
    AVCodecContext *enc;
    int frame_number, vid, i;
1613 1614
    double bitrate;
    int64_t pts = INT64_MAX;
1615
    static int64_t last_time = -1;
1616
    static int qp_histogram[52];
1617
    int hours, mins, secs, us;
1618

1619 1620
    if (!print_stats && !is_last_report)
        return;
1621

1622 1623 1624 1625
    if (!is_last_report) {
        if (last_time == -1) {
            last_time = cur_time;
            return;
1626
        }
1627 1628 1629 1630 1631
        if ((cur_time - last_time) < 500000)
            return;
        last_time = cur_time;
    }

1632

1633
    oc = output_files[0].ctx;
1634

1635
    total_size = avio_size(oc->pb);
1636
    if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1637
        total_size = avio_tell(oc->pb);
1638 1639 1640
        if (total_size < 0)
            total_size = 0;
    }
1641

1642 1643
    buf[0] = '\0';
    vid = 0;
1644
    for (i = 0; i < nb_ostreams; i++) {
1645
        float q = -1;
1646
        ost = &ost_table[i];
1647
        enc = ost->st->codec;
1648
        if (!ost->stream_copy && enc->coded_frame)
1649
            q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
1650
        if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
Michael Niedermayer's avatar
Michael Niedermayer committed
1651
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1652
        }
1653
        if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1654
            float t = (cur_time-timer_start) / 1000000.0;
1655

1656
            frame_number = ost->frame_number;
1657
            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1658 1659
                     frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
            if (is_last_report)
1660
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1661
            if (qp_hist) {
1662
                int j;
1663
                int qp = lrintf(q);
1664
                if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1665
                    qp_histogram[qp]++;
1666 1667
                for (j = 0; j < 32; j++)
                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
1668
            }
1669
            if (enc->flags&CODEC_FLAG_PSNR) {
1670
                int j;
1671 1672 1673
                double error, error_sum = 0;
                double scale, scale_sum = 0;
                char type[3] = { 'Y','U','V' };
1674
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1675 1676 1677 1678 1679 1680 1681
                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;
1682
                    }
1683 1684
                    if (j)
                        scale /= 4;
1685 1686
                    error_sum += error;
                    scale_sum += scale;
1687
                    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
1688
                }
1689
                snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
1690
            }
1691 1692 1693
            vid = 1;
        }
        /* compute min output value */
1694 1695
        pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
                                      ost->st->time_base, AV_TIME_BASE_Q));
1696
    }
1697

1698 1699 1700 1701 1702 1703
    secs = pts / AV_TIME_BASE;
    us = pts % AV_TIME_BASE;
    mins = secs / 60;
    secs %= 60;
    hours = mins / 60;
    mins %= 60;
1704

1705
    bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1706

1707 1708 1709 1710 1711 1712 1713
    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
             "size=%8.0fkB time=", total_size / 1024.0);
    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
             "%02d:%02d:%02d.%02d ", hours, mins, secs,
             (100 * us) / AV_TIME_BASE);
    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
             "bitrate=%6.1fkbits/s", bitrate);
1714

1715 1716 1717
    if (nb_frames_dup || nb_frames_drop)
        snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
                nb_frames_dup, nb_frames_drop);
1718

1719
    av_log(NULL, AV_LOG_INFO, "%s    \r", buf);
1720 1721

    fflush(stderr);
1722

1723
    if (is_last_report) {
1724
        int64_t raw= audio_size + video_size + extra_size;
1725 1726
        av_log(NULL, AV_LOG_INFO, "\n");
        av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1727 1728 1729 1730
               video_size / 1024.0,
               audio_size / 1024.0,
               extra_size / 1024.0,
               100.0 * (total_size - raw) / raw
1731
        );
1732 1733 1734
        if(video_size + audio_size + extra_size == 0){
            av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
        }
1735
    }
1736 1737
}

1738
static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1739 1740 1741 1742
{
    int i, ret;

    for (i = 0; i < nb_ostreams; i++) {
1743 1744 1745 1746
        OutputStream   *ost = &ost_table[i];
        AVCodecContext *enc = ost->st->codec;
        AVFormatContext *os = output_files[ost->file_index].ctx;

1747
        if (!ost->encoding_needed)
1748 1749
            continue;

1750
        if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1751
            continue;
1752
        if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
1753 1754
            continue;

1755
        for (;;) {
1756 1757 1758
            AVPacket pkt;
            int fifo_bytes;
            av_init_packet(&pkt);
1759
            pkt.stream_index = ost->index;
1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775

            switch (ost->st->codec->codec_type) {
            case AVMEDIA_TYPE_AUDIO:
                fifo_bytes = av_fifo_size(ost->fifo);
                ret = 0;
                /* encode any samples remaining in fifo */
                if (fifo_bytes > 0) {
                    int osize = av_get_bytes_per_sample(enc->sample_fmt);
                    int fs_tmp = enc->frame_size;

                    av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
                    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 (allocated_audio_buf_size < frame_bytes)
1776
                            exit_program(1);
1777
                        generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1778 1779
                    }

1780 1781 1782 1783 1784 1785 1786
                    ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
                    pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
                                              ost->st->time_base.num, enc->sample_rate);
                    enc->frame_size = fs_tmp;
                }
                if (ret <= 0) {
                    ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1787
                }
1788
                if (ret < 0) {
1789
                    av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1790 1791 1792
                    exit_program(1);
                }
                audio_size += ret;
1793
                pkt.flags  |= AV_PKT_FLAG_KEY;
1794 1795 1796 1797
                break;
            case AVMEDIA_TYPE_VIDEO:
                ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
                if (ret < 0) {
1798
                    av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1799 1800 1801
                    exit_program(1);
                }
                video_size += ret;
1802
                if (enc->coded_frame && enc->coded_frame->key_frame)
1803 1804 1805 1806 1807 1808
                    pkt.flags |= AV_PKT_FLAG_KEY;
                if (ost->logfile && enc->stats_out) {
                    fprintf(ost->logfile, "%s", enc->stats_out);
                }
                break;
            default:
1809
                ret = -1;
1810
            }
1811 1812 1813 1814 1815 1816

            if (ret <= 0)
                break;
            pkt.data = bit_buffer;
            pkt.size = ret;
            if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1817
                pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1818
            write_frame(os, &pkt, ost);
1819 1820 1821 1822
        }
    }
}

1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838
/*
 * Check whether a packet from ist should be written into ost at this time
 */
static int check_output_constraints(InputStream *ist, OutputStream *ost)
{
    OutputFile *of = &output_files[ost->file_index];
    int ist_index  = ist - input_streams;

    if (ost->source_index != ist_index)
        return 0;

    if (of->start_time && ist->pts < of->start_time)
        return 0;

    if (of->recording_time != INT64_MAX &&
        av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1839
                      (AVRational){ 1, 1000000 }) >= 0) {
1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882
        ost->is_past_recording_time = 1;
        return 0;
    }

    return 1;
}

static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
{
    OutputFile *of = &output_files[ost->file_index];
    int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
    AVPicture pict;
    AVPacket opkt;

    av_init_packet(&opkt);

    if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
        !ost->copy_initial_nonkeyframes)
        return;

    /* force the input stream PTS */
    if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
        audio_size += pkt->size;
    else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
        video_size += pkt->size;
        ost->sync_opts++;
    }

    opkt.stream_index = ost->index;
    if (pkt->pts != AV_NOPTS_VALUE)
        opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
    else
        opkt.pts = AV_NOPTS_VALUE;

    if (pkt->dts == AV_NOPTS_VALUE)
        opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
    else
        opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
    opkt.dts -= ost_tb_start_time;

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

1883 1884
    // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
    if (  ost->st->codec->codec_id != CODEC_ID_H264
1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901
       && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
       && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
       ) {
        if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
            opkt.destruct = av_destruct_packet;
    } else {
        opkt.data = pkt->data;
        opkt.size = pkt->size;
    }
    if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
        /* store AVPicture in AVPacket, as expected by the output format */
        avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
        opkt.data = (uint8_t *)&pict;
        opkt.size = sizeof(AVPicture);
        opkt.flags |= AV_PKT_FLAG_KEY;
    }

1902
    write_frame(of->ctx, &opkt, ost);
1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918
    ost->st->codec->frame_number++;
    av_free_packet(&opkt);
}

static void rate_emu_sleep(InputStream *ist)
{
    if (input_files[ist->file_index].rate_emu) {
        int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
        int64_t now = av_gettime() - ist->start;
        if (pts > now)
            usleep(pts - now);
    }
}

static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
{
1919 1920
    AVFrame *decoded_frame;
    AVCodecContext *avctx = ist->st->codec;
1921 1922 1923
    int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
    int i, ret;

1924 1925 1926 1927 1928
    if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
        return AVERROR(ENOMEM);
    else
        avcodec_get_frame_defaults(ist->decoded_frame);
    decoded_frame = ist->decoded_frame;
1929

1930 1931
    ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
    if (ret < 0) {
1932
        return ret;
1933
    }
1934 1935 1936

    if (!*got_output) {
        /* no audio frame */
1937
        return ret;
1938 1939
    }

1940 1941 1942 1943 1944 1945 1946 1947 1948
    /* if the decoder provides a pts, use it instead of the last packet pts.
       the decoder could be delaying output by a packet or more. */
    if (decoded_frame->pts != AV_NOPTS_VALUE)
        ist->next_pts = decoded_frame->pts;

    /* increment next_pts to use for the case where the input stream does not
       have timestamps or there are multiple frames in the packet */
    ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                     avctx->sample_rate;
1949 1950 1951

    // preprocess audio (volume)
    if (audio_volume != 256) {
1952 1953 1954
        int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
        void *samples = decoded_frame->data[0];
        switch (avctx->sample_fmt) {
1955 1956 1957 1958 1959 1960
        case AV_SAMPLE_FMT_U8:
        {
            uint8_t *volp = samples;
            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
                int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
                *volp++ = av_clip_uint8(v);
1961
            }
1962
            break;
1963
        }
1964 1965 1966 1967 1968 1969
        case AV_SAMPLE_FMT_S16:
        {
            int16_t *volp = samples;
            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
                int v = ((*volp) * audio_volume + 128) >> 8;
                *volp++ = av_clip_int16(v);
1970
            }
1971
            break;
1972
        }
1973 1974 1975 1976 1977 1978 1979 1980
        case AV_SAMPLE_FMT_S32:
        {
            int32_t *volp = samples;
            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
                int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
                *volp++ = av_clipl_int32(v);
            }
            break;
1981
        }
1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
        case AV_SAMPLE_FMT_FLT:
        {
            float *volp = samples;
            float scale = audio_volume / 256.f;
            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
                *volp++ *= scale;
            }
            break;
        }
        case AV_SAMPLE_FMT_DBL:
        {
            double *volp = samples;
            double scale = audio_volume / 256.;
            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
                *volp++ *= scale;
            }
            break;
        }
        default:
            av_log(NULL, AV_LOG_FATAL,
                   "Audio volume adjustment on sample format %s is not supported.\n",
                   av_get_sample_fmt_name(ist->st->codec->sample_fmt));
            exit_program(1);
        }
    }

    rate_emu_sleep(ist);

    for (i = 0; i < nb_output_streams; i++) {
        OutputStream *ost = &output_streams[i];

        if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
            continue;
2015
        do_audio_out(output_files[ost->file_index].ctx, ost, ist, decoded_frame);
2016
    }
2017

2018
    return ret;
2019 2020 2021 2022 2023 2024 2025 2026
}

static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts, int64_t *pkt_dts)
{
    AVFrame *decoded_frame, *filtered_frame = NULL;
    void *buffer_to_free = NULL;
    int i, ret = 0;
    float quality = 0;
2027
#if CONFIG_AVFILTER
2028
    int frame_available = 1;
2029
#endif
2030
    int duration=0;
2031 2032
    int64_t *best_effort_timestamp;
    AVRational *frame_sample_aspect;
2033

2034
    if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2035
        return AVERROR(ENOMEM);
2036 2037 2038
    else
        avcodec_get_frame_defaults(ist->decoded_frame);
    decoded_frame = ist->decoded_frame;
2039 2040 2041 2042
    pkt->pts  = *pkt_pts;
    pkt->dts  = *pkt_dts;
    *pkt_pts  = AV_NOPTS_VALUE;

2043 2044 2045
    if (pkt->duration) {
        duration = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
    } else if(ist->st->codec->time_base.num != 0) {
2046
        int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2047
        duration = ((int64_t)AV_TIME_BASE *
2048
                          ist->st->codec->time_base.num * ticks) /
2049 2050 2051 2052 2053
                          ist->st->codec->time_base.den;
    }

    if(*pkt_dts != AV_NOPTS_VALUE && duration) {
        *pkt_dts += duration;
2054 2055
    }else
        *pkt_dts = AV_NOPTS_VALUE;
2056

2057 2058 2059
    ret = avcodec_decode_video2(ist->st->codec,
                                decoded_frame, got_output, pkt);
    if (ret < 0)
2060
        return ret;
2061

2062 2063 2064
    quality = same_quant ? decoded_frame->quality : 0;
    if (!*got_output) {
        /* no picture yet */
2065
        return ret;
2066
    }
2067

2068 2069 2070
    best_effort_timestamp= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "best_effort_timestamp");
    if(*best_effort_timestamp != AV_NOPTS_VALUE)
        ist->next_pts = ist->pts = *best_effort_timestamp;
2071

2072
    ist->next_pts += duration;
2073
    pkt->size = 0;
2074

2075
    pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2076

2077
#if CONFIG_AVFILTER
2078
    frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2079
    for(i=0;i<nb_output_streams;i++) {
2080
        OutputStream *ost = ost = &output_streams[i];
2081
        if(check_output_constraints(ist, ost) && ost->encoding_needed){
2082 2083
            if (!frame_sample_aspect->num)
                *frame_sample_aspect = ist->st->sample_aspect_ratio;
2084
            decoded_frame->pts = ist->pts;
2085
            if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER) {
2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100
                FrameBuffer      *buf = decoded_frame->opaque;
                AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
                                            decoded_frame->data, decoded_frame->linesize,
                                            AV_PERM_READ | AV_PERM_PRESERVE,
                                            ist->st->codec->width, ist->st->codec->height,
                                            ist->st->codec->pix_fmt);

                avfilter_copy_frame_props(fb, decoded_frame);
                fb->pts                 = ist->pts;
                fb->buf->priv           = buf;
                fb->buf->free           = filter_release_buffer;

                buf->refcount++;
                av_buffersrc_buffer(ost->input_video_filter, fb);
            } else
2101 2102 2103 2104
            if((av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, AV_VSRC_BUF_FLAG_OVERWRITE)) < 0){
                av_log(0, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
                exit_program(1);
            }
2105
        }
2106
    }
2107
#endif
2108

2109
    rate_emu_sleep(ist);
2110

2111 2112 2113 2114 2115 2116 2117 2118 2119
    for (i = 0; i < nb_output_streams; i++) {
        OutputStream *ost = &output_streams[i];
        int frame_size;

        if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
            continue;

#if CONFIG_AVFILTER
        if (ost->input_video_filter) {
2120
            frame_available = av_buffersink_poll_frame(ost->output_video_filter);
2121 2122 2123 2124
        }
        while (frame_available) {
            if (ost->output_video_filter) {
                AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
2125 2126
                if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0){
                    av_log(0, AV_LOG_WARNING, "AV Filter told us it has a frame available but failed to output one\n");
2127
                    goto cont;
2128
                }
2129 2130 2131 2132 2133 2134
                if (!ist->filtered_frame && !(ist->filtered_frame = avcodec_alloc_frame())) {
                    av_free(buffer_to_free);
                    return AVERROR(ENOMEM);
                } else
                    avcodec_get_frame_defaults(ist->filtered_frame);
                filtered_frame = ist->filtered_frame;
2135 2136 2137 2138
                *filtered_frame= *decoded_frame; //for me_threshold
                if (ost->picref) {
                    avfilter_fill_frame_from_video_buffer_ref(filtered_frame, ost->picref);
                    ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2139 2140
                }
            }
2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152
            if (ost->picref->video && !ost->frame_aspect_ratio)
                ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
#else
            filtered_frame = decoded_frame;
#endif

            do_video_out(output_files[ost->file_index].ctx, ost, ist, filtered_frame, &frame_size,
                         same_quant ? quality : ost->st->codec->global_quality);
            if (vstats_filename && frame_size)
                do_video_stats(output_files[ost->file_index].ctx, ost, frame_size);
#if CONFIG_AVFILTER
            cont:
2153
            frame_available = ost->output_video_filter && av_buffersink_poll_frame(ost->output_video_filter);
2154
            avfilter_unref_buffer(ost->picref);
2155
        }
2156
#endif
2157
    }
2158

2159 2160
    av_free(buffer_to_free);
    return ret;
2161 2162
}

2163
static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2164
{
2165 2166 2167 2168 2169 2170
    AVSubtitle subtitle;
    int i, ret = avcodec_decode_subtitle2(ist->st->codec,
                                          &subtitle, got_output, pkt);
    if (ret < 0)
        return ret;
    if (!*got_output)
2171
        return ret;
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184

    rate_emu_sleep(ist);

    for (i = 0; i < nb_output_streams; i++) {
        OutputStream *ost = &output_streams[i];

        if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
            continue;

        do_subtitle_out(output_files[ost->file_index].ctx, ost, ist, &subtitle, pkt->pts);
    }

    avsubtitle_free(&subtitle);
2185
    return ret;
2186
}
2187 2188

/* pkt = NULL means EOF (needed to flush decoder buffers) */
2189
static int output_packet(InputStream *ist,
2190
                         OutputStream *ost_table, int nb_ostreams,
2191
                         const AVPacket *pkt)
2192
{
2193
    int ret = 0, i;
2194
    int got_output;
2195
    int64_t pkt_dts = AV_NOPTS_VALUE;
2196
    int64_t pkt_pts = AV_NOPTS_VALUE;
2197

2198 2199
    AVPacket avpkt;

2200 2201
    if (ist->next_pts == AV_NOPTS_VALUE)
        ist->next_pts = ist->pts;
2202

2203 2204
    if (pkt == NULL) {
        /* EOF handling */
2205
        av_init_packet(&avpkt);
2206 2207
        avpkt.data = NULL;
        avpkt.size = 0;
2208
        goto handle_eof;
2209 2210
    } else {
        avpkt = *pkt;
2211 2212
    }

2213 2214
    if (pkt->dts != AV_NOPTS_VALUE) {
        if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2215 2216 2217
            ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
        pkt_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
    }
2218 2219
    if(pkt->pts != AV_NOPTS_VALUE)
        pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2220

2221
    // while we have more to decode or while the decoder did output something on EOF
2222
    while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2223
    handle_eof:
2224

2225 2226 2227
        ist->pts = ist->next_pts;

        if (avpkt.size && avpkt.size != pkt->size) {
2228 2229
            av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
                   "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2230 2231
            ist->showed_multi_packet_warning = 1;
        }
2232

2233
        switch (ist->st->codec->codec_type) {
2234 2235 2236 2237 2238 2239 2240 2241
        case AVMEDIA_TYPE_AUDIO:
            ret = transcode_audio    (ist, &avpkt, &got_output);
            break;
        case AVMEDIA_TYPE_VIDEO:
            ret = transcode_video    (ist, &avpkt, &got_output, &pkt_pts, &pkt_dts);
            break;
        case AVMEDIA_TYPE_SUBTITLE:
            ret = transcode_subtitles(ist, &avpkt, &got_output);
2242
            break;
2243 2244
        default:
            return -1;
2245
        }
2246

2247 2248
        if (ret < 0)
            return ret;
2249 2250 2251 2252

        avpkt.dts=
        avpkt.pts= AV_NOPTS_VALUE;

2253 2254 2255 2256 2257 2258 2259
        // touch data and size only if not EOF
        if (pkt) {
            if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
                ret = avpkt.size;
            avpkt.data += ret;
            avpkt.size -= ret;
        }
2260
        if (!got_output) {
2261
            continue;
2262
        }
2263
    }
2264

2265 2266 2267
    /* handle stream copy */
    if (!ist->decoding_needed) {
        rate_emu_sleep(ist);
2268
        ist->pts = ist->next_pts;
2269 2270 2271 2272 2273 2274
        switch (ist->st->codec->codec_type) {
        case AVMEDIA_TYPE_AUDIO:
            ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
                             ist->st->codec->sample_rate;
            break;
        case AVMEDIA_TYPE_VIDEO:
2275 2276 2277
            if (pkt->duration) {
                ist->next_pts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
            } else if(ist->st->codec->time_base.num != 0) {
2278
                int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2279 2280 2281
                ist->next_pts += ((int64_t)AV_TIME_BASE *
                                  ist->st->codec->time_base.num * ticks) /
                                  ist->st->codec->time_base.den;
2282
            }
2283
            break;
2284
        }
2285 2286
    }
    for (i = 0; pkt && i < nb_ostreams; i++) {
2287
        OutputStream *ost = &ost_table[i];
2288

2289 2290
        if (!check_output_constraints(ist, ost) || ost->encoding_needed)
            continue;
2291

2292
        do_streamcopy(ist, ost, pkt);
2293
    }
2294

2295 2296 2297
    return 0;
}

2298
static void print_sdp(OutputFile *output_files, int n)
2299 2300
{
    char sdp[2048];
2301
    int i;
2302
    AVFormatContext **avc = av_malloc(sizeof(*avc) * n);
2303 2304 2305 2306 2307

    if (!avc)
        exit_program(1);
    for (i = 0; i < n; i++)
        avc[i] = output_files[i].ctx;
2308

2309
    av_sdp_create(avc, n, sdp, sizeof(sdp));
2310
    printf("SDP:\n%s\n", sdp);
Luca Barbato's avatar
Luca Barbato committed
2311
    fflush(stdout);
2312
    av_freep(&avc);
2313
}
2314

2315 2316 2317 2318 2319 2320 2321
static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
                             char *error, int error_len)
{
    InputStream *ist = &input_streams[ist_index];
    if (ist->decoding_needed) {
        AVCodec *codec = ist->dec;
        if (!codec) {
2322
            snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2323 2324 2325
                    avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
            return AVERROR(EINVAL);
        }
2326

2327 2328
        ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
        if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2329 2330 2331 2332 2333
            ist->st->codec->get_buffer     = codec_get_buffer;
            ist->st->codec->release_buffer = codec_release_buffer;
            ist->st->codec->opaque         = ist;
        }

2334
        if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2335
            snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2336 2337 2338 2339 2340 2341 2342
                    ist->file_index, ist->st->index);
            return AVERROR(EINVAL);
        }
        assert_codec_experimental(ist->st->codec, 0);
        assert_avoptions(ist->opts);
    }

2343
    ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2344 2345 2346 2347 2348 2349
    ist->next_pts = AV_NOPTS_VALUE;
    ist->is_start = 1;

    return 0;
}

2350 2351
static int transcode_init(OutputFile *output_files, int nb_output_files,
                          InputFile  *input_files,  int nb_input_files)
Fabrice Bellard's avatar
Fabrice Bellard committed
2352
{
2353
    int ret = 0, i, j, k;
2354
    AVFormatContext *oc;
Fabrice Bellard's avatar
Fabrice Bellard committed
2355
    AVCodecContext *codec, *icodec;
2356
    OutputStream *ost;
2357
    InputStream *ist;
2358
    char error[1024];
2359
    int want_sdp = 1;
2360

2361 2362 2363 2364 2365 2366 2367
    /* init framerate emulation */
    for (i = 0; i < nb_input_files; i++) {
        InputFile *ifile = &input_files[i];
        if (ifile->rate_emu)
            for (j = 0; j < ifile->nb_streams; j++)
                input_streams[j + ifile->ist_index].start = av_gettime();
    }
Fabrice Bellard's avatar
Fabrice Bellard committed
2368 2369

    /* output stream init */
2370 2371 2372 2373
    for (i = 0; i < nb_output_files; i++) {
        oc = output_files[i].ctx;
        if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
            av_dump_format(oc, i, oc->filename, 1);
2374
            av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2375
            return AVERROR(EINVAL);
2376
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
2377 2378 2379
    }

    /* for each output stream, we compute the right encoding parameters */
2380 2381
    for (i = 0; i < nb_output_streams; i++) {
        ost = &output_streams[i];
2382
        oc  = output_files[ost->file_index].ctx;
2383
        ist = &input_streams[ost->source_index];
Fabrice Bellard's avatar
Fabrice Bellard committed
2384

2385 2386 2387
        if (ost->attachment_filename)
            continue;

2388
        codec  = ost->st->codec;
2389
        icodec = ist->st->codec;
Fabrice Bellard's avatar
Fabrice Bellard committed
2390

2391 2392
        ost->st->disposition          = ist->st->disposition;
        codec->bits_per_raw_sample    = icodec->bits_per_raw_sample;
2393
        codec->chroma_sample_location = icodec->chroma_sample_location;
2394

2395
        if (ost->stream_copy) {
2396 2397
            uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;

2398
            if (extra_size > INT_MAX) {
2399
                return AVERROR(EINVAL);
2400
            }
2401

2402
            /* if stream_copy is selected, no need to decode or encode */
2403
            codec->codec_id   = icodec->codec_id;
2404
            codec->codec_type = icodec->codec_type;
2405

2406 2407 2408 2409
            if (!codec->codec_tag) {
                if (!oc->oformat->codec_tag ||
                     av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
                     av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2410 2411 2412
                    codec->codec_tag = icodec->codec_tag;
            }

2413
            codec->bit_rate       = icodec->bit_rate;
2414 2415
            codec->rc_max_rate    = icodec->rc_max_rate;
            codec->rc_buffer_size = icodec->rc_buffer_size;
2416
            codec->field_order    = icodec->field_order;
2417
            codec->extradata      = av_mallocz(extra_size);
2418
            if (!codec->extradata) {
2419
                return AVERROR(ENOMEM);
2420
            }
2421
            memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2422
            codec->extradata_size= icodec->extradata_size;
2423 2424

            codec->time_base = ist->st->time_base;
2425
            if(!strcmp(oc->oformat->name, "avi")) {
2426 2427 2428
                if (   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
                                 && av_q2d(ist->st->time_base) < 1.0/500
                    || copy_tb==0){
2429 2430 2431 2432
                    codec->time_base = icodec->time_base;
                    codec->time_base.num *= icodec->ticks_per_frame;
                    codec->time_base.den *= 2;
                }
2433 2434 2435 2436
            } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
                      && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
                      && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
            ) {
2437 2438 2439
                if(   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
                                && av_q2d(ist->st->time_base) < 1.0/500
                   || copy_tb==0){
2440 2441 2442 2443 2444 2445 2446
                    codec->time_base = icodec->time_base;
                    codec->time_base.num *= icodec->ticks_per_frame;
                }
            }
            av_reduce(&codec->time_base.num, &codec->time_base.den,
                        codec->time_base.num, codec->time_base.den, INT_MAX);

2447
            switch (codec->codec_type) {
2448
            case AVMEDIA_TYPE_AUDIO:
2449
                if (audio_volume != 256) {
2450
                    av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2451
                    exit_program(1);
2452
                }
2453 2454 2455 2456
                codec->channel_layout     = icodec->channel_layout;
                codec->sample_rate        = icodec->sample_rate;
                codec->channels           = icodec->channels;
                codec->frame_size         = icodec->frame_size;
2457
                codec->audio_service_type = icodec->audio_service_type;
2458
                codec->block_align        = icodec->block_align;
2459
                break;
2460
            case AVMEDIA_TYPE_VIDEO:
2461 2462 2463 2464
                codec->pix_fmt            = icodec->pix_fmt;
                codec->width              = icodec->width;
                codec->height             = icodec->height;
                codec->has_b_frames       = icodec->has_b_frames;
2465
                if (!codec->sample_aspect_ratio.num) {
2466
                    codec->sample_aspect_ratio   =
2467 2468 2469 2470 2471
                    ost->st->sample_aspect_ratio =
                        ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
                        ist->st->codec->sample_aspect_ratio.num ?
                        ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
                }
2472
                ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2473
                break;
2474
            case AVMEDIA_TYPE_SUBTITLE:
2475
                codec->width  = icodec->width;
2476
                codec->height = icodec->height;
2477
                break;
2478
            case AVMEDIA_TYPE_DATA:
2479
            case AVMEDIA_TYPE_ATTACHMENT:
2480
                break;
2481
            default:
2482
                abort();
2483 2484
            }
        } else {
2485 2486
            if (!ost->enc)
                ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2487

2488 2489
            ist->decoding_needed = 1;
            ost->encoding_needed = 1;
2490

2491
            switch (codec->codec_type) {
2492
            case AVMEDIA_TYPE_AUDIO:
2493
                ost->fifo = av_fifo_alloc(1024);
2494
                if (!ost->fifo) {
2495
                    return AVERROR(ENOMEM);
2496
                }
2497
                if (!codec->sample_rate)
2498
                    codec->sample_rate = icodec->sample_rate;
2499
                choose_sample_rate(ost->st, ost->enc);
2500
                codec->time_base = (AVRational){ 1, codec->sample_rate };
2501

2502 2503 2504
                if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
                    codec->sample_fmt = icodec->sample_fmt;
                choose_sample_fmt(ost->st, ost->enc);
2505

2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522
                if (ost->audio_channels_mapped) {
                    /* the requested output channel is set to the number of
                     * -map_channel only if no -ac are specified */
                    if (!codec->channels) {
                        codec->channels       = ost->audio_channels_mapped;
                        codec->channel_layout = av_get_default_channel_layout(codec->channels);
                        if (!codec->channel_layout) {
                            av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
                            exit_program(1);
                        }
                    }
                    /* fill unused channel mapping with -1 (which means a muted
                     * channel in case the number of output channels is bigger
                     * than the number of mapped channel) */
                    for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
                        ost->audio_channels_map[j] = -1;
                } else if (!codec->channels) {
2523
                    codec->channels = icodec->channels;
2524 2525
                    codec->channel_layout = icodec->channel_layout;
                }
2526 2527
                if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
                    codec->channel_layout = 0;
2528 2529 2530 2531 2532

                ost->audio_resample       = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
                ost->audio_resample      |=    codec->sample_fmt     != icodec->sample_fmt
                                            || codec->channel_layout != icodec->channel_layout;
                icodec->request_channels  = codec->channels;
2533 2534 2535
                ost->resample_sample_fmt  = icodec->sample_fmt;
                ost->resample_sample_rate = icodec->sample_rate;
                ost->resample_channels    = icodec->channels;
2536
                break;
2537
            case AVMEDIA_TYPE_VIDEO:
2538 2539 2540 2541
                if (codec->pix_fmt == PIX_FMT_NONE)
                    codec->pix_fmt = icodec->pix_fmt;
                choose_pixel_fmt(ost->st, ost->enc);

2542
                if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2543
                    av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2544
                    exit_program(1);
2545
                }
2546 2547 2548 2549 2550 2551

                if (!codec->width || !codec->height) {
                    codec->width  = icodec->width;
                    codec->height = icodec->height;
                }

2552 2553 2554
                ost->video_resample = codec->width   != icodec->width  ||
                                      codec->height  != icodec->height ||
                                      codec->pix_fmt != icodec->pix_fmt;
2555
                if (ost->video_resample) {
2556
                    codec->bits_per_raw_sample = frame_bits_per_raw_sample;
Fabrice Bellard's avatar
Fabrice Bellard committed
2557
                }
2558

2559 2560 2561
                ost->resample_height  = icodec->height;
                ost->resample_width   = icodec->width;
                ost->resample_pix_fmt = icodec->pix_fmt;
2562

2563
                if (!ost->frame_rate.num)
2564
                    ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
2565
                if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2566 2567
                    int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
                    ost->frame_rate = ost->enc->supported_framerates[idx];
2568 2569
                }
                codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2570
                if (   av_q2d(codec->time_base) < 0.001 && video_sync_method
2571 2572
                   && (video_sync_method==1 || (video_sync_method<0 && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
                    av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2573 2574
                                               "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
                }
2575 2576 2577 2578
                for (j = 0; j < ost->forced_kf_count; j++)
                    ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
                                                         AV_TIME_BASE_Q,
                                                         codec->time_base);
2579

2580
#if CONFIG_AVFILTER
2581
                if (configure_video_filters(ist, ost)) {
2582
                    av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2583 2584 2585
                    exit(1);
                }
#endif
2586
                break;
2587
            case AVMEDIA_TYPE_SUBTITLE:
2588
                break;
2589
            default:
2590
                abort();
2591
                break;
Fabrice Bellard's avatar
Fabrice Bellard committed
2592
            }
2593
            /* two pass mode */
2594
            if (codec->codec_id != CODEC_ID_H264 &&
2595 2596 2597
                (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
                char logfilename[1024];
                FILE *f;
2598 2599

                snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2600 2601
                         pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
                         i);
2602
                if (codec->flags & CODEC_FLAG_PASS2) {
2603 2604
                    char  *logbuffer;
                    size_t logbuffer_size;
2605
                    if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2606 2607
                        av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
                               logfilename);
2608
                        exit_program(1);
2609 2610
                    }
                    codec->stats_in = logbuffer;
2611
                }
2612 2613 2614 2615 2616 2617 2618 2619 2620
                if (codec->flags & CODEC_FLAG_PASS1) {
                    f = fopen(logfilename, "wb");
                    if (!f) {
                        av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
                               logfilename, strerror(errno));
                        exit_program(1);
                    }
                    ost->logfile = f;
                }
2621 2622
            }
        }
2623
        if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2624
            /* maximum video buffer size is 6-bytes per pixel, plus DPX header size (1664)*/
2625 2626
            int size        = codec->width * codec->height;
            bit_buffer_size = FFMAX(bit_buffer_size, 7*size + 10000);
2627
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
2628 2629
    }

2630 2631
    if (!bit_buffer)
        bit_buffer = av_malloc(bit_buffer_size);
2632
    if (!bit_buffer) {
2633 2634
        av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
               bit_buffer_size);
2635
        return AVERROR(ENOMEM);
2636 2637
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
2638
    /* open each encoder */
2639 2640
    for (i = 0; i < nb_output_streams; i++) {
        ost = &output_streams[i];
Fabrice Bellard's avatar
Fabrice Bellard committed
2641
        if (ost->encoding_needed) {
2642
            AVCodec      *codec = ost->enc;
2643
            AVCodecContext *dec = input_streams[ost->source_index].st->codec;
Fabrice Bellard's avatar
Fabrice Bellard committed
2644
            if (!codec) {
2645
                snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2646
                         avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2647 2648
                ret = AVERROR(EINVAL);
                goto dump_format;
Fabrice Bellard's avatar
Fabrice Bellard committed
2649
            }
2650 2651 2652 2653 2654 2655 2656 2657 2658
            if (dec->subtitle_header) {
                ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
                if (!ost->st->codec->subtitle_header) {
                    ret = AVERROR(ENOMEM);
                    goto dump_format;
                }
                memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
                ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
            }
2659
            if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2660
                snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
Fabrice Bellard's avatar
Fabrice Bellard committed
2661
                        ost->file_index, ost->index);
2662 2663
                ret = AVERROR(EINVAL);
                goto dump_format;
Fabrice Bellard's avatar
Fabrice Bellard committed
2664
            }
2665
            assert_codec_experimental(ost->st->codec, 1);
2666
            assert_avoptions(ost->opts);
2667 2668
            if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
                av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2669
                                             " It takes bits/s as argument, not kbits/s\n");
2670
            extra_size += ost->st->codec->extradata_size;
2671 2672 2673

            if (ost->st->codec->me_threshold)
                input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
Fabrice Bellard's avatar
Fabrice Bellard committed
2674 2675 2676
        }
    }

2677 2678
    /* init input streams */
    for (i = 0; i < nb_input_streams; i++)
2679
        if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2680
            goto dump_format;
2681

2682 2683 2684 2685 2686 2687 2688 2689 2690 2691
    /* discard unused programs */
    for (i = 0; i < nb_input_files; i++) {
        InputFile *ifile = &input_files[i];
        for (j = 0; j < ifile->ctx->nb_programs; j++) {
            AVProgram *p = ifile->ctx->programs[j];
            int discard  = AVDISCARD_ALL;

            for (k = 0; k < p->nb_stream_indexes; k++)
                if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
                    discard = AVDISCARD_DEFAULT;
2692 2693
                    break;
                }
2694
            p->discard = discard;
Fabrice Bellard's avatar
Fabrice Bellard committed
2695 2696 2697 2698
        }
    }

    /* open files and write file headers */
2699
    for (i = 0; i < nb_output_files; i++) {
2700 2701 2702
        oc = output_files[i].ctx;
        oc->interrupt_callback = int_cb;
        if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2703
            snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2704
            ret = AVERROR(EINVAL);
2705
            goto dump_format;
2706
        }
2707
//        assert_avoptions(output_files[i].opts);
2708
        if (strcmp(oc->oformat->name, "rtp")) {
2709 2710 2711
            want_sdp = 0;
        }
    }
2712 2713 2714 2715

 dump_format:
    /* dump the file output parameters - cannot be done before in case
       of stream copy */
2716
    for (i = 0; i < nb_output_files; i++) {
2717
        av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2718 2719 2720
    }

    /* dump the stream mapping */
2721 2722 2723
    av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
    for (i = 0; i < nb_output_streams; i++) {
        ost = &output_streams[i];
2724 2725 2726 2727 2728 2729

        if (ost->attachment_filename) {
            /* an attached file */
            av_log(NULL, AV_LOG_INFO, "  File %s -> Stream #%d:%d\n",
                   ost->attachment_filename, ost->file_index, ost->index);
            continue;
2730
        }
2731
        av_log(NULL, AV_LOG_INFO, "  Stream #%d:%d -> #%d:%d",
2732 2733 2734 2735
               input_streams[ost->source_index].file_index,
               input_streams[ost->source_index].st->index,
               ost->file_index,
               ost->index);
2736 2737 2738 2739 2740 2741 2742 2743 2744
        if (ost->audio_channels_mapped) {
            av_log(NULL, AV_LOG_INFO, " [ch:");
            for (j = 0; j < ost->audio_channels_mapped; j++)
                if (ost->audio_channels_map[j] == -1)
                    av_log(NULL, AV_LOG_INFO, " M");
                else
                    av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
            av_log(NULL, AV_LOG_INFO, "]");
        }
2745
        if (ost->sync_ist != &input_streams[ost->source_index])
2746
            av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2747 2748
                   ost->sync_ist->file_index,
                   ost->sync_ist->st->index);
2749
        if (ost->stream_copy)
2750 2751 2752 2753 2754 2755
            av_log(NULL, AV_LOG_INFO, " (copy)");
        else
            av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
                   input_streams[ost->source_index].dec->name : "?",
                   ost->enc ? ost->enc->name : "?");
        av_log(NULL, AV_LOG_INFO, "\n");
2756 2757 2758
    }

    if (ret) {
2759
        av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2760
        return ret;
2761 2762
    }

2763 2764
    if (want_sdp) {
        print_sdp(output_files, nb_output_files);
Fabrice Bellard's avatar
Fabrice Bellard committed
2765 2766
    }

2767 2768 2769 2770 2771 2772
    return 0;
}

/*
 * The following code is the main loop of the file converter
 */
2773 2774
static int transcode(OutputFile *output_files, int nb_output_files,
                     InputFile  *input_files,  int nb_input_files)
2775 2776 2777 2778 2779 2780
{
    int ret, i;
    AVFormatContext *is, *os;
    OutputStream *ost;
    InputStream *ist;
    uint8_t *no_packet;
2781
    int no_packet_count = 0;
2782 2783 2784 2785 2786 2787 2788 2789 2790 2791
    int64_t timer_start;
    int key;

    if (!(no_packet = av_mallocz(nb_input_files)))
        exit_program(1);

    ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
    if (ret < 0)
        goto fail;

2792
    if (!using_stdin) {
2793
        av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2794
    }
2795

2796
    timer_start = av_gettime();
2797

2798
    for (; received_sigterm == 0;) {
Fabrice Bellard's avatar
Fabrice Bellard committed
2799 2800
        int file_index, ist_index;
        AVPacket pkt;
2801
        int64_t ipts_min;
2802
        double opts_min;
2803
        int64_t cur_time= av_gettime();
2804

2805 2806
        ipts_min = INT64_MAX;
        opts_min = 1e100;
2807
        /* if 'q' pressed, exits */
2808
        if (!using_stdin) {
2809
            static int64_t last_time;
2810
            if (received_nb_signals)
2811
                break;
2812
            /* read_key() returns 0 on EOF */
2813 2814 2815 2816 2817
            if(cur_time - last_time >= 100000 && !run_as_daemon){
                key =  read_key();
                last_time = cur_time;
            }else
                key = -1;
2818 2819
            if (key == 'q')
                break;
2820 2821
            if (key == '+') av_log_set_level(av_log_get_level()+10);
            if (key == '-') av_log_set_level(av_log_get_level()-10);
2822 2823 2824 2825 2826 2827 2828 2829 2830 2831
            if (key == 's') qp_hist     ^= 1;
            if (key == 'h'){
                if (do_hex_dump){
                    do_hex_dump = do_pkt_dump = 0;
                } else if(do_pkt_dump){
                    do_hex_dump = 1;
                } else
                    do_pkt_dump = 1;
                av_log_set_level(AV_LOG_DEBUG);
            }
2832
#if CONFIG_AVFILTER
2833
            if (key == 'c' || key == 'C'){
2834 2835
                char buf[4096], target[64], command[256], arg[256] = {0};
                double time;
2836
                int k, n = 0;
2837
                fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2838 2839 2840 2841 2842
                i = 0;
                while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
                    if (k > 0)
                        buf[i++] = k;
                buf[i] = 0;
2843 2844 2845 2846
                if (k > 0 &&
                    (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
                    av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
                           target, time, command, arg);
2847
                    for (i = 0; i < nb_output_streams; i++) {
2848
                        ost = &output_streams[i];
2849 2850 2851 2852 2853 2854 2855
                        if (ost->graph) {
                            if (time < 0) {
                                ret = avfilter_graph_send_command(ost->graph, target, command, arg, buf, sizeof(buf),
                                                                  key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
                                fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
                            } else {
                                ret = avfilter_graph_queue_command(ost->graph, target, command, arg, 0, time);
2856
                            }
2857 2858
                        }
                    }
2859
                } else {
2860 2861 2862
                    av_log(NULL, AV_LOG_ERROR,
                           "Parse error, at least 3 arguments were expected, "
                           "only %d given in string '%s'\n", n, buf);
2863 2864
                }
            }
2865
#endif
2866 2867 2868
            if (key == 'd' || key == 'D'){
                int debug=0;
                if(key == 'D') {
2869
                    debug = input_streams[0].st->codec->debug<<1;
2870 2871 2872 2873
                    if(!debug) debug = 1;
                    while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
                        debug += debug;
                }else
2874 2875
                    if(scanf("%d", &debug)!=1)
                        fprintf(stderr,"error parsing debug value\n");
2876 2877
                for(i=0;i<nb_input_streams;i++) {
                    input_streams[i].st->codec->debug = debug;
2878
                }
2879 2880
                for(i=0;i<nb_output_streams;i++) {
                    ost = &output_streams[i];
2881 2882 2883 2884 2885
                    ost->st->codec->debug = debug;
                }
                if(debug) av_log_set_level(AV_LOG_DEBUG);
                fprintf(stderr,"debug=%d\n", debug);
            }
2886 2887 2888 2889 2890
            if (key == '?'){
                fprintf(stderr, "key    function\n"
                                "?      show this help\n"
                                "+      increase verbosity\n"
                                "-      decrease verbosity\n"
2891
                                "c      Send command to filtergraph\n"
2892
                                "D      cycle through available debug modes\n"
2893 2894 2895 2896 2897
                                "h      dump packets/hex press to cycle through the 3 states\n"
                                "q      quit\n"
                                "s      Show QP histogram\n"
                );
            }
2898
        }
2899

2900 2901
        /* select the stream that we must read now by looking at the
           smallest output pts */
Fabrice Bellard's avatar
Fabrice Bellard committed
2902
        file_index = -1;
2903
        for (i = 0; i < nb_output_streams; i++) {
2904
            OutputFile *of;
2905 2906
            int64_t ipts;
            double  opts;
2907
            ost = &output_streams[i];
2908
            of = &output_files[ost->file_index];
2909
            os = output_files[ost->file_index].ctx;
2910
            ist = &input_streams[ost->source_index];
2911 2912
            if (ost->is_past_recording_time || no_packet[ist->file_index] ||
                (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2913
                continue;
2914
            opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2915
            ipts = ist->pts;
2916 2917
            if (!input_files[ist->file_index].eof_reached) {
                if (ipts < ipts_min) {
2918
                    ipts_min = ipts;
2919 2920
                    if (input_sync)
                        file_index = ist->file_index;
2921
                }
2922
                if (opts < opts_min) {
2923
                    opts_min = opts;
2924
                    if (!input_sync) file_index = ist->file_index;
2925
                }
Fabrice Bellard's avatar
Fabrice Bellard committed
2926
            }
2927 2928
            if (ost->frame_number >= ost->max_frames) {
                int j;
2929 2930
                for (j = 0; j < of->ctx->nb_streams; j++)
                    output_streams[of->ost_index + j].is_past_recording_time = 1;
2931
                continue;
2932
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
2933 2934
        }
        /* if none, if is finished */
2935
        if (file_index < 0) {
2936 2937
            if (no_packet_count) {
                no_packet_count = 0;
2938
                memset(no_packet, 0, nb_input_files);
2939
                usleep(10000);
2940 2941
                continue;
            }
Fabrice Bellard's avatar
Fabrice Bellard committed
2942
            break;
2943 2944
        }

2945
        /* read a frame from it and output it in the fifo */
2946 2947 2948 2949
        is  = input_files[file_index].ctx;
        ret = av_read_frame(is, &pkt);
        if (ret == AVERROR(EAGAIN)) {
            no_packet[file_index] = 1;
2950
            no_packet_count++;
2951
            continue;
2952
        }
2953
        if (ret < 0) {
2954
            input_files[file_index].eof_reached = 1;
Alex Beregszaszi's avatar
Alex Beregszaszi committed
2955 2956 2957 2958
            if (opt_shortest)
                break;
            else
                continue;
Fabrice Bellard's avatar
Fabrice Bellard committed
2959
        }
2960

2961
        no_packet_count = 0;
2962
        memset(no_packet, 0, nb_input_files);
2963

2964
        if (do_pkt_dump) {
2965 2966
            av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
                             is->streams[pkt.stream_index]);
2967
        }
2968 2969
        /* the following test is needed in case new streams appear
           dynamically in stream : we ignore them */
2970
        if (pkt.stream_index >= input_files[file_index].nb_streams)
2971
            goto discard_packet;
2972 2973
        ist_index = input_files[file_index].ist_index + pkt.stream_index;
        ist = &input_streams[ist_index];
2974 2975
        if (ist->discard)
            goto discard_packet;
Fabrice Bellard's avatar
Fabrice Bellard committed
2976

2977
        if (pkt.dts != AV_NOPTS_VALUE)
2978
            pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2979
        if (pkt.pts != AV_NOPTS_VALUE)
2980
            pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2981

2982
        if (pkt.pts != AV_NOPTS_VALUE)
2983
            pkt.pts *= ist->ts_scale;
2984
        if (pkt.dts != AV_NOPTS_VALUE)
2985
            pkt.dts *= ist->ts_scale;
2986

2987 2988 2989 2990
        //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
        //        ist->next_pts,
        //        pkt.dts, input_files[ist->file_index].ts_offset,
        //        ist->st->codec->codec_type);
2991 2992
        if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
            && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2993 2994
            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;
2995 2996 2997 2998
            if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
                (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
                 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
                pkt_dts+1<ist->pts)&& !copy_ts){
2999
                input_files[ist->file_index].ts_offset -= delta;
3000 3001
                av_log(NULL, AV_LOG_DEBUG,
                       "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3002
                       delta, input_files[ist->file_index].ts_offset);
3003
                pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3004
                if (pkt.pts != AV_NOPTS_VALUE)
3005
                    pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3006 3007 3008
            }
        }

3009
        // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3010
        if (output_packet(ist, output_streams, nb_output_streams, &pkt) < 0) {
3011

3012
            av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3013
                   ist->file_index, ist->st->index);
3014
            if (exit_on_error)
3015
                exit_program(1);
3016
            av_free_packet(&pkt);
3017
            continue;
Michael Niedermayer's avatar
Michael Niedermayer committed
3018
        }
3019

3020
    discard_packet:
Fabrice Bellard's avatar
Fabrice Bellard committed
3021
        av_free_packet(&pkt);
3022

3023
        /* dump report by using the output first video and audio streams */
3024
        print_report(output_files, output_streams, nb_output_streams, 0, timer_start, cur_time);
Fabrice Bellard's avatar
Fabrice Bellard committed
3025
    }
3026 3027

    /* at the end of stream, we must flush the decoder buffers */
3028 3029
    for (i = 0; i < nb_input_streams; i++) {
        ist = &input_streams[i];
3030
        if (ist->decoding_needed) {
3031
            output_packet(ist, output_streams, nb_output_streams, NULL);
3032 3033
        }
    }
3034
    flush_encoders(output_streams, nb_output_streams);
3035

3036
    term_exit();
Fabrice Bellard's avatar
Fabrice Bellard committed
3037

3038
    /* write the trailer if needed and close file */
3039
    for (i = 0; i < nb_output_files; i++) {
3040
        os = output_files[i].ctx;
3041 3042 3043
        av_write_trailer(os);
    }

3044
    /* dump report by using the first video and audio streams */
3045
    print_report(output_files, output_streams, nb_output_streams, 1, timer_start, av_gettime());
3046

Fabrice Bellard's avatar
Fabrice Bellard committed
3047
    /* close each encoder */
3048 3049
    for (i = 0; i < nb_output_streams; i++) {
        ost = &output_streams[i];
Fabrice Bellard's avatar
Fabrice Bellard committed
3050
        if (ost->encoding_needed) {
3051 3052
            av_freep(&ost->st->codec->stats_in);
            avcodec_close(ost->st->codec);
Fabrice Bellard's avatar
Fabrice Bellard committed
3053
        }
3054 3055 3056
#if CONFIG_AVFILTER
        avfilter_graph_free(&ost->graph);
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
3057
    }
3058

Fabrice Bellard's avatar
Fabrice Bellard committed
3059
    /* close each decoder */
3060 3061
    for (i = 0; i < nb_input_streams; i++) {
        ist = &input_streams[i];
Fabrice Bellard's avatar
Fabrice Bellard committed
3062
        if (ist->decoding_needed) {
3063
            avcodec_close(ist->st->codec);
Fabrice Bellard's avatar
Fabrice Bellard committed
3064 3065 3066 3067
        }
    }

    /* finished ! */
3068
    ret = 0;
3069

3070
 fail:
3071
    av_freep(&bit_buffer);
3072
    av_freep(&no_packet);
Fabrice Bellard's avatar
Fabrice Bellard committed
3073

3074 3075 3076
    if (output_streams) {
        for (i = 0; i < nb_output_streams; i++) {
            ost = &output_streams[i];
Fabrice Bellard's avatar
Fabrice Bellard committed
3077
            if (ost) {
3078
                if (ost->stream_copy)
3079
                    av_freep(&ost->st->codec->extradata);
3080 3081 3082 3083
                if (ost->logfile) {
                    fclose(ost->logfile);
                    ost->logfile = NULL;
                }
3084
                av_fifo_free(ost->fifo); /* works even if fifo is not
3085
                                             initialized but set to zero */
3086
                av_freep(&ost->st->codec->subtitle_header);
3087
                av_free(ost->resample_frame.data[0]);
3088
                av_free(ost->forced_kf_pts);
Fabrice Bellard's avatar
Fabrice Bellard committed
3089
                if (ost->video_resample)
3090
                    sws_freeContext(ost->img_resample_ctx);
Michael Niedermayer's avatar
Michael Niedermayer committed
3091
                swr_free(&ost->swr);
3092
                av_dict_free(&ost->opts);
Fabrice Bellard's avatar
Fabrice Bellard committed
3093 3094 3095 3096 3097 3098
            }
        }
    }
    return ret;
}

3099
static int opt_frame_crop(const char *opt, const char *arg)
3100
{
3101
    av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3102
    return AVERROR(EINVAL);
3103 3104
}

3105 3106
static int opt_pad(const char *opt, const char *arg)
{
3107
    av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3108
    return -1;
3109 3110
}

3111
static double parse_frame_aspect_ratio(const char *arg)
3112 3113 3114 3115
{
    int x = 0, y = 0;
    double ar = 0;
    const char *p;
3116
    char *end;
3117

3118 3119
    p = strchr(arg, ':');
    if (p) {
3120 3121
        x = strtol(arg, &end, 10);
        if (end == p)
3122
            y = strtol(end + 1, &end, 10);
3123 3124
        if (x > 0 && y > 0)
            ar = (double)x / (double)y;
3125
    } else
3126
        ar = strtod(arg, NULL);
3127 3128

    if (!ar) {
3129
        av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
3130
        exit_program(1);
3131
    }
3132
    return ar;
Fabrice Bellard's avatar
Fabrice Bellard committed
3133 3134
}

3135
static int opt_video_channel(const char *opt, const char *arg)
3136
{
3137
    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3138
    return opt_default("channel", arg);
3139 3140
}

3141
static int opt_video_standard(const char *opt, const char *arg)
3142
{
3143
    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3144
    return opt_default("standard", arg);
3145 3146
}

3147
static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
3148
{
3149 3150
    audio_codec_name = arg;
    return parse_option(o, "codec:a", arg, options);
Fabrice Bellard's avatar
Fabrice Bellard committed
3151 3152
}

3153
static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3154
{
3155 3156
    video_codec_name = arg;
    return parse_option(o, "codec:v", arg, options);
3157 3158
}

3159
static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3160
{
3161 3162
    subtitle_codec_name = arg;
    return parse_option(o, "codec:s", arg, options);
3163 3164
}

3165
static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3166
{
3167
    return parse_option(o, "codec:d", arg, options);
3168 3169
}

3170
static int opt_map(OptionsContext *o, const char *opt, const char *arg)
Fabrice Bellard's avatar
Fabrice Bellard committed
3171
{
3172 3173
    StreamMap *m = NULL;
    int i, negative = 0, file_idx;
3174
    int sync_file_idx = -1, sync_stream_idx = 0;
3175 3176
    char *p, *sync;
    char *map;
Fabrice Bellard's avatar
Fabrice Bellard committed
3177

3178 3179 3180 3181 3182
    if (*arg == '-') {
        negative = 1;
        arg++;
    }
    map = av_strdup(arg);
Fabrice Bellard's avatar
Fabrice Bellard committed
3183

3184 3185 3186 3187 3188
    /* parse sync stream first, just pick first matching stream */
    if (sync = strchr(map, ',')) {
        *sync = 0;
        sync_file_idx = strtol(sync + 1, &sync, 0);
        if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3189
            av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3190 3191 3192 3193
            exit_program(1);
        }
        if (*sync)
            sync++;
3194
        for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
3195 3196 3197 3198 3199
            if (check_stream_specifier(input_files[sync_file_idx].ctx,
                                       input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
                sync_stream_idx = i;
                break;
            }
3200
        if (i == input_files[sync_file_idx].nb_streams) {
3201
            av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3202 3203 3204 3205
                                       "match any streams.\n", arg);
            exit_program(1);
        }
    }
Juanjo's avatar
Juanjo committed
3206

3207 3208 3209

    file_idx = strtol(map, &p, 0);
    if (file_idx >= nb_input_files || file_idx < 0) {
3210
        av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3211
        exit_program(1);
3212
    }
3213 3214
    if (negative)
        /* disable some already defined maps */
3215 3216
        for (i = 0; i < o->nb_stream_maps; i++) {
            m = &o->stream_maps[i];
3217 3218
            if (file_idx == m->file_index &&
                check_stream_specifier(input_files[m->file_index].ctx,
3219 3220 3221 3222 3223
                                       input_files[m->file_index].ctx->streams[m->stream_index],
                                       *p == ':' ? p + 1 : p) > 0)
                m->disabled = 1;
        }
    else
3224
        for (i = 0; i < input_files[file_idx].nb_streams; i++) {
3225 3226 3227
            if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
                        *p == ':' ? p + 1 : p) <= 0)
                continue;
3228 3229 3230
            o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
                                        &o->nb_stream_maps, o->nb_stream_maps + 1);
            m = &o->stream_maps[o->nb_stream_maps - 1];
3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244

            m->file_index   = file_idx;
            m->stream_index = i;

            if (sync_file_idx >= 0) {
                m->sync_file_index   = sync_file_idx;
                m->sync_stream_index = sync_stream_idx;
            } else {
                m->sync_file_index   = file_idx;
                m->sync_stream_index = i;
            }
        }

    if (!m) {
3245
        av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3246 3247 3248 3249
        exit_program(1);
    }

    av_freep(&map);
3250
    return 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
3251 3252
}

3253
static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3254
{
3255 3256 3257 3258
    o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
                                &o->nb_attachments, o->nb_attachments + 1);
    o->attachments[o->nb_attachments - 1] = arg;
    return 0;
3259 3260
}

3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320
static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
{
    int n;
    AVStream *st;
    AudioChannelMap *m;

    o->audio_channel_maps =
        grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
                   &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
    m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];

    /* muted channel syntax */
    n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
    if ((n == 1 || n == 3) && m->channel_idx == -1) {
        m->file_idx = m->stream_idx = -1;
        if (n == 1)
            m->ofile_idx = m->ostream_idx = -1;
        return 0;
    }

    /* normal syntax */
    n = sscanf(arg, "%d.%d.%d:%d.%d",
               &m->file_idx,  &m->stream_idx, &m->channel_idx,
               &m->ofile_idx, &m->ostream_idx);

    if (n != 3 && n != 5) {
        av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
               "[file.stream.channel|-1][:syncfile:syncstream]\n");
        exit_program(1);
    }

    if (n != 5) // only file.stream.channel specified
        m->ofile_idx = m->ostream_idx = -1;

    /* check input */
    if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
               m->file_idx);
        exit_program(1);
    }
    if (m->stream_idx < 0 ||
        m->stream_idx >= input_files[m->file_idx].nb_streams) {
        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
               m->file_idx, m->stream_idx);
        exit_program(1);
    }
    st = input_files[m->file_idx].ctx->streams[m->stream_idx];
    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
        av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
               m->file_idx, m->stream_idx);
        exit_program(1);
    }
    if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
               m->file_idx, m->stream_idx, m->channel_idx);
        exit_program(1);
    }
    return 0;
}

3321 3322 3323 3324 3325 3326 3327
/**
 * Parse a metadata specifier in arg.
 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
 * @param index for type c/p, chapter/program index is written here
 * @param stream_spec for type s, the stream specifier is written here
 */
static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3328
{
3329 3330
    if (*arg) {
        *type = *arg;
3331 3332 3333 3334
        switch (*arg) {
        case 'g':
            break;
        case 's':
3335 3336 3337 3338 3339 3340
            if (*(++arg) && *arg != ':') {
                av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
                exit_program(1);
            }
            *stream_spec = *arg == ':' ? arg + 1 : "";
            break;
3341 3342
        case 'c':
        case 'p':
3343 3344
            if (*(++arg) == ':')
                *index = strtol(++arg, NULL, 0);
3345 3346
            break;
        default:
3347
            av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3348
            exit_program(1);
3349 3350 3351 3352 3353
        }
    } else
        *type = 'g';
}

3354
static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3355
{
3356
    AVDictionary **meta_in = NULL;
3357
    AVDictionary **meta_out = NULL;
3358 3359 3360 3361
    int i, ret = 0;
    char type_in, type_out;
    const char *istream_spec = NULL, *ostream_spec = NULL;
    int idx_in = 0, idx_out = 0;
3362

3363 3364
    parse_meta_type(inspec,  &type_in,  &idx_in,  &istream_spec);
    parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3365

3366
    if (type_in == 'g' || type_out == 'g')
3367
        o->metadata_global_manual = 1;
3368
    if (type_in == 's' || type_out == 's')
3369
        o->metadata_streams_manual = 1;
3370
    if (type_in == 'c' || type_out == 'c')
3371
        o->metadata_chapters_manual = 1;
3372

3373 3374 3375 3376 3377 3378
#define METADATA_CHECK_INDEX(index, nb_elems, desc)\
    if ((index) < 0 || (index) >= (nb_elems)) {\
        av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
                (desc), (index));\
        exit_program(1);\
    }
3379

3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411
#define SET_DICT(type, meta, context, index)\
        switch (type) {\
        case 'g':\
            meta = &context->metadata;\
            break;\
        case 'c':\
            METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
            meta = &context->chapters[index]->metadata;\
            break;\
        case 'p':\
            METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
            meta = &context->programs[index]->metadata;\
            break;\
        }\

    SET_DICT(type_in, meta_in, ic, idx_in);
    SET_DICT(type_out, meta_out, oc, idx_out);

    /* for input streams choose first matching stream */
    if (type_in == 's') {
        for (i = 0; i < ic->nb_streams; i++) {
            if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
                meta_in = &ic->streams[i]->metadata;
                break;
            } else if (ret < 0)
                exit_program(1);
        }
        if (!meta_in) {
            av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match  any streams.\n", istream_spec);
            exit_program(1);
        }
    }
3412

3413 3414 3415 3416 3417 3418 3419 3420 3421 3422
    if (type_out == 's') {
        for (i = 0; i < oc->nb_streams; i++) {
            if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
                meta_out = &oc->streams[i]->metadata;
                av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
            } else if (ret < 0)
                exit_program(1);
        }
    } else
        av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
3423 3424

    return 0;
3425 3426
}

3427
static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
3428
{
3429 3430 3431 3432
    char buf[128];
    int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
    struct tm time = *gmtime((time_t*)&recording_timestamp);
    strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3433
    parse_option(o, "metadata", buf, options);
3434 3435 3436

    av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
                                 "tag instead.\n", opt);
3437
    return 0;
3438 3439
}

3440
static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3441 3442 3443 3444 3445 3446 3447
{
    const char *codec_string = encoder ? "encoder" : "decoder";
    AVCodec *codec;

    codec = encoder ?
        avcodec_find_encoder_by_name(name) :
        avcodec_find_decoder_by_name(name);
3448
    if (!codec) {
3449
        av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
3450 3451
        exit_program(1);
    }
3452
    if (codec->type != type) {
3453
        av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
3454 3455
        exit_program(1);
    }
3456
    return codec;
3457 3458
}

3459
static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
3460 3461 3462
{
    char *codec_name = NULL;

3463
    MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
3464 3465 3466 3467 3468 3469
    if (codec_name) {
        AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
        st->codec->codec_id = codec->id;
        return codec;
    } else
        return avcodec_find_decoder(st->codec->codec_id);
3470
}
3471

3472 3473 3474 3475
/**
 * Add all the streams from the given input file to the global
 * list of input streams.
 */
3476
static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
3477
{
3478
    int i;
3479
    char *next, *codec_tag = NULL;
3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490

    for (i = 0; i < ic->nb_streams; i++) {
        AVStream *st = ic->streams[i];
        AVCodecContext *dec = st->codec;
        InputStream *ist;

        input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
        ist = &input_streams[nb_input_streams - 1];
        ist->st = st;
        ist->file_index = nb_input_files;
        ist->discard = 1;
3491
        ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
3492

3493 3494
        ist->ts_scale = 1.0;
        MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
3495

3496 3497 3498 3499 3500 3501 3502 3503
        MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
        if (codec_tag) {
            uint32_t tag = strtol(codec_tag, &next, 0);
            if (*next)
                tag = AV_RL32(codec_tag);
            st->codec->codec_tag = tag;
        }

3504
        ist->dec = choose_decoder(o, ic, st);
3505 3506 3507

        switch (dec->codec_type) {
        case AVMEDIA_TYPE_AUDIO:
3508
            if (!ist->dec)
3509
                ist->dec = avcodec_find_decoder(dec->codec_id);
3510 3511
            if (o->audio_disable)
                st->discard = AVDISCARD_ALL;
3512 3513 3514 3515 3516 3517 3518 3519
            break;
        case AVMEDIA_TYPE_VIDEO:
            if(!ist->dec)
                ist->dec = avcodec_find_decoder(dec->codec_id);
            if (dec->lowres) {
                dec->flags |= CODEC_FLAG_EMU_EDGE;
            }

3520
            if (o->video_disable)
3521 3522 3523
                st->discard = AVDISCARD_ALL;
            else if (video_discard)
                st->discard = video_discard;
3524 3525
            break;
        case AVMEDIA_TYPE_DATA:
3526 3527
            if (o->data_disable)
                st->discard= AVDISCARD_ALL;
3528 3529 3530 3531
            break;
        case AVMEDIA_TYPE_SUBTITLE:
            if(!ist->dec)
                ist->dec = avcodec_find_decoder(dec->codec_id);
3532
            if(o->subtitle_disable)
3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543
                st->discard = AVDISCARD_ALL;
            break;
        case AVMEDIA_TYPE_ATTACHMENT:
        case AVMEDIA_TYPE_UNKNOWN:
            break;
        default:
            abort();
        }
    }
}

3544
static void assert_file_overwrite(const char *filename)
3545
{
3546
    if ((!file_overwrite || no_file_overwrite) &&
3547 3548 3549
        (strchr(filename, ':') == NULL || filename[1] == ':' ||
         av_strstart(filename, "file:", NULL))) {
        if (avio_check(filename, 0) == 0) {
3550
            if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
3551 3552 3553
                fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                fflush(stderr);
                term_exit();
3554
                signal(SIGINT, SIG_DFL);
3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566
                if (!read_yesno()) {
                    av_log(0, AV_LOG_FATAL, "Not overwriting - exiting\n");
                    exit_program(1);
                }
                term_init();
            }
            else {
                av_log(0, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
                exit_program(1);
            }
        }
    }
3567 3568
}

3569
static void dump_attachment(AVStream *st, const char *filename)
3570
{
3571 3572 3573
    int ret;
    AVIOContext *out = NULL;
    AVDictionaryEntry *e;
3574

3575 3576 3577 3578 3579 3580 3581 3582 3583 3584
    if (!st->codec->extradata_size) {
        av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
               nb_input_files - 1, st->index);
        return;
    }
    if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
        filename = e->value;
    if (!*filename) {
        av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
               "in stream #%d:%d.\n", nb_input_files - 1, st->index);
3585
        exit_program(1);
3586
    }
3587 3588 3589

    assert_file_overwrite(filename);

3590
    if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
3591 3592
        av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
               filename);
3593
        exit_program(1);
3594
    }
3595 3596 3597 3598

    avio_write(out, st->codec->extradata, st->codec->extradata_size);
    avio_flush(out);
    avio_close(out);
3599 3600
}

3601
static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
Fabrice Bellard's avatar
Fabrice Bellard committed
3602 3603
{
    AVFormatContext *ic;
3604
    AVInputFormat *file_iformat = NULL;
3605
    int err, i, ret;
3606
    int64_t timestamp;
3607
    uint8_t buf[128];
3608 3609
    AVDictionary **opts;
    int orig_nb_streams;                     // number of streams before avformat_find_stream_info
Fabrice Bellard's avatar
Fabrice Bellard committed
3610

3611 3612
    if (o->format) {
        if (!(file_iformat = av_find_input_format(o->format))) {
3613
            av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
3614
            exit_program(1);
3615
        }
3616 3617
    }

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

3621
    using_stdin |= !strncmp(filename, "pipe:", 5) ||
3622
                    !strcmp(filename, "/dev/stdin");
3623

Fabrice Bellard's avatar
Fabrice Bellard committed
3624
    /* get default parameters from command line */
3625
    ic = avformat_alloc_context();
3626 3627
    if (!ic) {
        print_error(filename, AVERROR(ENOMEM));
3628
        exit_program(1);
3629
    }
3630 3631
    if (o->nb_audio_sample_rate) {
        snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
3632 3633
        av_dict_set(&format_opts, "sample_rate", buf, 0);
    }
3634 3635
    if (o->nb_audio_channels) {
        snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3636 3637
        av_dict_set(&format_opts, "channels", buf, 0);
    }
3638 3639
    if (o->nb_frame_rates) {
        av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
3640
    }
3641 3642
    if (o->nb_frame_sizes) {
        av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
3643
    }
3644 3645
    if (o->nb_frame_pix_fmts)
        av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
3646

3647 3648 3649 3650 3651 3652
    ic->video_codec_id   = video_codec_name ?
        find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0)->id : CODEC_ID_NONE;
    ic->audio_codec_id   = audio_codec_name ?
        find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0)->id : CODEC_ID_NONE;
    ic->subtitle_codec_id= subtitle_codec_name ?
        find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
3653
    ic->flags |= AVFMT_FLAG_NONBLOCK;
3654
    ic->interrupt_callback = int_cb;
3655

Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
3656
    if (loop_input) {
3657 3658 3659 3660
        av_log(NULL, AV_LOG_WARNING,
            "-loop_input is deprecated, use -loop 1\n"
            "Note, both loop options only work with -f image2\n"
        );
Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
3661 3662 3663
        ic->loop_input = loop_input;
    }

3664
    /* open the input file with generic avformat function */
3665
    err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
Fabrice Bellard's avatar
Fabrice Bellard committed
3666
    if (err < 0) {
3667
        print_error(filename, err);
3668
        exit_program(1);
Fabrice Bellard's avatar
Fabrice Bellard committed
3669
    }
3670 3671
    assert_avoptions(format_opts);

3672 3673
    /* apply forced codec ids */
    for (i = 0; i < ic->nb_streams; i++)
3674
        choose_decoder(o, ic, ic->streams[i]);
3675

3676
    /* Set AVCodecContext options for avformat_find_stream_info */
3677
    opts = setup_find_stream_info_opts(ic, codec_opts);
3678
    orig_nb_streams = ic->nb_streams;
3679

3680 3681
    /* If not enough info to get the stream parameters, we decode the
       first frames to get it. (used in mpeg case for example) */
3682
    ret = avformat_find_stream_info(ic, opts);
3683 3684
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3685
        avformat_close_input(&ic);
3686
        exit_program(1);
Fabrice Bellard's avatar
Fabrice Bellard committed
3687 3688
    }

3689
    timestamp = o->start_time;
3690 3691 3692 3693
    /* add the stream start time */
    if (ic->start_time != AV_NOPTS_VALUE)
        timestamp += ic->start_time;

3694
    /* if seeking requested, we execute it */
3695
    if (o->start_time != 0) {
3696
        ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3697
        if (ret < 0) {
3698 3699
            av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
                   filename, (double)timestamp / AV_TIME_BASE);
3700 3701 3702
        }
    }

Fabrice Bellard's avatar
Fabrice Bellard committed
3703
    /* update the current parameters so that they match the one of the input stream */
3704
    add_input_streams(o, ic);
3705

Fabrice Bellard's avatar
Fabrice Bellard committed
3706
    /* dump the file content */
3707
    av_dump_format(ic, nb_input_files, filename, 0);
3708

3709 3710 3711
    input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
    input_files[nb_input_files - 1].ctx        = ic;
    input_files[nb_input_files - 1].ist_index  = nb_input_streams - ic->nb_streams;
3712
    input_files[nb_input_files - 1].ts_offset  = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3713
    input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
Michael Niedermayer's avatar
Michael Niedermayer committed
3714
    input_files[nb_input_files - 1].rate_emu   = o->rate_emu;
3715

3716 3717 3718 3719 3720 3721 3722 3723 3724 3725
    for (i = 0; i < o->nb_dump_attachment; i++) {
        int j;

        for (j = 0; j < ic->nb_streams; j++) {
            AVStream *st = ic->streams[j];

            if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
                dump_attachment(st, o->dump_attachment[i].u.str);
        }
    }
3726

3727 3728 3729
    for (i = 0; i < orig_nb_streams; i++)
        av_dict_free(&opts[i]);
    av_freep(&opts);
3730

3731
    reset_options(o, 1);
3732
    return 0;
Fabrice Bellard's avatar
Fabrice Bellard committed
3733 3734
}

3735
static void parse_forced_key_frames(char *kf, OutputStream *ost)
3736 3737 3738 3739 3740 3741 3742 3743
{
    char *p;
    int n = 1, i;

    for (p = kf; *p; p++)
        if (*p == ',')
            n++;
    ost->forced_kf_count = n;
3744
    ost->forced_kf_pts   = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3745 3746 3747 3748 3749 3750
    if (!ost->forced_kf_pts) {
        av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
        exit_program(1);
    }
    for (i = 0; i < n; i++) {
        p = i ? strchr(p, ',') + 1 : kf;
3751
        ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
3752 3753 3754
    }
}

3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788
static uint8_t *get_line(AVIOContext *s)
{
    AVIOContext *line;
    uint8_t *buf;
    char c;

    if (avio_open_dyn_buf(&line) < 0) {
        av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
        exit_program(1);
    }

    while ((c = avio_r8(s)) && c != '\n')
        avio_w8(line, c);
    avio_w8(line, 0);
    avio_close_dyn_buf(line, &buf);

    return buf;
}

static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
{
    int i, ret = 1;
    char filename[1000];
    const char *base[3] = { getenv("AVCONV_DATADIR"),
                            getenv("HOME"),
                            AVCONV_DATADIR,
                            };

    for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
        if (!base[i])
            continue;
        if (codec_name) {
            snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
                     i != 1 ? "" : "/.avconv", codec_name, preset_name);
3789
            ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3790 3791 3792 3793
        }
        if (ret) {
            snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
                     i != 1 ? "" : "/.avconv", preset_name);
3794
            ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3795 3796
        }
    }
3797
    return ret;
3798 3799
}

3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816
static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
{
    char *codec_name = NULL;

    MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
    if (!codec_name) {
        ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
                                                  NULL, ost->st->codec->codec_type);
        ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
    } else if (!strcmp(codec_name, "copy"))
        ost->stream_copy = 1;
    else {
        ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
        ost->st->codec->codec_id = ost->enc->id;
    }
}

3817
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3818 3819
{
    OutputStream *ost;
3820
    AVStream *st = avformat_new_stream(oc, NULL);
3821
    int idx      = oc->nb_streams - 1, ret = 0;
3822
    char *bsf = NULL, *next, *codec_tag = NULL;
3823
    AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3824
    double qscale = -1;
3825 3826
    char *buf = NULL, *arg = NULL, *preset = NULL;
    AVIOContext *s = NULL;
3827 3828

    if (!st) {
3829
        av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3830 3831 3832
        exit_program(1);
    }

3833 3834 3835
    if (oc->nb_streams - 1 < o->nb_streamid_map)
        st->id = o->streamid_map[oc->nb_streams - 1];

3836 3837 3838
    output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
                                nb_output_streams + 1);
    ost = &output_streams[nb_output_streams - 1];
3839
    ost->file_index = nb_output_files;
3840 3841
    ost->index      = idx;
    ost->st         = st;
3842
    st->codec->codec_type = type;
3843
    choose_encoder(o, oc, ost);
3844
    if (ost->enc) {
3845
        ost->opts  = filter_codec_opts(codec_opts, ost->enc, oc, st);
3846 3847 3848 3849 3850
    }

    avcodec_get_context_defaults3(st->codec, ost->enc);
    st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy

3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875
    MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
    if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
        do  {
            buf = get_line(s);
            if (!buf[0] || buf[0] == '#') {
                av_free(buf);
                continue;
            }
            if (!(arg = strchr(buf, '='))) {
                av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
                exit_program(1);
            }
            *arg++ = 0;
            av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
            av_free(buf);
        } while (!s->eof_reached);
        avio_close(s);
    }
    if (ret) {
        av_log(NULL, AV_LOG_FATAL,
               "Preset %s specified for stream %d:%d, but could not be opened.\n",
               preset, ost->file_index, ost->index);
        exit_program(1);
    }

3876 3877
    ost->max_frames = INT64_MAX;
    MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3878 3879 3880 3881 3882 3883

    MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
    while (bsf) {
        if (next = strchr(bsf, ','))
            *next++ = 0;
        if (!(bsfc = av_bitstream_filter_init(bsf))) {
3884
            av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3885
            exit_program(1);
3886
        }
3887 3888 3889 3890 3891 3892 3893
        if (bsfc_prev)
            bsfc_prev->next = bsfc;
        else
            ost->bitstream_filters = bsfc;

        bsfc_prev = bsfc;
        bsf       = next;
3894
    }
3895

3896 3897 3898 3899 3900 3901
    MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
    if (codec_tag) {
        uint32_t tag = strtol(codec_tag, &next, 0);
        if (*next)
            tag = AV_RL32(codec_tag);
        st->codec->codec_tag = tag;
3902
    }
3903

3904 3905 3906 3907 3908
    MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
    if (qscale >= 0 || same_quant) {
        st->codec->flags |= CODEC_FLAG_QSCALE;
        st->codec->global_quality = FF_QP2LAMBDA * qscale;
    }
3909

3910 3911
    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
        st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3912

3913
    av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3914 3915 3916
    return ost;
}

3917 3918 3919 3920
static void parse_matrix_coeffs(uint16_t *dest, const char *str)
{
    int i;
    const char *p = str;
3921
    for (i = 0;; i++) {
3922
        dest[i] = atoi(p);
3923
        if (i == 63)
3924 3925
            break;
        p = strchr(p, ',');
3926
        if (!p) {
3927
            av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3928 3929 3930 3931 3932
            exit_program(1);
        }
        p++;
    }
}
3933

3934
static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
Fabrice Bellard's avatar
Fabrice Bellard committed
3935 3936
{
    AVStream *st;
3937
    OutputStream *ost;
3938
    AVCodecContext *video_enc;
3939

3940
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3941
    st  = ost->st;
3942
    video_enc = st->codec;
3943

3944
    if (!ost->stream_copy) {
3945 3946 3947 3948
        const char *p = NULL;
        char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
        char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
        char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3949
        int i;
3950 3951 3952

        MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
        if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3953
            av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3954 3955
            exit_program(1);
        }
3956

3957 3958
        MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
        if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3959
            av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3960 3961
            exit_program(1);
        }
3962

3963 3964 3965
        MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
        if (frame_aspect_ratio)
            ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3966

3967
        video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3968 3969
        MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
        if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3970
            av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3971 3972
            exit_program(1);
        }
3973
        st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3974

3975
        if (intra_only)
3976
            video_enc->gop_size = 0;
3977 3978 3979
        MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
        if (intra_matrix) {
            if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3980
                av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3981 3982 3983 3984 3985 3986 3987
                exit_program(1);
            }
            parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
        }
        MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
        if (inter_matrix) {
            if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3988
                av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3989 3990 3991
                exit_program(1);
            }
            parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3992 3993
        }

3994
        MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3995
        for (i = 0; p; i++) {
3996
            int start, end, q;
3997 3998
            int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
            if (e != 3) {
3999
                av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4000
                exit_program(1);
4001
            }
4002
            /* FIXME realloc failure */
4003
            video_enc->rc_override =
4004
                av_realloc(video_enc->rc_override,
4005 4006 4007 4008 4009 4010
                           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;
4011
            }
4012 4013 4014
            else {
                video_enc->rc_override[i].qscale         = 0;
                video_enc->rc_override[i].quality_factor = -q/100.0;
4015
            }
4016 4017
            p = strchr(p, '/');
            if (p) p++;
4018
        }
4019
        video_enc->rc_override_count = i;
4020
        if (!video_enc->rc_initial_buffer_occupancy)
4021 4022
            video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
        video_enc->intra_dc_precision = intra_dc_precision - 8;
4023

4024 4025 4026
        if (do_psnr)
            video_enc->flags|= CODEC_FLAG_PSNR;

4027 4028
        /* two pass mode */
        if (do_pass) {
4029
            if (do_pass & 1) {
4030
                video_enc->flags |= CODEC_FLAG_PASS1;
4031 4032
            }
            if (do_pass & 2) {
4033 4034 4035
                video_enc->flags |= CODEC_FLAG_PASS2;
            }
        }
4036

4037
        MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4038
        if (forced_key_frames)
4039
            parse_forced_key_frames(forced_key_frames, ost);
4040

4041 4042 4043 4044
        MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);

        ost->top_field_first = -1;
        MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4045 4046 4047 4048 4049 4050

#if CONFIG_AVFILTER
        MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
        if (filters)
            ost->avfilter = av_strdup(filters);
#endif
4051 4052
    } else {
        MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4053 4054
    }

4055
    return ost;
4056 4057
}

4058
static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
4059
{
4060
    int n;
4061
    AVStream *st;
4062
    OutputStream *ost;
4063
    AVCodecContext *audio_enc;
4064

4065
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
4066
    st  = ost->st;
4067

4068
    audio_enc = st->codec;
4069
    audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4070

4071
    if (!ost->stream_copy) {
4072
        char *sample_fmt = NULL;
4073

4074 4075
        MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);

4076 4077 4078
        MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
        if (sample_fmt &&
            (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4079
            av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4080
            exit_program(1);
4081
        }
4082 4083

        MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4084 4085 4086

        ost->rematrix_volume=1.0;
        MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
4087
    }
4088

4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103
    /* check for channel mapping for this audio stream */
    for (n = 0; n < o->nb_audio_channel_maps; n++) {
        AudioChannelMap *map = &o->audio_channel_maps[n];
        InputStream *ist = &input_streams[ost->source_index];
        if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
            (map->ofile_idx   == -1 || ost->file_index == map->ofile_idx) &&
            (map->ostream_idx == -1 || ost->st->index  == map->ostream_idx)) {
            if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
                ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
            else
                av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
                       ost->file_index, ost->st->index);
        }
    }

4104
    return ost;
4105 4106
}

4107
static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
4108
{
4109
    OutputStream *ost;
4110

4111
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
4112
    if (!ost->stream_copy) {
4113
        av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4114
        exit_program(1);
4115 4116
    }

4117 4118
    return ost;
}
4119

4120 4121 4122
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
{
    OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
4123
    ost->stream_copy = 1;
4124
    return ost;
4125 4126
}

4127
static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
4128 4129
{
    AVStream *st;
4130
    OutputStream *ost;
4131
    AVCodecContext *subtitle_enc;
4132

4133
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
4134 4135
    st  = ost->st;
    subtitle_enc = st->codec;
4136

4137
    subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4138

4139
    return ost;
4140 4141
}

4142
/* arg format is "output-stream-index:streamid-value". */
4143
static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4144 4145 4146 4147 4148
{
    int idx;
    char *p;
    char idx_str[16];

4149
    av_strlcpy(idx_str, arg, sizeof(idx_str));
4150 4151
    p = strchr(idx_str, ':');
    if (!p) {
4152 4153 4154
        av_log(NULL, AV_LOG_FATAL,
               "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
               arg, opt);
4155
        exit_program(1);
4156 4157
    }
    *p++ = '\0';
4158
    idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4159 4160
    o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
    o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4161
    return 0;
4162
}
4163

4164
static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4165
{
4166 4167
    AVFormatContext *is = ifile->ctx;
    AVFormatContext *os = ofile->ctx;
4168 4169 4170 4171
    int i;

    for (i = 0; i < is->nb_chapters; i++) {
        AVChapter *in_ch = is->chapters[i], *out_ch;
4172
        int64_t ts_off   = av_rescale_q(ofile->start_time - ifile->ts_offset,
4173
                                       AV_TIME_BASE_Q, in_ch->time_base);
4174 4175
        int64_t rt       = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
                           av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191


        if (in_ch->end < ts_off)
            continue;
        if (rt != INT64_MAX && in_ch->start > rt + ts_off)
            break;

        out_ch = av_mallocz(sizeof(AVChapter));
        if (!out_ch)
            return AVERROR(ENOMEM);

        out_ch->id        = in_ch->id;
        out_ch->time_base = in_ch->time_base;
        out_ch->start     = FFMAX(0,  in_ch->start - ts_off);
        out_ch->end       = FFMIN(rt, in_ch->end   - ts_off);

4192
        if (copy_metadata)
4193 4194 4195
            av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);

        os->nb_chapters++;
4196
        os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4197 4198 4199 4200 4201 4202 4203
        if (!os->chapters)
            return AVERROR(ENOMEM);
        os->chapters[os->nb_chapters - 1] = out_ch;
    }
    return 0;
}

4204 4205 4206
static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
{
    int i, err;
4207
    AVFormatContext *ic = avformat_alloc_context();
4208

4209
    ic->interrupt_callback = int_cb;
4210 4211 4212 4213 4214 4215 4216 4217
    err = avformat_open_input(&ic, filename, NULL, NULL);
    if (err < 0)
        return err;
    /* copy stream format */
    for(i=0;i<ic->nb_streams;i++) {
        AVStream *st;
        OutputStream *ost;
        AVCodec *codec;
4218
        AVCodecContext *avctx;
4219 4220 4221 4222

        codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
        ost   = new_output_stream(o, s, codec->type);
        st    = ost->st;
4223
        avctx = st->codec;
4224
        ost->enc = codec;
4225 4226 4227 4228 4229

        // FIXME: a more elegant solution is needed
        memcpy(st, ic->streams[i], sizeof(AVStream));
        st->info = av_malloc(sizeof(*st->info));
        memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4230
        st->codec= avctx;
4231 4232
        avcodec_copy_context(st->codec, ic->streams[i]->codec);

4233
        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4234
            choose_sample_fmt(st, codec);
4235
        else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4236 4237 4238
            choose_pixel_fmt(st, codec);
    }

4239
    avformat_close_input(&ic);
4240 4241 4242
    return 0;
}

4243
static void opt_output_file(void *optctx, const char *filename)
4244
{
4245
    OptionsContext *o = optctx;
4246
    AVFormatContext *oc;
4247
    int i, err;
4248
    AVOutputFormat *file_oformat;
4249 4250
    OutputStream *ost;
    InputStream  *ist;
Fabrice Bellard's avatar
Fabrice Bellard committed
4251 4252 4253 4254

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

4255
    err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4256
    if (!oc) {
4257
        print_error(filename, err);
4258
        exit_program(1);
4259
    }
4260
    file_oformat= oc->oformat;
4261
    oc->interrupt_callback = int_cb;
Fabrice Bellard's avatar
Fabrice Bellard committed
4262

4263
    if (!strcmp(file_oformat->name, "ffm") &&
4264
        av_strstart(filename, "http:", NULL)) {
4265
        int j;
Fabrice Bellard's avatar
Fabrice Bellard committed
4266 4267
        /* special case for files sent to ffserver: we get the stream
           parameters from ffserver */
4268
        int err = read_ffserver_streams(o, oc, filename);
4269 4270
        if (err < 0) {
            print_error(filename, err);
4271
            exit_program(1);
Fabrice Bellard's avatar
Fabrice Bellard committed
4272
        }
4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283
        for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
            ost = &output_streams[j];
            for (i = 0; i < nb_input_streams; i++) {
                ist = &input_streams[i];
                if(ist->st->codec->codec_type == ost->st->codec->codec_type){
                    ost->sync_ist= ist;
                    ost->source_index= i;
                    ist->discard = 0;
                    break;
                }
            }
4284 4285 4286 4287
            if(!ost->sync_ist){
                av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
                exit_program(1);
            }
4288
        }
4289
    } else if (!o->nb_stream_maps) {
4290 4291 4292
        /* pick the "best" stream of each type */
#define NEW_STREAM(type, index)\
        if (index >= 0) {\
4293
            ost = new_ ## type ## _stream(o, oc);\
4294 4295 4296 4297 4298 4299
            ost->source_index = index;\
            ost->sync_ist     = &input_streams[index];\
            input_streams[index].discard = 0;\
        }

        /* video: highest resolution */
4300
        if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313
            int area = 0, idx = -1;
            for (i = 0; i < nb_input_streams; i++) {
                ist = &input_streams[i];
                if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
                    ist->st->codec->width * ist->st->codec->height > area) {
                    area = ist->st->codec->width * ist->st->codec->height;
                    idx = i;
                }
            }
            NEW_STREAM(video, idx);
        }

        /* audio: most channels */
4314
        if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327
            int channels = 0, idx = -1;
            for (i = 0; i < nb_input_streams; i++) {
                ist = &input_streams[i];
                if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
                    ist->st->codec->channels > channels) {
                    channels = ist->st->codec->channels;
                    idx = i;
                }
            }
            NEW_STREAM(audio, idx);
        }

        /* subtitles: pick first */
4328
        if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
4329 4330 4331 4332 4333 4334 4335
            for (i = 0; i < nb_input_streams; i++)
                if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
                    NEW_STREAM(subtitle, i);
                    break;
                }
        }
        /* do something with data? */
Fabrice Bellard's avatar
Fabrice Bellard committed
4336
    } else {
4337 4338
        for (i = 0; i < o->nb_stream_maps; i++) {
            StreamMap *map = &o->stream_maps[i];
4339

4340 4341
            if (map->disabled)
                continue;
4342 4343

            ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
4344 4345 4346 4347 4348 4349
            if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
                continue;
            if(o->   audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
                continue;
            if(o->   video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
                continue;
4350 4351
            if(o->    data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
                continue;
4352

4353
            switch (ist->st->codec->codec_type) {
4354 4355 4356 4357
            case AVMEDIA_TYPE_VIDEO:    ost = new_video_stream(o, oc);    break;
            case AVMEDIA_TYPE_AUDIO:    ost = new_audio_stream(o, oc);    break;
            case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
            case AVMEDIA_TYPE_DATA:     ost = new_data_stream(o, oc);     break;
4358
            case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
4359
            default:
4360
                av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
4361 4362 4363 4364 4365
                       map->file_index, map->stream_index);
                exit_program(1);
            }

            ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
4366
            ost->sync_ist     = &input_streams[input_files[map->sync_file_index].ist_index +
4367 4368 4369
                                           map->sync_stream_index];
            ist->discard = 0;
        }
Fabrice Bellard's avatar
Fabrice Bellard committed
4370 4371
    }

4372 4373 4374 4375 4376 4377
    /* handle attached files */
    for (i = 0; i < o->nb_attachments; i++) {
        AVIOContext *pb;
        uint8_t *attachment;
        const char *p;
        int64_t len;
Fabrice Bellard's avatar
Fabrice Bellard committed
4378

4379
        if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
4380 4381
            av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
                   o->attachments[i]);
4382
            exit_program(1);
Fabrice Bellard's avatar
Fabrice Bellard committed
4383
        }
4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405
        if ((len = avio_size(pb)) <= 0) {
            av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
                   o->attachments[i]);
            exit_program(1);
        }
        if (!(attachment = av_malloc(len))) {
            av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
                   o->attachments[i]);
            exit_program(1);
        }
        avio_read(pb, attachment, len);

        ost = new_attachment_stream(o, oc);
        ost->stream_copy               = 0;
        ost->source_index              = -1;
        ost->attachment_filename       = o->attachments[i];
        ost->st->codec->extradata      = attachment;
        ost->st->codec->extradata_size = len;

        p = strrchr(o->attachments[i], '/');
        av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
        avio_close(pb);
Fabrice Bellard's avatar
Fabrice Bellard committed
4406 4407
    }

4408 4409
    output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
    output_files[nb_output_files - 1].ctx       = oc;
4410
    output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
4411 4412 4413
    output_files[nb_output_files - 1].recording_time = o->recording_time;
    output_files[nb_output_files - 1].start_time     = o->start_time;
    output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
4414
    av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
4415

4416
    /* check filename in case of an image number is expected */
4417
    if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
4418
        if (!av_filename_number_test(oc->filename)) {
4419
            print_error(oc->filename, AVERROR(EINVAL));
4420
            exit_program(1);
4421
        }
4422 4423
    }

4424
    if (!(oc->oformat->flags & AVFMT_NOFILE)) {
4425
        /* test if it already exists to avoid losing precious files */
4426
        assert_file_overwrite(filename);
4427

Fabrice Bellard's avatar
Fabrice Bellard committed
4428
        /* open the file */
4429 4430 4431
        if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
                              &oc->interrupt_callback,
                              &output_files[nb_output_files - 1].opts)) < 0) {
4432
            print_error(filename, err);
4433
            exit_program(1);
Fabrice Bellard's avatar
Fabrice Bellard committed
4434 4435 4436
        }
    }

4437 4438 4439 4440 4441
    if (o->mux_preload) {
        uint8_t buf[64];
        snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
        av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
    }
4442
    oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
4443

4444 4445 4446 4447
    if (loop_output >= 0) {
        av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
        oc->loop_output = loop_output;
    }
4448

4449 4450 4451 4452
    /* copy metadata */
    for (i = 0; i < o->nb_metadata_map; i++) {
        char *p;
        int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
4453

4454 4455 4456 4457 4458 4459 4460 4461 4462
        if (in_file_index < 0)
            continue;
        if (in_file_index >= nb_input_files) {
            av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
            exit_program(1);
        }
        copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index].ctx, o);
    }

4463
    /* copy chapters */
4464 4465
    if (o->chapters_input_file >= nb_input_files) {
        if (o->chapters_input_file == INT_MAX) {
4466
            /* copy chapters from the first input file that has them*/
4467
            o->chapters_input_file = -1;
4468 4469
            for (i = 0; i < nb_input_files; i++)
                if (input_files[i].ctx->nb_chapters) {
4470
                    o->chapters_input_file = i;
4471 4472 4473
                    break;
                }
        } else {
4474
            av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
4475
                   o->chapters_input_file);
4476 4477 4478
            exit_program(1);
        }
    }
4479 4480
    if (o->chapters_input_file >= 0)
        copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
4481
                      !o->metadata_chapters_manual);
4482

4483
    /* copy global metadata by default */
4484
    if (!o->metadata_global_manual && nb_input_files){
4485 4486
        av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
                     AV_DICT_DONT_OVERWRITE);
4487 4488 4489
        if(o->recording_time != INT64_MAX)
            av_dict_set(&oc->metadata, "duration", NULL, 0);
    }
4490
    if (!o->metadata_streams_manual)
4491
        for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
4492 4493 4494 4495
            InputStream *ist;
            if (output_streams[i].source_index < 0)         /* this is true e.g. for attached files */
                continue;
            ist = &input_streams[output_streams[i].source_index];
4496
            av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
4497 4498
        }

4499 4500 4501 4502
    /* process manually set metadata */
    for (i = 0; i < o->nb_metadata; i++) {
        AVDictionary **m;
        char type, *val;
4503
        const char *stream_spec;
4504
        int index = 0, j, ret = 0;
4505 4506 4507

        val = strchr(o->metadata[i].u.str, '=');
        if (!val) {
4508
            av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
4509 4510 4511 4512 4513
                   o->metadata[i].u.str);
            exit_program(1);
        }
        *val++ = 0;

4514 4515 4516 4517 4518 4519 4520
        parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
        if (type == 's') {
            for (j = 0; j < oc->nb_streams; j++) {
                if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
                    av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
                } else if (ret < 0)
                    exit_program(1);
4521
            }
4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537
            printf("ret %d, stream_spec %s\n", ret, stream_spec);
        }
        else {
            switch (type) {
            case 'g':
                m = &oc->metadata;
                break;
            case 'c':
                if (index < 0 || index >= oc->nb_chapters) {
                    av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
                    exit_program(1);
                }
                m = &oc->chapters[index]->metadata;
                break;
            default:
                av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
4538 4539
                exit_program(1);
            }
4540
            av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
4541 4542
        }
    }
4543

4544
    reset_options(o, 0);
Fabrice Bellard's avatar
Fabrice Bellard committed
4545 4546
}

4547
/* same option as mencoder */
4548
static int opt_pass(const char *opt, const char *arg)
4549
{
4550
    do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
4551
    return 0;
4552
}
4553

4554
static int64_t getutime(void)
Fabrice Bellard's avatar
Fabrice Bellard committed
4555
{
4556
#if HAVE_GETRUSAGE
4557 4558 4559 4560
    struct rusage rusage;

    getrusage(RUSAGE_SELF, &rusage);
    return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4561
#elif HAVE_GETPROCESSTIMES
4562 4563 4564 4565 4566 4567
    HANDLE proc;
    FILETIME c, e, k, u;
    proc = GetCurrentProcess();
    GetProcessTimes(proc, &c, &e, &k, &u);
    return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
#else
Ramiro Polla's avatar
Ramiro Polla committed
4568
    return av_gettime();
Ramiro Polla's avatar
Ramiro Polla committed
4569
#endif
Fabrice Bellard's avatar
Fabrice Bellard committed
4570
}
Fabrice Bellard's avatar
Fabrice Bellard committed
4571

4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589
static int64_t getmaxrss(void)
{
#if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
    struct rusage rusage;
    getrusage(RUSAGE_SELF, &rusage);
    return (int64_t)rusage.ru_maxrss * 1024;
#elif HAVE_GETPROCESSMEMORYINFO
    HANDLE proc;
    PROCESS_MEMORY_COUNTERS memcounters;
    proc = GetCurrentProcess();
    memcounters.cb = sizeof(memcounters);
    GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
    return memcounters.PeakPagefileUsage;
#else
    return 0;
#endif
}

4590
static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
4591
{
4592
    return parse_option(o, "q:a", arg, options);
4593 4594
}

4595
static void show_usage(void)
4596
{
4597 4598 4599
    av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
    av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
    av_log(NULL, AV_LOG_INFO, "\n");
4600 4601
}

4602
static int opt_help(const char *opt, const char *arg)
4603
{
4604
    int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
4605 4606
    av_log_set_callback(log_callback_help);
    show_usage();
4607
    show_help_options(options, "Main options:\n",
4608
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4609 4610 4611
    show_help_options(options, "\nAdvanced options:\n",
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
                      OPT_EXPERT);
4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629
    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);
4630
    printf("\n");
4631 4632 4633
    show_help_children(avcodec_get_class(), flags);
    show_help_children(avformat_get_class(), flags);
    show_help_children(sws_get_class(), flags);
4634

4635
    return 0;
4636 4637
}

4638
static int opt_target(OptionsContext *o, const char *opt, const char *arg)
4639
{
4640
    enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4641
    static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
4642

4643
    if (!strncmp(arg, "pal-", 4)) {
4644
        norm = PAL;
4645
        arg += 4;
4646
    } else if (!strncmp(arg, "ntsc-", 5)) {
4647
        norm = NTSC;
4648
        arg += 5;
4649
    } else if (!strncmp(arg, "film-", 5)) {
4650
        norm = FILM;
4651
        arg += 5;
4652
    } else {
4653
        /* Try to determine PAL/NTSC by peeking in the input files */
4654
        if (nb_input_files) {
4655 4656 4657 4658
            int i, j, fr;
            for (j = 0; j < nb_input_files; j++) {
                for (i = 0; i < input_files[j].nb_streams; i++) {
                    AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4659
                    if (c->codec_type != AVMEDIA_TYPE_VIDEO)
4660 4661
                        continue;
                    fr = c->time_base.den * 1000 / c->time_base.num;
4662
                    if (fr == 25000) {
4663
                        norm = PAL;
4664
                        break;
4665
                    } else if ((fr == 29970) || (fr == 23976)) {
4666
                        norm = NTSC;
4667
                        break;
4668
                    }
4669
                }
4670
                if (norm != UNKNOWN)
4671
                    break;
4672 4673
            }
        }
4674 4675
        if (norm != UNKNOWN)
            av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4676 4677
    }

4678
    if (norm == UNKNOWN) {
4679 4680 4681
        av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
        av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
        av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
4682
        exit_program(1);
4683 4684
    }

4685
    if (!strcmp(arg, "vcd")) {
4686 4687
        opt_video_codec(o, "c:v", "mpeg1video");
        opt_audio_codec(o, "c:a", "mp2");
4688
        parse_option(o, "f", "vcd", options);
4689

4690 4691
        parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
        parse_option(o, "r", frame_rates[norm], options);
4692
        opt_default("g", norm == PAL ? "15" : "18");
4693

4694
        opt_default("b:v", "1150000");
4695 4696
        opt_default("maxrate", "1150000");
        opt_default("minrate", "1150000");
4697
        opt_default("bufsize", "327680"); // 40*1024*8;
4698

4699
        opt_default("b:a", "224000");
4700
        parse_option(o, "ar", "44100", options);
4701
        parse_option(o, "ac", "2", options);
4702

4703
        opt_default("packetsize", "2324");
4704
        opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4705

4706 4707 4708 4709 4710
        /* 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. */
4711 4712
        o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
    } else if (!strcmp(arg, "svcd")) {
4713

4714 4715
        opt_video_codec(o, "c:v", "mpeg2video");
        opt_audio_codec(o, "c:a", "mp2");
4716
        parse_option(o, "f", "svcd", options);
4717

4718 4719 4720
        parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
        parse_option(o, "r", frame_rates[norm], options);
        parse_option(o, "pix_fmt", "yuv420p", options);
4721
        opt_default("g", norm == PAL ? "15" : "18");
4722

4723
        opt_default("b:v", "2040000");
4724
        opt_default("maxrate", "2516000");
4725 4726
        opt_default("minrate", "0"); // 1145000;
        opt_default("bufsize", "1835008"); // 224*1024*8;
4727
        opt_default("flags", "+scan_offset");
4728

4729

4730
        opt_default("b:a", "224000");
4731
        parse_option(o, "ar", "44100", options);
4732

4733
        opt_default("packetsize", "2324");
4734

4735
    } else if (!strcmp(arg, "dvd")) {
4736

4737 4738
        opt_video_codec(o, "c:v", "mpeg2video");
        opt_audio_codec(o, "c:a", "ac3");
4739
        parse_option(o, "f", "dvd", options);
4740

4741 4742 4743
        parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
        parse_option(o, "r", frame_rates[norm], options);
        parse_option(o, "pix_fmt", "yuv420p", options);
4744
        opt_default("g", norm == PAL ? "15" : "18");
4745

4746
        opt_default("b:v", "6000000");
4747
        opt_default("maxrate", "9000000");
4748 4749
        opt_default("minrate", "0"); // 1500000;
        opt_default("bufsize", "1835008"); // 224*1024*8;
4750

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

4754
        opt_default("b:a", "448000");
4755
        parse_option(o, "ar", "48000", options);
4756

4757
    } else if (!strncmp(arg, "dv", 2)) {
4758

4759
        parse_option(o, "f", "dv", options);
4760

4761 4762 4763 4764
        parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
        parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
                          norm == PAL ? "yuv420p" : "yuv411p", options);
        parse_option(o, "r", frame_rates[norm], options);
4765

4766
        parse_option(o, "ar", "48000", options);
4767
        parse_option(o, "ac", "2", options);
4768

4769
    } else {
4770
        av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4771
        return AVERROR(EINVAL);
4772
    }
4773
    return 0;
4774 4775
}

4776
static int opt_vstats_file(const char *opt, const char *arg)
4777 4778
{
    av_free (vstats_filename);
4779
    vstats_filename = av_strdup (arg);
4780
    return 0;
4781 4782
}

4783
static int opt_vstats(const char *opt, const char *arg)
4784 4785 4786 4787 4788 4789 4790
{
    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);
4791
    return opt_vstats_file(opt, filename);
4792 4793
}

4794
static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4795
{
4796 4797
    return parse_option(o, "frames:v", arg, options);
}
4798

4799 4800 4801 4802
static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
{
    return parse_option(o, "frames:a", arg, options);
}
4803

4804 4805 4806
static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
{
    return parse_option(o, "frames:d", arg, options);
4807 4808
}

4809
static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
4810 4811 4812
{
    FILE *f=NULL;
    char filename[1000], tmp[1000], tmp2[1000], line[1000];
4813 4814 4815
    const char *codec_name = *opt == 'v' ? video_codec_name :
                             *opt == 'a' ? audio_codec_name :
                                           subtitle_codec_name;
4816 4817

    if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4818
        if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
4819
            av_log(0, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
4820
        }else
4821
            av_log(0, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
4822 4823 4824 4825 4826 4827 4828 4829 4830
        exit_program(1);
    }

    while(!feof(f)){
        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){
4831
            av_log(0, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
4832 4833 4834
            exit_program(1);
        }
        if(!strcmp(tmp, "acodec")){
4835
            opt_audio_codec(o, tmp, tmp2);
4836
        }else if(!strcmp(tmp, "vcodec")){
4837
            opt_video_codec(o, tmp, tmp2);
4838
        }else if(!strcmp(tmp, "scodec")){
4839
            opt_subtitle_codec(o, tmp, tmp2);
4840
        }else if(!strcmp(tmp, "dcodec")){
4841
            opt_data_codec(o, tmp, tmp2);
4842
        }else if(opt_default(tmp, tmp2) < 0){
4843
            av_log(0, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4844 4845 4846 4847 4848 4849 4850 4851 4852
            exit_program(1);
        }
    }

    fclose(f);

    return 0;
}

4853
static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4854 4855 4856
{
}

4857
static int opt_passlogfile(const char *opt, const char *arg)
4858 4859
{
    pass_logfilename_prefix = arg;
4860
#if CONFIG_LIBX264_ENCODER
4861
    return opt_default("passlogfile", arg);
4862 4863 4864
#else
    return 0;
#endif
4865 4866
}

4867 4868
static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
{
4869
    char *s = av_asprintf("%s:%c", opt + 1, *opt);
4870
    int ret = parse_option(o, s, arg, options);
4871
    av_free(s);
4872
    return ret;
4873 4874
}

4875 4876 4877
static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
{
    if(!strcmp(opt, "b")){
4878
        av_log(0,AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
4879
        return parse_option(o, "b:v", arg, options);
4880 4881 4882 4883
    }
    return opt_default(opt, arg);
}

4884 4885 4886 4887
static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
{
    return parse_option(o, "filter:v", arg, options);
}
4888

4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899
static int opt_vsync(const char *opt, const char *arg)
{
    if      (!av_strcasecmp(arg, "cfr"))         video_sync_method = VSYNC_CFR;
    else if (!av_strcasecmp(arg, "vfr"))         video_sync_method = VSYNC_VFR;
    else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;

    if (video_sync_method == VSYNC_AUTO)
        video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
    return 0;
}

4900
#define OFFSET(x) offsetof(OptionsContext, x)
4901
static const OptionDef options[] = {
4902
    /* main options */
4903
#include "cmdutils_common_opts.h"
4904 4905
    { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
    { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
Fabrice Bellard's avatar
Fabrice Bellard committed
4906
    { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4907
    { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
4908 4909
    { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
    { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4910
    { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4911
    { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
4912
    { "map_channel", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_channel}, "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
4913
    { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
4914
      "outfile[,metadata]:infile[,metadata]" },
4915
    { "map_chapters",  OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)},  "set chapters mapping", "input_file_index" },
4916 4917 4918 4919
    { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
    { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
    { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
    { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4920 4921 4922 4923
    { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
    { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
    { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
    { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4924
    { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
Fabrice Bellard's avatar
Fabrice Bellard committed
4925
      "add timings for benchmarking" },
4926
    { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4927
    { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4928
      "dump each input packet" },
4929
    { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4930
      "when dumping packets, also dump the payload" },
4931
    { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4932 4933
    { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
    { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4934
    { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4935
    { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
4936
    { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4937
    { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4938
    { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
4939
    { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying", "source" },
4940
    { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4941
    { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4942
    { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4943
    { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4944
    { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4945
    { "tag",   OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4946 4947 4948 4949 4950
    { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
    { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
#if CONFIG_AVFILTER
    { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
#endif
4951
    { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4952 4953
    { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
    { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4954 4955

    /* video options */
4956
    { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4957 4958 4959 4960
    { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
    { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
    { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
    { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4961
    { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
4962 4963 4964 4965 4966 4967 4968 4969 4970
    { "croptop",  HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
    { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
    { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
    { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
    { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
    { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
    { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
    { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
    { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4971
    { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4972
    { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
Måns Rullgård's avatar
Måns Rullgård committed
4973
    { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4974
    { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4975
    { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4976
    { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4977
    { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
Lou Logan's avatar
Lou Logan committed
4978
      "use same quantizer as source (implies VBR)" },
4979
    { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4980
    { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4981
    { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4982
      "deinterlace pictures" },
4983
    { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4984 4985
    { "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" },
4986
#if CONFIG_AVFILTER
4987
    { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4988
#endif
4989 4990 4991
    { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
    { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
    { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4992
    { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4993
    { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
4994
    { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4995 4996 4997
    { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
    { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
    { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
4998
    { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
4999 5000

    /* audio options */
5001
    { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5002 5003
    { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
    { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5004 5005
    { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
    { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5006
    { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5007
    { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5008
    { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5009
    { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5010
    { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
5011

5012
    /* subtitle options */
5013
    { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5014
    { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5015
    { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5016

5017
    /* grab options */
5018 5019
    { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
    { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5020
    { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5021 5022

    /* muxer options */
5023 5024
    { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT   | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
    { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)},   "set the initial demux-decode delay", "seconds" },
5025

5026
    { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5027 5028
    { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
    { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5029

5030 5031 5032 5033
    { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
    { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
    { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
    { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5034
    /* data codec support */
5035
    { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5036
    { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
Michael Niedermayer's avatar
Michael Niedermayer committed
5037

5038
    { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
Fabrice Bellard's avatar
Fabrice Bellard committed
5039 5040 5041
    { NULL, },
};

5042 5043
int main(int argc, char **argv)
{
5044
    OptionsContext o = { 0 };
5045 5046
    int64_t ti;

5047
    reset_options(&o, 0);
5048

5049
    av_log_set_flags(AV_LOG_SKIP_REPEATED);
5050
    parse_loglevel(argc, argv, options);
5051

5052
    if(argc>1 && !strcmp(argv[1], "-d")){
5053
        run_as_daemon=1;
5054 5055 5056 5057 5058
        av_log_set_callback(log_callback_null);
        argc--;
        argv++;
    }

Luca Abeni's avatar
Luca Abeni committed
5059
    avcodec_register_all();
5060
#if CONFIG_AVDEVICE
Luca Abeni's avatar
Luca Abeni committed
5061
    avdevice_register_all();
5062 5063 5064
#endif
#if CONFIG_AVFILTER
    avfilter_register_all();
5065
#endif
5066
    av_register_all();
5067
    avformat_network_init();
5068

5069
    show_banner(argc, argv, options);
5070

5071 5072
    term_init();

5073
    /* parse options */
5074
    parse_options(&o, argc, argv, options, opt_output_file);
5075

5076
    if (nb_output_files <= 0 && nb_input_files == 0) {
5077
        show_usage();
5078
        av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5079
        exit_program(1);
5080
    }
5081

5082 5083
    /* file converter / grab */
    if (nb_output_files <= 0) {
5084
        av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5085
        exit_program(1);
5086 5087 5088
    }

    if (nb_input_files == 0) {
5089
        av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5090
        exit_program(1);
5091 5092 5093
    }

    ti = getutime();
5094
    if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
5095
        exit_program(1);
5096 5097
    ti = getutime() - ti;
    if (do_benchmark) {
5098 5099
        int maxrss = getmaxrss() / 1024;
        printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
5100 5101
    }

5102 5103
    exit_program(0);
    return 0;
5104
}