ffmpeg_opt.c 134 KB
Newer Older
1
/*
2
 * ffmpeg option parsing
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7 8 9 10
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * 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 19 20 21 22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <stdint.h>

23
#include "ffmpeg.h"
24 25 26 27 28 29 30 31 32 33 34
#include "cmdutils.h"

#include "libavformat/avformat.h"

#include "libavcodec/avcodec.h"

#include "libavfilter/avfilter.h"

#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/avutil.h"
35
#include "libavutil/channel_layout.h"
36 37 38 39 40 41 42
#include "libavutil/intreadwrite.h"
#include "libavutil/fifo.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "libavutil/parseutils.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h"
43
#include "libavutil/time_internal.h"
44

45
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
46

47 48 49 50 51 52 53 54
#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)\
55
            exit_program(1);\
56 57 58
    }\
}

59 60
#define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
{\
61
    int i;\
62 63
    for (i = 0; i < o->nb_ ## name; i++) {\
        char *spec = o->name[i].specifier;\
64
        if (!strcmp(spec, mediatype))\
65 66 67
            outvar = o->name[i].u.type;\
    }\
}
68

69
const HWAccel hwaccels[] = {
70 71
#if HAVE_VDPAU_X11
    { "vdpau", vdpau_init, HWACCEL_VDPAU, AV_PIX_FMT_VDPAU },
72
#endif
73
#if HAVE_DXVA2_LIB
74
    { "dxva2", dxva2_init, HWACCEL_DXVA2, AV_PIX_FMT_DXVA2_VLD },
75 76
#endif
#if CONFIG_VDA
77 78 79 80
    { "vda",   videotoolbox_init,   HWACCEL_VDA,   AV_PIX_FMT_VDA },
#endif
#if CONFIG_VIDEOTOOLBOX
    { "videotoolbox",   videotoolbox_init,   HWACCEL_VIDEOTOOLBOX,   AV_PIX_FMT_VIDEOTOOLBOX },
81 82 83
#endif
#if CONFIG_LIBMFX
    { "qsv",   qsv_init,   HWACCEL_QSV,   AV_PIX_FMT_QSV },
84
#endif
85 86 87
    { 0 },
};

88
char *vstats_filename;
89
char *sdp_filename;
90 91 92

float audio_drift_threshold = 0.1;
float dts_delta_threshold   = 10;
93
float dts_error_threshold   = 3600*30;
94 95 96 97

int audio_volume      = 256;
int audio_sync_method = 0;
int video_sync_method = VSYNC_AUTO;
98
float frame_drop_threshold = 0;
99 100
int do_deinterlace    = 0;
int do_benchmark      = 0;
101
int do_benchmark_all  = 0;
102 103 104
int do_hex_dump       = 0;
int do_pkt_dump       = 0;
int copy_ts           = 0;
105
int start_at_zero     = 0;
106 107
int copy_tb           = -1;
int debug_ts          = 0;
108
int exit_on_error     = 0;
109
int abort_on_flags    = 0;
110
int print_stats       = -1;
111
int qp_hist           = 0;
112 113
int stdin_interaction = 1;
int frame_bits_per_raw_sample = 0;
114
float max_error_rate  = 2.0/3;
115

116 117

static int intra_only         = 0;
118
static int file_overwrite     = 0;
119 120
static int no_file_overwrite  = 0;
static int do_psnr            = 0;
121
static int input_sync;
122
static int override_ffserver  = 0;
123
static int input_stream_potentially_available = 0;
124
static int ignore_unknown_streams = 0;
125
static int copy_unknown_streams = 0;
126

127
static void uninit_options(OptionsContext *o)
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
{
    const OptionDef *po = options;
    int i;

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

    for (i = 0; i < o->nb_stream_maps; i++)
        av_freep(&o->stream_maps[i].linklabel);
    av_freep(&o->stream_maps);
154
    av_freep(&o->audio_channel_maps);
155
    av_freep(&o->streamid_map);
156
    av_freep(&o->attachments);
157
}
158

159
static void init_options(OptionsContext *o)
160
{
161 162
    memset(o, 0, sizeof(*o));

163
    o->stop_time = INT64_MAX;
164
    o->mux_max_delay  = 0.7;
165
    o->start_time     = AV_NOPTS_VALUE;
166
    o->start_time_eof = AV_NOPTS_VALUE;
167
    o->recording_time = INT64_MAX;
168 169
    o->limit_filesize = UINT64_MAX;
    o->chapters_input_file = INT_MAX;
170
    o->accurate_seek  = 1;
171 172
}

173 174 175 176 177 178 179 180 181 182 183 184
static int show_hwaccels(void *optctx, const char *opt, const char *arg)
{
    int i;

    printf("Hardware acceleration methods:\n");
    for (i = 0; i < FF_ARRAY_ELEMS(hwaccels) - 1; i++) {
        printf("%s\n", hwaccels[i].name);
    }
    printf("\n");
    return 0;
}

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
/* return a copy of the input with the stream specifiers removed from the keys */
static AVDictionary *strip_specifiers(AVDictionary *dict)
{
    AVDictionaryEntry *e = NULL;
    AVDictionary    *ret = NULL;

    while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
        char *p = strchr(e->key, ':');

        if (p)
            *p = 0;
        av_dict_set(&ret, e->key, e->value, 0);
        if (p)
            *p = ':';
    }
    return ret;
}

203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
static int opt_abort_on(void *optctx, const char *opt, const char *arg)
{
    static const AVOption opts[] = {
        { "abort_on"        , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
        { "empty_output"    , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT     },    .unit = "flags" },
        { NULL },
    };
    static const AVClass class = {
        .class_name = "",
        .item_name  = av_default_item_name,
        .option     = opts,
        .version    = LIBAVUTIL_VERSION_INT,
    };
    const AVClass *pclass = &class;

    return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
}

221 222
static int opt_sameq(void *optctx, const char *opt, const char *arg)
{
223 224 225 226 227
    av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
           "If you are looking for an option to preserve the quality (which is not "
           "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
           opt, opt);
    return AVERROR(EINVAL);
228 229
}

230
static int opt_video_channel(void *optctx, const char *opt, const char *arg)
231 232
{
    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
233
    return opt_default(optctx, "channel", arg);
234
}
235

236
static int opt_video_standard(void *optctx, const char *opt, const char *arg)
237 238
{
    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
239
    return opt_default(optctx, "standard", arg);
240 241
}

242
static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
243
{
244
    OptionsContext *o = optctx;
245 246 247
    return parse_option(o, "codec:a", arg, options);
}

248
static int opt_video_codec(void *optctx, const char *opt, const char *arg)
249
{
250
    OptionsContext *o = optctx;
251 252 253
    return parse_option(o, "codec:v", arg, options);
}

254
static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
255
{
256
    OptionsContext *o = optctx;
257 258 259
    return parse_option(o, "codec:s", arg, options);
}

260
static int opt_data_codec(void *optctx, const char *opt, const char *arg)
261
{
262
    OptionsContext *o = optctx;
263 264 265
    return parse_option(o, "codec:d", arg, options);
}

266
static int opt_map(void *optctx, const char *opt, const char *arg)
267
{
268
    OptionsContext *o = optctx;
269 270
    StreamMap *m = NULL;
    int i, negative = 0, file_idx;
271
    int sync_file_idx = -1, sync_stream_idx = 0;
272 273
    char *p, *sync;
    char *map;
274
    char *allow_unused;
275 276 277 278 279 280

    if (*arg == '-') {
        negative = 1;
        arg++;
    }
    map = av_strdup(arg);
281 282
    if (!map)
        return AVERROR(ENOMEM);
283 284 285 286 287 288 289

    /* 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) {
            av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
290
            exit_program(1);
291 292 293 294 295 296 297 298 299 300 301 302
        }
        if (*sync)
            sync++;
        for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
            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;
            }
        if (i == input_files[sync_file_idx]->nb_streams) {
            av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
                                       "match any streams.\n", arg);
303
            exit_program(1);
304 305 306 307 308 309 310
        }
    }


    if (map[0] == '[') {
        /* this mapping refers to lavfi output */
        const char *c = map + 1;
311
        GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
312 313 314 315
        m = &o->stream_maps[o->nb_stream_maps - 1];
        m->linklabel = av_get_token(&c, "]");
        if (!m->linklabel) {
            av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
316
            exit_program(1);
317 318
        }
    } else {
319 320
        if (allow_unused = strchr(map, '?'))
            *allow_unused = 0;
321 322 323
        file_idx = strtol(map, &p, 0);
        if (file_idx >= nb_input_files || file_idx < 0) {
            av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
324
            exit_program(1);
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
        }
        if (negative)
            /* disable some already defined maps */
            for (i = 0; i < o->nb_stream_maps; i++) {
                m = &o->stream_maps[i];
                if (file_idx == m->file_index &&
                    check_stream_specifier(input_files[m->file_index]->ctx,
                                           input_files[m->file_index]->ctx->streams[m->stream_index],
                                           *p == ':' ? p + 1 : p) > 0)
                    m->disabled = 1;
            }
        else
            for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
                if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
                            *p == ':' ? p + 1 : p) <= 0)
                    continue;
341
                GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
                m = &o->stream_maps[o->nb_stream_maps - 1];

                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) {
358 359 360 361 362 363 364
        if (allow_unused) {
            av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
        } else {
            av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
                                       "To ignore this, add a trailing '?' to the map.\n", arg);
            exit_program(1);
        }
365 366 367 368 369 370
    }

    av_freep(&map);
    return 0;
}

371
static int opt_attach(void *optctx, const char *opt, const char *arg)
372
{
373
    OptionsContext *o = optctx;
374
    GROW_ARRAY(o->attachments, o->nb_attachments);
375 376 377 378
    o->attachments[o->nb_attachments - 1] = arg;
    return 0;
}

379
static int opt_map_channel(void *optctx, const char *opt, const char *arg)
380
{
381
    OptionsContext *o = optctx;
382 383 384 385
    int n;
    AVStream *st;
    AudioChannelMap *m;

386
    GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
    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");
406
        exit_program(1);
407 408 409 410 411 412 413 414 415
    }

    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);
416
        exit_program(1);
417 418 419 420 421
    }
    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);
422
        exit_program(1);
423 424 425 426 427
    }
    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);
428
        exit_program(1);
429 430 431 432
    }
    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);
433
        exit_program(1);
434 435 436 437
    }
    return 0;
}

438 439 440 441 442 443 444
static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
{
    av_free(sdp_filename);
    sdp_filename = av_strdup(arg);
    return 0;
}

445
/**
446
 * Parse a metadata specifier passed as 'arg' parameter.
447
 * @param arg  metadata string to parse
448 449 450 451 452 453 454 455 456 457 458 459 460 461
 * @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)
{
    if (*arg) {
        *type = *arg;
        switch (*arg) {
        case 'g':
            break;
        case 's':
            if (*(++arg) && *arg != ':') {
                av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
462
                exit_program(1);
463 464 465 466 467 468 469 470 471 472
            }
            *stream_spec = *arg == ':' ? arg + 1 : "";
            break;
        case 'c':
        case 'p':
            if (*(++arg) == ':')
                *index = strtol(++arg, NULL, 0);
            break;
        default:
            av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
473
            exit_program(1);
474 475 476 477 478 479 480 481
        }
    } else
        *type = 'g';
}

static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
{
    AVDictionary **meta_in = NULL;
482
    AVDictionary **meta_out = NULL;
483 484 485 486 487 488 489 490
    int i, ret = 0;
    char type_in, type_out;
    const char *istream_spec = NULL, *ostream_spec = NULL;
    int idx_in = 0, idx_out = 0;

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

491 492 493 494 495 496 497 498 499 500
    if (!ic) {
        if (type_out == 'g' || !*outspec)
            o->metadata_global_manual = 1;
        if (type_out == 's' || !*outspec)
            o->metadata_streams_manual = 1;
        if (type_out == 'c' || !*outspec)
            o->metadata_chapters_manual = 1;
        return 0;
    }

501 502 503 504 505 506 507
    if (type_in == 'g' || type_out == 'g')
        o->metadata_global_manual = 1;
    if (type_in == 's' || type_out == 's')
        o->metadata_streams_manual = 1;
    if (type_in == 'c' || type_out == 'c')
        o->metadata_chapters_manual = 1;

508 509 510 511
    /* ic is NULL when just disabling automatic mappings */
    if (!ic)
        return 0;

512 513 514 515
#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));\
516
        exit_program(1);\
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531
    }

#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;\
532
        case 's':\
533
            break; /* handled separately below */ \
534 535 536 537 538 539 540 541 542 543 544 545 546
        default: av_assert0(0);\
        }\

    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)
547
                exit_program(1);
548 549 550
        }
        if (!meta_in) {
            av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match  any streams.\n", istream_spec);
551
            exit_program(1);
552 553 554 555 556 557 558 559 560
        }
    }

    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)
561
                exit_program(1);
562 563 564 565 566 567 568
        }
    } else
        av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);

    return 0;
}

