Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52866 views
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
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include <stdint.h>
22
23
#include "ffmpeg.h"
24
#include "cmdutils.h"
25
26
#include "libavformat/avformat.h"
27
28
#include "libavcodec/avcodec.h"
29
30
#include "libavfilter/avfilter.h"
31
32
#include "libavutil/avassert.h"
33
#include "libavutil/avstring.h"
34
#include "libavutil/avutil.h"
35
#include "libavutil/channel_layout.h"
36
#include "libavutil/intreadwrite.h"
37
#include "libavutil/fifo.h"
38
#include "libavutil/mathematics.h"
39
#include "libavutil/opt.h"
40
#include "libavutil/parseutils.h"
41
#include "libavutil/pixdesc.h"
42
#include "libavutil/pixfmt.h"
43
#include "libavutil/time_internal.h"
44
45
#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
46
47
#define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
48
{\
49
int i, ret;\
50
for (i = 0; i < o->nb_ ## name; i++) {\
51
char *spec = o->name[i].specifier;\
52
if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
53
outvar = o->name[i].u.type;\
54
else if (ret < 0)\
55
exit_program(1);\
56
}\
57
}
58
59
#define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
60
{\
61
int i;\
62
for (i = 0; i < o->nb_ ## name; i++) {\
63
char *spec = o->name[i].specifier;\
64
if (!strcmp(spec, mediatype))\
65
outvar = o->name[i].u.type;\
66
}\
67
}
68
69
const HWAccel hwaccels[] = {
70
#if HAVE_VDPAU_X11
71
{ "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
#endif
76
#if CONFIG_VDA
77
{ "vda", videotoolbox_init, HWACCEL_VDA, AV_PIX_FMT_VDA },
78
#endif
79
#if CONFIG_VIDEOTOOLBOX
80
{ "videotoolbox", videotoolbox_init, HWACCEL_VIDEOTOOLBOX, AV_PIX_FMT_VIDEOTOOLBOX },
81
#endif
82
#if CONFIG_LIBMFX
83
{ "qsv", qsv_init, HWACCEL_QSV, AV_PIX_FMT_QSV },
84
#endif
85
{ 0 },
86
};
87
88
char *vstats_filename;
89
char *sdp_filename;
90
91
float audio_drift_threshold = 0.1;
92
float dts_delta_threshold = 10;
93
float dts_error_threshold = 3600*30;
94
95
int audio_volume = 256;
96
int audio_sync_method = 0;
97
int video_sync_method = VSYNC_AUTO;
98
float frame_drop_threshold = 0;
99
int do_deinterlace = 0;
100
int do_benchmark = 0;
101
int do_benchmark_all = 0;
102
int do_hex_dump = 0;
103
int do_pkt_dump = 0;
104
int copy_ts = 0;
105
int start_at_zero = 0;
106
int copy_tb = -1;
107
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
int stdin_interaction = 1;
113
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
static int no_file_overwrite = 0;
120
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
const OptionDef *po = options;
130
int i;
131
132
/* all OPT_SPEC and OPT_STRING can be freed in generic way */
133
while (po->name) {
134
void *dst = (uint8_t*)o + po->u.off;
135
136
if (po->flags & OPT_SPEC) {
137
SpecifierOpt **so = dst;
138
int i, *count = (int*)(so + 1);
139
for (i = 0; i < *count; i++) {
140
av_freep(&(*so)[i].specifier);
141
if (po->flags & OPT_STRING)
142
av_freep(&(*so)[i].u.str);
143
}
144
av_freep(so);
145
*count = 0;
146
} else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
147
av_freep(dst);
148
po++;
149
}
150
151
for (i = 0; i < o->nb_stream_maps; i++)
152
av_freep(&o->stream_maps[i].linklabel);
153
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
memset(o, 0, sizeof(*o));
162
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
o->limit_filesize = UINT64_MAX;
169
o->chapters_input_file = INT_MAX;
170
o->accurate_seek = 1;
171
}
172
173
static int show_hwaccels(void *optctx, const char *opt, const char *arg)
174
{
175
int i;
176
177
printf("Hardware acceleration methods:\n");
178
for (i = 0; i < FF_ARRAY_ELEMS(hwaccels) - 1; i++) {
179
printf("%s\n", hwaccels[i].name);
180
}
181
printf("\n");
182
return 0;
183
}
184
185
/* return a copy of the input with the stream specifiers removed from the keys */
186
static AVDictionary *strip_specifiers(AVDictionary *dict)
187
{
188
AVDictionaryEntry *e = NULL;
189
AVDictionary *ret = NULL;
190
191
while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX))) {
192
char *p = strchr(e->key, ':');
193
194
if (p)
195
*p = 0;
196
av_dict_set(&ret, e->key, e->value, 0);
197
if (p)
198
*p = ':';
199
}
200
return ret;
201
}
202
203
static int opt_abort_on(void *optctx, const char *opt, const char *arg)
204
{
205
static const AVOption opts[] = {
206
{ "abort_on" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
207
{ "empty_output" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT }, .unit = "flags" },
208
{ NULL },
209
};
210
static const AVClass class = {
211
.class_name = "",
212
.item_name = av_default_item_name,
213
.option = opts,
214
.version = LIBAVUTIL_VERSION_INT,
215
};
216
const AVClass *pclass = &class;
217
218
return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
219
}
220
221
static int opt_sameq(void *optctx, const char *opt, const char *arg)
222
{
223
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
224
"If you are looking for an option to preserve the quality (which is not "
225
"what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
226
opt, opt);
227
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
return parse_option(o, "codec:a", arg, options);
246
}
247
248
static int opt_video_codec(void *optctx, const char *opt, const char *arg)
249
{
250
OptionsContext *o = optctx;
251
return parse_option(o, "codec:v", arg, options);
252
}
253
254
static int opt_subtitle_codec(void *optctx, const char *opt, const char *arg)
255
{
256
OptionsContext *o = optctx;
257
return parse_option(o, "codec:s", arg, options);
258
}
259
260
static int opt_data_codec(void *optctx, const char *opt, const char *arg)
261
{
262
OptionsContext *o = optctx;
263
return parse_option(o, "codec:d", arg, options);
264
}
265
266
static int opt_map(void *optctx, const char *opt, const char *arg)
267
{
268
OptionsContext *o = optctx;
269
StreamMap *m = NULL;
270
int i, negative = 0, file_idx;
271
int sync_file_idx = -1, sync_stream_idx = 0;
272
char *p, *sync;
273
char *map;
274
char *allow_unused;
275
276
if (*arg == '-') {
277
negative = 1;
278
arg++;
279
}
280
map = av_strdup(arg);
281
if (!map)
282
return AVERROR(ENOMEM);
283
284
/* parse sync stream first, just pick first matching stream */
285
if (sync = strchr(map, ',')) {
286
*sync = 0;
287
sync_file_idx = strtol(sync + 1, &sync, 0);
288
if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
289
av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
290
exit_program(1);
291
}
292
if (*sync)
293
sync++;
294
for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
295
if (check_stream_specifier(input_files[sync_file_idx]->ctx,
296
input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
297
sync_stream_idx = i;
298
break;
299
}
300
if (i == input_files[sync_file_idx]->nb_streams) {
301
av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
302
"match any streams.\n", arg);
303
exit_program(1);
304
}
305
}
306
307
308
if (map[0] == '[') {
309
/* this mapping refers to lavfi output */
310
const char *c = map + 1;
311
GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
312
m = &o->stream_maps[o->nb_stream_maps - 1];
313
m->linklabel = av_get_token(&c, "]");
314
if (!m->linklabel) {
315
av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
316
exit_program(1);
317
}
318
} else {
319
if (allow_unused = strchr(map, '?'))
320
*allow_unused = 0;
321
file_idx = strtol(map, &p, 0);
322
if (file_idx >= nb_input_files || file_idx < 0) {
323
av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
324
exit_program(1);
325
}
326
if (negative)
327
/* disable some already defined maps */
328
for (i = 0; i < o->nb_stream_maps; i++) {
329
m = &o->stream_maps[i];
330
if (file_idx == m->file_index &&
331
check_stream_specifier(input_files[m->file_index]->ctx,
332
input_files[m->file_index]->ctx->streams[m->stream_index],
333
*p == ':' ? p + 1 : p) > 0)
334
m->disabled = 1;
335
}
336
else
337
for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
338
if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
339
*p == ':' ? p + 1 : p) <= 0)
340
continue;
341
GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
342
m = &o->stream_maps[o->nb_stream_maps - 1];
343
344
m->file_index = file_idx;
345
m->stream_index = i;
346
347
if (sync_file_idx >= 0) {
348
m->sync_file_index = sync_file_idx;
349
m->sync_stream_index = sync_stream_idx;
350
} else {
351
m->sync_file_index = file_idx;
352
m->sync_stream_index = i;
353
}
354
}
355
}
356
357
if (!m) {
358
if (allow_unused) {
359
av_log(NULL, AV_LOG_VERBOSE, "Stream map '%s' matches no streams; ignoring.\n", arg);
360
} else {
361
av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n"
362
"To ignore this, add a trailing '?' to the map.\n", arg);
363
exit_program(1);
364
}
365
}
366
367
av_freep(&map);
368
return 0;
369
}
370
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
o->attachments[o->nb_attachments - 1] = arg;
376
return 0;
377
}
378
379
static int opt_map_channel(void *optctx, const char *opt, const char *arg)
380
{
381
OptionsContext *o = optctx;
382
int n;
383
AVStream *st;
384
AudioChannelMap *m;
385
386
GROW_ARRAY(o->audio_channel_maps, o->nb_audio_channel_maps);
387
m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
388
389
/* muted channel syntax */
390
n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
391
if ((n == 1 || n == 3) && m->channel_idx == -1) {
392
m->file_idx = m->stream_idx = -1;
393
if (n == 1)
394
m->ofile_idx = m->ostream_idx = -1;
395
return 0;
396
}
397
398
/* normal syntax */
399
n = sscanf(arg, "%d.%d.%d:%d.%d",
400
&m->file_idx, &m->stream_idx, &m->channel_idx,
401
&m->ofile_idx, &m->ostream_idx);
402
403
if (n != 3 && n != 5) {
404
av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
405
"[file.stream.channel|-1][:syncfile:syncstream]\n");
406
exit_program(1);
407
}
408
409
if (n != 5) // only file.stream.channel specified
410
m->ofile_idx = m->ostream_idx = -1;
411
412
/* check input */
413
if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
414
av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
415
m->file_idx);
416
exit_program(1);
417
}
418
if (m->stream_idx < 0 ||
419
m->stream_idx >= input_files[m->file_idx]->nb_streams) {
420
av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
421
m->file_idx, m->stream_idx);
422
exit_program(1);
423
}
424
st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
425
if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
426
av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
427
m->file_idx, m->stream_idx);
428
exit_program(1);
429
}
430
if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
431
av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
432
m->file_idx, m->stream_idx, m->channel_idx);
433
exit_program(1);
434
}
435
return 0;
436
}
437
438
static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
439
{
440
av_free(sdp_filename);
441
sdp_filename = av_strdup(arg);
442
return 0;
443
}
444
445
/**
446
* Parse a metadata specifier passed as 'arg' parameter.
447
* @param arg metadata string to parse
448
* @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
449
* @param index for type c/p, chapter/program index is written here
450
* @param stream_spec for type s, the stream specifier is written here
451
*/
452
static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
453
{
454
if (*arg) {
455
*type = *arg;
456
switch (*arg) {
457
case 'g':
458
break;
459
case 's':
460
if (*(++arg) && *arg != ':') {
461
av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
462
exit_program(1);
463
}
464
*stream_spec = *arg == ':' ? arg + 1 : "";
465
break;
466
case 'c':
467
case 'p':
468
if (*(++arg) == ':')
469
*index = strtol(++arg, NULL, 0);
470
break;
471
default:
472
av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
473
exit_program(1);
474
}
475
} else
476
*type = 'g';
477
}
478
479
static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
480
{
481
AVDictionary **meta_in = NULL;
482
AVDictionary **meta_out = NULL;
483
int i, ret = 0;
484
char type_in, type_out;
485
const char *istream_spec = NULL, *ostream_spec = NULL;
486
int idx_in = 0, idx_out = 0;
487
488
parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
489
parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
490
491
if (!ic) {
492
if (type_out == 'g' || !*outspec)
493
o->metadata_global_manual = 1;
494
if (type_out == 's' || !*outspec)
495
o->metadata_streams_manual = 1;
496
if (type_out == 'c' || !*outspec)
497
o->metadata_chapters_manual = 1;
498
return 0;
499
}
500
501
if (type_in == 'g' || type_out == 'g')
502
o->metadata_global_manual = 1;
503
if (type_in == 's' || type_out == 's')
504
o->metadata_streams_manual = 1;
505
if (type_in == 'c' || type_out == 'c')
506
o->metadata_chapters_manual = 1;
507
508
/* ic is NULL when just disabling automatic mappings */
509
if (!ic)
510
return 0;
511
512
#define METADATA_CHECK_INDEX(index, nb_elems, desc)\
513
if ((index) < 0 || (index) >= (nb_elems)) {\
514
av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
515
(desc), (index));\
516
exit_program(1);\
517
}
518
519
#define SET_DICT(type, meta, context, index)\
520
switch (type) {\
521
case 'g':\
522
meta = &context->metadata;\
523
break;\
524
case 'c':\
525
METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
526
meta = &context->chapters[index]->metadata;\
527
break;\
528
case 'p':\
529
METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
530
meta = &context->programs[index]->metadata;\
531
break;\
532
case 's':\
533
break; /* handled separately below */ \
534
default: av_assert0(0);\
535
}\
536
537
SET_DICT(type_in, meta_in, ic, idx_in);
538
SET_DICT(type_out, meta_out, oc, idx_out);
539
540
/* for input streams choose first matching stream */
541
if (type_in == 's') {
542
for (i = 0; i < ic->nb_streams; i++) {
543
if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
544
meta_in = &ic->streams[i]->metadata;
545
break;
546
} else if (ret < 0)
547
exit_program(1);
548
}
549
if (!meta_in) {
550
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
if (type_out == 's') {
556
for (i = 0; i < oc->nb_streams; i++) {
557
if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
558
meta_out = &oc->streams[i]->metadata;
559
av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
560
} else if (ret < 0)
561
exit_program(1);
562
}
563
} else
564
av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
565
566
return 0;
567
}
568
569
static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
570
{
571
OptionsContext *o = optctx;
572
char buf[128];
573
int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
574
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
parse_option(o, "metadata", buf, options);
578
579
av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
580
"tag instead.\n", opt);
581
return 0;
582
}
583
584
static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
585
{
586
const AVCodecDescriptor *desc;
587
const char *codec_string = encoder ? "encoder" : "decoder";
588
AVCodec *codec;
589
590
codec = encoder ?
591
avcodec_find_encoder_by_name(name) :
592
avcodec_find_decoder_by_name(name);
593
594
if (!codec && (desc = avcodec_descriptor_get_by_name(name))) {
595
codec = encoder ? avcodec_find_encoder(desc->id) :
596
avcodec_find_decoder(desc->id);
597
if (codec)
598
av_log(NULL, AV_LOG_VERBOSE, "Matched %s '%s' for codec '%s'.\n",
599
codec_string, codec->name, desc->name);
600
}
601
602
if (!codec) {
603
av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
604
exit_program(1);
605
}
606
if (codec->type != type) {
607
av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
608
exit_program(1);
609
}
610
return codec;
611
}
612
613
static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
614
{
615
char *codec_name = NULL;
616
617
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
618
if (codec_name) {
619
AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
620
st->codec->codec_id = codec->id;
621
return codec;
622
} else
623
return avcodec_find_decoder(st->codec->codec_id);
624
}
625
626
/* Add all the streams from the given input file to the global
627
* list of input streams. */
628
static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
629
{
630
int i, ret;
631
632
for (i = 0; i < ic->nb_streams; i++) {
633
AVStream *st = ic->streams[i];
634
AVCodecContext *dec = st->codec;
635
InputStream *ist = av_mallocz(sizeof(*ist));
636
char *framerate = NULL, *hwaccel = NULL, *hwaccel_device = NULL;
637
char *codec_tag = NULL;
638
char *next;
639
char *discard_str = NULL;
640
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
input_streams[nb_input_streams - 1] = ist;
647
648
ist->st = st;
649
ist->file_index = nb_input_files;
650
ist->discard = 1;
651
st->discard = AVDISCARD_ALL;
652
ist->nb_samples = 0;
653
ist->min_pts = INT64_MAX;
654
ist->max_pts = INT64_MIN;
655
656
ist->ts_scale = 1.0;
657
MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
658
659
ist->autorotate = 1;
660
MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
661
662
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
663
if (codec_tag) {
664
uint32_t tag = strtol(codec_tag, &next, 0);
665
if (*next)
666
tag = AV_RL32(codec_tag);
667
st->codec->codec_tag = tag;
668
}
669
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
ist->reinit_filters = -1;
674
MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
675
676
MATCH_PER_STREAM_OPT(discard, str, discard_str, ic, st);
677
ist->user_set_discard = AVDISCARD_NONE;
678
if (discard_str && av_opt_eval_int(dec, discard_opt, discard_str, &ist->user_set_discard) < 0) {
679
av_log(NULL, AV_LOG_ERROR, "Error parsing discard %s.\n",
680
discard_str);
681
exit_program(1);
682
}
683
684
ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
685
686
ist->dec_ctx = avcodec_alloc_context3(ist->dec);
687
if (!ist->dec_ctx) {
688
av_log(NULL, AV_LOG_ERROR, "Error allocating the decoder context.\n");
689
exit_program(1);
690
}
691
692
ret = avcodec_copy_context(ist->dec_ctx, dec);
693
if (ret < 0) {
694
av_log(NULL, AV_LOG_ERROR, "Error initializing the decoder context.\n");
695
exit_program(1);
696
}
697
698
switch (dec->codec_type) {
699
case AVMEDIA_TYPE_VIDEO:
700
if(!ist->dec)
701
ist->dec = avcodec_find_decoder(dec->codec_id);
702
#if FF_API_EMU_EDGE
703
if (av_codec_get_lowres(dec)) {
704
dec->flags |= CODEC_FLAG_EMU_EDGE;
705
}
706
#endif
707
708
ist->resample_height = ist->dec_ctx->height;
709
ist->resample_width = ist->dec_ctx->width;
710
ist->resample_pix_fmt = ist->dec_ctx->pix_fmt;
711
712
MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
713
if (framerate && av_parse_video_rate(&ist->framerate,
714
framerate) < 0) {
715
av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
716
framerate);
717
exit_program(1);
718
}
719
720
ist->top_field_first = -1;
721
MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
722
723
MATCH_PER_STREAM_OPT(hwaccels, str, hwaccel, ic, st);
724
if (hwaccel) {
725
if (!strcmp(hwaccel, "none"))
726
ist->hwaccel_id = HWACCEL_NONE;
727
else if (!strcmp(hwaccel, "auto"))
728
ist->hwaccel_id = HWACCEL_AUTO;
729
else {
730
int i;
731
for (i = 0; hwaccels[i].name; i++) {
732
if (!strcmp(hwaccels[i].name, hwaccel)) {
733
ist->hwaccel_id = hwaccels[i].id;
734
break;
735
}
736
}
737
738
if (!ist->hwaccel_id) {
739
av_log(NULL, AV_LOG_FATAL, "Unrecognized hwaccel: %s.\n",
740
hwaccel);
741
av_log(NULL, AV_LOG_FATAL, "Supported hwaccels: ");
742
for (i = 0; hwaccels[i].name; i++)
743
av_log(NULL, AV_LOG_FATAL, "%s ", hwaccels[i].name);
744
av_log(NULL, AV_LOG_FATAL, "\n");
745
exit_program(1);
746
}
747
}
748
}
749
750
MATCH_PER_STREAM_OPT(hwaccel_devices, str, hwaccel_device, ic, st);
751
if (hwaccel_device) {
752
ist->hwaccel_device = av_strdup(hwaccel_device);
753
if (!ist->hwaccel_device)
754
exit_program(1);
755
}
756
ist->hwaccel_pix_fmt = AV_PIX_FMT_NONE;
757
758
break;
759
case AVMEDIA_TYPE_AUDIO:
760
ist->guess_layout_max = INT_MAX;
761
MATCH_PER_STREAM_OPT(guess_layout_max, i, ist->guess_layout_max, ic, st);
762
guess_input_channel_layout(ist);
763
764
ist->resample_sample_fmt = ist->dec_ctx->sample_fmt;
765
ist->resample_sample_rate = ist->dec_ctx->sample_rate;
766
ist->resample_channels = ist->dec_ctx->channels;
767
ist->resample_channel_layout = ist->dec_ctx->channel_layout;
768
769
break;
770
case AVMEDIA_TYPE_DATA:
771
case AVMEDIA_TYPE_SUBTITLE: {
772
char *canvas_size = NULL;
773
if(!ist->dec)
774
ist->dec = avcodec_find_decoder(dec->codec_id);
775
MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
776
MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
777
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
case AVMEDIA_TYPE_ATTACHMENT:
785
case AVMEDIA_TYPE_UNKNOWN:
786
break;
787
default:
788
abort();
789
}
790
}
791
}
792
793
static void assert_file_overwrite(const char *filename)
794
{
795
if (file_overwrite && no_file_overwrite) {
796
fprintf(stderr, "Error, both -y and -n supplied. Exiting.\n");
797
exit_program(1);
798
}
799
800
if (!file_overwrite) {
801
const char *proto_name = avio_find_protocol_name(filename);
802
if (proto_name && !strcmp(proto_name, "file") && avio_check(filename, 0) == 0) {
803
if (stdin_interaction && !no_file_overwrite) {
804
fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
805
fflush(stderr);
806
term_exit();
807
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
static void dump_attachment(AVStream *st, const char *filename)
823
{
824
int ret;
825
AVIOContext *out = NULL;
826
AVDictionaryEntry *e;
827
828
if (!st->codec->extradata_size) {
829
av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
830
nb_input_files - 1, st->index);
831
return;
832
}
833
if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
834
filename = e->value;
835
if (!*filename) {
836
av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
837
"in stream #%d:%d.\n", nb_input_files - 1, st->index);
838
exit_program(1);
839
}
840
841
assert_file_overwrite(filename);
842
843
if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
844
av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
845
filename);
846
exit_program(1);
847
}
848
849
avio_write(out, st->codec->extradata, st->codec->extradata_size);
850
avio_flush(out);
851
avio_close(out);
852
}
853
854
static int open_input_file(OptionsContext *o, const char *filename)
855
{
856
InputFile *f;
857
AVFormatContext *ic;
858
AVInputFormat *file_iformat = NULL;
859
int err, i, ret;
860
int64_t timestamp;
861
AVDictionary **opts;
862
AVDictionary *unused_opts = NULL;
863
AVDictionaryEntry *e = NULL;
864
int orig_nb_streams; // number of streams before avformat_find_stream_info
865
char * video_codec_name = NULL;
866
char * audio_codec_name = NULL;
867
char *subtitle_codec_name = NULL;
868
char * data_codec_name = NULL;
869
int scan_all_pmts_set = 0;
870
871
if (o->format) {
872
if (!(file_iformat = av_find_input_format(o->format))) {
873
av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
874
exit_program(1);
875
}
876
}
877
878
if (!strcmp(filename, "-"))
879
filename = "pipe:";
880
881
stdin_interaction &= strncmp(filename, "pipe:", 5) &&
882
strcmp(filename, "/dev/stdin");
883
884
/* get default parameters from command line */
885
ic = avformat_alloc_context();
886
if (!ic) {
887
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
if (o->nb_audio_channels) {
894
/* because we set audio_channels based on both the "ac" and
895
* "channel_layout" options, we need to check that the specified
896
* demuxer actually has the "channels" option before setting it */
897
if (file_iformat && file_iformat->priv_class &&
898
av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
899
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
if (o->nb_frame_rates) {
904
/* set the format-level framerate option;
905
* this is important for video grabbers, e.g. x11 */
906
if (file_iformat && file_iformat->priv_class &&
907
av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
908
AV_OPT_SEARCH_FAKE_OBJ)) {
909
av_dict_set(&o->g->format_opts, "framerate",
910
o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
911
}
912
}
913
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
MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
920
MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
921
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
ic->video_codec_id = video_codec_name ?
925
find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
926
ic->audio_codec_id = audio_codec_name ?
927
find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
928
ic->subtitle_codec_id= subtitle_codec_name ?
929
find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
930
ic->data_codec_id = data_codec_name ?
931
find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
932
933
if (video_codec_name)
934
av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
935
if (audio_codec_name)
936
av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
937
if (subtitle_codec_name)
938
av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
939
if (data_codec_name)
940
av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
941
942
ic->flags |= AVFMT_FLAG_NONBLOCK;
943
ic->interrupt_callback = int_cb;
944
945
if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
946
av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
947
scan_all_pmts_set = 1;
948
}
949
/* open the input file with generic avformat function */
950
err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
951
if (err < 0) {
952
print_error(filename, err);
953
exit_program(1);
954
}
955
if (scan_all_pmts_set)
956
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
/* apply forced codec ids */
961
for (i = 0; i < ic->nb_streams; i++)
962
choose_decoder(o, ic, ic->streams[i]);
963
964
/* Set AVCodecContext options for avformat_find_stream_info */
965
opts = setup_find_stream_info_opts(ic, o->g->codec_opts);
966
orig_nb_streams = ic->nb_streams;
967
968
/* If not enough info to get the stream parameters, we decode the
969
first frames to get it. (used in mpeg case for example) */
970
ret = avformat_find_stream_info(ic, opts);
971
if (ret < 0) {
972
av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
973
if (ic->nb_streams == 0) {
974
avformat_close_input(&ic);
975
exit_program(1);
976
}
977
}
978
979
if (o->start_time_eof != AV_NOPTS_VALUE) {
980
if (ic->duration>0) {
981
o->start_time = o->start_time_eof + ic->duration;
982
} else
983
av_log(NULL, AV_LOG_WARNING, "Cannot use -sseof, duration of %s not known\n", filename);
984
}
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
timestamp += ic->start_time;
989
990
/* if seeking requested, we execute it */
991
if (o->start_time != AV_NOPTS_VALUE) {
992
int64_t seek_timestamp = timestamp;
993
994
if (!(ic->iformat->flags & AVFMT_SEEK_TO_PTS)) {
995
int dts_heuristic = 0;
996
for (i=0; i<ic->nb_streams; i++) {
997
AVCodecContext *avctx = ic->streams[i]->codec;
998
if (avctx->has_b_frames)
999
dts_heuristic = 1;
1000
}
1001
if (dts_heuristic) {
1002
seek_timestamp -= 3*AV_TIME_BASE / 23;
1003
}
1004
}
1005
ret = avformat_seek_file(ic, -1, INT64_MIN, seek_timestamp, seek_timestamp, 0);
1006
if (ret < 0) {
1007
av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
1008
filename, (double)timestamp / AV_TIME_BASE);
1009
}
1010
}
1011
1012
/* update the current parameters so that they match the one of the input stream */
1013
add_input_streams(o, ic);
1014
1015
/* dump the file content */
1016
av_dump_format(ic, nb_input_files, filename, 0);
1017
1018
GROW_ARRAY(input_files, nb_input_files);
1019
f = av_mallocz(sizeof(*f));
1020
if (!f)
1021
exit_program(1);
1022
input_files[nb_input_files - 1] = f;
1023
1024
f->ctx = ic;
1025
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
f->nb_streams = ic->nb_streams;
1031
f->rate_emu = o->rate_emu;
1032
f->accurate_seek = o->accurate_seek;
1033
f->loop = o->loop;
1034
f->duration = 0;
1035
f->time_base = (AVRational){ 1, 1 };
1036
#if HAVE_PTHREADS
1037
f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
1038
#endif
1039
1040
/* check if all codec options have been used */
1041
unused_opts = strip_specifiers(o->g->codec_opts);
1042
for (i = f->ist_index; i < nb_input_streams; i++) {
1043
e = NULL;
1044
while ((e = av_dict_get(input_streams[i]->decoder_opts, "", e,
1045
AV_DICT_IGNORE_SUFFIX)))
1046
av_dict_set(&unused_opts, e->key, NULL, 0);
1047
}
1048
1049
e = NULL;
1050
while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
1051
const AVClass *class = avcodec_get_class();
1052
const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
1053
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1054
const AVClass *fclass = avformat_get_class();
1055
const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
1056
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
1057
if (!option || foption)
1058
continue;
1059
1060
1061
if (!(option->flags & AV_OPT_FLAG_DECODING_PARAM)) {
1062
av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
1063
"input file #%d (%s) is not a decoding option.\n", e->key,
1064
option->help ? option->help : "", nb_input_files - 1,
1065
filename);
1066
exit_program(1);
1067
}
1068
1069
av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
1070
"input file #%d (%s) has not been used for any stream. The most "
1071
"likely reason is either wrong type (e.g. a video option with "
1072
"no video streams) or that it is a private option of some decoder "
1073
"which was not actually used for any stream.\n", e->key,
1074
option->help ? option->help : "", nb_input_files - 1, filename);
1075
}
1076
av_dict_free(&unused_opts);
1077
1078
for (i = 0; i < o->nb_dump_attachment; i++) {
1079
int j;
1080
1081
for (j = 0; j < ic->nb_streams; j++) {
1082
AVStream *st = ic->streams[j];
1083
1084
if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
1085
dump_attachment(st, o->dump_attachment[i].u.str);
1086
}
1087
}
1088
1089
for (i = 0; i < orig_nb_streams; i++)
1090
av_dict_free(&opts[i]);
1091
av_freep(&opts);
1092
1093
input_stream_potentially_available = 1;
1094
1095
return 0;
1096
}
1097
1098
static uint8_t *get_line(AVIOContext *s)
1099
{
1100
AVIOContext *line;
1101
uint8_t *buf;
1102
char c;
1103
1104
if (avio_open_dyn_buf(&line) < 0) {
1105
av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
1106
exit_program(1);
1107
}
1108
1109
while ((c = avio_r8(s)) && c != '\n')
1110
avio_w8(line, c);
1111
avio_w8(line, 0);
1112
avio_close_dyn_buf(line, &buf);
1113
1114
return buf;
1115
}
1116
1117
static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
1118
{
1119
int i, ret = -1;
1120
char filename[1000];
1121
const char *base[3] = { getenv("AVCONV_DATADIR"),
1122
getenv("HOME"),
1123
AVCONV_DATADIR,
1124
};
1125
1126
for (i = 0; i < FF_ARRAY_ELEMS(base) && ret < 0; i++) {
1127
if (!base[i])
1128
continue;
1129
if (codec_name) {
1130
snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
1131
i != 1 ? "" : "/.avconv", codec_name, preset_name);
1132
ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1133
}
1134
if (ret < 0) {
1135
snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
1136
i != 1 ? "" : "/.avconv", preset_name);
1137
ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
1138
}
1139
}
1140
return ret;
1141
}
1142
1143
static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
1144
{
1145
char *codec_name = NULL;
1146
1147
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
1148
if (!codec_name) {
1149
ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
1150
NULL, ost->st->codec->codec_type);
1151
ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1152
} else if (!strcmp(codec_name, "copy"))
1153
ost->stream_copy = 1;
1154
else {
1155
ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
1156
ost->st->codec->codec_id = ost->enc->id;
1157
}
1158
}
1159
1160
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
1161
{
1162
OutputStream *ost;
1163
AVStream *st = avformat_new_stream(oc, NULL);
1164
int idx = oc->nb_streams - 1, ret = 0;
1165
char *bsf = NULL, *next, *codec_tag = NULL;
1166
AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
1167
double qscale = -1;
1168
int i;
1169
1170
if (!st) {
1171
av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
1172
exit_program(1);
1173
}
1174
1175
if (oc->nb_streams - 1 < o->nb_streamid_map)
1176
st->id = o->streamid_map[oc->nb_streams - 1];
1177
1178
GROW_ARRAY(output_streams, nb_output_streams);
1179
if (!(ost = av_mallocz(sizeof(*ost))))
1180
exit_program(1);
1181
output_streams[nb_output_streams - 1] = ost;
1182
1183
ost->file_index = nb_output_files - 1;
1184
ost->index = idx;
1185
ost->st = st;
1186
st->codec->codec_type = type;
1187
choose_encoder(o, oc, ost);
1188
1189
ost->enc_ctx = avcodec_alloc_context3(ost->enc);
1190
if (!ost->enc_ctx) {
1191
av_log(NULL, AV_LOG_ERROR, "Error allocating the encoding context.\n");
1192
exit_program(1);
1193
}
1194
ost->enc_ctx->codec_type = type;
1195
1196
if (ost->enc) {
1197
AVIOContext *s = NULL;
1198
char *buf = NULL, *arg = NULL, *preset = NULL;
1199
1200
ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
1201
1202
MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
1203
if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
1204
do {
1205
buf = get_line(s);
1206
if (!buf[0] || buf[0] == '#') {
1207
av_free(buf);
1208
continue;
1209
}
1210
if (!(arg = strchr(buf, '='))) {
1211
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
av_free(buf);
1217
} while (!s->eof_reached);
1218
avio_closep(&s);
1219
}
1220
if (ret) {
1221
av_log(NULL, AV_LOG_FATAL,
1222
"Preset %s specified for stream %d:%d, but could not be opened.\n",
1223
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
ost->max_frames = INT64_MAX;
1231
MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
1232
for (i = 0; i<o->nb_max_frames; i++) {
1233
char *p = o->max_frames[i].specifier;
1234
if (!*p && type != AVMEDIA_TYPE_VIDEO) {
1235
av_log(NULL, AV_LOG_WARNING, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1236
break;
1237
}
1238
}
1239
1240
ost->copy_prior_start = -1;
1241
MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
1242
1243
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
1244
while (bsf) {
1245
char *arg = NULL;
1246
if (next = strchr(bsf, ','))
1247
*next++ = 0;
1248
if (arg = strchr(bsf, '='))
1249
*arg++ = 0;
1250
if (!(bsfc = av_bitstream_filter_init(bsf))) {
1251
av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
1252
exit_program(1);
1253
}
1254
if (bsfc_prev)
1255
bsfc_prev->next = bsfc;
1256
else
1257
ost->bitstream_filters = bsfc;
1258
if (arg)
1259
if (!(bsfc->args = av_strdup(arg))) {
1260
av_log(NULL, AV_LOG_FATAL, "Bitstream filter memory allocation failed\n");
1261
exit_program(1);
1262
}
1263
1264
bsfc_prev = bsfc;
1265
bsf = next;
1266
}
1267
1268
MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
1269
if (codec_tag) {
1270
uint32_t tag = strtol(codec_tag, &next, 0);
1271
if (*next)
1272
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
MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
1284
ost->disposition = av_strdup(ost->disposition);
1285
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
av_dict_copy(&ost->resample_opts, o->g->resample_opts, 0);
1296
1297
ost->source_index = source_index;
1298
if (source_index >= 0) {
1299
ost->sync_ist = input_streams[source_index];
1300
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
return ost;
1306
}
1307
1308
static void parse_matrix_coeffs(uint16_t *dest, const char *str)
1309
{
1310
int i;
1311
const char *p = str;
1312
for (i = 0;; i++) {
1313
dest[i] = atoi(p);
1314
if (i == 63)
1315
break;
1316
p = strchr(p, ',');
1317
if (!p) {
1318
av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
1319
exit_program(1);
1320
}
1321
p++;
1322
}
1323
}
1324
1325
/* read file contents into a string */
1326
static uint8_t *read_file(const char *filename)
1327
{
1328
AVIOContext *pb = NULL;
1329
AVIOContext *dyn_buf = NULL;
1330
int ret = avio_open(&pb, filename, AVIO_FLAG_READ);
1331
uint8_t buf[1024], *str;
1332
1333
if (ret < 0) {
1334
av_log(NULL, AV_LOG_ERROR, "Error opening file %s.\n", filename);
1335
return NULL;
1336
}
1337
1338
ret = avio_open_dyn_buf(&dyn_buf);
1339
if (ret < 0) {
1340
avio_closep(&pb);
1341
return NULL;
1342
}
1343
while ((ret = avio_read(pb, buf, sizeof(buf))) > 0)
1344
avio_write(dyn_buf, buf, ret);
1345
avio_w8(dyn_buf, 0);
1346
avio_closep(&pb);
1347
1348
ret = avio_close_dyn_buf(dyn_buf, &str);
1349
if (ret < 0)
1350
return NULL;
1351
return str;
1352
}
1353
1354
static char *get_ost_filters(OptionsContext *o, AVFormatContext *oc,
1355
OutputStream *ost)
1356
{
1357
AVStream *st = ost->st;
1358
1359
if (ost->filters_script && ost->filters) {
1360
av_log(NULL, AV_LOG_ERROR, "Both -filter and -filter_script set for "
1361
"output stream #%d:%d.\n", nb_output_files, st->index);
1362
exit_program(1);
1363
}
1364
1365
if (ost->filters_script)
1366
return read_file(ost->filters_script);
1367
else if (ost->filters)
1368
return av_strdup(ost->filters);
1369
1370
return av_strdup(st->codec->codec_type == AVMEDIA_TYPE_VIDEO ?
1371
"null" : "anull");
1372
}
1373
1374
static void check_streamcopy_filters(OptionsContext *o, AVFormatContext *oc,
1375
const OutputStream *ost, enum AVMediaType type)
1376
{
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
ost->filters ? "Filtergraph" : "Filtergraph script",
1382
ost->filters ? ost->filters : ost->filters_script,
1383
av_get_media_type_string(type), ost->file_index, ost->index);
1384
exit_program(1);
1385
}
1386
}
1387
1388
static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1389
{
1390
AVStream *st;
1391
OutputStream *ost;
1392
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
MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
1400
if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
1401
av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
1402
exit_program(1);
1403
}
1404
if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
1405
av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
1406
1407
MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
1408
if (frame_aspect_ratio) {
1409
AVRational q;
1410
if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
1411
q.num <= 0 || q.den <= 0) {
1412
av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
1413
exit_program(1);
1414
}
1415
ost->frame_aspect_ratio = q;
1416
}
1417
1418
MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1419
MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1420
1421
if (!ost->stream_copy) {
1422
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
int i;
1429
1430
MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1431
if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
1432
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
if (frame_pix_fmt && *frame_pix_fmt == '+') {
1439
ost->keep_pix_fmt = 1;
1440
if (!*++frame_pix_fmt)
1441
frame_pix_fmt = NULL;
1442
}
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
st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
1448
1449
if (intra_only)
1450
video_enc->gop_size = 0;
1451
MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
1452
if (intra_matrix) {
1453
if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
1454
av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1455
exit_program(1);
1456
}
1457
parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
1458
}
1459
MATCH_PER_STREAM_OPT(chroma_intra_matrices, str, chroma_intra_matrix, oc, st);
1460
if (chroma_intra_matrix) {
1461
uint16_t *p = av_mallocz(sizeof(*video_enc->chroma_intra_matrix) * 64);
1462
if (!p) {
1463
av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
1464
exit_program(1);
1465
}
1466
av_codec_set_chroma_intra_matrix(video_enc, p);
1467
parse_matrix_coeffs(p, chroma_intra_matrix);
1468
}
1469
MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
1470
if (inter_matrix) {
1471
if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
1472
av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
1473
exit_program(1);
1474
}
1475
parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
1476
}
1477
1478
MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
1479
for (i = 0; p; i++) {
1480
int start, end, q;
1481
int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
1482
if (e != 3) {
1483
av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
1484
exit_program(1);
1485
}
1486
video_enc->rc_override =
1487
av_realloc_array(video_enc->rc_override,
1488
i + 1, sizeof(RcOverride));
1489
if (!video_enc->rc_override) {
1490
av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
1491
exit_program(1);
1492
}
1493
video_enc->rc_override[i].start_frame = start;
1494
video_enc->rc_override[i].end_frame = end;
1495
if (q > 0) {
1496
video_enc->rc_override[i].qscale = q;
1497
video_enc->rc_override[i].quality_factor = 1.0;
1498
}
1499
else {
1500
video_enc->rc_override[i].qscale = 0;
1501
video_enc->rc_override[i].quality_factor = -q/100.0;
1502
}
1503
p = strchr(p, '/');
1504
if (p) p++;
1505
}
1506
video_enc->rc_override_count = i;
1507
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
MATCH_PER_STREAM_OPT(passlogfiles, str, ost->logfile_prefix, oc, st);
1525
if (ost->logfile_prefix &&
1526
!(ost->logfile_prefix = av_strdup(ost->logfile_prefix)))
1527
exit_program(1);
1528
1529
if (do_pass) {
1530
char logfilename[1024];
1531
FILE *f;
1532
1533
snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
1534
ost->logfile_prefix ? ost->logfile_prefix :
1535
DEFAULT_PASS_LOGFILENAME_PREFIX,
1536
i);
1537
if (!strcmp(ost->enc->name, "libx264")) {
1538
av_dict_set(&ost->encoder_opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
1539
} else {
1540
if (video_enc->flags & AV_CODEC_FLAG_PASS2) {
1541
char *logbuffer = read_file(logfilename);
1542
1543
if (!logbuffer) {
1544
av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
1545
logfilename);
1546
exit_program(1);
1547
}
1548
video_enc->stats_in = logbuffer;
1549
}
1550
if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1551
f = av_fopen_utf8(logfilename, "wb");
1552
if (!f) {
1553
av_log(NULL, AV_LOG_FATAL,
1554
"Cannot write log file '%s' for pass-1 encoding: %s\n",
1555
logfilename, strerror(errno));
1556
exit_program(1);
1557
}
1558
ost->logfile = f;
1559
}
1560
}
1561
}
1562
1563
MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
1564
if (ost->forced_keyframes)
1565
ost->forced_keyframes = av_strdup(ost->forced_keyframes);
1566
1567
MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
1568
1569
ost->top_field_first = -1;
1570
MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
1571
1572
1573
ost->avfilter = get_ost_filters(o, oc, ost);
1574
if (!ost->avfilter)
1575
exit_program(1);
1576
} else {
1577
MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
1578
}
1579
1580
if (ost->stream_copy)
1581
check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_VIDEO);
1582
1583
return ost;
1584
}
1585
1586
static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1587
{
1588
int n;
1589
AVStream *st;
1590
OutputStream *ost;
1591
AVCodecContext *audio_enc;
1592
1593
ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
1594
st = ost->st;
1595
1596
audio_enc = ost->enc_ctx;
1597
audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
1598
1599
MATCH_PER_STREAM_OPT(filter_scripts, str, ost->filters_script, oc, st);
1600
MATCH_PER_STREAM_OPT(filters, str, ost->filters, oc, st);
1601
1602
if (!ost->stream_copy) {
1603
char *sample_fmt = NULL;
1604
1605
MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
1606
1607
MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
1608
if (sample_fmt &&
1609
(audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
1610
av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
1611
exit_program(1);
1612
}
1613
1614
MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
1615
1616
MATCH_PER_STREAM_OPT(apad, str, ost->apad, oc, st);
1617
ost->apad = av_strdup(ost->apad);
1618
1619
ost->avfilter = get_ost_filters(o, oc, ost);
1620
if (!ost->avfilter)
1621
exit_program(1);
1622
1623
/* check for channel mapping for this audio stream */
1624
for (n = 0; n < o->nb_audio_channel_maps; n++) {
1625
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
InputStream *ist;
1629
1630
if (map->channel_idx == -1) {
1631
ist = NULL;
1632
} else if (ost->source_index < 0) {
1633
av_log(NULL, AV_LOG_FATAL, "Cannot determine input stream for channel mapping %d.%d\n",
1634
ost->file_index, ost->st->index);
1635
continue;
1636
} else {
1637
ist = input_streams[ost->source_index];
1638
}
1639
1640
if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
1641
if (av_reallocp_array(&ost->audio_channels_map,
1642
ost->audio_channels_mapped + 1,
1643
sizeof(*ost->audio_channels_map)
1644
) < 0 )
1645
exit_program(1);
1646
1647
ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
1648
}
1649
}
1650
}
1651
}
1652
1653
if (ost->stream_copy)
1654
check_streamcopy_filters(o, oc, ost, AVMEDIA_TYPE_AUDIO);
1655
1656
return ost;
1657
}
1658
1659
static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1660
{
1661
OutputStream *ost;
1662
1663
ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
1664
if (!ost->stream_copy) {
1665
av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
1666
exit_program(1);
1667
}
1668
1669
return ost;
1670
}
1671
1672
static OutputStream *new_unknown_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1673
{
1674
OutputStream *ost;
1675
1676
ost = new_output_stream(o, oc, AVMEDIA_TYPE_UNKNOWN, source_index);
1677
if (!ost->stream_copy) {
1678
av_log(NULL, AV_LOG_FATAL, "Unknown stream encoding not supported yet (only streamcopy)\n");
1679
exit_program(1);
1680
}
1681
1682
return ost;
1683
}
1684
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
return ost;
1691
}
1692
1693
static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
1694
{
1695
AVStream *st;
1696
OutputStream *ost;
1697
AVCodecContext *subtitle_enc;
1698
1699
ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
1700
st = ost->st;
1701
subtitle_enc = ost->enc_ctx;
1702
1703
subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
1704
1705
MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
1706
1707
if (!ost->stream_copy) {
1708
char *frame_size = NULL;
1709
1710
MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
1711
if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
1712
av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
1713
exit_program(1);
1714
}
1715
}
1716
1717
return ost;
1718
}
1719
1720
/* 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
int idx;
1725
char *p;
1726
char idx_str[16];
1727
1728
av_strlcpy(idx_str, arg, sizeof(idx_str));
1729
p = strchr(idx_str, ':');
1730
if (!p) {
1731
av_log(NULL, AV_LOG_FATAL,
1732
"Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1733
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
o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
1739
o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
1740
return 0;
1741
}
1742
1743
static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
1744
{
1745
AVFormatContext *is = ifile->ctx;
1746
AVFormatContext *os = ofile->ctx;
1747
AVChapter **tmp;
1748
int i;
1749
1750
tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
1751
if (!tmp)
1752
return AVERROR(ENOMEM);
1753
os->chapters = tmp;
1754
1755
for (i = 0; i < is->nb_chapters; i++) {
1756
AVChapter *in_ch = is->chapters[i], *out_ch;
1757
int64_t start_time = (ofile->start_time == AV_NOPTS_VALUE) ? 0 : ofile->start_time;
1758
int64_t ts_off = av_rescale_q(start_time - ifile->ts_offset,
1759
AV_TIME_BASE_Q, in_ch->time_base);
1760
int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
1761
av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1762
1763
1764
if (in_ch->end < ts_off)
1765
continue;
1766
if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1767
break;
1768
1769
out_ch = av_mallocz(sizeof(AVChapter));
1770
if (!out_ch)
1771
return AVERROR(ENOMEM);
1772
1773
out_ch->id = in_ch->id;
1774
out_ch->time_base = in_ch->time_base;
1775
out_ch->start = FFMAX(0, in_ch->start - ts_off);
1776
out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1777
1778
if (copy_metadata)
1779
av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1780
1781
os->chapters[os->nb_chapters++] = out_ch;
1782
}
1783
return 0;
1784
}
1785
1786
static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
1787
{
1788
int i, err;
1789
AVFormatContext *ic = avformat_alloc_context();
1790
1791
ic->interrupt_callback = int_cb;
1792
err = avformat_open_input(&ic, filename, NULL, NULL);
1793
if (err < 0)
1794
return err;
1795
/* copy stream format */
1796
for(i=0;i<ic->nb_streams;i++) {
1797
AVStream *st;
1798
OutputStream *ost;
1799
AVCodec *codec;
1800
const char *enc_config;
1801
1802
codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
1803
if (!codec) {
1804
av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
1805
return AVERROR(EINVAL);
1806
}
1807
if (codec->type == AVMEDIA_TYPE_AUDIO)
1808
opt_audio_codec(o, "c:a", codec->name);
1809
else if (codec->type == AVMEDIA_TYPE_VIDEO)
1810
opt_video_codec(o, "c:v", codec->name);
1811
ost = new_output_stream(o, s, codec->type, -1);
1812
st = ost->st;
1813
1814
avcodec_get_context_defaults3(st->codec, codec);
1815
enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
1816
if (enc_config) {
1817
AVDictionary *opts = NULL;
1818
av_dict_parse_string(&opts, enc_config, "=", ",", 0);
1819
av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
1820
av_dict_free(&opts);
1821
}
1822
1823
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
1824
choose_sample_fmt(st, codec);
1825
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
avcodec_copy_context(ost->enc_ctx, st->codec);
1828
if (enc_config)
1829
av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
1830
}
1831
1832
avformat_close_input(&ic);
1833
return err;
1834
}
1835
1836
static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
1837
AVFormatContext *oc)
1838
{
1839
OutputStream *ost;
1840
1841
switch (ofilter->type) {
1842
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
1843
case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
1844
default:
1845
av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
1846
"currently.\n");
1847
exit_program(1);
1848
}
1849
1850
ost->source_index = -1;
1851
ost->filter = ofilter;
1852
1853
ofilter->ost = ost;
1854
1855
if (ost->stream_copy) {
1856
av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
1857
"which is fed from a complex filtergraph. Filtering and streamcopy "
1858
"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
const char *opt = ost->filters ? "-vf/-af/-filter" : "-filter_script";
1864
av_log(NULL, AV_LOG_ERROR,
1865
"%s '%s' was specified through the %s option "
1866
"for output stream %d:%d, which is fed from a complex filtergraph.\n"
1867
"%s and -filter_complex cannot be used together for the same stream.\n",
1868
ost->filters ? "Filtergraph" : "Filtergraph script",
1869
ost->filters ? ost->filters : ost->filters_script,
1870
opt, ost->file_index, ost->index, opt);
1871
exit_program(1);
1872
}
1873
1874
avfilter_inout_free(&ofilter->out_tmp);
1875
}
1876
1877
static int init_complex_filters(void)
1878
{
1879
int i, ret = 0;
1880
1881
for (i = 0; i < nb_filtergraphs; i++) {
1882
ret = init_complex_filtergraph(filtergraphs[i]);
1883
if (ret < 0)
1884
return ret;
1885
}
1886
return 0;
1887
}
1888
1889
static int configure_complex_filters(void)
1890
{
1891
int i, ret = 0;
1892
1893
for (i = 0; i < nb_filtergraphs; i++)
1894
if (!filtergraphs[i]->graph &&
1895
(ret = configure_filtergraph(filtergraphs[i])) < 0)
1896
return ret;
1897
return 0;
1898
}
1899
1900
static int open_output_file(OptionsContext *o, const char *filename)
1901
{
1902
AVFormatContext *oc;
1903
int i, j, err;
1904
AVOutputFormat *file_oformat;
1905
OutputFile *of;
1906
OutputStream *ost;
1907
InputStream *ist;
1908
AVDictionary *unused_opts = NULL;
1909
AVDictionaryEntry *e = NULL;
1910
1911
1912
if (o->stop_time != INT64_MAX && o->recording_time != INT64_MAX) {
1913
o->stop_time = INT64_MAX;
1914
av_log(NULL, AV_LOG_WARNING, "-t and -to cannot be used together; using -t.\n");
1915
}
1916
1917
if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
1918
int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
1919
if (o->stop_time <= start_time) {
1920
av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
1921
exit_program(1);
1922
} else {
1923
o->recording_time = o->stop_time - start_time;
1924
}
1925
}
1926
1927
GROW_ARRAY(output_files, nb_output_files);
1928
of = av_mallocz(sizeof(*of));
1929
if (!of)
1930
exit_program(1);
1931
output_files[nb_output_files - 1] = of;
1932
1933
of->ost_index = nb_output_streams;
1934
of->recording_time = o->recording_time;
1935
of->start_time = o->start_time;
1936
of->limit_filesize = o->limit_filesize;
1937
of->shortest = o->shortest;
1938
av_dict_copy(&of->opts, o->g->format_opts, 0);
1939
1940
if (!strcmp(filename, "-"))
1941
filename = "pipe:";
1942
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
of->ctx = oc;
1950
if (o->recording_time != INT64_MAX)
1951
oc->duration = o->recording_time;
1952
1953
file_oformat= oc->oformat;
1954
oc->interrupt_callback = int_cb;
1955
1956
/* create streams for all unlabeled output pads */
1957
for (i = 0; i < nb_filtergraphs; i++) {
1958
FilterGraph *fg = filtergraphs[i];
1959
for (j = 0; j < fg->nb_outputs; j++) {
1960
OutputFilter *ofilter = fg->outputs[j];
1961
1962
if (!ofilter->out_tmp || ofilter->out_tmp->name)
1963
continue;
1964
1965
switch (ofilter->type) {
1966
case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
1967
case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
1968
case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
1969
}
1970
init_output_filter(ofilter, o, oc);
1971
}
1972
}
1973
1974
/* ffserver seeking with date=... needs a date reference */
1975
if (!strcmp(file_oformat->name, "ffm") &&
1976
av_strstart(filename, "http:", NULL)) {
1977
int err = parse_option(o, "metadata", "creation_time=now", options);
1978
if (err < 0) {
1979
print_error(filename, err);
1980
exit_program(1);
1981
}
1982
}
1983
1984
if (!strcmp(file_oformat->name, "ffm") && !override_ffserver &&
1985
av_strstart(filename, "http:", NULL)) {
1986
int j;
1987
/* special case for files sent to ffserver: we get the stream
1988
parameters from ffserver */
1989
int err = read_ffserver_streams(o, oc, filename);
1990
if (err < 0) {
1991
print_error(filename, err);
1992
exit_program(1);
1993
}
1994
for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
1995
ost = output_streams[j];
1996
for (i = 0; i < nb_input_streams; i++) {
1997
ist = input_streams[i];
1998
if(ist->st->codec->codec_type == ost->st->codec->codec_type){
1999
ost->sync_ist= ist;
2000
ost->source_index= i;
2001
if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
2002
if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
2003
ist->discard = 0;
2004
ist->st->discard = ist->user_set_discard;
2005
break;
2006
}
2007
}
2008
if(!ost->sync_ist){
2009
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
if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2026
new_area = 1;
2027
if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
2028
new_area > area) {
2029
if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2030
continue;
2031
area = new_area;
2032
idx = i;
2033
}
2034
}
2035
if (idx >= 0)
2036
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
score > best_score) {
2048
best_score = score;
2049
idx = i;
2050
}
2051
}
2052
if (idx >= 0)
2053
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
for (i = 0; i < nb_input_streams; i++)
2060
if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2061
AVCodecDescriptor const *input_descriptor =
2062
avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
2063
AVCodecDescriptor const *output_descriptor = NULL;
2064
AVCodec const *output_codec =
2065
avcodec_find_encoder(oc->oformat->subtitle_codec);
2066
int input_props = 0, output_props = 0;
2067
if (output_codec)
2068
output_descriptor = avcodec_descriptor_get(output_codec->id);
2069
if (input_descriptor)
2070
input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2071
if (output_descriptor)
2072
output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
2073
if (subtitle_codec_name ||
2074
input_props & output_props ||
2075
// Map dvb teletext which has neither property to any output subtitle encoder
2076
input_descriptor && output_descriptor &&
2077
(!input_descriptor->props ||
2078
!output_descriptor->props)) {
2079
new_subtitle_stream(o, oc, i);
2080
break;
2081
}
2082
}
2083
}
2084
/* Data only if codec id match */
2085
if (!o->data_disable ) {
2086
enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
2087
for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
2088
if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_DATA
2089
&& input_streams[i]->st->codec->codec_id == codec_id )
2090
new_data_stream(o, oc, i);
2091
}
2092
}
2093
} else {
2094
for (i = 0; i < o->nb_stream_maps; i++) {
2095
StreamMap *map = &o->stream_maps[i];
2096
2097
if (map->disabled)
2098
continue;
2099
2100
if (map->linklabel) {
2101
FilterGraph *fg;
2102
OutputFilter *ofilter = NULL;
2103
int j, k;
2104
2105
for (j = 0; j < nb_filtergraphs; j++) {
2106
fg = filtergraphs[j];
2107
for (k = 0; k < fg->nb_outputs; k++) {
2108
AVFilterInOut *out = fg->outputs[k]->out_tmp;
2109
if (out && !strcmp(out->name, map->linklabel)) {
2110
ofilter = fg->outputs[k];
2111
goto loop_end;
2112
}
2113
}
2114
}
2115
loop_end:
2116
if (!ofilter) {
2117
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
init_output_filter(ofilter, o, oc);
2122
} else {
2123
int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
2124
2125
ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
2126
if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
2127
continue;
2128
if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2129
continue;
2130
if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2131
continue;
2132
if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
2133
continue;
2134
2135
ost = NULL;
2136
switch (ist->st->codec->codec_type) {
2137
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
2138
case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
2139
case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
2140
case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
2141
case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
2142
case AVMEDIA_TYPE_UNKNOWN:
2143
if (copy_unknown_streams) {
2144
ost = new_unknown_stream (o, oc, src_idx);
2145
break;
2146
}
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
if (!ignore_unknown_streams) {
2152
av_log(NULL, AV_LOG_FATAL,
2153
"If you want unsupported types ignored instead "
2154
"of failing, please use the -ignore_unknown option\n"
2155
"If you want them copied, please use -copy_unknown\n");
2156
exit_program(1);
2157
}
2158
}
2159
if (ost)
2160
ost->sync_ist = input_streams[ input_files[map->sync_file_index]->ist_index
2161
+ map->sync_stream_index];
2162
}
2163
}
2164
}
2165
2166
/* handle attached files */
2167
for (i = 0; i < o->nb_attachments; i++) {
2168
AVIOContext *pb;
2169
uint8_t *attachment;
2170
const char *p;
2171
int64_t len;
2172
2173
if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
2174
av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
2175
o->attachments[i]);
2176
exit_program(1);
2177
}
2178
if ((len = avio_size(pb)) <= 0) {
2179
av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
2180
o->attachments[i]);
2181
exit_program(1);
2182
}
2183
if (!(attachment = av_malloc(len))) {
2184
av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
2185
o->attachments[i]);
2186
exit_program(1);
2187
}
2188
avio_read(pb, attachment, len);
2189
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
ost->st->codec->extradata = attachment;
2195
ost->st->codec->extradata_size = len;
2196
2197
p = strrchr(o->attachments[i], '/');
2198
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
for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
2203
AVDictionaryEntry *e;
2204
ost = output_streams[i];
2205
2206
if ((ost->stream_copy || ost->attachment_filename)
2207
&& (e = av_dict_get(o->g->codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
2208
&& (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
2209
if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
2210
exit_program(1);
2211
}
2212
2213
if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2214
av_dump_format(oc, nb_output_files - 1, oc->filename, 1);
2215
av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", nb_output_files - 1);
2216
exit_program(1);
2217
}
2218
2219
/* check if all codec options have been used */
2220
unused_opts = strip_specifiers(o->g->codec_opts);
2221
for (i = of->ost_index; i < nb_output_streams; i++) {
2222
e = NULL;
2223
while ((e = av_dict_get(output_streams[i]->encoder_opts, "", e,
2224
AV_DICT_IGNORE_SUFFIX)))
2225
av_dict_set(&unused_opts, e->key, NULL, 0);
2226
}
2227
2228
e = NULL;
2229
while ((e = av_dict_get(unused_opts, "", e, AV_DICT_IGNORE_SUFFIX))) {
2230
const AVClass *class = avcodec_get_class();
2231
const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
2232
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2233
const AVClass *fclass = avformat_get_class();
2234
const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
2235
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
2236
if (!option || foption)
2237
continue;
2238
2239
2240
if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
2241
av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
2242
"output file #%d (%s) is not an encoding option.\n", e->key,
2243
option->help ? option->help : "", nb_output_files - 1,
2244
filename);
2245
exit_program(1);
2246
}
2247
2248
// gop_timecode is injected by generic code but not always used
2249
if (!strcmp(e->key, "gop_timecode"))
2250
continue;
2251
2252
av_log(NULL, AV_LOG_WARNING, "Codec AVOption %s (%s) specified for "
2253
"output file #%d (%s) has not been used for any stream. The most "
2254
"likely reason is either wrong type (e.g. a video option with "
2255
"no video streams) or that it is a private option of some encoder "
2256
"which was not actually used for any stream.\n", e->key,
2257
option->help ? option->help : "", nb_output_files - 1, filename);
2258
}
2259
av_dict_free(&unused_opts);
2260
2261
/* set the encoding/decoding_needed flags */
2262
for (i = of->ost_index; i < nb_output_streams; i++) {
2263
OutputStream *ost = output_streams[i];
2264
2265
ost->encoding_needed = !ost->stream_copy;
2266
if (ost->encoding_needed && ost->source_index >= 0) {
2267
InputStream *ist = input_streams[ost->source_index];
2268
ist->decoding_needed |= DECODING_FOR_OST;
2269
}
2270
}
2271
2272
/* check filename in case of an image number is expected */
2273
if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
2274
if (!av_filename_number_test(oc->filename)) {
2275
print_error(oc->filename, AVERROR(EINVAL));
2276
exit_program(1);
2277
}
2278
}
2279
2280
if (!(oc->oformat->flags & AVFMT_NOSTREAMS) && !input_stream_potentially_available) {
2281
av_log(NULL, AV_LOG_ERROR,
2282
"No input streams but output needs an input stream\n");
2283
exit_program(1);
2284
}
2285
2286
if (!(oc->oformat->flags & AVFMT_NOFILE)) {
2287
/* test if it already exists to avoid losing precious files */
2288
assert_file_overwrite(filename);
2289
2290
/* open the file */
2291
if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
2292
&oc->interrupt_callback,
2293
&of->opts)) < 0) {
2294
print_error(filename, err);
2295
exit_program(1);
2296
}
2297
} else if (strcmp(oc->oformat->name, "image2")==0 && !av_filename_number_test(filename))
2298
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
oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
2304
2305
/* copy metadata */
2306
for (i = 0; i < o->nb_metadata_map; i++) {
2307
char *p;
2308
int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
2309
2310
if (in_file_index >= nb_input_files) {
2311
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
copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc,
2315
in_file_index >= 0 ?
2316
input_files[in_file_index]->ctx : NULL, o);
2317
}
2318
2319
/* copy chapters */
2320
if (o->chapters_input_file >= nb_input_files) {
2321
if (o->chapters_input_file == INT_MAX) {
2322
/* copy chapters from the first input file that has them*/
2323
o->chapters_input_file = -1;
2324
for (i = 0; i < nb_input_files; i++)
2325
if (input_files[i]->ctx->nb_chapters) {
2326
o->chapters_input_file = i;
2327
break;
2328
}
2329
} else {
2330
av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
2331
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
!o->metadata_chapters_manual);
2338
2339
/* copy global metadata by default */
2340
if (!o->metadata_global_manual && nb_input_files){
2341
av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
2342
AV_DICT_DONT_OVERWRITE);
2343
if(o->recording_time != INT64_MAX)
2344
av_dict_set(&oc->metadata, "duration", NULL, 0);
2345
av_dict_set(&oc->metadata, "creation_time", NULL, 0);
2346
}
2347
if (!o->metadata_streams_manual)
2348
for (i = of->ost_index; i < nb_output_streams; i++) {
2349
InputStream *ist;
2350
if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
2351
continue;
2352
ist = input_streams[output_streams[i]->source_index];
2353
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
if (ist->autorotate)
2357
av_dict_set(&output_streams[i]->st->metadata, "rotate", NULL, 0);
2358
}
2359
}
2360
2361
/* process manually set programs */
2362
for (i = 0; i < o->nb_program; i++) {
2363
const char *p = o->program[i].u.str;
2364
int progid = i+1;
2365
AVProgram *program;
2366
2367
while(*p) {
2368
const char *p2 = av_get_token(&p, ":");
2369
const char *to_dealloc = p2;
2370
char *key;
2371
if (!p2)
2372
break;
2373
2374
if(*p) p++;
2375
2376
key = av_get_token(&p2, "=");
2377
if (!key || !*p2) {
2378
av_freep(&to_dealloc);
2379
av_freep(&key);
2380
break;
2381
}
2382
p2++;
2383
2384
if (!strcmp(key, "program_num"))
2385
progid = strtol(p2, NULL, 0);
2386
av_freep(&to_dealloc);
2387
av_freep(&key);
2388
}
2389
2390
program = av_new_program(oc, progid);
2391
2392
p = o->program[i].u.str;
2393
while(*p) {
2394
const char *p2 = av_get_token(&p, ":");
2395
const char *to_dealloc = p2;
2396
char *key;
2397
if (!p2)
2398
break;
2399
if(*p) p++;
2400
2401
key = av_get_token(&p2, "=");
2402
if (!key) {
2403
av_log(NULL, AV_LOG_FATAL,
2404
"No '=' character in program string %s.\n",
2405
p2);
2406
exit_program(1);
2407
}
2408
if (!*p2)
2409
exit_program(1);
2410
p2++;
2411
2412
if (!strcmp(key, "title")) {
2413
av_dict_set(&program->metadata, "title", p2, 0);
2414
} else if (!strcmp(key, "program_num")) {
2415
} else if (!strcmp(key, "st")) {
2416
int st_num = strtol(p2, NULL, 0);
2417
av_program_add_stream_index(oc, progid, st_num);
2418
} else {
2419
av_log(NULL, AV_LOG_FATAL, "Unknown program key %s.\n", key);
2420
exit_program(1);
2421
}
2422
av_freep(&to_dealloc);
2423
av_freep(&key);
2424
}
2425
}
2426
2427
/* process manually set metadata */
2428
for (i = 0; i < o->nb_metadata; i++) {
2429
AVDictionary **m;
2430
char type, *val;
2431
const char *stream_spec;
2432
int index = 0, j, ret = 0;
2433
char now_time[256];
2434
2435
val = strchr(o->metadata[i].u.str, '=');
2436
if (!val) {
2437
av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
2438
o->metadata[i].u.str);
2439
exit_program(1);
2440
}
2441
*val++ = 0;
2442
2443
if (!strcmp(o->metadata[i].u.str, "creation_time") &&
2444
!strcmp(val, "now")) {
2445
time_t now = time(0);
2446
struct tm *ptm, tmbuf;
2447
ptm = localtime_r(&now, &tmbuf);
2448
if (ptm) {
2449
if (strftime(now_time, sizeof(now_time), "%Y-%m-%d %H:%M:%S", ptm))
2450
val = now_time;
2451
}
2452
}
2453
2454
parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
2455
if (type == 's') {
2456
for (j = 0; j < oc->nb_streams; j++) {
2457
ost = output_streams[nb_output_streams - oc->nb_streams + j];
2458
if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
2459
av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
2460
if (!strcmp(o->metadata[i].u.str, "rotate")) {
2461
ost->rotate_overridden = 1;
2462
}
2463
} else if (ret < 0)
2464
exit_program(1);
2465
}
2466
}
2467
else {
2468
switch (type) {
2469
case 'g':
2470
m = &oc->metadata;
2471
break;
2472
case 'c':
2473
if (index < 0 || index >= oc->nb_chapters) {
2474
av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
2475
exit_program(1);
2476
}
2477
m = &oc->chapters[index]->metadata;
2478
break;
2479
case 'p':
2480
if (index < 0 || index >= oc->nb_programs) {
2481
av_log(NULL, AV_LOG_FATAL, "Invalid program index %d in metadata specifier.\n", index);
2482
exit_program(1);
2483
}
2484
m = &oc->programs[index]->metadata;
2485
break;
2486
default:
2487
av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
2488
exit_program(1);
2489
}
2490
av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
2491
}
2492
}
2493
2494
return 0;
2495
}
2496
2497
static int opt_target(void *optctx, const char *opt, const char *arg)
2498
{
2499
OptionsContext *o = optctx;
2500
enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
2501
static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
2502
2503
if (!strncmp(arg, "pal-", 4)) {
2504
norm = PAL;
2505
arg += 4;
2506
} else if (!strncmp(arg, "ntsc-", 5)) {
2507
norm = NTSC;
2508
arg += 5;
2509
} else if (!strncmp(arg, "film-", 5)) {
2510
norm = FILM;
2511
arg += 5;
2512
} else {
2513
/* Try to determine PAL/NTSC by peeking in the input files */
2514
if (nb_input_files) {
2515
int i, j, fr;
2516
for (j = 0; j < nb_input_files; j++) {
2517
for (i = 0; i < input_files[j]->nb_streams; i++) {
2518
AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
2519
if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
2520
!c->time_base.num)
2521
continue;
2522
fr = c->time_base.den * 1000 / c->time_base.num;
2523
if (fr == 25000) {
2524
norm = PAL;
2525
break;
2526
} else if ((fr == 29970) || (fr == 23976)) {
2527
norm = NTSC;
2528
break;
2529
}
2530
}
2531
if (norm != UNKNOWN)
2532
break;
2533
}
2534
}
2535
if (norm != UNKNOWN)
2536
av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
2537
}
2538
2539
if (norm == UNKNOWN) {
2540
av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2541
av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2542
av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
2543
exit_program(1);
2544
}
2545
2546
if (!strcmp(arg, "vcd")) {
2547
opt_video_codec(o, "c:v", "mpeg1video");
2548
opt_audio_codec(o, "c:a", "mp2");
2549
parse_option(o, "f", "vcd", options);
2550
2551
parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
2552
parse_option(o, "r", frame_rates[norm], options);
2553
opt_default(NULL, "g", norm == PAL ? "15" : "18");
2554
2555
opt_default(NULL, "b:v", "1150000");
2556
opt_default(NULL, "maxrate:v", "1150000");
2557
opt_default(NULL, "minrate:v", "1150000");
2558
opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
2559
2560
opt_default(NULL, "b:a", "224000");
2561
parse_option(o, "ar", "44100", options);
2562
parse_option(o, "ac", "2", options);
2563
2564
opt_default(NULL, "packetsize", "2324");
2565
opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
2566
2567
/* We have to offset the PTS, so that it is consistent with the SCR.
2568
SCR starts at 36000, but the first two packs contain only padding
2569
and the first pack from the other stream, respectively, may also have
2570
been written before.
2571
So the real data starts at SCR 36000+3*1200. */
2572
o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
2573
} else if (!strcmp(arg, "svcd")) {
2574
2575
opt_video_codec(o, "c:v", "mpeg2video");
2576
opt_audio_codec(o, "c:a", "mp2");
2577
parse_option(o, "f", "svcd", options);
2578
2579
parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
2580
parse_option(o, "r", frame_rates[norm], options);
2581
parse_option(o, "pix_fmt", "yuv420p", options);
2582
opt_default(NULL, "g", norm == PAL ? "15" : "18");
2583
2584
opt_default(NULL, "b:v", "2040000");
2585
opt_default(NULL, "maxrate:v", "2516000");
2586
opt_default(NULL, "minrate:v", "0"); // 1145000;
2587
opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2588
opt_default(NULL, "scan_offset", "1");
2589
2590
opt_default(NULL, "b:a", "224000");
2591
parse_option(o, "ar", "44100", options);
2592
2593
opt_default(NULL, "packetsize", "2324");
2594
2595
} else if (!strcmp(arg, "dvd")) {
2596
2597
opt_video_codec(o, "c:v", "mpeg2video");
2598
opt_audio_codec(o, "c:a", "ac3");
2599
parse_option(o, "f", "dvd", options);
2600
2601
parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2602
parse_option(o, "r", frame_rates[norm], options);
2603
parse_option(o, "pix_fmt", "yuv420p", options);
2604
opt_default(NULL, "g", norm == PAL ? "15" : "18");
2605
2606
opt_default(NULL, "b:v", "6000000");
2607
opt_default(NULL, "maxrate:v", "9000000");
2608
opt_default(NULL, "minrate:v", "0"); // 1500000;
2609
opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
2610
2611
opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2612
opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2613
2614
opt_default(NULL, "b:a", "448000");
2615
parse_option(o, "ar", "48000", options);
2616
2617
} else if (!strncmp(arg, "dv", 2)) {
2618
2619
parse_option(o, "f", "dv", options);
2620
2621
parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
2622
parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
2623
norm == PAL ? "yuv420p" : "yuv411p", options);
2624
parse_option(o, "r", frame_rates[norm], options);
2625
2626
parse_option(o, "ar", "48000", options);
2627
parse_option(o, "ac", "2", options);
2628
2629
} else {
2630
av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
2631
return AVERROR(EINVAL);
2632
}
2633
2634
av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
2635
av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
2636
2637
return 0;
2638
}
2639
2640
static int opt_vstats_file(void *optctx, const char *opt, const char *arg)
2641
{
2642
av_free (vstats_filename);
2643
vstats_filename = av_strdup (arg);
2644
return 0;
2645
}
2646
2647
static int opt_vstats(void *optctx, const char *opt, const char *arg)
2648
{
2649
char filename[40];
2650
time_t today2 = time(NULL);
2651
struct tm *today = localtime(&today2);
2652
2653
if (!today) { // maybe tomorrow
2654
av_log(NULL, AV_LOG_FATAL, "Unable to get current time: %s\n", strerror(errno));
2655
exit_program(1);
2656
}
2657
2658
snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
2659
today->tm_sec);
2660
return opt_vstats_file(NULL, opt, filename);
2661
}
2662
2663
static int opt_video_frames(void *optctx, const char *opt, const char *arg)
2664
{
2665
OptionsContext *o = optctx;
2666
return parse_option(o, "frames:v", arg, options);
2667
}
2668
2669
static int opt_audio_frames(void *optctx, const char *opt, const char *arg)
2670
{
2671
OptionsContext *o = optctx;
2672
return parse_option(o, "frames:a", arg, options);
2673
}
2674
2675
static int opt_data_frames(void *optctx, const char *opt, const char *arg)
2676
{
2677
OptionsContext *o = optctx;
2678
return parse_option(o, "frames:d", arg, options);
2679
}
2680
2681
static int opt_default_new(OptionsContext *o, const char *opt, const char *arg)
2682
{
2683
int ret;
2684
AVDictionary *cbak = codec_opts;
2685
AVDictionary *fbak = format_opts;
2686
codec_opts = NULL;
2687
format_opts = NULL;
2688
2689
ret = opt_default(NULL, opt, arg);
2690
2691
av_dict_copy(&o->g->codec_opts , codec_opts, 0);
2692
av_dict_copy(&o->g->format_opts, format_opts, 0);
2693
av_dict_free(&codec_opts);
2694
av_dict_free(&format_opts);
2695
codec_opts = cbak;
2696
format_opts = fbak;
2697
2698
return ret;
2699
}
2700
2701
static int opt_preset(void *optctx, const char *opt, const char *arg)
2702
{
2703
OptionsContext *o = optctx;
2704
FILE *f=NULL;
2705
char filename[1000], line[1000], tmp_line[1000];
2706
const char *codec_name = NULL;
2707
2708
tmp_line[0] = *opt;
2709
tmp_line[1] = 0;
2710
MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
2711
2712
if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
2713
if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
2714
av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
2715
}else
2716
av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
2717
exit_program(1);
2718
}
2719
2720
while (fgets(line, sizeof(line), f)) {
2721
char *key = tmp_line, *value, *endptr;
2722
2723
if (strcspn(line, "#\n\r") == 0)
2724
continue;
2725
av_strlcpy(tmp_line, line, sizeof(tmp_line));
2726
if (!av_strtok(key, "=", &value) ||
2727
!av_strtok(value, "\r\n", &endptr)) {
2728
av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
2729
exit_program(1);
2730
}
2731
av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
2732
2733
if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
2734
else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
2735
else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
2736
else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
2737
else if (opt_default_new(o, key, value) < 0) {
2738
av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2739
filename, line, key, value);
2740
exit_program(1);
2741
}
2742
}
2743
2744
fclose(f);
2745
2746
return 0;
2747
}
2748
2749
static int opt_old2new(void *optctx, const char *opt, const char *arg)
2750
{
2751
OptionsContext *o = optctx;
2752
char *s = av_asprintf("%s:%c", opt + 1, *opt);
2753
int ret = parse_option(o, s, arg, options);
2754
av_free(s);
2755
return ret;
2756
}
2757
2758
static int opt_bitrate(void *optctx, const char *opt, const char *arg)
2759
{
2760
OptionsContext *o = optctx;
2761
2762
if(!strcmp(opt, "ab")){
2763
av_dict_set(&o->g->codec_opts, "b:a", arg, 0);
2764
return 0;
2765
} else if(!strcmp(opt, "b")){
2766
av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
2767
av_dict_set(&o->g->codec_opts, "b:v", arg, 0);
2768
return 0;
2769
}
2770
av_dict_set(&o->g->codec_opts, opt, arg, 0);
2771
return 0;
2772
}
2773
2774
static int opt_qscale(void *optctx, const char *opt, const char *arg)
2775
{
2776
OptionsContext *o = optctx;
2777
char *s;
2778
int ret;
2779
if(!strcmp(opt, "qscale")){
2780
av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2781
return parse_option(o, "q:v", arg, options);
2782
}
2783
s = av_asprintf("q%s", opt + 6);
2784
ret = parse_option(o, s, arg, options);
2785
av_free(s);
2786
return ret;
2787
}
2788
2789
static int opt_profile(void *optctx, const char *opt, const char *arg)
2790
{
2791
OptionsContext *o = optctx;
2792
if(!strcmp(opt, "profile")){
2793
av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2794
av_dict_set(&o->g->codec_opts, "profile:v", arg, 0);
2795
return 0;
2796
}
2797
av_dict_set(&o->g->codec_opts, opt, arg, 0);
2798
return 0;
2799
}
2800
2801
static int opt_video_filters(void *optctx, const char *opt, const char *arg)
2802
{
2803
OptionsContext *o = optctx;
2804
return parse_option(o, "filter:v", arg, options);
2805
}
2806
2807
static int opt_audio_filters(void *optctx, const char *opt, const char *arg)
2808
{
2809
OptionsContext *o = optctx;
2810
return parse_option(o, "filter:a", arg, options);
2811
}
2812
2813
static int opt_vsync(void *optctx, const char *opt, const char *arg)
2814
{
2815
if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
2816
else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
2817
else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
2818
else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
2819
2820
if (video_sync_method == VSYNC_AUTO)
2821
video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
2822
return 0;
2823
}
2824
2825
static int opt_timecode(void *optctx, const char *opt, const char *arg)
2826
{
2827
OptionsContext *o = optctx;
2828
char *tcr = av_asprintf("timecode=%s", arg);
2829
int ret = parse_option(o, "metadata:g", tcr, options);
2830
if (ret >= 0)
2831
ret = av_dict_set(&o->g->codec_opts, "gop_timecode", arg, 0);
2832
av_free(tcr);
2833
return 0;
2834
}
2835
2836
static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
2837
{
2838
OptionsContext *o = optctx;
2839
char layout_str[32];
2840
char *stream_str;
2841
char *ac_str;
2842
int ret, channels, ac_str_size;
2843
uint64_t layout;
2844
2845
layout = av_get_channel_layout(arg);
2846
if (!layout) {
2847
av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
2848
return AVERROR(EINVAL);
2849
}
2850
snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
2851
ret = opt_default_new(o, opt, layout_str);
2852
if (ret < 0)
2853
return ret;
2854
2855
/* set 'ac' option based on channel layout */
2856
channels = av_get_channel_layout_nb_channels(layout);
2857
snprintf(layout_str, sizeof(layout_str), "%d", channels);
2858
stream_str = strchr(opt, ':');
2859
ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
2860
ac_str = av_mallocz(ac_str_size);
2861
if (!ac_str)
2862
return AVERROR(ENOMEM);
2863
av_strlcpy(ac_str, "ac", 3);
2864
if (stream_str)
2865
av_strlcat(ac_str, stream_str, ac_str_size);
2866
ret = parse_option(o, ac_str, layout_str, options);
2867
av_free(ac_str);
2868
2869
return ret;
2870
}
2871
2872
static int opt_audio_qscale(void *optctx, const char *opt, const char *arg)
2873
{
2874
OptionsContext *o = optctx;
2875
return parse_option(o, "q:a", arg, options);
2876
}
2877
2878
static int opt_filter_complex(void *optctx, const char *opt, const char *arg)
2879
{
2880
GROW_ARRAY(filtergraphs, nb_filtergraphs);
2881
if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2882
return AVERROR(ENOMEM);
2883
filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2884
filtergraphs[nb_filtergraphs - 1]->graph_desc = av_strdup(arg);
2885
if (!filtergraphs[nb_filtergraphs - 1]->graph_desc)
2886
return AVERROR(ENOMEM);
2887
2888
input_stream_potentially_available = 1;
2889
2890
return 0;
2891
}
2892
2893
static int opt_filter_complex_script(void *optctx, const char *opt, const char *arg)
2894
{
2895
uint8_t *graph_desc = read_file(arg);
2896
if (!graph_desc)
2897
return AVERROR(EINVAL);
2898
2899
GROW_ARRAY(filtergraphs, nb_filtergraphs);
2900
if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
2901
return AVERROR(ENOMEM);
2902
filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
2903
filtergraphs[nb_filtergraphs - 1]->graph_desc = graph_desc;
2904
2905
input_stream_potentially_available = 1;
2906
2907
return 0;
2908
}
2909
2910
void show_help_default(const char *opt, const char *arg)
2911
{
2912
/* per-file options have at least one of those set */
2913
const int per_file = OPT_SPEC | OPT_OFFSET | OPT_PERFILE;
2914
int show_advanced = 0, show_avoptions = 0;
2915
2916
if (opt && *opt) {
2917
if (!strcmp(opt, "long"))
2918
show_advanced = 1;
2919
else if (!strcmp(opt, "full"))
2920
show_advanced = show_avoptions = 1;
2921
else
2922
av_log(NULL, AV_LOG_ERROR, "Unknown help option '%s'.\n", opt);
2923
}
2924
2925
show_usage();
2926
2927
printf("Getting help:\n"
2928
" -h -- print basic options\n"
2929
" -h long -- print more options\n"
2930
" -h full -- print all options (including all format and codec specific options, very long)\n"
2931
" -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter\n"
2932
" See man %s for detailed description of the options.\n"
2933
"\n", program_name);
2934
2935
show_help_options(options, "Print help / information / capabilities:",
2936
OPT_EXIT, 0, 0);
2937
2938
show_help_options(options, "Global options (affect whole program "
2939
"instead of just one file:",
2940
0, per_file | OPT_EXIT | OPT_EXPERT, 0);
2941
if (show_advanced)
2942
show_help_options(options, "Advanced global options:", OPT_EXPERT,
2943
per_file | OPT_EXIT, 0);
2944
2945
show_help_options(options, "Per-file main options:", 0,
2946
OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE |
2947
OPT_EXIT, per_file);
2948
if (show_advanced)
2949
show_help_options(options, "Advanced per-file options:",
2950
OPT_EXPERT, OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE, per_file);
2951
2952
show_help_options(options, "Video options:",
2953
OPT_VIDEO, OPT_EXPERT | OPT_AUDIO, 0);
2954
if (show_advanced)
2955
show_help_options(options, "Advanced Video options:",
2956
OPT_EXPERT | OPT_VIDEO, OPT_AUDIO, 0);
2957
2958
show_help_options(options, "Audio options:",
2959
OPT_AUDIO, OPT_EXPERT | OPT_VIDEO, 0);
2960
if (show_advanced)
2961
show_help_options(options, "Advanced Audio options:",
2962
OPT_EXPERT | OPT_AUDIO, OPT_VIDEO, 0);
2963
show_help_options(options, "Subtitle options:",
2964
OPT_SUBTITLE, 0, 0);
2965
printf("\n");
2966
2967
if (show_avoptions) {
2968
int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
2969
show_help_children(avcodec_get_class(), flags);
2970
show_help_children(avformat_get_class(), flags);
2971
#if CONFIG_SWSCALE
2972
show_help_children(sws_get_class(), flags);
2973
#endif
2974
show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
2975
show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_FILTERING_PARAM);
2976
}
2977
}
2978
2979
void show_usage(void)
2980
{
2981
av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
2982
av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
2983
av_log(NULL, AV_LOG_INFO, "\n");
2984
}
2985
2986
enum OptGroup {
2987
GROUP_OUTFILE,
2988
GROUP_INFILE,
2989
};
2990
2991
static const OptionGroupDef groups[] = {
2992
[GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
2993
[GROUP_INFILE] = { "input file", "i", OPT_INPUT },
2994
};
2995
2996
static int open_files(OptionGroupList *l, const char *inout,
2997
int (*open_file)(OptionsContext*, const char*))
2998
{
2999
int i, ret;
3000
3001
for (i = 0; i < l->nb_groups; i++) {
3002
OptionGroup *g = &l->groups[i];
3003
OptionsContext o;
3004
3005
init_options(&o);
3006
o.g = g;
3007
3008
ret = parse_optgroup(&o, g);
3009
if (ret < 0) {
3010
av_log(NULL, AV_LOG_ERROR, "Error parsing options for %s file "
3011
"%s.\n", inout, g->arg);
3012
return ret;
3013
}
3014
3015
av_log(NULL, AV_LOG_DEBUG, "Opening an %s file: %s.\n", inout, g->arg);
3016
ret = open_file(&o, g->arg);
3017
uninit_options(&o);
3018
if (ret < 0) {
3019
av_log(NULL, AV_LOG_ERROR, "Error opening %s file %s.\n",
3020
inout, g->arg);
3021
return ret;
3022
}
3023
av_log(NULL, AV_LOG_DEBUG, "Successfully opened the file.\n");
3024
}
3025
3026
return 0;
3027
}
3028
3029
int ffmpeg_parse_options(int argc, char **argv)
3030
{
3031
OptionParseContext octx;
3032
uint8_t error[128];
3033
int ret;
3034
3035
memset(&octx, 0, sizeof(octx));
3036
3037
/* split the commandline into an internal representation */
3038
ret = split_commandline(&octx, argc, argv, options, groups,
3039
FF_ARRAY_ELEMS(groups));
3040
if (ret < 0) {
3041
av_log(NULL, AV_LOG_FATAL, "Error splitting the argument list: ");
3042
goto fail;
3043
}
3044
3045
/* apply global options */
3046
ret = parse_optgroup(NULL, &octx.global_opts);
3047
if (ret < 0) {
3048
av_log(NULL, AV_LOG_FATAL, "Error parsing global options: ");
3049
goto fail;
3050
}
3051
3052
/* open input files */
3053
ret = open_files(&octx.groups[GROUP_INFILE], "input", open_input_file);
3054
if (ret < 0) {
3055
av_log(NULL, AV_LOG_FATAL, "Error opening input files: ");
3056
goto fail;
3057
}
3058
3059
/* create the complex filtergraphs */
3060
ret = init_complex_filters();
3061
if (ret < 0) {
3062
av_log(NULL, AV_LOG_FATAL, "Error initializing complex filters.\n");
3063
goto fail;
3064
}
3065
3066
/* open output files */
3067
ret = open_files(&octx.groups[GROUP_OUTFILE], "output", open_output_file);
3068
if (ret < 0) {
3069
av_log(NULL, AV_LOG_FATAL, "Error opening output files: ");
3070
goto fail;
3071
}
3072
3073
/* configure the complex filtergraphs */
3074
ret = configure_complex_filters();
3075
if (ret < 0) {
3076
av_log(NULL, AV_LOG_FATAL, "Error configuring complex filters.\n");
3077
goto fail;
3078
}
3079
3080
fail:
3081
uninit_parse_context(&octx);
3082
if (ret < 0) {
3083
av_strerror(ret, error, sizeof(error));
3084
av_log(NULL, AV_LOG_FATAL, "%s\n", error);
3085
}
3086
return ret;
3087
}
3088
3089
static int opt_progress(void *optctx, const char *opt, const char *arg)
3090
{
3091
AVIOContext *avio = NULL;
3092
int ret;
3093
3094
if (!strcmp(arg, "-"))
3095
arg = "pipe:";
3096
ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
3097
if (ret < 0) {
3098
av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
3099
arg, av_err2str(ret));
3100
return ret;
3101
}
3102
progress_avio = avio;
3103
return 0;
3104
}
3105
3106
#define OFFSET(x) offsetof(OptionsContext, x)
3107
const OptionDef options[] = {
3108
/* main options */
3109
#include "cmdutils_common_opts.h"
3110
{ "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
3111
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
3112
"force format", "fmt" },
3113
{ "y", OPT_BOOL, { &file_overwrite },
3114
"overwrite output files" },
3115
{ "n", OPT_BOOL, { &no_file_overwrite },
3116
"never overwrite output files" },
3117
{ "ignore_unknown", OPT_BOOL, { &ignore_unknown_streams },
3118
"Ignore unknown stream types" },
3119
{ "copy_unknown", OPT_BOOL | OPT_EXPERT, { &copy_unknown_streams },
3120
"Copy unknown stream types" },
3121
{ "c", HAS_ARG | OPT_STRING | OPT_SPEC |
3122
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3123
"codec name", "codec" },
3124
{ "codec", HAS_ARG | OPT_STRING | OPT_SPEC |
3125
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(codec_names) },
3126
"codec name", "codec" },
3127
{ "pre", HAS_ARG | OPT_STRING | OPT_SPEC |
3128
OPT_OUTPUT, { .off = OFFSET(presets) },
3129
"preset name", "preset" },
3130
{ "map", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3131
OPT_OUTPUT, { .func_arg = opt_map },
3132
"set input stream mapping",
3133
"[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
3134
{ "map_channel", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_map_channel },
3135
"map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
3136
{ "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC |
3137
OPT_OUTPUT, { .off = OFFSET(metadata_map) },
3138
"set metadata information of outfile from infile",
3139
"outfile[,metadata]:infile[,metadata]" },
3140
{ "map_chapters", HAS_ARG | OPT_INT | OPT_EXPERT | OPT_OFFSET |
3141
OPT_OUTPUT, { .off = OFFSET(chapters_input_file) },
3142
"set chapters mapping", "input_file_index" },
3143
{ "t", HAS_ARG | OPT_TIME | OPT_OFFSET |
3144
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(recording_time) },
3145
"record or transcode \"duration\" seconds of audio/video",
3146
"duration" },
3147
{ "to", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(stop_time) },
3148
"record or transcode stop time", "time_stop" },
3149
{ "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(limit_filesize) },
3150
"set the limit file size in bytes", "limit_size" },
3151
{ "ss", HAS_ARG | OPT_TIME | OPT_OFFSET |
3152
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time) },
3153
"set the start time offset", "time_off" },
3154
{ "sseof", HAS_ARG | OPT_TIME | OPT_OFFSET |
3155
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(start_time_eof) },
3156
"set the start time offset relative to EOF", "time_off" },
3157
{ "seek_timestamp", HAS_ARG | OPT_INT | OPT_OFFSET |
3158
OPT_INPUT, { .off = OFFSET(seek_timestamp) },
3159
"enable/disable seeking by timestamp with -ss" },
3160
{ "accurate_seek", OPT_BOOL | OPT_OFFSET | OPT_EXPERT |
3161
OPT_INPUT, { .off = OFFSET(accurate_seek) },
3162
"enable/disable accurate seeking with -ss" },
3163
{ "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET |
3164
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(input_ts_offset) },
3165
"set the input ts offset", "time_off" },
3166
{ "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC |
3167
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(ts_scale) },
3168
"set the input ts scale", "scale" },
3169
{ "timestamp", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_recording_timestamp },
3170
"set the recording timestamp ('now' to set the current time)", "time" },
3171
{ "metadata", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(metadata) },
3172
"add metadata", "string=string" },
3173
{ "program", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(program) },
3174
"add program with specified streams", "title=string:st=number..." },
3175
{ "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3176
OPT_OUTPUT, { .func_arg = opt_data_frames },
3177
"set the number of data frames to output", "number" },
3178
{ "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
3179
"add timings for benchmarking" },
3180
{ "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
3181
"add timings for each task" },
3182
{ "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress },
3183
"write program-readable progress information", "url" },
3184
{ "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction },
3185
"enable or disable interaction on standard input" },
3186
{ "timelimit", HAS_ARG | OPT_EXPERT, { .func_arg = opt_timelimit },
3187
"set max runtime in seconds", "limit" },
3188
{ "dump", OPT_BOOL | OPT_EXPERT, { &do_pkt_dump },
3189
"dump each input packet" },
3190
{ "hex", OPT_BOOL | OPT_EXPERT, { &do_hex_dump },
3191
"when dumping packets, also dump the payload" },
3192
{ "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3193
OPT_INPUT, { .off = OFFSET(rate_emu) },
3194
"read input at native frame rate", "" },
3195
{ "target", HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_target },
3196
"specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\" or \"dv50\" "
3197
"with optional prefixes \"pal-\", \"ntsc-\" or \"film-\")", "type" },
3198
{ "vsync", HAS_ARG | OPT_EXPERT, { .func_arg = opt_vsync },
3199
"video sync method", "" },
3200
{ "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
3201
"frame drop threshold", "" },
3202
{ "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
3203
"audio sync method", "" },
3204
{ "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
3205
"audio drift threshold", "threshold" },
3206
{ "copyts", OPT_BOOL | OPT_EXPERT, { &copy_ts },
3207
"copy timestamps" },
3208
{ "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
3209
"shift input timestamps to start at 0 when using copyts" },
3210
{ "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { &copy_tb },
3211
"copy input stream time base when stream copying", "mode" },
3212
{ "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
3213
OPT_OUTPUT, { .off = OFFSET(shortest) },
3214
"finish encoding within shortest input" },
3215
{ "apad", OPT_STRING | HAS_ARG | OPT_SPEC |
3216
OPT_OUTPUT, { .off = OFFSET(apad) },
3217
"audio pad", "" },
3218
{ "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_delta_threshold },
3219
"timestamp discontinuity delta threshold", "threshold" },
3220
{ "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &dts_error_threshold },
3221
"timestamp error delta threshold", "threshold" },
3222
{ "xerror", OPT_BOOL | OPT_EXPERT, { &exit_on_error },
3223
"exit on error", "error" },
3224
{ "abort_on", HAS_ARG | OPT_EXPERT, { .func_arg = opt_abort_on },
3225
"abort on the specified condition flags", "flags" },
3226
{ "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3227
OPT_OUTPUT, { .off = OFFSET(copy_initial_nonkeyframes) },
3228
"copy initial non-keyframes" },
3229
{ "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
3230
"copy or discard frames before start time" },
3231
{ "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
3232
"set the number of frames to output", "number" },
3233
{ "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
3234
OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
3235
"force codec tag/fourcc", "fourcc/tag" },
3236
{ "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE |
3237
OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(qscale) },
3238
"use fixed quality scale (VBR)", "q" },
3239
{ "qscale", HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3240
OPT_OUTPUT, { .func_arg = opt_qscale },
3241
"use fixed quality scale (VBR)", "q" },
3242
{ "profile", HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_profile },
3243
"set profile", "profile" },
3244
{ "filter", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filters) },
3245
"set stream filtergraph", "filter_graph" },
3246
{ "filter_script", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(filter_scripts) },
3247
"read stream filtergraph description from a file", "filename" },
3248
{ "reinit_filter", HAS_ARG | OPT_INT | OPT_SPEC | OPT_INPUT, { .off = OFFSET(reinit_filters) },
3249
"reinit filtergraph on input parameter changes", "" },
3250
{ "filter_complex", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3251
"create a complex filtergraph", "graph_description" },
3252
{ "lavfi", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex },
3253
"create a complex filtergraph", "graph_description" },
3254
{ "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
3255
"read complex filtergraph description from a file", "filename" },
3256
{ "stats", OPT_BOOL, { &print_stats },
3257
"print progress report during encoding", },
3258
{ "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
3259
OPT_OUTPUT, { .func_arg = opt_attach },
3260
"add an attachment to the output file", "filename" },
3261
{ "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |
3262
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(dump_attachment) },
3263
"extract an attachment into a file", "filename" },
3264
{ "stream_loop", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_INPUT |
3265
OPT_OFFSET, { .off = OFFSET(loop) }, "set number of times input stream shall be looped", "loop count" },
3266
{ "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
3267
"print timestamp debugging info" },
3268
{ "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
3269
"maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
3270
{ "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
3271
OPT_INPUT, { .off = OFFSET(discard) },
3272
"discard", "" },
3273
{ "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
3274
OPT_OUTPUT, { .off = OFFSET(disposition) },
3275
"disposition", "" },
3276
{ "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
3277
{ .off = OFFSET(thread_queue_size) },
3278
"set the maximum number of queued packets from the demuxer" },
3279
3280
/* video options */
3281
{ "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
3282
"set the number of video frames to output", "number" },
3283
{ "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3284
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
3285
"set frame rate (Hz value, fraction or abbreviation)", "rate" },
3286
{ "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
3287
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
3288
"set frame size (WxH or abbreviation)", "size" },
3289
{ "aspect", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
3290
OPT_OUTPUT, { .off = OFFSET(frame_aspect_ratios) },
3291
"set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3292
{ "pix_fmt", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3293
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_pix_fmts) },
3294
"set pixel format", "format" },
3295
{ "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG, { &frame_bits_per_raw_sample },
3296
"set the number of bits per raw sample", "number" },
3297
{ "intra", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &intra_only },
3298
"deprecated use -g 1" },
3299
{ "vn", OPT_VIDEO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(video_disable) },
3300
"disable video" },
3301
{ "rc_override", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3302
OPT_OUTPUT, { .off = OFFSET(rc_overrides) },
3303
"rate control override for specific intervals", "override" },
3304
{ "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT |
3305
OPT_OUTPUT, { .func_arg = opt_video_codec },
3306
"force video codec ('copy' to copy stream)", "codec" },
3307
{ "sameq", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3308
"Removed" },
3309
{ "same_quant", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_sameq },
3310
"Removed" },
3311
{ "timecode", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_timecode },
3312
"set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
3313
{ "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT | OPT_OUTPUT, { .off = OFFSET(pass) },
3314
"select the pass number (1 to 3)", "n" },
3315
{ "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC |
3316
OPT_OUTPUT, { .off = OFFSET(passlogfiles) },
3317
"select two pass log file name prefix", "prefix" },
3318
{ "deinterlace", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_deinterlace },
3319
"this option is deprecated, use the yadif filter instead" },
3320
{ "psnr", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &do_psnr },
3321
"calculate PSNR of compressed frames" },
3322
{ "vstats", OPT_VIDEO | OPT_EXPERT , { .func_arg = opt_vstats },
3323
"dump video coding statistics to file" },
3324
{ "vstats_file", OPT_VIDEO | HAS_ARG | OPT_EXPERT , { .func_arg = opt_vstats_file },
3325
"dump video coding statistics to file", "file" },
3326
{ "vf", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_filters },
3327
"set video filters", "filter_graph" },
3328
{ "intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3329
OPT_OUTPUT, { .off = OFFSET(intra_matrices) },
3330
"specify intra matrix coeffs", "matrix" },
3331
{ "inter_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3332
OPT_OUTPUT, { .off = OFFSET(inter_matrices) },
3333
"specify inter matrix coeffs", "matrix" },
3334
{ "chroma_intra_matrix", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_STRING | OPT_SPEC |
3335
OPT_OUTPUT, { .off = OFFSET(chroma_intra_matrices) },
3336
"specify intra matrix coeffs", "matrix" },
3337
{ "top", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_INT| OPT_SPEC |
3338
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(top_field_first) },
3339
"top=1/bottom=0/auto=-1 field first", "" },
3340
{ "vtag", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3341
OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_old2new },
3342
"force video tag/fourcc", "fourcc/tag" },
3343
{ "qphist", OPT_VIDEO | OPT_BOOL | OPT_EXPERT , { &qp_hist },
3344
"show QP histogram" },
3345
{ "force_fps", OPT_VIDEO | OPT_BOOL | OPT_EXPERT | OPT_SPEC |
3346
OPT_OUTPUT, { .off = OFFSET(force_fps) },
3347
"force the selected framerate, disable the best supported framerate selection" },
3348
{ "streamid", OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3349
OPT_OUTPUT, { .func_arg = opt_streamid },
3350
"set the value of an outfile streamid", "streamIndex:value" },
3351
{ "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3352
OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(forced_key_frames) },
3353
"force key frames at specified timestamps", "timestamps" },
3354
{ "ab", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3355
"audio bitrate (please use -b:a)", "bitrate" },
3356
{ "b", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_bitrate },
3357
"video bitrate (please use -b:v)", "bitrate" },
3358
{ "hwaccel", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3359
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccels) },
3360
"use HW accelerated decoding", "hwaccel name" },
3361
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
3362
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
3363
"select a device for HW acceleration", "devicename" },
3364
#if HAVE_VDPAU_X11
3365
{ "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
3366
#endif
3367
#if CONFIG_VDA || CONFIG_VIDEOTOOLBOX
3368
{ "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },
3369
#endif
3370
{ "hwaccels", OPT_EXIT, { .func_arg = show_hwaccels },
3371
"show available HW acceleration methods" },
3372
{ "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
3373
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
3374
"automatically insert correct rotate filters" },
3375
3376
/* audio options */
3377
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
3378
"set the number of audio frames to output", "number" },
3379
{ "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
3380
"set audio quality (codec-specific)", "quality", },
3381
{ "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3382
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_sample_rate) },
3383
"set audio sampling rate (in Hz)", "rate" },
3384
{ "ac", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
3385
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(audio_channels) },
3386
"set number of audio channels", "channels" },
3387
{ "an", OPT_AUDIO | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT,{ .off = OFFSET(audio_disable) },
3388
"disable audio" },
3389
{ "acodec", OPT_AUDIO | HAS_ARG | OPT_PERFILE |
3390
OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_audio_codec },
3391
"force audio codec ('copy' to copy stream)", "codec" },
3392
{ "atag", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3393
OPT_OUTPUT, { .func_arg = opt_old2new },
3394
"force audio tag/fourcc", "fourcc/tag" },
3395
{ "vol", OPT_AUDIO | HAS_ARG | OPT_INT, { &audio_volume },
3396
"change audio volume (256=normal)" , "volume" },
3397
{ "sample_fmt", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_SPEC |
3398
OPT_STRING | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(sample_fmts) },
3399
"set sample format", "format" },
3400
{ "channel_layout", OPT_AUDIO | HAS_ARG | OPT_EXPERT | OPT_PERFILE |
3401
OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_channel_layout },
3402
"set channel layout", "layout" },
3403
{ "af", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_filters },
3404
"set audio filters", "filter_graph" },
3405
{ "guess_layout_max", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_INPUT, { .off = OFFSET(guess_layout_max) },
3406
"set the maximum number of channels to try to guess the channel layout" },
3407
3408
/* subtitle options */
3409
{ "sn", OPT_SUBTITLE | OPT_BOOL | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(subtitle_disable) },
3410
"disable subtitle" },
3411
{ "scodec", OPT_SUBTITLE | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_subtitle_codec },
3412
"force subtitle codec ('copy' to copy stream)", "codec" },
3413
{ "stag", OPT_SUBTITLE | HAS_ARG | OPT_EXPERT | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new }
3414
, "force subtitle tag/fourcc", "fourcc/tag" },
3415
{ "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC | OPT_INPUT, { .off = OFFSET(fix_sub_duration) },
3416
"fix subtitles duration" },
3417
{ "canvas_size", OPT_SUBTITLE | HAS_ARG | OPT_STRING | OPT_SPEC | OPT_INPUT, { .off = OFFSET(canvas_sizes) },
3418
"set canvas size (WxH or abbreviation)", "size" },
3419
3420
/* grab options */
3421
{ "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
3422
"deprecated, use -channel", "channel" },
3423
{ "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
3424
"deprecated, use -standard", "standard" },
3425
{ "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
3426
3427
/* muxer options */
3428
{ "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_max_delay) },
3429
"set the maximum demux-decode delay", "seconds" },
3430
{ "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) },
3431
"set the initial demux-decode delay", "seconds" },
3432
{ "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
3433
"override the options from ffserver", "" },
3434
{ "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file },
3435
"specify a file in which to print sdp information", "file" },
3436
3437
{ "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
3438
"A comma-separated list of bitstream filters", "bitstream_filters" },
3439
{ "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3440
"deprecated", "audio bitstream_filters" },
3441
{ "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_old2new },
3442
"deprecated", "video bitstream_filters" },
3443
3444
{ "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3445
"set the audio options to the indicated preset", "preset" },
3446
{ "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3447
"set the video options to the indicated preset", "preset" },
3448
{ "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3449
"set the subtitle options to the indicated preset", "preset" },
3450
{ "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_preset },
3451
"set options from indicated preset file", "filename" },
3452
/* data codec support */
3453
{ "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
3454
"force data codec ('copy' to copy stream)", "codec" },
3455
{ "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET | OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(data_disable) },
3456
"disable data" },
3457
3458
{ NULL, },
3459
};
3460
3461