569
static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
570
{
571
    OptionsContext *o = optctx;
572 573 574
    char buf[128];
    int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
    struct tm time = *gmtime((time_t*)&recording_timestamp);
575
    if (!strftime(buf, sizeof(buf), "creation_time=%Y-%m-%dT%H:%M:%S%z", &time))
576
        return -1;
577 578 579 580 581 582 583
    parse_option(o, "metadata", buf, options);

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

584 585
static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
{
586
    const AVCodecDescriptor *desc;
587 588 589 590 591 592
    const char *codec_string = encoder ? "encoder" : "decoder";
    AVCodec *codec;

    codec = encoder ?
        avcodec_find_encoder_by_name(name) :
        avcodec_find_decoder_by_name(name);
593 594 595 596 597 598 599 600 601

    if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
        codec = encoder ? avcodec_find_encoder(desc->id) :
                          avcodec_find_decoder(desc->id);
        if (codec)
            av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
                   codec_string, codec->name, desc->name);
    }

602 603
    if (!codec) {
        av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
604
        exit_program(1);
605 606 607
    }
    if (codec->type != type) {
        av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
608
        exit_program(1);
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
    }
    return codec;
}

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

    MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
    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);
}

626 627
/* Add all the streams from the given input file to the global
 * list of input streams. */
628 629
static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
{
630
    int i, ret;
631 632 633 634 635

    for (i = 0; i < ic->nb_streams; i++) {
        AVStream *st = ic->streams[i];
        AVCodecContext *dec = st->codec;
        InputStream *ist = av_mallocz(sizeof(*ist));
636
        char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
637 638
        char *codec_tag = NULL;
        char *next;
639 640
        char *discard_str = NULL;
        const AVOption *discard_opt = av_opt_find(dec, "skip_frame", NULL, 0, 0);
641 642

        if (!ist)
643
            exit_program(1);
644

645
        GROW_ARRAY(input_streams, nb_input_streams);
646 647 648 649 650 651
        input_streams[nb_input_streams - 1] = ist;

        ist->st = st;
        ist->file_index = nb_input_files;
        ist->discard = 1;
        st->discard  = AVDISCARD_ALL;
652 653 654
        ist->nb_samples = 0;
        ist->min_pts = INT64_MAX;
        ist->max_pts = INT64_MIN;
655 656 657 658

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

659 660 661
        ist->autorotate = 1;
        MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);

662 663 664 665 666 667 668 669
        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;
        }

670
        ist->dec = choose_decoder(o, ic, st);
671
        ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
672

673 674 675
        ist->reinit_filters = -1;
        MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);

676 677 678 679 680 681 682 683
        MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
        ist->user_set_discard = AVDISCARD_NONE;
        if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) {
            av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
                    discard_str);
            exit_program(1);
        }

684 685
        ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;

686 687 688 689 690 691 692 693 694 695 696 697
        ist->dec_ctx = avcodec_alloc_context3(ist->dec);
        if (!ist->dec_ctx) {
            av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
            exit_program(1);
        }

        ret = avcodec_copy_context(ist->dec_ctx, dec);
        if (ret < 0) {
            av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
            exit_program(1);
        }

698 699
        switch (dec->codec_type) {
        case AVMEDIA_TYPE_VIDEO:
700 701
            if(!ist->dec)
                ist->dec = avcodec_find_decoder(dec->codec_id);
702
#if FF_API_EMU_EDGE
703
            if (av_codec_get_lowres(dec)) {
704 705
                dec->flags |= CODEC_FLAG_EMU_EDGE;
            }
706
#endif
707

708 709 710
            ist->resample_height  = ist->dec_ctx->height;
            ist->resample_width   = ist->dec_ctx->width;
            ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
711 712 713 714 715 716

            MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
            if (framerate && av_parse_video_rate(&ist->framerate,
                                                 framerate) < 0) {
                av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
                       framerate);
717
                exit_program(1);
718 719
            }

720 721 722
            ist->top_field_first = -1;
            MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);

723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
            MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
            if (hwaccel) {
                if (!strcmp(hwaccel, "none"))
                    ist->hwaccel_id = HWACCEL_NONE;
                else if (!strcmp(hwaccel, "auto"))
                    ist->hwaccel_id = HWACCEL_AUTO;
                else {
                    int i;
                    for (i = 0; hwaccels[i].name; i++) {
                        if (!strcmp(hwaccels[i].name, hwaccel)) {
                            ist->hwaccel_id = hwaccels[i].id;
                            break;
                        }
                    }

                    if (!ist->hwaccel_id) {
                        av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
                               hwaccel);
                        av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
                        for (i = 0; hwaccels[i].name; i++)
                            av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
                        av_log(NULL, AV_LOG_FATAL, "\n");
                        exit_program(1);
                    }
                }
            }

            MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
            if (hwaccel_device) {
                ist->hwaccel_device = av_strdup(hwaccel_device);
                if (!ist->hwaccel_device)
                    exit_program(1);
            }
756
            ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
757

758 759
            break;
        case AVMEDIA_TYPE_AUDIO:
760 761
            ist->guess_layout_max = INT_MAX;
            MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
762 763
            guess_input_channel_layout(ist);

764 765 766 767
            ist->resample_sample_fmt     = ist->dec_ctx->sample_fmt;
            ist->resample_sample_rate    = ist->dec_ctx->sample_rate;
            ist->resample_channels       = ist->dec_ctx->channels;
            ist->resample_channel_layout = ist->dec_ctx->channel_layout;
768 769 770

            break;
        case AVMEDIA_TYPE_DATA:
771 772
        case AVMEDIA_TYPE_SUBTITLE: {
            char *canvas_size = NULL;
773 774
            if(!ist->dec)
                ist->dec = avcodec_find_decoder(dec->codec_id);
775
            MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
776 777
            MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
            if (canvas_size &&
778
                av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
779
                av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
780
                exit_program(1);
781
            }
782
            break;
783
        }
784 785 786 787 788 789 790 791 792 793 794
        case AVMEDIA_TYPE_ATTACHMENT:
        case AVMEDIA_TYPE_UNKNOWN:
            break;
        default:
            abort();
        }
    }
}

static void assert_file_overwrite(const char *filename)
{
795
    if (file_overwrite && no_file_overwrite) {
796 797 798 799
        fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
        exit_program(1);
    }

800 801 802
    if (!file_overwrite) {
        const char *proto_name = avio_find_protocol_name(filename);
        if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
803
            if (stdin_interaction && !no_file_overwrite) {
804 805
                fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                fflush(stderr);
806 807
                term_exit();
                signal(SIGINT, SIG_DFL);
808
                if (!read_yesno()) {
809
                    av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
810
                    exit_program(1);
811
                }
812
                term_init();
813 814
            }
            else {
815
                av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
816
                exit_program(1);
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837
            }
        }
    }
}

static void dump_attachment(AVStream *st, const char *filename)
{
    int ret;
    AVIOContext *out = NULL;
    AVDictionaryEntry *e;

    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);
838
        exit_program(1);
839 840 841 842 843 844 845
    }

    assert_file_overwrite(filename);

    if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
        av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
               filename);
846
        exit_program(1);
847 848 849 850 851 852 853
    }

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

854
static int open_input_file(OptionsContext *o, const char *filename)
855
{
856
    InputFile *f;
857 858 859 860 861
    AVFormatContext *ic;
    AVInputFormat *file_iformat = NULL;
    int err, i, ret;
    int64_t timestamp;
    AVDictionary **opts;
862 863
    AVDictionary *unused_opts = NULL;
    AVDictionaryEntry *e = NULL;
864
    int orig_nb_streams;                     // number of streams before avformat_find_stream_info
865 866 867
    char *   video_codec_name = NULL;
    char *   audio_codec_name = NULL;
    char *subtitle_codec_name = NULL;
868
    char *    data_codec_name = NULL;
869
    int scan_all_pmts_set = 0;
870 871 872 873

    if (o->format) {
        if (!(file_iformat = av_find_input_format(o->format))) {
            av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
874
            exit_program(1);
875 876 877 878 879 880
        }
    }

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

881 882
    stdin_interaction &= strncmp(filename, "pipe:", 5) &&
                         strcmp(filename, "/dev/stdin");
883 884 885 886 887

    /* get default parameters from command line */
    ic = avformat_alloc_context();
    if (!ic) {
        print_error(filename, AVERROR(ENOMEM));
888
        exit_program(1);
889 890
    }
    if (o->nb_audio_sample_rate) {
891
        av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
892 893 894 895 896 897 898 899
    }
    if (o->nb_audio_channels) {
        /* because we set audio_channels based on both the "ac" and
         * "channel_layout" options, we need to check that the specified
         * demuxer actually has the "channels" option before setting it */
        if (file_iformat && file_iformat->priv_class &&
            av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
                        AV_OPT_SEARCH_FAKE_OBJ)) {
900
            av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
901 902 903 904 905 906 907 908
        }
    }
    if (o->nb_frame_rates) {
        /* set the format-level framerate option;
         * this is important for video grabbers, e.g. x11 */
        if (file_iformat && file_iformat->priv_class &&
            av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
                        AV_OPT_SEARCH_FAKE_OBJ)) {
909
            av_dict_set(&o->g->format_opts, "framerate",
910 911 912 913
                        o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
        }
    }
    if (o->nb_frame_sizes) {
914
        av_dict_set(&o->g->format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
915 916
    }
    if (o->nb_frame_pix_fmts)
917
        av_dict_set(&o->g->format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
918

919 920 921
    MATCH_PER_TYPE_OPT(codec_names, str,    video_codec_name, ic, "v");
    MATCH_PER_TYPE_OPT(codec_names, str,    audio_codec_name, ic, "a");
    MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
922
    MATCH_PER_TYPE_OPT(codec_names, str,     data_codec_name, ic, "d");
923

924 925 926 927 928 929
    ic->video_codec_id   = video_codec_name ?
        find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0)->id : AV_CODEC_ID_NONE;
    ic->audio_codec_id   = audio_codec_name ?
        find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0)->id : AV_CODEC_ID_NONE;
    ic->subtitle_codec_id= subtitle_codec_name ?
        find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
930 931
    ic->data_codec_id    = data_codec_name ?
        find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
932 933 934 935 936 937 938

    if (video_codec_name)
        av_format_set_video_codec   (ic, find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0));
    if (audio_codec_name)
        av_format_set_audio_codec   (ic, find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0));
    if (subtitle_codec_name)
        av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
939 940
    if (data_codec_name)
        av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
941

942 943 944
    ic->flags |= AVFMT_FLAG_NONBLOCK;
    ic->interrupt_callback = int_cb;

945 946 947 948
    if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
        av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
        scan_all_pmts_set = 1;
    }
949
    /* open the input file with generic avformat function */
950
    err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
951 952
    if (err < 0) {
        print_error(filename, err);
953
        exit_program(1);
954
    }
955 956
    if (scan_all_pmts_set)
        av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
957
    remove_avoptions(&o->g->format_opts, o->g->codec_opts);
958
    assert_avoptions(o->g->format_opts);
959 960 961 962 963 964

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

    /* Set AVCodecContext options for avformat_find_stream_info */
965
    opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
966 967 968 969 970 971 972
    orig_nb_streams = ic->nb_streams;

    /* If not enough info to get the stream parameters, we decode the
       first frames to get it. (used in mpeg case for example) */
    ret = avformat_find_stream_info(ic, opts);
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
973 974 975 976
        if (ic->nb_streams == 0) {
            avformat_close_input(&ic);
            exit_program(1);
        }
977 978
    }

979 980 981 982 983 984
    if (o->start_time_eof != AV_NOPTS_VALUE) {
        if (ic->duration>0) {
            o->start_time = o->start_time_eof + ic->duration;
        } else
            av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
    }
985
    timestamp = (o->start_time == AV_NOPTS_VALUE) ? 0 : o->start_time;
986
    /* add the stream start time */
987
    if (!o->seek_timestamp && ic->start_time != AV_NOPTS_VALUE)
988 989 990
        timestamp += ic->start_time;

    /* if seeking requested, we execute it */
991
    if (o->start_time != AV_NOPTS_VALUE) {
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
        int64_t seek_timestamp = timestamp;

        if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
            int dts_heuristic = 0;
            for (i=0; i<ic->nb_streams; i++) {
                AVCodecContext *avctx = ic->streams[i]->codec;
                if (avctx->has_b_frames)
                    dts_heuristic = 1;
            }
            if (dts_heuristic) {
                seek_timestamp -= 3*AV_TIME_BASE / 23;
            }
        }
        ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
        if (ret < 0) {
            av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
                   filename, (double)timestamp / AV_TIME_BASE);
        }
    }

    /* update the current parameters so that they match the one of the input stream */
    add_input_streams(o, ic);

    /* dump the file content */
    av_dump_format(ic, nb_input_files, filename, 0);

1018
    GROW_ARRAY(input_files, nb_input_files);
1019 1020
    f = av_mallocz(sizeof(*f));
    if (!f)
1021
        exit_program(1);
1022
    input_files[nb_input_files - 1] = f;
1023

1024 1025
    f->ctx        = ic;
    f->ist_index  = nb_input_streams - ic->nb_streams;
1026
    f->start_time = o->start_time;
1027
    f->recording_time = o->recording_time;
1028
    f->input_ts_offset = o->input_ts_offset;
1029
    f->ts_offset  = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
1030 1031
    f->nb_streams = ic->nb_streams;
    f->rate_emu   = o->rate_emu;
1032
    f->accurate_seek = o->accurate_seek;
1033 1034 1035
    f->loop = o->loop;
    f->duration = 0;
    f->time_base = (AVRational){ 1, 1 };
1036 1037 1038
#if HAVE_PTHREADS
    f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
#endif
1039

1040 1041 1042 1043
    /* check if all codec options have been used */
    unused_opts = strip_specifiers(o->g->codec_opts);
    for (i = f->ist_index; i < nb_input_streams; i++) {
        e = NULL;
1044
        while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1045 1046 1047 1048 1049 1050 1051 1052 1053
                                AV_DICT_IGNORE_SUFFIX)))
            av_dict_set(&unused_opts, e->key, NULL, 0);
    }

    e = NULL;
    while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
        const AVClass *class = avcodec_get_class();
        const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
                                             AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1054 1055 1056 1057
        const AVClass *fclass = avformat_get_class();
        const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
                                             AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
        if (!option || foption)
1058
            continue;
1059 1060


1061 1062 1063 1064 1065
        if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
            av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
                   "input file #%d (%s) is not a decoding option.\n", e->key,
                   option->help ? option->help : "", nb_input_files - 1,
                   filename);
1066
            exit_program(1);
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
        }

        av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
               "input file #%d (%s) has not been used for any stream. The most "
               "likely reason is either wrong type (e.g. a video option with "
               "no video streams) or that it is a private option of some decoder "
               "which was not actually used for any stream.\n", e->key,
               option->help ? option->help : "", nb_input_files - 1, filename);
    }
    av_dict_free(&unused_opts);

1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
    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);
        }
    }

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

1093 1094
    input_stream_potentially_available = 1;

1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
    return 0;
}

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");
1106
        exit_program(1);
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118
    }

    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)
{
1119
    int i, ret = -1;
1120 1121 1122 1123 1124 1125
    char filename[1000];
    const char *base[3] = { getenv("AVCONV_DATADIR"),
                            getenv("HOME"),
                            AVCONV_DATADIR,
                            };

1126
    for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1127 1128 1129 1130 1131 1132 1133
        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);
            ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
        }
1134
        if (ret < 0) {
1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
            snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
                     i != 1 ? "" : "/.avconv", preset_name);
            ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
        }
    }
    return ret;
}

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

1160
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1161 1162 1163 1164 1165 1166 1167
{
    OutputStream *ost;
    AVStream *st = avformat_new_stream(oc, NULL);
    int idx      = oc->nb_streams - 1, ret = 0;
    char *bsf = NULL, *next, *codec_tag = NULL;
    AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
    double qscale = -1;
1168
    int i;
1169 1170 1171

    if (!st) {
        av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1172
        exit_program(1);
1173 1174 1175 1176 1177
    }

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

1178
    GROW_ARRAY(output_streams, nb_output_streams);
1179
    if (!(ost = av_mallocz(sizeof(*ost))))
1180
        exit_program(1);
1181 1182
    output_streams[nb_output_streams - 1] = ost;

1183
    ost->file_index = nb_output_files - 1;
1184 1185 1186 1187
    ost->index      = idx;
    ost->st         = st;
    st->codec->codec_type = type;
    choose_encoder(o, oc, ost);
1188 1189 1190 1191 1192 1193 1194 1195

    ost->enc_ctx = avcodec_alloc_context3(ost->enc);
    if (!ost->enc_ctx) {
        av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
        exit_program(1);
    }
    ost->enc_ctx->codec_type = type;

1196
    if (ost->enc) {
1197 1198 1199
        AVIOContext *s = NULL;
        char *buf = NULL, *arg = NULL, *preset = NULL;

1200
        ost->encoder_opts  = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211

        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");
1212
                    exit_program(1);
1213 1214
                }
                *arg++ = 0;
1215
                av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
1216 1217
                av_free(buf);
            } while (!s->eof_reached);
1218
            avio_closep(&s);
1219 1220 1221 1222 1223
        }
        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);
1224
            exit_program(1);
1225
        }
1226
    } else {
1227
        ost->encoder_opts = filter_codec_opts(o->g->codec_opts, AV_CODEC_ID_NONE, oc, st, NULL);
1228 1229 1230 1231
    }

    ost->max_frames = INT64_MAX;
    MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1232 1233 1234 1235 1236 1237 1238
    for (i = 0; i<o->nb_max_frames; i++) {
        char *p = o->max_frames[i].specifier;
        if (!*p && type != AVMEDIA_TYPE_VIDEO) {
            av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
            break;
        }
    }
1239

1240 1241 1242
    ost->copy_prior_start = -1;
    MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);

1243 1244
    MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
    while (bsf) {
1245
        char *arg = NULL;
1246 1247
        if (next = strchr(bsf, ','))
            *next++ = 0;
1248 1249
        if (arg = strchr(bsf, '='))
            *arg++ = 0;
1250 1251
        if (!(bsfc = av_bitstream_filter_init(bsf))) {
            av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
1252
            exit_program(1);
1253 1254 1255 1256 1257
        }
        if (bsfc_prev)
            bsfc_prev->next = bsfc;
        else
            ost->bitstream_filters = bsfc;
1258 1259 1260 1261 1262
        if (arg)
            if (!(bsfc->args = av_strdup(arg))) {
                av_log(NULL, AV_LOG_FATAL, "Bitstream filter memory allocation failed\n");
                exit_program(1);
            }
1263 1264 1265 1266 1267 1268 1269 1270 1271 1272

        bsfc_prev = bsfc;
        bsf       = next;
    }

    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);
1273
        ost->st->codec->codec_tag =
1274
        ost->enc_ctx->codec_tag = tag;
1275 1276 1277
    }

    MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
1278
    if (qscale >= 0) {
1279
        ost->enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
1280
        ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
1281 1282
    }

1283 1284 1285
    MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
    ost->disposition = av_strdup(ost->disposition);

1286
    if (oc->oformat->flags & AVFMT_GLOBALHEADER)
1287
        ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
1288

1289
    av_dict_copy(&ost->sws_dict, o->g->sws_dict, 0);
1290 1291

    av_dict_copy(&ost->swr_opts, o->g->swr_opts, 0);
1292
    if (ost->enc && av_get_exact_bits_per_sample(ost->enc->id) == 24)
1293
        av_dict_set(&ost->swr_opts, "output_sample_bits", "24", 0);
1294

1295 1296
    av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);

1297 1298 1299 1300
    ost->source_index = source_index;
    if (source_index >= 0) {
        ost->sync_ist = input_streams[source_index];
        input_streams[source_index]->discard = 0;
1301
        input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
1302
    }
1303
    ost->last_mux_dts = AV_NOPTS_VALUE;
1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318

    return ost;
}

static void parse_matrix_coeffs(uint16_t *dest, const char *str)
{
    int i;
    const char *p = str;
    for (i = 0;; i++) {
        dest[i] = atoi(p);
        if (i == 63)
            break;
        p = strchr(p, ',');
        if (!p) {
            av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1319
            exit_program(1);
1320 1321 1322 1323 1324
        }
        p++;
    }
}

1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358
/* read file contents into a string */
static uint8_t *read_file(const char *filename)
{
    AVIOContext *pb      = NULL;
    AVIOContext *dyn_buf = NULL;
    int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
    uint8_t buf[1024], *str;

    if (ret < 0) {
        av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
        return NULL;
    }

    ret = avio_open_dyn_buf(&dyn_buf);
    if (ret < 0) {
        avio_closep(&pb);
        return NULL;
    }
    while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
        avio_write(dyn_buf, buf, ret);
    avio_w8(dyn_buf, 0);
    avio_closep(&pb);

    ret = avio_close_dyn_buf(dyn_buf, &str);
    if (ret < 0)
        return NULL;
    return str;
}

static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
                             OutputStream *ost)
{
    AVStream *st = ost->st;

1359
    if (ost->filters_script && ost->filters) {
1360 1361
        av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
               "output stream #%d:%d.\n", nb_output_files, st->index);
1362
        exit_program(1);
1363 1364
    }

1365 1366 1367 1368
    if (ost->filters_script)
        return read_file(ost->filters_script);
    else if (ost->filters)
        return av_strdup(ost->filters);
1369 1370 1371 1372 1373

    return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
                     "null" : "anull");
}

1374 1375 1376
static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
                                     const OutputStream *ost, enum AVMediaType type)
{
1377
    if (ost->filters_script || ost->filters) {
1378
        av_log(NULL, AV_LOG_ERROR,
1379
               "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1380
               "Filtering and streamcopy cannot be used together.\n",
1381 1382 1383
               ost->filters ? "Filtergraph" : "Filtergraph script",
               ost->filters ? ost->filters : ost->filters_script,
               av_get_media_type_string(type), ost->file_index, ost->index);
1384 1385 1386 1387
        exit_program(1);
    }
}

1388
static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1389 1390 1391 1392
{
    AVStream *st;
    OutputStream *ost;
    AVCodecContext *video_enc;
1393
    char *frame_rate = NULL, *frame_aspect_ratio = NULL;
1394

1395
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
1396
    st  = ost->st;
1397
    video_enc = ost->enc_ctx;
1398

1399 1400 1401
    MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
    if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
        av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1402
        exit_program(1);
1403
    }
1404 1405
    if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
        av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1406

1407 1408 1409 1410 1411 1412
    MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
    if (frame_aspect_ratio) {
        AVRational q;
        if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
            q.num <= 0 || q.den <= 0) {
            av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1413
            exit_program(1);
1414 1415 1416 1417
        }
        ost->frame_aspect_ratio = q;
    }

1418 1419 1420
    MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
    MATCH_PER_STREAM_OPT(filters,        str, ost->filters,        oc, st);

1421 1422
    if (!ost->stream_copy) {
        const char *p = NULL;
1423
        char *frame_size = NULL;
1424
        char *frame_pix_fmt = NULL;
1425
        char *intra_matrix = NULL, *inter_matrix = NULL;
1426
        char *chroma_intra_matrix = NULL;
1427
        int do_pass = 0;
1428 1429 1430 1431 1432
        int i;

        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) {
            av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1433
            exit_program(1);
1434 1435
        }

1436
        video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
1437
        MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
1438 1439 1440 1441 1442
        if (frame_pix_fmt && *frame_pix_fmt == '+') {
            ost->keep_pix_fmt = 1;
            if (!*++frame_pix_fmt)
                frame_pix_fmt = NULL;
        }
1443
        if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
1444
            av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
1445
            exit_program(1);
1446 1447 1448
        }
        st->sample_aspect_ratio = video_enc->sample_aspect_ratio;

1449 1450
        if (intra_only)
            video_enc->gop_size = 0;
1451 1452 1453 1454
        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))) {
                av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1455
                exit_program(1);
1456 1457 1458
            }
            parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
        }
1459 1460 1461 1462 1463 1464 1465 1466 1467 1468
        MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
        if (chroma_intra_matrix) {
            uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
            if (!p) {
                av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
                exit_program(1);
            }
            av_codec_set_chroma_intra_matrix(video_enc, p);
            parse_matrix_coeffs(p, chroma_intra_matrix);
        }
1469 1470 1471 1472
        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))) {
                av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1473
                exit_program(1);
1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
            }
            parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
        }

        MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
        for (i = 0; p; i++) {
            int start, end, q;
            int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
            if (e != 3) {
                av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1484
                exit_program(1);
1485 1486
            }
            video_enc->rc_override =
1487 1488
                av_realloc_array(video_enc->rc_override,
                                 i + 1, sizeof(RcOverride));
1489 1490
            if (!video_enc->rc_override) {
                av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1491
                exit_program(1);
1492
            }
1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
            video_enc->rc_override[i].start_frame = start;
            video_enc->rc_override[i].end_frame   = end;
            if (q > 0) {
                video_enc->rc_override[i].qscale         = q;
                video_enc->rc_override[i].quality_factor = 1.0;
            }
            else {
                video_enc->rc_override[i].qscale         = 0;
                video_enc->rc_override[i].quality_factor = -q/100.0;
            }
            p = strchr(p, '/');
            if (p) p++;
        }
        video_enc->rc_override_count = i;

1508
        if (do_psnr)
1509
            video_enc->flags|= AV_CODEC_FLAG_PSNR;
1510

1511
        /* two pass mode */
1512
        MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
1513
        if (do_pass) {
1514
            if (do_pass & 1) {
1515
                video_enc->flags |= AV_CODEC_FLAG_PASS1;
1516
                av_dict_set(&ost->encoder_opts, "flags", "+pass1", AV_DICT_APPEND);
1517 1518
            }
            if (do_pass & 2) {
1519
                video_enc->flags |= AV_CODEC_FLAG_PASS2;
1520
                av_dict_set(&ost->encoder_opts, "flags", "+pass2", AV_DICT_APPEND);
1521 1522 1523
            }
        }

1524 1525 1526
        MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
        if (ost->logfile_prefix &&
            !(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1527
            exit_program(1);
1528

1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
        if (do_pass) {
            char logfilename[1024];
            FILE *f;

            snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
                     ost->logfile_prefix ? ost->logfile_prefix :
                                           DEFAULT_PASS_LOGFILENAME_PREFIX,
                     i);
            if (!strcmp(ost->enc->name, "libx264")) {
                av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
            } else {
1540
                if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1541 1542 1543
                    char  *logbuffer = read_file(logfilename);

                    if (!logbuffer) {
1544 1545 1546 1547 1548 1549
                        av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
                               logfilename);
                        exit_program(1);
                    }
                    video_enc->stats_in = logbuffer;
                }
1550
                if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1551 1552 1553 1554 1555 1556 1557 1558 1559
                    f = av_fopen_utf8(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;
                }
1560 1561 1562
            }
        }

1563 1564 1565 1566 1567 1568 1569 1570 1571
        MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
        if (ost->forced_keyframes)
            ost->forced_keyframes = av_strdup(ost->forced_keyframes);

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

1572 1573 1574

        ost->avfilter = get_ost_filters(o, oc, ost);
        if (!ost->avfilter)
1575
            exit_program(1);
1576 1577 1578 1579
    } else {
        MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
    }

1580 1581 1582
    if (ost->stream_copy)
        check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);

1583 1584 1585
    return ost;
}

1586
static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1587
{
1588
    int n;
1589 1590 1591 1592
    AVStream *st;
    OutputStream *ost;
    AVCodecContext *audio_enc;

1593
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1594 1595
    st  = ost->st;

1596
    audio_enc = ost->enc_ctx;
1597 1598
    audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;

1599 1600 1601
    MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
    MATCH_PER_STREAM_OPT(filters,        str, ost->filters,        oc, st);

1602 1603 1604 1605 1606 1607 1608 1609 1610
    if (!ost->stream_copy) {
        char *sample_fmt = NULL;

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

        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) {
            av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1611
            exit_program(1);
1612 1613 1614 1615
        }

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

1616 1617 1618
        MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
        ost->apad = av_strdup(ost->apad);

1619 1620
        ost->avfilter = get_ost_filters(o, oc, ost);
        if (!ost->avfilter)
1621
            exit_program(1);
1622 1623 1624 1625

        /* 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];
1626
            if ((map->ofile_idx   == -1 || ost->file_index == map->ofile_idx) &&
1627
                (map->ostream_idx == -1 || ost->st->index  == map->ostream_idx)) {
1628 1629 1630 1631 1632 1633
                InputStream *ist;

                if (map->channel_idx == -1) {
                    ist = NULL;
                } else if (ost->source_index < 0) {
                    av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1634
                           ost->file_index, ost->st->index);
1635 1636 1637 1638 1639 1640
                    continue;
                } else {
                    ist = input_streams[ost->source_index];
                }

                if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1641 1642 1643 1644 1645 1646 1647
                    if (av_reallocp_array(&ost->audio_channels_map,
                                          ost->audio_channels_mapped + 1,
                                          sizeof(*ost->audio_channels_map)
                                          ) < 0 )
                        exit_program(1);

                    ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1648
                }
1649 1650
            }
        }
1651 1652
    }

1653 1654 1655
    if (ost->stream_copy)
        check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);

1656 1657 1658
    return ost;
}

1659
static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1660 1661 1662
{
    OutputStream *ost;

1663
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1664 1665
    if (!ost->stream_copy) {
        av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1666
        exit_program(1);
1667 1668 1669 1670 1671
    }

    return ost;
}

1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684
static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
{
    OutputStream *ost;

    ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
    if (!ost->stream_copy) {
        av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
        exit_program(1);
    }

    return ost;
}

1685
static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1686
{
1687
    OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
1688
    ost->stream_copy = 1;
1689
    ost->finished    = 1;
1690 1691 1692
    return ost;
}

1693
static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1694 1695 1696 1697 1698
{
    AVStream *st;
    OutputStream *ost;
    AVCodecContext *subtitle_enc;

1699
    ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1700
    st  = ost->st;
1701
    subtitle_enc = ost->enc_ctx;
1702 1703 1704

    subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;

1705 1706
    MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);

1707 1708 1709 1710 1711 1712
    if (!ost->stream_copy) {
        char *frame_size = NULL;

        MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
        if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
            av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1713
            exit_program(1);
1714 1715 1716
        }
    }

1717 1718 1719 1720
    return ost;
}

/* arg format is "output-stream-index:streamid-value". */
1721
static int opt_streamid(void *optctx, const char *opt, const char *arg)
1722
{
1723
    OptionsContext *o = optctx;
1724 1725 1726 1727 1728 1729 1730 1731 1732 1733
    int idx;
    char *p;
    char idx_str[16];

    av_strlcpy(idx_str, arg, sizeof(idx_str));
    p = strchr(idx_str, ':');
    if (!p) {
        av_log(NULL, AV_LOG_FATAL,
               "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
               arg, opt);
1734
        exit_program(1);
1735 1736
    }
    *p++ = '\0';
1737
    idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
1738 1739 1740 1741 1742 1743 1744 1745 1746
    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);
    return 0;
}

static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
{
    AVFormatContext *is = ifile->ctx;
    AVFormatContext *os = ofile->ctx;
1747
    AVChapter **tmp;
1748 1749
    int i;

1750
    tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1751 1752 1753 1754
    if (!tmp)
        return AVERROR(ENOMEM);
    os->chapters = tmp;

1755 1756
    for (i = 0; i < is->nb_chapters; i++) {
        AVChapter *in_ch = is->chapters[i], *out_ch;
1757 1758
        int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
        int64_t ts_off   = av_rescale_q(start_time - ifile->ts_offset,
1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
                                       AV_TIME_BASE_Q, in_ch->time_base);
        int64_t rt       = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
                           av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);


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

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

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

        if (copy_metadata)
            av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);

1781
        os->chapters[os->nb_chapters++] = out_ch;
1782 1783 1784 1785
    }
    return 0;
}

1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799
static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
{
    int i, err;
    AVFormatContext *ic = avformat_alloc_context();

    ic->interrupt_callback = int_cb;
    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;
1800
        const char *enc_config;
1801 1802

        codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1803 1804 1805 1806
        if (!codec) {
            av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
            return AVERROR(EINVAL);
        }
1807 1808 1809 1810
        if (codec->type == AVMEDIA_TYPE_AUDIO)
            opt_audio_codec(o, "c:a", codec->name);
        else if (codec->type == AVMEDIA_TYPE_VIDEO)
            opt_video_codec(o, "c:v", codec->name);
1811 1812 1813
        ost   = new_output_stream(o, s, codec->type, -1);
        st    = ost->st;

1814 1815 1816 1817 1818 1819 1820 1821
        avcodec_get_context_defaults3(st->codec, codec);
        enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
        if (enc_config) {
            AVDictionary *opts = NULL;
            av_dict_parse_string(&opts, enc_config, "=", ",", 0);
            av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
            av_dict_free(&opts);
        }
1822 1823 1824 1825

        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
            choose_sample_fmt(st, codec);
        else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
1826
            choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
1827 1828 1829
        avcodec_copy_context(ost->enc_ctx, st->codec);
        if (enc_config)
            av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
1830 1831 1832
    }

    avformat_close_input(&ic);
1833
    return err;
1834 1835
}

1836 1837 1838 1839 1840
static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
                               AVFormatContext *oc)
{
    OutputStream *ost;

1841
    switch (ofilter->type) {
1842 1843
    case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
    case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1844 1845 1846
    default:
        av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
               "currently.\n");
1847
        exit_program(1);
1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858
    }

    ost->source_index = -1;
    ost->filter       = ofilter;

    ofilter->ost      = ost;

    if (ost->stream_copy) {
        av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
               "which is fed from a complex filtergraph. Filtering and streamcopy "
               "cannot be used together.\n", ost->file_index, ost->index);
1859
        exit_program(1);
1860 1861
    }

1862
    if (ost->avfilter && (ost->filters || ost->filters_script)) {
1863 1864 1865 1866 1867 1868 1869 1870 1871
        const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
        av_log(NULL, AV_LOG_ERROR,
               "%s '%s' was specified through the %s option "
               "for output stream %d:%d, which is fed from a complex filtergraph.\n"
               "%s and -filter_complex cannot be used together for the same stream.\n",
               ost->filters ? "Filtergraph" : "Filtergraph script",
               ost->filters ? ost->filters : ost->filters_script,
               opt, ost->file_index, ost->index, opt);
        exit_program(1);
1872 1873
    }

1874 1875 1876
    avfilter_inout_free(&ofilter->out_tmp);
}

1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888
static int init_complex_filters(void)
{
    int i, ret = 0;

    for (i = 0; i < nb_filtergraphs; i++) {
        ret = init_complex_filtergraph(filtergraphs[i]);
        if (ret < 0)
            return ret;
    }
    return 0;
}

1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
static int configure_complex_filters(void)
{
    int i, ret = 0;

    for (i = 0; i < nb_filtergraphs; i++)
        if (!filtergraphs[i]->graph &&
            (ret = configure_filtergraph(filtergraphs[i])) < 0)
            return ret;
    return 0;
}

1900
static int open_output_file(OptionsContext *o, const char *filename)
1901 1902 1903 1904
{
    AVFormatContext *oc;
    int i, j, err;
    AVOutputFormat *file_oformat;
1905
    OutputFile *of;
1906 1907
    OutputStream *ost;
    InputStream  *ist;
1908 1909
    AVDictionary *unused_opts = NULL;
    AVDictionaryEntry *e = NULL;
1910 1911


1912 1913 1914 1915 1916 1917
    if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
        o->stop_time = INT64_MAX;
        av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
    }

    if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1918 1919
        int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
        if (o->stop_time <= start_time) {
1920 1921
            av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
            exit_program(1);
1922
        } else {
1923
            o->recording_time = o->stop_time - start_time;
1924 1925 1926
        }
    }

1927 1928 1929
    GROW_ARRAY(output_files, nb_output_files);
    of = av_mallocz(sizeof(*of));
    if (!of)
1930
        exit_program(1);
1931 1932 1933 1934 1935 1936 1937 1938 1939
    output_files[nb_output_files - 1] = of;

    of->ost_index      = nb_output_streams;
    of->recording_time = o->recording_time;
    of->start_time     = o->start_time;
    of->limit_filesize = o->limit_filesize;
    of->shortest       = o->shortest;
    av_dict_copy(&of->opts, o->g->format_opts, 0);

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

1943
    err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
1944
    if (!oc) {
1945
        print_error(filename, err);
1946
        exit_program(1);
1947
    }
1948

1949 1950 1951
    of->ctx = oc;
    if (o->recording_time != INT64_MAX)
        oc->duration = o->recording_time;
1952

1953
    file_oformat= oc->oformat;
1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964
    oc->interrupt_callback = int_cb;

    /* create streams for all unlabeled output pads */
    for (i = 0; i < nb_filtergraphs; i++) {
        FilterGraph *fg = filtergraphs[i];
        for (j = 0; j < fg->nb_outputs; j++) {
            OutputFilter *ofilter = fg->outputs[j];

            if (!ofilter->out_tmp || ofilter->out_tmp->name)
                continue;

1965
            switch (ofilter->type) {
1966 1967 1968 1969 1970 1971 1972 1973
            case AVMEDIA_TYPE_VIDEO:    o->video_disable    = 1; break;
            case AVMEDIA_TYPE_AUDIO:    o->audio_disable    = 1; break;
            case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
            }
            init_output_filter(ofilter, o, oc);
        }
    }

1974 1975 1976 1977 1978 1979 1980 1981 1982 1983
    /* ffserver seeking with date=... needs a date reference */
    if (!strcmp(file_oformat->name, "ffm") &&
        av_strstart(filename, "http:", NULL)) {
        int err = parse_option(o, "metadata", "creation_time=now", options);
        if (err < 0) {
            print_error(filename, err);
            exit_program(1);
        }
    }

1984
    if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
1985 1986 1987 1988 1989 1990 1991
        av_strstart(filename, "http:", NULL)) {
        int j;
        /* special case for files sent to ffserver: we get the stream
           parameters from ffserver */
        int err = read_ffserver_streams(o, oc, filename);
        if (err < 0) {
            print_error(filename, err);
1992
            exit_program(1);
1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
        }
        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;
                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
                    ist->discard = 0;
2004
                    ist->st->discard = ist->user_set_discard;
2005 2006 2007 2008 2009
                    break;
                }
            }
            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));
2010
                exit_program(1);
2011
            }
2012
        }
2013
    } else if (!o->nb_stream_maps) {
2014
        char *subtitle_codec_name = NULL;
2015
        /* pick the "best" stream of each type */
2016 2017

        /* video: highest resolution */
2018
        if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
2019
            int area = 0, idx = -1;
2020
            int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
2021
            for (i = 0; i < nb_input_streams; i++) {
2022
                int new_area;
2023
                ist = input_streams[i];
2024
                new_area = ist->st->codec->width * ist->st->codec->height + 100000000*!!ist->st->codec_info_nb_frames;
2025 2026
                if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
                    new_area = 1;
2027
                if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
2028
                    new_area > area) {
2029 2030
                    if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
                        continue;
2031
                    area = new_area;
2032 2033 2034
                    idx = i;
                }
            }
2035 2036
            if (idx >= 0)
                new_video_stream(o, oc, idx);
2037 2038 2039
        }

        /* audio: most channels */
2040
        if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
2041
            int best_score = 0, idx = -1;
2042
            for (i = 0; i < nb_input_streams; i++) {
2043
                int score;
2044
                ist = input_streams[i];
2045
                score = ist->st->codec->channels + 100000000*!!ist->st->codec_info_nb_frames;
2046
                if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
2047 2048
                    score > best_score) {
                    best_score = score;
2049 2050 2051
                    idx = i;
                }
            }
2052 2053
            if (idx >= 0)
                new_audio_stream(o, oc, idx);
2054 2055 2056
        }

        /* subtitles: pick first */
2057
        MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
2058
        if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
2059 2060
            for (i = 0; i < nb_input_streams; i++)
                if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081
                    AVCodecDescriptor const *input_descriptor =
                        avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
                    AVCodecDescriptor const *output_descriptor = NULL;
                    AVCodec const *output_codec =
                        avcodec_find_encoder(oc->oformat->subtitle_codec);
                    int input_props = 0, output_props = 0;
                    if (output_codec)
                        output_descriptor = avcodec_descriptor_get(output_codec->id);
                    if (input_descriptor)
                        input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
                    if (output_descriptor)
                        output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
                    if (subtitle_codec_name ||
                        input_props & output_props ||
                        // Map dvb teletext which has neither property to any output subtitle encoder
                        input_descriptor && output_descriptor &&
                        (!input_descriptor->props ||
                         !output_descriptor->props)) {
                        new_subtitle_stream(o, oc, i);
                        break;
                    }
2082 2083
                }
        }
2084 2085 2086 2087 2088 2089 2090 2091 2092
        /* Data only if codec id match */
        if (!o->data_disable ) {
            enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
            for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
                if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_DATA
                    && input_streams[i]->st->codec->codec_id == codec_id )
                    new_data_stream(o, oc, i);
            }
        }
2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117
    } else {
        for (i = 0; i < o->nb_stream_maps; i++) {
            StreamMap *map = &o->stream_maps[i];

            if (map->disabled)
                continue;

            if (map->linklabel) {
                FilterGraph *fg;
                OutputFilter *ofilter = NULL;
                int j, k;

                for (j = 0; j < nb_filtergraphs; j++) {
                    fg = filtergraphs[j];
                    for (k = 0; k < fg->nb_outputs; k++) {
                        AVFilterInOut *out = fg->outputs[k]->out_tmp;
                        if (out && !strcmp(out->name, map->linklabel)) {
                            ofilter = fg->outputs[k];
                            goto loop_end;
                        }
                    }
                }
loop_end:
                if (!ofilter) {
                    av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
2118
                           "in any defined filter graph, or was already used elsewhere.\n", map->linklabel);
2119
                    exit_program(1);
2120 2121 2122
                }
                init_output_filter(ofilter, o, oc);
            } else {
2123 2124
                int src_idx = input_files[map->file_index]->ist_index + map->stream_index;

2125
                ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2126 2127 2128 2129 2130 2131 2132 2133 2134
                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;
                if(o->    data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
                    continue;

2135
                ost = NULL;
2136
                switch (ist->st->codec->codec_type) {
2137 2138 2139 2140 2141
                case AVMEDIA_TYPE_VIDEO:      ost = new_video_stream     (o, oc, src_idx); break;
                case AVMEDIA_TYPE_AUDIO:      ost = new_audio_stream     (o, oc, src_idx); break;
                case AVMEDIA_TYPE_SUBTITLE:   ost = new_subtitle_stream  (o, oc, src_idx); break;
                case AVMEDIA_TYPE_DATA:       ost = new_data_stream      (o, oc, src_idx); break;
                case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2142 2143 2144 2145 2146
                case AVMEDIA_TYPE_UNKNOWN:
                    if (copy_unknown_streams) {
                        ost = new_unknown_stream   (o, oc, src_idx);
                        break;
                    }
2147
                default:
2148
                    av_log(NULL, ignore_unknown_streams ? AV_LOG_WARNING : AV_LOG_FATAL,
2149
                           "Cannot map stream #%d:%d - unsupported type.\n",
2150
                           map->file_index, map->stream_index);
2151 2152
                    if (!ignore_unknown_streams) {
                        av_log(NULL, AV_LOG_FATAL,
2153
                               "If you want unsupported types ignored instead "
2154 2155
                               "of failing, please use the -ignore_unknown option\n"
                               "If you want them copied, please use -copy_unknown\n");
2156
                        exit_program(1);
2157
                    }
2158
                }
2159 2160 2161
                if (ost)
                    ost->sync_ist = input_streams[  input_files[map->sync_file_index]->ist_index
                                                  + map->sync_stream_index];
2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175
            }
        }
    }

    /* handle attached files */
    for (i = 0; i < o->nb_attachments; i++) {
        AVIOContext *pb;
        uint8_t *attachment;
        const char *p;
        int64_t len;

        if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
            av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
                   o->attachments[i]);
2176
            exit_program(1);
2177 2178 2179 2180
        }
        if ((len = avio_size(pb)) <= 0) {
            av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
                   o->attachments[i]);
2181
            exit_program(1);
2182 2183 2184 2185
        }
        if (!(attachment = av_malloc(len))) {
            av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
                   o->attachments[i]);
2186
            exit_program(1);
2187 2188 2189
        }
        avio_read(pb, attachment, len);

2190
        ost = new_attachment_stream(o, oc, -1);
2191
        ost->stream_copy               = 1;
2192
        ost->attachment_filename       = o->attachments[i];
2193
        ost->finished                  = 1;
2194 2195 2196 2197 2198
        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);
2199
        avio_closep(&pb);
2200 2201
    }

2202 2203 2204 2205
    for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
        AVDictionaryEntry *e;
        ost = output_streams[i];

2206
        if ((ost->stream_copy || ost->attachment_filename)
2207 2208 2209
            && (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
            && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
            if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2210
                exit_program(1);
2211 2212
    }

2213 2214 2215 2216 2217 2218
    if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
        av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
        av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
        exit_program(1);
    }

2219 2220 2221 2222
    /* check if all codec options have been used */
    unused_opts = strip_specifiers(o->g->codec_opts);
    for (i = of->ost_index; i < nb_output_streams; i++) {
        e = NULL;
2223
        while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2224 2225 2226 2227 2228 2229 2230 2231 2232
                                AV_DICT_IGNORE_SUFFIX)))
            av_dict_set(&unused_opts, e->key, NULL, 0);
    }

    e = NULL;
    while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
        const AVClass *class = avcodec_get_class();
        const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
                                             AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2233 2234 2235 2236
        const AVClass *fclass = avformat_get_class();
        const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
                                              AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
        if (!option || foption)
2237
            continue;
2238 2239


2240 2241 2242 2243 2244
        if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
            av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
                   "output file #%d (%s) is not an encoding option.\n", e->key,
                   option->help ? option->help : "", nb_output_files - 1,
                   filename);
2245
            exit_program(1);
2246 2247
        }

2248 2249 2250 2251
        // gop_timecode is injected by generic code but not always used
        if (!strcmp(e->key, "gop_timecode"))
            continue;

2252 2253 2254 2255 2256 2257 2258 2259 2260
        av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
               "output file #%d (%s) has not been used for any stream. The most "
               "likely reason is either wrong type (e.g. a video option with "
               "no video streams) or that it is a private option of some encoder "
               "which was not actually used for any stream.\n", e->key,
               option->help ? option->help : "", nb_output_files - 1, filename);
    }
    av_dict_free(&unused_opts);

2261 2262 2263 2264 2265 2266 2267
    /* set the encoding/decoding_needed flags */
    for (i = of->ost_index; i < nb_output_streams; i++) {
        OutputStream *ost = output_streams[i];

        ost->encoding_needed = !ost->stream_copy;
        if (ost->encoding_needed && ost->source_index >= 0) {
            InputStream *ist = input_streams[ost->source_index];
2268
            ist->decoding_needed |= DECODING_FOR_OST;
2269 2270 2271
        }
    }

2272 2273 2274 2275
    /* check filename in case of an image number is expected */
    if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
        if (!av_filename_number_test(oc->filename)) {
            print_error(oc->filename, AVERROR(EINVAL));
2276
            exit_program(1);
2277 2278 2279
        }
    }

2280 2281 2282 2283 2284 2285
    if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
        av_log(NULL, AV_LOG_ERROR,
               "No input streams but output needs an input stream\n");
        exit_program(1);
    }

2286 2287 2288 2289 2290 2291 2292
    if (!(oc->oformat->flags & AVFMT_NOFILE)) {
        /* test if it already exists to avoid losing precious files */
        assert_file_overwrite(filename);

        /* open the file */
        if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
                              &oc->interrupt_callback,
2293
                              &of->opts)) < 0) {
2294
            print_error(filename, err);
2295
            exit_program(1);
2296
        }
2297 2298
    } else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
        assert_file_overwrite(filename);
2299 2300

    if (o->mux_preload) {
2301
        av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
    }
    oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);

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

        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);
2312
            exit_program(1);
2313
        }
2314 2315 2316
        copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
                      in_file_index >= 0 ?
                      input_files[in_file_index]->ctx : NULL, o);
2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331
    }

    /* copy chapters */
    if (o->chapters_input_file >= nb_input_files) {
        if (o->chapters_input_file == INT_MAX) {
            /* copy chapters from the first input file that has them*/
            o->chapters_input_file = -1;
            for (i = 0; i < nb_input_files; i++)
                if (input_files[i]->ctx->nb_chapters) {
                    o->chapters_input_file = i;
                    break;
                }
        } else {
            av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
                   o->chapters_input_file);
2332
            exit_program(1);
2333 2334 2335
        }
    }
    if (o->chapters_input_file >= 0)
2336
        copy_chapters(input_files[o->chapters_input_file], of,
2337 2338 2339
                      !o->metadata_chapters_manual);

    /* copy global metadata by default */
2340
    if (!o->metadata_global_manual && nb_input_files){
2341 2342
        av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
                     AV_DICT_DONT_OVERWRITE);
2343 2344 2345 2346
        if(o->recording_time != INT64_MAX)
            av_dict_set(&oc->metadata, "duration", NULL, 0);
        av_dict_set(&oc->metadata, "creation_time", NULL, 0);
    }
2347
    if (!o->metadata_streams_manual)
2348
        for (i = of->ost_index; i < nb_output_streams; i++) {
2349 2350 2351 2352 2353
            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];
            av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
2354
            if (!output_streams[i]->stream_copy) {
2355
                av_dict_set(&output_streams[i]->st->metadata, "encoder", NULL, 0);
2356 2357 2358
                if (ist->autorotate)
                    av_dict_set(&output_streams[i]->st->metadata, "rotate", NULL, 0);
            }
2359 2360 2361 2362 2363 2364 2365
        }

    /* process manually set metadata */
    for (i = 0; i < o->nb_metadata; i++) {
        AVDictionary **m;
        char type, *val;
        const char *stream_spec;
2366
        int index = 0, j, ret = 0;
2367
        char now_time[256];
2368 2369 2370 2371 2372

        val = strchr(o->metadata[i].u.str, '=');
        if (!val) {
            av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
                   o->metadata[i].u.str);
2373
            exit_program(1);
2374 2375 2376
        }
        *val++ = 0;

2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387
        if (!strcmp(o->metadata[i].u.str, "creation_time") &&
            !strcmp(val, "now")) {
            time_t now = time(0);
            struct tm *ptm, tmbuf;
            ptm = localtime_r(&now, &tmbuf);
            if (ptm) {
                if (strftime(now_time, sizeof(now_time), "%Y-%m-%d %H:%M:%S", ptm))
                    val = now_time;
            }
        }

2388 2389 2390
        parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
        if (type == 's') {
            for (j = 0; j < oc->nb_streams; j++) {
2391
                ost = output_streams[nb_output_streams - oc->nb_streams + j];
2392 2393
                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);
2394 2395 2396
                    if (!strcmp(o->metadata[i].u.str, "rotate")) {
                        ost->rotate_overridden = 1;
                    }
2397
                } else if (ret < 0)
2398
                    exit_program(1);
2399 2400 2401 2402 2403 2404 2405 2406 2407 2408
            }
        }
        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);
2409
                    exit_program(1);
2410 2411 2412 2413 2414
                }
                m = &oc->chapters[index]->metadata;
                break;
            default:
                av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2415
                exit_program(1);
2416 2417 2418 2419 2420
            }
            av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
        }
    }

2421 2422 2423 2424
    /* process manually set programs */
    for (i = 0; i < o->nb_program; i++) {
        const char *p = o->program[i].u.str;
        int progid = i+1;
2425
        AVProgram *program;
2426

2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445
        while(*p) {
            const char *p2 = av_get_token(&p, ":");
            char *key;
            if (!p2)
                break;
            if(*p) p++;

            key = av_get_token(&p2, "=");
            if (!key || !*p2)
                break;
            p2++;

            if (!strcmp(key, "program_num"))
                progid = strtol(p2, NULL, 0);
        }

        program = av_new_program(oc, progid);

        p = o->program[i].u.str;
2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465
        while(*p) {
            const char *p2 = av_get_token(&p, ":");
            char *key;
            if (!p2)
                break;
            if(*p) p++;

            key = av_get_token(&p2, "=");
            if (!key) {
                av_log(NULL, AV_LOG_FATAL,
                       "No '=' character in program string %s.\n",
                       p2);
                exit_program(1);
            }
            if (!*p2)
                exit_program(1);
            p2++;

            if (!strcmp(key, "title")) {
                av_dict_set(&program->metadata, "title", p2, 0);
2466
            } else if (!strcmp(key, "program_num")) {
2467 2468 2469 2470 2471 2472 2473 2474 2475 2476
            } else if (!strcmp(key, "st")) {
                int st_num = strtol(p2, NULL, 0);
                av_program_add_stream_index(oc, progid, st_num);
            } else {
                av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
                exit_program(1);
            }
        }
    }

2477
    return 0;
2478 2479
}

2480
static int opt_target(void *optctx, const char *opt, const char *arg)
2481
{
2482
    OptionsContext *o = optctx;
2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501
    enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
    static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };

    if (!strncmp(arg, "pal-", 4)) {
        norm = PAL;
        arg += 4;
    } else if (!strncmp(arg, "ntsc-", 5)) {
        norm = NTSC;
        arg += 5;
    } else if (!strncmp(arg, "film-", 5)) {
        norm = FILM;
        arg += 5;
    } else {
        /* Try to determine PAL/NTSC by peeking in the input files */
        if (nb_input_files) {
            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;
2502 2503
                    if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
                        !c->time_base.num)
2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525
                        continue;
                    fr = c->time_base.den * 1000 / c->time_base.num;
                    if (fr == 25000) {
                        norm = PAL;
                        break;
                    } else if ((fr == 29970) || (fr == 23976)) {
                        norm = NTSC;
                        break;
                    }
                }
                if (norm != UNKNOWN)
                    break;
            }
        }
        if (norm != UNKNOWN)
            av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
    }

    if (norm == UNKNOWN) {
        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");
2526
        exit_program(1);
2527 2528 2529 2530 2531 2532 2533 2534 2535
    }

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

        parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
        parse_option(o, "r", frame_rates[norm], options);
2536
        opt_default(NULL, "g", norm == PAL ? "15" : "18");
2537

2538
        opt_default(NULL, "b:v", "1150000");
2539 2540 2541
        opt_default(NULL, "maxrate:v", "1150000");
        opt_default(NULL, "minrate:v", "1150000");
        opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2542

2543
        opt_default(NULL, "b:a", "224000");
2544 2545 2546
        parse_option(o, "ar", "44100", options);
        parse_option(o, "ac", "2", options);

2547 2548
        opt_default(NULL, "packetsize", "2324");
        opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563

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

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

        parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
        parse_option(o, "r", frame_rates[norm], options);
2564
        parse_option(o, "pix_fmt", "yuv420p", options);
2565
        opt_default(NULL, "g", norm == PAL ? "15" : "18");
2566

2567
        opt_default(NULL, "b:v", "2040000");
2568 2569 2570
        opt_default(NULL, "maxrate:v", "2516000");
        opt_default(NULL, "minrate:v", "0"); // 1145000;
        opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2571
        opt_default(NULL, "scan_offset", "1");
2572

2573
        opt_default(NULL, "b:a", "224000");
2574 2575
        parse_option(o, "ar", "44100", options);

2576
        opt_default(NULL, "packetsize", "2324");
2577 2578 2579 2580 2581 2582 2583 2584 2585

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

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

        parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
        parse_option(o, "r", frame_rates[norm], options);
2586
        parse_option(o, "pix_fmt", "yuv420p", options);
2587
        opt_default(NULL, "g", norm == PAL ? "15" : "18");
2588

2589
        opt_default(NULL, "b:v", "6000000");
2590 2591 2592
        opt_default(NULL, "maxrate:v", "9000000");
        opt_default(NULL, "minrate:v", "0"); // 1500000;
        opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2593

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

2597
        opt_default(NULL, "b:a", "448000");
2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615
        parse_option(o, "ar", "48000", options);

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

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

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

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

    } else {
        av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
        return AVERROR(EINVAL);
    }
2616

2617 2618
    av_dict_copy(&o->g->codec_opts,  codec_opts, AV_DICT_DONT_OVERWRITE);
    av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2619

2620 2621 2622
    return 0;
}

2623
static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2624 2625 2626 2627 2628 2629
{
    av_free (vstats_filename);
    vstats_filename = av_strdup (arg);
    return 0;
}

2630
static int opt_vstats(void *optctx, const char *opt, const char *arg)
2631 2632 2633 2634 2635
{
    char filename[40];
    time_t today2 = time(NULL);
    struct tm *today = localtime(&today2);

2636
    if (!today) { // maybe tomorrow
2637
        av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2638 2639
        exit_program(1);
    }
2640

2641 2642
    snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
             today->tm_sec);
2643
    return opt_vstats_file(NULL, opt, filename);
2644 2645
}

2646
static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2647
{
2648
    OptionsContext *o = optctx;
2649 2650 2651
    return parse_option(o, "frames:v", arg, options);
}

2652
static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2653
{
2654
    OptionsContext *o = optctx;
2655 2656 2657
    return parse_option(o, "frames:a", arg, options);
}

2658
static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2659
{
2660
    OptionsContext *o = optctx;
2661 2662 2663
    return parse_option(o, "frames:d", arg, options);
}

2664 2665 2666
static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
{
    int ret;
2667 2668
    AVDictionary *cbak = codec_opts;
    AVDictionary *fbak = format_opts;
2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
    codec_opts = NULL;
    format_opts = NULL;

    ret = opt_default(NULL, opt, arg);

    av_dict_copy(&o->g->codec_opts , codec_opts, 0);
    av_dict_copy(&o->g->format_opts, format_opts, 0);
    av_dict_free(&codec_opts);
    av_dict_free(&format_opts);
    codec_opts = cbak;
    format_opts = fbak;

    return ret;
}

2684
static int opt_preset(void *optctx, const char *opt, const char *arg)
2685
{
2686
    OptionsContext *o = optctx;
2687 2688
    FILE *f=NULL;
    char filename[1000], line[1000], tmp_line[1000];
2689 2690 2691 2692 2693
    const char *codec_name = NULL;

    tmp_line[0] = *opt;
    tmp_line[1] = 0;
    MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2694 2695 2696 2697 2698 2699

    if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
        if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
            av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
        }else
            av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2700
        exit_program(1);
2701
    }
2702 2703 2704 2705 2706 2707

    while (fgets(line, sizeof(line), f)) {
        char *key = tmp_line, *value, *endptr;

        if (strcspn(line, "#\n\r") == 0)
            continue;
2708
        av_strlcpy(tmp_line, line, sizeof(tmp_line));
2709 2710 2711
        if (!av_strtok(key,   "=",    &value) ||
            !av_strtok(value, "\r\n", &endptr)) {
            av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2712
            exit_program(1);
2713 2714 2715 2716 2717 2718 2719
        }
        av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);

        if      (!strcmp(key, "acodec")) opt_audio_codec   (o, key, value);
        else if (!strcmp(key, "vcodec")) opt_video_codec   (o, key, value);
        else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
        else if (!strcmp(key, "dcodec")) opt_data_codec    (o, key, value);
2720
        else if (opt_default_new(o, key, value) < 0) {
2721 2722
            av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
                   filename, line, key, value);
2723
            exit_program(1);
2724 2725 2726 2727 2728 2729 2730 2731
        }
    }

    fclose(f);

    return 0;
}

2732
static int opt_old2new(void *optctx, const char *opt, const char *arg)
2733
{
2734
    OptionsContext *o = optctx;
2735 2736 2737 2738
    char *s = av_asprintf("%s:%c", opt + 1, *opt);
    int ret = parse_option(o, s, arg, options);
    av_free(s);
    return ret;
2739 2740
}

2741
static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2742
{
2743
    OptionsContext *o = optctx;
2744 2745 2746 2747 2748

    if(!strcmp(opt, "ab")){
        av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
        return 0;
    } else if(!strcmp(opt, "b")){
2749
        av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2750 2751
        av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
        return 0;
2752
    }
2753 2754
    av_dict_set(&o->g->codec_opts, opt, arg, 0);
    return 0;
2755 2756
}

2757
static int opt_qscale(void *optctx, const char *opt, const char *arg)
2758
{
2759
    OptionsContext *o = optctx;
2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771
    char *s;
    int ret;
    if(!strcmp(opt, "qscale")){
        av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
        return parse_option(o, "q:v", arg, options);
    }
    s = av_asprintf("q%s", opt + 6);
    ret = parse_option(o, s, arg, options);
    av_free(s);
    return ret;
}

2772
static int opt_profile(void *optctx, const char *opt, const char *arg)
2773
{
2774
    OptionsContext *o = optctx;
2775 2776
    if(!strcmp(opt, "profile")){
        av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2777 2778
        av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
        return 0;
2779
    }
2780 2781
    av_dict_set(&o->g->codec_opts, opt, arg, 0);
    return 0;
2782 2783
}

2784
static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2785
{
2786
    OptionsContext *o = optctx;
2787 2788 2789
    return parse_option(o, "filter:v", arg, options);
}

2790
static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2791
{
2792
    OptionsContext *o = optctx;
2793 2794 2795
    return parse_option(o, "filter:a", arg, options);
}

2796
static int opt_vsync(void *optctx, const char *opt, const char *arg)
2797 2798 2799 2800
{
    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;
2801
    else if (!av_strcasecmp(arg, "drop"))        video_sync_method = VSYNC_DROP;
2802 2803 2804 2805 2806 2807

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

2808
static int opt_timecode(void *optctx, const char *opt, const char *arg)
2809
{
2810
    OptionsContext *o = optctx;
2811 2812 2813
    char *tcr = av_asprintf("timecode=%s", arg);
    int ret = parse_option(o, "metadata:g", tcr, options);
    if (ret >= 0)
2814
        ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2815
    av_free(tcr);
2816 2817 2818
    return 0;
}

2819
static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2820
{
2821
    OptionsContext *o = optctx;
2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833
    char layout_str[32];
    char *stream_str;
    char *ac_str;
    int ret, channels, ac_str_size;
    uint64_t layout;

    layout = av_get_channel_layout(arg);
    if (!layout) {
        av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
        return AVERROR(EINVAL);
    }
    snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2834
    ret = opt_default_new(o, opt, layout_str);
2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854
    if (ret < 0)
        return ret;

    /* set 'ac' option based on channel layout */
    channels = av_get_channel_layout_nb_channels(layout);
    snprintf(layout_str, sizeof(layout_str), "%d", channels);
    stream_str = strchr(opt, ':');
    ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
    ac_str = av_mallocz(ac_str_size);
    if (!ac_str)
        return AVERROR(ENOMEM);
    av_strlcpy(ac_str, "ac", 3);
    if (stream_str)
        av_strlcat(ac_str, stream_str, ac_str_size);
    ret = parse_option(o, ac_str, layout_str, options);
    av_free(ac_str);

    return ret;
}

2855
static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2856
{
2857
    OptionsContext *o = optctx;
2858 2859 2860
    return parse_option(o, "q:a", arg, options);
}

2861
static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2862
{
2863
    GROW_ARRAY(filtergraphs, nb_filtergraphs);
2864 2865
    if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
        return AVERROR(ENOMEM);
2866 2867 2868 2869
    filtergraphs[nb_filtergraphs - 1]->index      = nb_filtergraphs - 1;
    filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
    if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
        return AVERROR(ENOMEM);
2870 2871 2872

    input_stream_potentially_available = 1;

2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886
    return 0;
}

static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
{
    uint8_t *graph_desc = read_file(arg);
    if (!graph_desc)
        return AVERROR(EINVAL);

    GROW_ARRAY(filtergraphs, nb_filtergraphs);
    if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
        return AVERROR(ENOMEM);
    filtergraphs[nb_filtergraphs - 1]->index      = nb_filtergraphs - 1;
    filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2887 2888 2889

    input_stream_potentially_available = 1;

2890 2891 2892
    return 0;
}

2893
void show_help_default(const char *opt, const char *arg)
2894
{
2895
    /* per-file options have at least one of those set */
2896
    const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2897 2898
    int show_advanced = 0, show_avoptions = 0;

2899
    if (opt && *opt) {
2900 2901 2902 2903 2904 2905 2906
        if (!strcmp(opt, "long"))
            show_advanced = 1;
        else if (!strcmp(opt, "full"))
            show_advanced = show_avoptions = 1;
        else
            av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
    }
2907

2908
    show_usage();
2909 2910 2911 2912 2913

    printf("Getting help:\n"
           "    -h      -- print basic options\n"
           "    -h long -- print more options\n"
           "    -h full -- print all options (including all format and codec specific options, very long)\n"
2914
           "    -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
2915 2916 2917
           "    See man %s for detailed description of the options.\n"
           "\n", program_name);

2918
    show_help_options(options, "Print help / information / capabilities:",
2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930
                      OPT_EXIT, 0, 0);

    show_help_options(options, "Global options (affect whole program "
                      "instead of just one file:",
                      0, per_file | OPT_EXIT | OPT_EXPERT, 0);
    if (show_advanced)
        show_help_options(options, "Advanced global options:", OPT_EXPERT,
                          per_file | OPT_EXIT, 0);

    show_help_options(options, "Per-file main options:", 0,
                      OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
                      OPT_EXIT, per_file);
2931
    if (show_advanced)
2932 2933
        show_help_options(options, "Advanced per-file options:",
                          OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2934

2935
    show_help_options(options, "Video options:",
2936
                      OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2937 2938
    if (show_advanced)
        show_help_options(options, "Advanced Video options:",
2939
                          OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2940

2941
    show_help_options(options, "Audio options:",
2942
                      OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2943 2944
    if (show_advanced)
        show_help_options(options, "Advanced Audio options:",
2945
                          OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2946
    show_help_options(options, "Subtitle options:",
2947
                      OPT_SUBTITLE, 0, 0);
2948
    printf("\n");
2949 2950 2951 2952 2953

    if (show_avoptions) {
        int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
        show_help_children(avcodec_get_class(), flags);
        show_help_children(avformat_get_class(), flags);
2954
#if CONFIG_SWSCALE
2955
        show_help_children(sws_get_class(), flags);
2956
#endif
2957
        show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2958
        show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
2959
    }
2960 2961 2962 2963
}

void show_usage(void)
{
2964 2965 2966
    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");
2967 2968
}

2969 2970 2971 2972 2973 2974
enum OptGroup {
    GROUP_OUTFILE,
    GROUP_INFILE,
};

static const OptionGroupDef groups[] = {
2975 2976
    [GROUP_OUTFILE] = { "output file",  NULL, OPT_OUTPUT },
    [GROUP_INFILE]  = { "input file",   "i",  OPT_INPUT },
2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987
};

static int open_files(OptionGroupList *l, const char *inout,
                      int (*open_file)(OptionsContext*, const char*))
{
    int i, ret;

    for (i = 0; i < l->nb_groups; i++) {
        OptionGroup *g = &l->groups[i];
        OptionsContext o;

2988
        init_options(&o);
2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999
        o.g = g;

        ret = parse_optgroup(&o, g);
        if (ret < 0) {
            av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
                   "%s.\n", inout, g->arg);
            return ret;
        }

        av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
        ret = open_file(&o, g->arg);
3000
        uninit_options(&o);
3001 3002 3003 3004 3005
        if (ret < 0) {
            av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
                   inout, g->arg);
            return ret;
        }
3006
        av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3007 3008 3009 3010 3011
    }

    return 0;
}

3012
int ffmpeg_parse_options(int argc, char **argv)
3013 3014 3015 3016 3017 3018 3019 3020
{
    OptionParseContext octx;
    uint8_t error[128];
    int ret;

    memset(&octx, 0, sizeof(octx));

    /* split the commandline into an internal representation */
3021 3022
    ret = split_commandline(&octx, argc, argv, options, groups,
                            FF_ARRAY_ELEMS(groups));
3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
        goto fail;
    }

    /* apply global options */
    ret = parse_optgroup(NULL, &octx.global_opts);
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
        goto fail;
    }

    /* open input files */
    ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
        goto fail;
    }

3042
    /* create the complex filtergraphs */
3043
    ret = init_complex_filters();
3044
    if (ret < 0) {
3045
        av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3046 3047 3048
        goto fail;
    }

3049 3050 3051 3052 3053 3054 3055
    /* open output files */
    ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
        goto fail;
    }

3056 3057 3058 3059 3060 3061 3062
    /* configure the complex filtergraphs */
    ret = configure_complex_filters();
    if (ret < 0) {
        av_log(NULL, AV_LOG_FATAL, "Error configuring complex filters.\n");
        goto fail;
    }

3063 3064 3065 3066 3067 3068 3069 3070
fail:
    uninit_parse_context(&octx);
    if (ret < 0) {
        av_strerror(ret, error, sizeof(error));
        av_log(NULL, AV_LOG_FATAL, "%s\n", error);
    }
    return ret;
}
3071

3072
static int opt_progress(void *optctx, const char *opt, const char *arg)
3073 3074 3075 3076 3077 3078 3079 3080
{
    AVIOContext *avio = NULL;
    int ret;

    if (!strcmp(arg, "-"))
        arg = "pipe:";
    ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
    if (ret < 0) {
3081
        av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3082 3083 3084 3085 3086 3087 3088
               arg, av_err2str(ret));
        return ret;
    }
    progress_avio = avio;
    return 0;
}

3089 3090 3091 3092
#define OFFSET(x) offsetof(OptionsContext, x)
const OptionDef options[] = {
    /* main options */
#include "cmdutils_common_opts.h"
3093 3094
    { "f",              HAS_ARG | OPT_STRING | OPT_OFFSET |
                        OPT_INPUT | OPT_OUTPUT,                      { .off       = OFFSET(format) },
3095 3096 3097
        "force format", "fmt" },
    { "y",              OPT_BOOL,                                    {              &file_overwrite },
        "overwrite output files" },
3098
    { "n",              OPT_BOOL,                                    {              &no_file_overwrite },
3099
        "never overwrite output files" },
3100 3101
    { "ignore_unknown", OPT_BOOL,                                    {              &ignore_unknown_streams },
        "Ignore unknown stream types" },
3102 3103
    { "copy_unknown",   OPT_BOOL | OPT_EXPERT,                       {              &copy_unknown_streams },
        "Copy unknown stream types" },
3104 3105
    { "c",              HAS_ARG | OPT_STRING | OPT_SPEC |
                        OPT_INPUT | OPT_OUTPUT,                      { .off       = OFFSET(codec_names) },
3106
        "codec name", "codec" },
3107 3108
    { "codec",          HAS_ARG | OPT_STRING | OPT_SPEC |
                        OPT_INPUT | OPT_OUTPUT,                      { .off       = OFFSET(codec_names) },
3109
        "codec name", "codec" },
3110 3111
    { "pre",            HAS_ARG | OPT_STRING | OPT_SPEC |
                        OPT_OUTPUT,                                  { .off       = OFFSET(presets) },
3112
        "preset name", "preset" },
3113 3114
    { "map",            HAS_ARG | OPT_EXPERT | OPT_PERFILE |
                        OPT_OUTPUT,                                  { .func_arg = opt_map },
3115 3116
        "set input stream mapping",
        "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3117
    { "map_channel",    HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3118
        "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3119 3120
    { "map_metadata",   HAS_ARG | OPT_STRING | OPT_SPEC |
                        OPT_OUTPUT,                                  { .off       = OFFSET(metadata_map) },
3121 3122
        "set metadata information of outfile from infile",
        "outfile[,metadata]:infile[,metadata]" },
3123 3124
    { "map_chapters",   HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
                        OPT_OUTPUT,                                  { .off = OFFSET(chapters_input_file) },
3125
        "set chapters mapping", "input_file_index" },
3126 3127
    { "t",              HAS_ARG | OPT_TIME | OPT_OFFSET |
                        OPT_INPUT | OPT_OUTPUT,                      { .off = OFFSET(recording_time) },
3128 3129
        "record or transcode \"duration\" seconds of audio/video",
        "duration" },
3130
    { "to",             HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT,  { .off = OFFSET(stop_time) },
3131
        "record or transcode stop time", "time_stop" },
3132
    { "fs",             HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3133
        "set the limit file size in bytes", "limit_size" },
3134 3135
    { "ss",             HAS_ARG | OPT_TIME | OPT_OFFSET |
                        OPT_INPUT | OPT_OUTPUT,                      { .off = OFFSET(start_time) },
3136
        "set the start time offset", "time_off" },
3137 3138 3139
    { "sseof",          HAS_ARG | OPT_TIME | OPT_OFFSET |
                        OPT_INPUT | OPT_OUTPUT,                      { .off = OFFSET(start_time_eof) },
        "set the start time offset relative to EOF", "time_off" },
3140 3141 3142
    { "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
                        OPT_INPUT,                                   { .off = OFFSET(seek_timestamp) },
        "enable/disable seeking by timestamp with -ss" },
3143 3144 3145
    { "accurate_seek",  OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
                        OPT_INPUT,                                   { .off = OFFSET(accurate_seek) },
        "enable/disable accurate seeking with -ss" },
3146 3147
    { "itsoffset",      HAS_ARG | OPT_TIME | OPT_OFFSET |
                        OPT_EXPERT | OPT_INPUT,                      { .off = OFFSET(input_ts_offset) },
3148
        "set the input ts offset", "time_off" },
3149 3150
    { "itsscale",       HAS_ARG | OPT_DOUBLE | OPT_SPEC |
                        OPT_EXPERT | OPT_INPUT,                      { .off = OFFSET(ts_scale) },
3151
        "set the input ts scale", "scale" },
3152
    { "timestamp",      HAS_ARG | OPT_PERFILE | OPT_OUTPUT,          { .func_arg = opt_recording_timestamp },
3153
        "set the recording timestamp ('now' to set the current time)", "time" },
3154
    { "metadata",       HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3155
        "add metadata", "string=string" },
3156 3157
    { "program",        HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
        "add program with specified streams", "title=string:st=number..." },
3158 3159
    { "dframes",        HAS_ARG | OPT_PERFILE | OPT_EXPERT |
                        OPT_OUTPUT,                                  { .func_arg = opt_data_frames },
3160
        "set the number of data frames to output", "number" },
3161 3162
    { "benchmark",      OPT_BOOL | OPT_EXPERT,                       { &do_benchmark },
        "add timings for benchmarking" },
3163
    { "benchmark_all",  OPT_BOOL | OPT_EXPERT,                       { &do_benchmark_all },
3164
      "add timings for each task" },
3165
    { "progress",       HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_progress },
3166
      "write program-readable progress information", "url" },
3167
    { "stdin",          OPT_BOOL | OPT_EXPERT,                       { &stdin_interaction },
3168
      "enable or disable interaction on standard input" },
3169
    { "timelimit",      HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_timelimit },
3170 3171 3172 3173 3174
        "set max runtime in seconds", "limit" },
    { "dump",           OPT_BOOL | OPT_EXPERT,                       { &do_pkt_dump },
        "dump each input packet" },
    { "hex",            OPT_BOOL | OPT_EXPERT,                       { &do_hex_dump },
        "when dumping packets, also dump the payload" },
3175 3176
    { "re",             OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
                        OPT_INPUT,                                   { .off = OFFSET(rate_emu) },
3177
        "read input at native frame rate", "" },
3178
    { "target",         HAS_ARG | OPT_PERFILE | OPT_OUTPUT,          { .func_arg = opt_target },
3179 3180
        "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
        "with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3181
    { "vsync",          HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_vsync },
3182
        "video sync method", "" },
3183 3184
    { "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT,      { &frame_drop_threshold },
        "frame drop threshold", "" },
3185 3186 3187 3188 3189 3190
    { "async",          HAS_ARG | OPT_INT | OPT_EXPERT,              { &audio_sync_method },
        "audio sync method", "" },
    { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT,          { &audio_drift_threshold },
        "audio drift threshold", "threshold" },
    { "copyts",         OPT_BOOL | OPT_EXPERT,                       { &copy_ts },
        "copy timestamps" },
3191 3192
    { "start_at_zero",  OPT_BOOL | OPT_EXPERT,                       { &start_at_zero },
        "shift input timestamps to start at 0 when using copyts" },
3193 3194
    { "copytb",         HAS_ARG | OPT_INT | OPT_EXPERT,              { &copy_tb },
        "copy input stream time base when stream copying", "mode" },
3195 3196
    { "shortest",       OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
                        OPT_OUTPUT,                                  { .off = OFFSET(shortest) },
3197
        "finish encoding within shortest input" },
3198 3199 3200
    { "apad",           OPT_STRING | HAS_ARG | OPT_SPEC |
                        OPT_OUTPUT,                                  { .off = OFFSET(apad) },
        "audio pad", "" },
3201 3202
    { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT,       { &dts_delta_threshold },
        "timestamp discontinuity delta threshold", "threshold" },
3203 3204
    { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT,       { &dts_error_threshold },
        "timestamp error delta threshold", "threshold" },
3205
    { "xerror",         OPT_BOOL | OPT_EXPERT,                       { &exit_on_error },
3206
        "exit on error", "error" },
3207 3208
    { "abort_on",       HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_abort_on },
        "abort on the specified condition flags", "flags" },
3209 3210
    { "copyinkf",       OPT_BOOL | OPT_EXPERT | OPT_SPEC |
                        OPT_OUTPUT,                                  { .off = OFFSET(copy_initial_nonkeyframes) },
3211
        "copy initial non-keyframes" },
3212
    { "copypriorss",    OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT,   { .off = OFFSET(copy_prior_start) },
3213
        "copy or discard frames before start time" },
3214
    { "frames",         OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3215
        "set the number of frames to output", "number" },
3216
    { "tag",            OPT_STRING | HAS_ARG | OPT_SPEC |
3217
                        OPT_EXPERT | OPT_OUTPUT | OPT_INPUT,         { .off = OFFSET(codec_tags) },
3218
        "force codec tag/fourcc", "fourcc/tag" },
3219 3220
    { "q",              HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
                        OPT_SPEC | OPT_OUTPUT,                       { .off = OFFSET(qscale) },
3221
        "use fixed quality scale (VBR)", "q" },
3222 3223
    { "qscale",         HAS_ARG | OPT_EXPERT | OPT_PERFILE |
                        OPT_OUTPUT,                                  { .func_arg = opt_qscale },
3224
        "use fixed quality scale (VBR)", "q" },
3225
    { "profile",        HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3226
        "set profile", "profile" },
3227
    { "filter",         HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3228
        "set stream filtergraph", "filter_graph" },
3229 3230
    { "filter_script",  HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
        "read stream filtergraph description from a file", "filename" },
3231
    { "reinit_filter",  HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT,    { .off = OFFSET(reinit_filters) },
3232
        "reinit filtergraph on input parameter changes", "" },
3233 3234
    { "filter_complex", HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_filter_complex },
        "create a complex filtergraph", "graph_description" },
3235 3236
    { "lavfi",          HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_filter_complex },
        "create a complex filtergraph", "graph_description" },
3237 3238
    { "filter_complex_script", HAS_ARG | OPT_EXPERT,                 { .func_arg = opt_filter_complex_script },
        "read complex filtergraph description from a file", "filename" },
3239 3240
    { "stats",          OPT_BOOL,                                    { &print_stats },
        "print progress report during encoding", },
3241 3242
    { "attach",         HAS_ARG | OPT_PERFILE | OPT_EXPERT |
                        OPT_OUTPUT,                                  { .func_arg = opt_attach },
3243
        "add an attachment to the output file", "filename" },
3244 3245
    { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
                         OPT_EXPERT | OPT_INPUT,                     { .off = OFFSET(dump_attachment) },
3246
        "extract an attachment into a file", "filename" },
3247
    { "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3248
                        OPT_OFFSET,                                  { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3249 3250
    { "debug_ts",       OPT_BOOL | OPT_EXPERT,                       { &debug_ts },
        "print timestamp debugging info" },
3251 3252
    { "max_error_rate",  HAS_ARG | OPT_FLOAT,                        { &max_error_rate },
        "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
3253 3254 3255
    { "discard",        OPT_STRING | HAS_ARG | OPT_SPEC |
                        OPT_INPUT,                                   { .off = OFFSET(discard) },
        "discard", "" },
3256 3257 3258
    { "disposition",    OPT_STRING | HAS_ARG | OPT_SPEC |
                        OPT_OUTPUT,                                  { .off = OFFSET(disposition) },
        "disposition", "" },
3259 3260 3261
    { "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
                                                                     { .off = OFFSET(thread_queue_size) },
        "set the maximum number of queued packets from the demuxer" },
3262 3263

    /* video options */
3264
    { "vframes",      OPT_VIDEO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_video_frames },
3265
        "set the number of video frames to output", "number" },
3266 3267
    { "r",            OPT_VIDEO | HAS_ARG  | OPT_STRING | OPT_SPEC |
                      OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(frame_rates) },
3268
        "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3269
    { "s",            OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3270
                      OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(frame_sizes) },
3271
        "set frame size (WxH or abbreviation)", "size" },
3272 3273
    { "aspect",       OPT_VIDEO | HAS_ARG  | OPT_STRING | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(frame_aspect_ratios) },
3274
        "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3275 3276
    { "pix_fmt",      OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC |
                      OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(frame_pix_fmts) },
3277
        "set pixel format", "format" },
3278 3279 3280 3281
    { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG,                      { &frame_bits_per_raw_sample },
        "set the number of bits per raw sample", "number" },
    { "intra",        OPT_VIDEO | OPT_BOOL | OPT_EXPERT,                         { &intra_only },
        "deprecated use -g 1" },
3282
    { "vn",           OPT_VIDEO | OPT_BOOL  | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3283
        "disable video" },
3284 3285
    { "rc_override",  OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(rc_overrides) },
3286
        "rate control override for specific intervals", "override" },
3287 3288
    { "vcodec",       OPT_VIDEO | HAS_ARG  | OPT_PERFILE | OPT_INPUT |
                      OPT_OUTPUT,                                                { .func_arg = opt_video_codec },
3289
        "force video codec ('copy' to copy stream)", "codec" },
3290 3291 3292 3293
    { "sameq",        OPT_VIDEO | OPT_EXPERT ,                                   { .func_arg = opt_sameq },
        "Removed" },
    { "same_quant",   OPT_VIDEO | OPT_EXPERT ,                                   { .func_arg = opt_sameq },
        "Removed" },
3294
    { "timecode",     OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT,            { .func_arg = opt_timecode },
3295
        "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3296
    { "pass",         OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT,     { .off = OFFSET(pass) },
3297
        "select the pass number (1 to 3)", "n" },
3298 3299
    { "passlogfile",  OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(passlogfiles) },
3300
        "select two pass log file name prefix", "prefix" },
3301
    { "deinterlace",  OPT_VIDEO | OPT_BOOL | OPT_EXPERT,                         { &do_deinterlace },
3302
        "this option is deprecated, use the yadif filter instead" },
3303 3304
    { "psnr",         OPT_VIDEO | OPT_BOOL | OPT_EXPERT,                         { &do_psnr },
        "calculate PSNR of compressed frames" },
3305
    { "vstats",       OPT_VIDEO | OPT_EXPERT ,                                   { .func_arg = opt_vstats },
3306
        "dump video coding statistics to file" },
3307
    { "vstats_file",  OPT_VIDEO | HAS_ARG | OPT_EXPERT ,                         { .func_arg = opt_vstats_file },
3308
        "dump video coding statistics to file", "file" },
3309
    { "vf",           OPT_VIDEO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_video_filters },
3310
        "set video filters", "filter_graph" },
3311 3312
    { "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(intra_matrices) },
3313
        "specify intra matrix coeffs", "matrix" },
3314 3315
    { "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(inter_matrices) },
3316
        "specify inter matrix coeffs", "matrix" },
3317 3318 3319
    { "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(chroma_intra_matrices) },
        "specify intra matrix coeffs", "matrix" },
3320
    { "top",          OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_INT| OPT_SPEC |
3321
                      OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(top_field_first) },
3322
        "top=1/bottom=0/auto=-1 field first", "" },
3323
    { "vtag",         OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_PERFILE |
3324
                      OPT_INPUT | OPT_OUTPUT,                                    { .func_arg = opt_old2new },
3325 3326 3327
        "force video tag/fourcc", "fourcc/tag" },
    { "qphist",       OPT_VIDEO | OPT_BOOL | OPT_EXPERT ,                        { &qp_hist },
        "show QP histogram" },
3328 3329
    { "force_fps",    OPT_VIDEO | OPT_BOOL | OPT_EXPERT  | OPT_SPEC |
                      OPT_OUTPUT,                                                { .off = OFFSET(force_fps) },
3330
        "force the selected framerate, disable the best supported framerate selection" },
3331 3332
    { "streamid",     OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
                      OPT_OUTPUT,                                                { .func_arg = opt_streamid },
3333
        "set the value of an outfile streamid", "streamIndex:value" },
3334 3335
    { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
                          OPT_SPEC | OPT_OUTPUT,                                 { .off = OFFSET(forced_key_frames) },
3336
        "force key frames at specified timestamps", "timestamps" },
3337 3338
    { "ab",           OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT,            { .func_arg = opt_bitrate },
        "audio bitrate (please use -b:a)", "bitrate" },
3339
    { "b",            OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT,            { .func_arg = opt_bitrate },
3340
        "video bitrate (please use -b:v)", "bitrate" },
3341 3342 3343 3344 3345
    { "hwaccel",          OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
                          OPT_SPEC | OPT_INPUT,                                  { .off = OFFSET(hwaccels) },
        "use HW accelerated decoding", "hwaccel name" },
    { "hwaccel_device",   OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
                          OPT_SPEC | OPT_INPUT,                                  { .off = OFFSET(hwaccel_devices) },
3346
        "select a device for HW acceleration", "devicename" },
3347 3348
#if HAVE_VDPAU_X11
    { "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
3349 3350 3351
#endif
#if CONFIG_VDA || CONFIG_VIDEOTOOLBOX
    { "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3352
#endif
3353 3354
    { "hwaccels",         OPT_EXIT,                                              { .func_arg = show_hwaccels },
        "show available HW acceleration methods" },
3355 3356 3357
    { "autorotate",       HAS_ARG | OPT_BOOL | OPT_SPEC |
                          OPT_EXPERT | OPT_INPUT,                                { .off = OFFSET(autorotate) },
        "automatically insert correct rotate filters" },
3358 3359

    /* audio options */
3360
    { "aframes",        OPT_AUDIO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_audio_frames },
3361
        "set the number of audio frames to output", "number" },
3362
    { "aq",             OPT_AUDIO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_audio_qscale },
3363
        "set audio quality (codec-specific)", "quality", },
3364 3365
    { "ar",             OPT_AUDIO | HAS_ARG  | OPT_INT | OPT_SPEC |
                        OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(audio_sample_rate) },
3366
        "set audio sampling rate (in Hz)", "rate" },
3367 3368
    { "ac",             OPT_AUDIO | HAS_ARG  | OPT_INT | OPT_SPEC |
                        OPT_INPUT | OPT_OUTPUT,                                    { .off = OFFSET(audio_channels) },
3369
        "set number of audio channels", "channels" },
3370
    { "an",             OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3371
        "disable audio" },
3372 3373
    { "acodec",         OPT_AUDIO | HAS_ARG  | OPT_PERFILE |
                        OPT_INPUT | OPT_OUTPUT,                                    { .func_arg = opt_audio_codec },
3374
        "force audio codec ('copy' to copy stream)", "codec" },
3375
    { "atag",           OPT_AUDIO | HAS_ARG  | OPT_EXPERT | OPT_PERFILE |
3376
                        OPT_OUTPUT,                                                { .func_arg = opt_old2new },
3377 3378 3379
        "force audio tag/fourcc", "fourcc/tag" },
    { "vol",            OPT_AUDIO | HAS_ARG  | OPT_INT,                            { &audio_volume },
        "change audio volume (256=normal)" , "volume" },
3380 3381
    { "sample_fmt",     OPT_AUDIO | HAS_ARG  | OPT_EXPERT | OPT_SPEC |
                        OPT_STRING | OPT_INPUT | OPT_OUTPUT,                       { .off = OFFSET(sample_fmts) },
3382
        "set sample format", "format" },
3383 3384
    { "channel_layout", OPT_AUDIO | HAS_ARG  | OPT_EXPERT | OPT_PERFILE |
                        OPT_INPUT | OPT_OUTPUT,                                    { .func_arg = opt_channel_layout },
3385
        "set channel layout", "layout" },
3386
    { "af",             OPT_AUDIO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_audio_filters },
3387
        "set audio filters", "filter_graph" },
3388
    { "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3389
      "set the maximum number of channels to try to guess the channel layout" },
3390 3391

    /* subtitle options */
3392
    { "sn",     OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3393
        "disable subtitle" },
3394
    { "scodec", OPT_SUBTITLE | HAS_ARG  | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3395
        "force subtitle codec ('copy' to copy stream)", "codec" },
3396
    { "stag",   OPT_SUBTITLE | HAS_ARG  | OPT_EXPERT  | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3397
        , "force subtitle tag/fourcc", "fourcc/tag" },
3398
    { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3399
        "fix subtitles duration" },
3400
    { "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3401
        "set canvas size (WxH or abbreviation)", "size" },
3402 3403

    /* grab options */
3404
    { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3405
        "deprecated, use -channel", "channel" },
3406
    { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3407
        "deprecated, use -standard", "standard" },
3408
    { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3409 3410

    /* muxer options */
3411
    { "muxdelay",   OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3412
        "set the maximum demux-decode delay", "seconds" },
3413
    { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3414
        "set the initial demux-decode delay", "seconds" },
3415 3416
    { "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
        "override the options from ffserver", "" },
3417
    { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3418
        "specify a file in which to print sdp information", "file" },
3419

3420
    { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3421
        "A comma-separated list of bitstream filters", "bitstream_filters" },
3422
    { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3423
        "deprecated", "audio bitstream_filters" },
3424
    { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3425 3426
        "deprecated", "video bitstream_filters" },

3427
    { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT,    { .func_arg = opt_preset },
3428
        "set the audio options to the indicated preset", "preset" },
3429
    { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT,    { .func_arg = opt_preset },
3430
        "set the video options to the indicated preset", "preset" },
3431
    { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3432
        "set the subtitle options to the indicated preset", "preset" },
3433
    { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT,                { .func_arg = opt_preset },
3434
        "set options from indicated preset file", "filename" },
3435
    /* data codec support */
3436
    { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3437
        "force data codec ('copy' to copy stream)", "codec" },
3438
    { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3439
        "disable data" },
3440 3441 3442

    { NULL, },
};