2 * ffmpeg option parsing
4 * This file is part of FFmpeg.
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.
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.
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
26 #include "libavformat/avformat.h"
28 #include "libavcodec/avcodec.h"
30 #include "libavfilter/avfilter.h"
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"
44 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
47 for (i = 0; i < o->nb_ ## name; i++) {\
48 char *spec = o->name[i].specifier;\
49 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
50 outvar = o->name[i].u.type;\
56 #define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
59 for (i = 0; i < o->nb_ ## name; i++) {\
60 char *spec = o->name[i].specifier;\
61 if (!strcmp(spec, mediatype))\
62 outvar = o->name[i].u.type;\
66 const HWAccel hwaccels
[] = {
68 { "vdpau", vdpau_init
, HWACCEL_VDPAU
, AV_PIX_FMT_VDPAU
},
71 { "dxva2", dxva2_init
, HWACCEL_DXVA2
, AV_PIX_FMT_DXVA2_VLD
},
74 { "vda", vda_init
, HWACCEL_VDA
, AV_PIX_FMT_VDA
},
79 char *vstats_filename
;
81 float audio_drift_threshold
= 0.1;
82 float dts_delta_threshold
= 10;
83 float dts_error_threshold
= 3600*30;
85 int audio_volume
= 256;
86 int audio_sync_method
= 0;
87 int video_sync_method
= VSYNC_AUTO
;
88 int do_deinterlace
= 0;
90 int do_benchmark_all
= 0;
94 int start_at_zero
= 0;
97 int exit_on_error
= 0;
100 int stdin_interaction
= 1;
101 int frame_bits_per_raw_sample
= 0;
102 float max_error_rate
= 2.0/3;
105 static int intra_only
= 0;
106 static int file_overwrite
= 0;
107 static int no_file_overwrite
= 0;
108 static int do_psnr
= 0;
109 static int input_sync
;
110 static int override_ffserver
= 0;
112 static void uninit_options(OptionsContext
*o
)
114 const OptionDef
*po
= options
;
117 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
119 void *dst
= (uint8_t*)o
+ po
->u
.off
;
121 if (po
->flags
& OPT_SPEC
) {
122 SpecifierOpt
**so
= dst
;
123 int i
, *count
= (int*)(so
+ 1);
124 for (i
= 0; i
< *count
; i
++) {
125 av_freep(&(*so
)[i
].specifier
);
126 if (po
->flags
& OPT_STRING
)
127 av_freep(&(*so
)[i
].u
.str
);
131 } else if (po
->flags
& OPT_OFFSET
&& po
->flags
& OPT_STRING
)
136 for (i
= 0; i
< o
->nb_stream_maps
; i
++)
137 av_freep(&o
->stream_maps
[i
].linklabel
);
138 av_freep(&o
->stream_maps
);
139 av_freep(&o
->audio_channel_maps
);
140 av_freep(&o
->streamid_map
);
141 av_freep(&o
->attachments
);
144 static void init_options(OptionsContext
*o
)
146 memset(o
, 0, sizeof(*o
));
148 o
->stop_time
= INT64_MAX
;
149 o
->mux_max_delay
= 0.7;
150 o
->start_time
= AV_NOPTS_VALUE
;
151 o
->recording_time
= INT64_MAX
;
152 o
->limit_filesize
= UINT64_MAX
;
153 o
->chapters_input_file
= INT_MAX
;
154 o
->accurate_seek
= 1;
157 /* return a copy of the input with the stream specifiers removed from the keys */
158 static AVDictionary
*strip_specifiers(AVDictionary
*dict
)
160 AVDictionaryEntry
*e
= NULL
;
161 AVDictionary
*ret
= NULL
;
163 while ((e
= av_dict_get(dict
, "", e
, AV_DICT_IGNORE_SUFFIX
))) {
164 char *p
= strchr(e
->key
, ':');
168 av_dict_set(&ret
, e
->key
, e
->value
, 0);
175 static int opt_sameq(void *optctx
, const char *opt
, const char *arg
)
177 av_log(NULL
, AV_LOG_ERROR
, "Option '%s' was removed. "
178 "If you are looking for an option to preserve the quality (which is not "
179 "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
181 return AVERROR(EINVAL
);
184 static int opt_video_channel(void *optctx
, const char *opt
, const char *arg
)
186 av_log(NULL
, AV_LOG_WARNING
, "This option is deprecated, use -channel.\n");
187 return opt_default(optctx
, "channel", arg
);
190 static int opt_video_standard(void *optctx
, const char *opt
, const char *arg
)
192 av_log(NULL
, AV_LOG_WARNING
, "This option is deprecated, use -standard.\n");
193 return opt_default(optctx
, "standard", arg
);
196 static int opt_audio_codec(void *optctx
, const char *opt
, const char *arg
)
198 OptionsContext
*o
= optctx
;
199 return parse_option(o
, "codec:a", arg
, options
);
202 static int opt_video_codec(void *optctx
, const char *opt
, const char *arg
)
204 OptionsContext
*o
= optctx
;
205 return parse_option(o
, "codec:v", arg
, options
);
208 static int opt_subtitle_codec(void *optctx
, const char *opt
, const char *arg
)
210 OptionsContext
*o
= optctx
;
211 return parse_option(o
, "codec:s", arg
, options
);
214 static int opt_data_codec(void *optctx
, const char *opt
, const char *arg
)
216 OptionsContext
*o
= optctx
;
217 return parse_option(o
, "codec:d", arg
, options
);
220 static int opt_map(void *optctx
, const char *opt
, const char *arg
)
222 OptionsContext
*o
= optctx
;
224 int i
, negative
= 0, file_idx
;
225 int sync_file_idx
= -1, sync_stream_idx
= 0;
233 map
= av_strdup(arg
);
235 /* parse sync stream first, just pick first matching stream */
236 if (sync
= strchr(map
, ',')) {
238 sync_file_idx
= strtol(sync
+ 1, &sync
, 0);
239 if (sync_file_idx
>= nb_input_files
|| sync_file_idx
< 0) {
240 av_log(NULL
, AV_LOG_FATAL
, "Invalid sync file index: %d.\n", sync_file_idx
);
245 for (i
= 0; i
< input_files
[sync_file_idx
]->nb_streams
; i
++)
246 if (check_stream_specifier(input_files
[sync_file_idx
]->ctx
,
247 input_files
[sync_file_idx
]->ctx
->streams
[i
], sync
) == 1) {
251 if (i
== input_files
[sync_file_idx
]->nb_streams
) {
252 av_log(NULL
, AV_LOG_FATAL
, "Sync stream specification in map %s does not "
253 "match any streams.\n", arg
);
260 /* this mapping refers to lavfi output */
261 const char *c
= map
+ 1;
262 GROW_ARRAY(o
->stream_maps
, o
->nb_stream_maps
);
263 m
= &o
->stream_maps
[o
->nb_stream_maps
- 1];
264 m
->linklabel
= av_get_token(&c
, "]");
266 av_log(NULL
, AV_LOG_ERROR
, "Invalid output link label: %s.\n", map
);
270 file_idx
= strtol(map
, &p
, 0);
271 if (file_idx
>= nb_input_files
|| file_idx
< 0) {
272 av_log(NULL
, AV_LOG_FATAL
, "Invalid input file index: %d.\n", file_idx
);
276 /* disable some already defined maps */
277 for (i
= 0; i
< o
->nb_stream_maps
; i
++) {
278 m
= &o
->stream_maps
[i
];
279 if (file_idx
== m
->file_index
&&
280 check_stream_specifier(input_files
[m
->file_index
]->ctx
,
281 input_files
[m
->file_index
]->ctx
->streams
[m
->stream_index
],
282 *p
== ':' ? p
+ 1 : p
) > 0)
286 for (i
= 0; i
< input_files
[file_idx
]->nb_streams
; i
++) {
287 if (check_stream_specifier(input_files
[file_idx
]->ctx
, input_files
[file_idx
]->ctx
->streams
[i
],
288 *p
== ':' ? p
+ 1 : p
) <= 0)
290 GROW_ARRAY(o
->stream_maps
, o
->nb_stream_maps
);
291 m
= &o
->stream_maps
[o
->nb_stream_maps
- 1];
293 m
->file_index
= file_idx
;
296 if (sync_file_idx
>= 0) {
297 m
->sync_file_index
= sync_file_idx
;
298 m
->sync_stream_index
= sync_stream_idx
;
300 m
->sync_file_index
= file_idx
;
301 m
->sync_stream_index
= i
;
307 av_log(NULL
, AV_LOG_FATAL
, "Stream map '%s' matches no streams.\n", arg
);
315 static int opt_attach(void *optctx
, const char *opt
, const char *arg
)
317 OptionsContext
*o
= optctx
;
318 GROW_ARRAY(o
->attachments
, o
->nb_attachments
);
319 o
->attachments
[o
->nb_attachments
- 1] = arg
;
323 static int opt_map_channel(void *optctx
, const char *opt
, const char *arg
)
325 OptionsContext
*o
= optctx
;
330 GROW_ARRAY(o
->audio_channel_maps
, o
->nb_audio_channel_maps
);
331 m
= &o
->audio_channel_maps
[o
->nb_audio_channel_maps
- 1];
333 /* muted channel syntax */
334 n
= sscanf(arg
, "%d:%d.%d", &m
->channel_idx
, &m
->ofile_idx
, &m
->ostream_idx
);
335 if ((n
== 1 || n
== 3) && m
->channel_idx
== -1) {
336 m
->file_idx
= m
->stream_idx
= -1;
338 m
->ofile_idx
= m
->ostream_idx
= -1;
343 n
= sscanf(arg
, "%d.%d.%d:%d.%d",
344 &m
->file_idx
, &m
->stream_idx
, &m
->channel_idx
,
345 &m
->ofile_idx
, &m
->ostream_idx
);
347 if (n
!= 3 && n
!= 5) {
348 av_log(NULL
, AV_LOG_FATAL
, "Syntax error, mapchan usage: "
349 "[file.stream.channel|-1][:syncfile:syncstream]\n");
353 if (n
!= 5) // only file.stream.channel specified
354 m
->ofile_idx
= m
->ostream_idx
= -1;
357 if (m
->file_idx
< 0 || m
->file_idx
>= nb_input_files
) {
358 av_log(NULL
, AV_LOG_FATAL
, "mapchan: invalid input file index: %d\n",
362 if (m
->stream_idx
< 0 ||
363 m
->stream_idx
>= input_files
[m
->file_idx
]->nb_streams
) {
364 av_log(NULL
, AV_LOG_FATAL
, "mapchan: invalid input file stream index #%d.%d\n",
365 m
->file_idx
, m
->stream_idx
);
368 st
= input_files
[m
->file_idx
]->ctx
->streams
[m
->stream_idx
];
369 if (st
->codec
->codec_type
!= AVMEDIA_TYPE_AUDIO
) {
370 av_log(NULL
, AV_LOG_FATAL
, "mapchan: stream #%d.%d is not an audio stream.\n",
371 m
->file_idx
, m
->stream_idx
);
374 if (m
->channel_idx
< 0 || m
->channel_idx
>= st
->codec
->channels
) {
375 av_log(NULL
, AV_LOG_FATAL
, "mapchan: invalid audio channel #%d.%d.%d\n",
376 m
->file_idx
, m
->stream_idx
, m
->channel_idx
);
383 * Parse a metadata specifier passed as 'arg' parameter.
384 * @param arg metadata string to parse
385 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
386 * @param index for type c/p, chapter/program index is written here
387 * @param stream_spec for type s, the stream specifier is written here
389 static void parse_meta_type(char *arg
, char *type
, int *index
, const char **stream_spec
)
397 if (*(++arg
) && *arg
!= ':') {
398 av_log(NULL
, AV_LOG_FATAL
, "Invalid metadata specifier %s.\n", arg
);
401 *stream_spec
= *arg
== ':' ? arg
+ 1 : "";
406 *index
= strtol(++arg
, NULL
, 0);
409 av_log(NULL
, AV_LOG_FATAL
, "Invalid metadata type %c.\n", *arg
);
416 static int copy_metadata(char *outspec
, char *inspec
, AVFormatContext
*oc
, AVFormatContext
*ic
, OptionsContext
*o
)
418 AVDictionary
**meta_in
= NULL
;
419 AVDictionary
**meta_out
= NULL
;
421 char type_in
, type_out
;
422 const char *istream_spec
= NULL
, *ostream_spec
= NULL
;
423 int idx_in
= 0, idx_out
= 0;
425 parse_meta_type(inspec
, &type_in
, &idx_in
, &istream_spec
);
426 parse_meta_type(outspec
, &type_out
, &idx_out
, &ostream_spec
);
429 if (type_out
== 'g' || !*outspec
)
430 o
->metadata_global_manual
= 1;
431 if (type_out
== 's' || !*outspec
)
432 o
->metadata_streams_manual
= 1;
433 if (type_out
== 'c' || !*outspec
)
434 o
->metadata_chapters_manual
= 1;
438 if (type_in
== 'g' || type_out
== 'g')
439 o
->metadata_global_manual
= 1;
440 if (type_in
== 's' || type_out
== 's')
441 o
->metadata_streams_manual
= 1;
442 if (type_in
== 'c' || type_out
== 'c')
443 o
->metadata_chapters_manual
= 1;
445 /* ic is NULL when just disabling automatic mappings */
449 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
450 if ((index) < 0 || (index) >= (nb_elems)) {\
451 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
456 #define SET_DICT(type, meta, context, index)\
459 meta = &context->metadata;\
462 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
463 meta = &context->chapters[index]->metadata;\
466 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
467 meta = &context->programs[index]->metadata;\
470 break; /* handled separately below */ \
471 default: av_assert0(0);\
474 SET_DICT(type_in, meta_in, ic, idx_in);
475 SET_DICT(type_out
, meta_out
, oc
, idx_out
);
477 /* for input streams choose first matching stream */
478 if (type_in
== 's') {
479 for (i
= 0; i
< ic
->nb_streams
; i
++) {
480 if ((ret
= check_stream_specifier(ic
, ic
->streams
[i
], istream_spec
)) > 0) {
481 meta_in
= &ic
->streams
[i
]->metadata
;
487 av_log(NULL
, AV_LOG_FATAL
, "Stream specifier %s does not match any streams.\n", istream_spec
);
492 if (type_out
== 's') {
493 for (i
= 0; i
< oc
->nb_streams
; i
++) {
494 if ((ret
= check_stream_specifier(oc
, oc
->streams
[i
], ostream_spec
)) > 0) {
495 meta_out
= &oc
->streams
[i
]->metadata
;
496 av_dict_copy(meta_out
, *meta_in
, AV_DICT_DONT_OVERWRITE
);
501 av_dict_copy(meta_out
, *meta_in
, AV_DICT_DONT_OVERWRITE
);
506 static int opt_recording_timestamp(void *optctx
, const char *opt
, const char *arg
)
508 OptionsContext
*o
= optctx
;
510 int64_t recording_timestamp
= parse_time_or_die(opt
, arg
, 0) / 1E6
;
511 struct tm time
= *gmtime((time_t*)&recording_timestamp
);
512 if (!strftime(buf
, sizeof(buf
), "creation_time=%FT%T%z", &time
))
514 parse_option(o
, "metadata", buf
, options
);
516 av_log(NULL
, AV_LOG_WARNING
, "%s is deprecated, set the 'creation_time' metadata "
517 "tag instead.\n", opt
);
521 static AVCodec
*find_codec_or_die(const char *name
, enum AVMediaType type
, int encoder
)
523 const AVCodecDescriptor
*desc
;
524 const char *codec_string
= encoder
? "encoder" : "decoder";
528 avcodec_find_encoder_by_name(name
) :
529 avcodec_find_decoder_by_name(name
);
531 if (!codec
&& (desc
= avcodec_descriptor_get_by_name(name
))) {
532 codec
= encoder
? avcodec_find_encoder(desc
->id
) :
533 avcodec_find_decoder(desc
->id
);
535 av_log(NULL
, AV_LOG_VERBOSE
, "Matched %s '%s' for codec '%s'.\n",
536 codec_string
, codec
->name
, desc
->name
);
540 av_log(NULL
, AV_LOG_FATAL
, "Unknown %s '%s'\n", codec_string
, name
);
543 if (codec
->type
!= type
) {
544 av_log(NULL
, AV_LOG_FATAL
, "Invalid %s type '%s'\n", codec_string
, name
);
550 static AVCodec
*choose_decoder(OptionsContext
*o
, AVFormatContext
*s
, AVStream
*st
)
552 char *codec_name
= NULL
;
554 MATCH_PER_STREAM_OPT(codec_names
, str
, codec_name
, s
, st
);
556 AVCodec
*codec
= find_codec_or_die(codec_name
, st
->codec
->codec_type
, 0);
557 st
->codec
->codec_id
= codec
->id
;
560 return avcodec_find_decoder(st
->codec
->codec_id
);
563 /* Add all the streams from the given input file to the global
564 * list of input streams. */
565 static void add_input_streams(OptionsContext
*o
, AVFormatContext
*ic
)
569 for (i
= 0; i
< ic
->nb_streams
; i
++) {
570 AVStream
*st
= ic
->streams
[i
];
571 AVCodecContext
*dec
= st
->codec
;
572 InputStream
*ist
= av_mallocz(sizeof(*ist
));
573 char *framerate
= NULL
, *hwaccel
= NULL
, *hwaccel_device
= NULL
;
574 char *codec_tag
= NULL
;
576 char *discard_str
= NULL
;
577 const AVOption
*discard_opt
= av_opt_find(dec
, "skip_frame", NULL
, 0, 0);
582 GROW_ARRAY(input_streams
, nb_input_streams
);
583 input_streams
[nb_input_streams
- 1] = ist
;
586 ist
->file_index
= nb_input_files
;
588 st
->discard
= AVDISCARD_ALL
;
591 MATCH_PER_STREAM_OPT(ts_scale
, dbl
, ist
->ts_scale
, ic
, st
);
593 MATCH_PER_STREAM_OPT(codec_tags
, str
, codec_tag
, ic
, st
);
595 uint32_t tag
= strtol(codec_tag
, &next
, 0);
597 tag
= AV_RL32(codec_tag
);
598 st
->codec
->codec_tag
= tag
;
601 ist
->dec
= choose_decoder(o
, ic
, st
);
602 ist
->decoder_opts
= filter_codec_opts(o
->g
->codec_opts
, ist
->st
->codec
->codec_id
, ic
, st
, ist
->dec
);
604 ist
->reinit_filters
= -1;
605 MATCH_PER_STREAM_OPT(reinit_filters
, i
, ist
->reinit_filters
, ic
, st
);
607 MATCH_PER_STREAM_OPT(discard
, str
, discard_str
, ic
, st
);
608 ist
->user_set_discard
= AVDISCARD_NONE
;
609 if (discard_str
&& av_opt_eval_int(dec
, discard_opt
, discard_str
, &ist
->user_set_discard
) < 0) {
610 av_log(NULL
, AV_LOG_ERROR
, "Error parsing discard %s.\n",
615 ist
->filter_in_rescale_delta_last
= AV_NOPTS_VALUE
;
617 ist
->dec_ctx
= avcodec_alloc_context3(ist
->dec
);
619 av_log(NULL
, AV_LOG_ERROR
, "Error allocating the decoder context.\n");
623 ret
= avcodec_copy_context(ist
->dec_ctx
, dec
);
625 av_log(NULL
, AV_LOG_ERROR
, "Error initializing the decoder context.\n");
629 switch (dec
->codec_type
) {
630 case AVMEDIA_TYPE_VIDEO
:
632 ist
->dec
= avcodec_find_decoder(dec
->codec_id
);
633 if (av_codec_get_lowres(dec
)) {
634 dec
->flags
|= CODEC_FLAG_EMU_EDGE
;
637 ist
->resample_height
= ist
->dec_ctx
->height
;
638 ist
->resample_width
= ist
->dec_ctx
->width
;
639 ist
->resample_pix_fmt
= ist
->dec_ctx
->pix_fmt
;
641 MATCH_PER_STREAM_OPT(frame_rates
, str
, framerate
, ic
, st
);
642 if (framerate
&& av_parse_video_rate(&ist
->framerate
,
644 av_log(NULL
, AV_LOG_ERROR
, "Error parsing framerate %s.\n",
649 ist
->top_field_first
= -1;
650 MATCH_PER_STREAM_OPT(top_field_first
, i
, ist
->top_field_first
, ic
, st
);
652 MATCH_PER_STREAM_OPT(hwaccels
, str
, hwaccel
, ic
, st
);
654 if (!strcmp(hwaccel
, "none"))
655 ist
->hwaccel_id
= HWACCEL_NONE
;
656 else if (!strcmp(hwaccel
, "auto"))
657 ist
->hwaccel_id
= HWACCEL_AUTO
;
660 for (i
= 0; hwaccels
[i
].name
; i
++) {
661 if (!strcmp(hwaccels
[i
].name
, hwaccel
)) {
662 ist
->hwaccel_id
= hwaccels
[i
].id
;
667 if (!ist
->hwaccel_id
) {
668 av_log(NULL
, AV_LOG_FATAL
, "Unrecognized hwaccel: %s.\n",
670 av_log(NULL
, AV_LOG_FATAL
, "Supported hwaccels: ");
671 for (i
= 0; hwaccels
[i
].name
; i
++)
672 av_log(NULL
, AV_LOG_FATAL
, "%s ", hwaccels
[i
].name
);
673 av_log(NULL
, AV_LOG_FATAL
, "\n");
679 MATCH_PER_STREAM_OPT(hwaccel_devices
, str
, hwaccel_device
, ic
, st
);
680 if (hwaccel_device
) {
681 ist
->hwaccel_device
= av_strdup(hwaccel_device
);
682 if (!ist
->hwaccel_device
)
685 ist
->hwaccel_pix_fmt
= AV_PIX_FMT_NONE
;
688 case AVMEDIA_TYPE_AUDIO
:
689 ist
->guess_layout_max
= INT_MAX
;
690 MATCH_PER_STREAM_OPT(guess_layout_max
, i
, ist
->guess_layout_max
, ic
, st
);
691 guess_input_channel_layout(ist
);
693 ist
->resample_sample_fmt
= ist
->dec_ctx
->sample_fmt
;
694 ist
->resample_sample_rate
= ist
->dec_ctx
->sample_rate
;
695 ist
->resample_channels
= ist
->dec_ctx
->channels
;
696 ist
->resample_channel_layout
= ist
->dec_ctx
->channel_layout
;
699 case AVMEDIA_TYPE_DATA
:
700 case AVMEDIA_TYPE_SUBTITLE
: {
701 char *canvas_size
= NULL
;
703 ist
->dec
= avcodec_find_decoder(dec
->codec_id
);
704 MATCH_PER_STREAM_OPT(fix_sub_duration
, i
, ist
->fix_sub_duration
, ic
, st
);
705 MATCH_PER_STREAM_OPT(canvas_sizes
, str
, canvas_size
, ic
, st
);
707 av_parse_video_size(&ist
->dec_ctx
->width
, &ist
->dec_ctx
->height
, canvas_size
) < 0) {
708 av_log(NULL
, AV_LOG_FATAL
, "Invalid canvas size: %s.\n", canvas_size
);
713 case AVMEDIA_TYPE_ATTACHMENT
:
714 case AVMEDIA_TYPE_UNKNOWN
:
722 static void assert_file_overwrite(const char *filename
)
724 if (file_overwrite
&& no_file_overwrite
) {
725 fprintf(stderr
, "Error, both -y and -n supplied. Exiting.\n");
729 if (!file_overwrite
) {
730 const char *proto_name
= avio_find_protocol_name(filename
);
731 if (proto_name
&& !strcmp(proto_name
, "file") && avio_check(filename
, 0) == 0) {
732 if (stdin_interaction
&& !no_file_overwrite
) {
733 fprintf(stderr
,"File '%s' already exists. Overwrite ? [y/N] ", filename
);
736 signal(SIGINT
, SIG_DFL
);
738 av_log(NULL
, AV_LOG_FATAL
, "Not overwriting - exiting\n");
744 av_log(NULL
, AV_LOG_FATAL
, "File '%s' already exists. Exiting.\n", filename
);
751 static void dump_attachment(AVStream
*st
, const char *filename
)
754 AVIOContext
*out
= NULL
;
755 AVDictionaryEntry
*e
;
757 if (!st
->codec
->extradata_size
) {
758 av_log(NULL
, AV_LOG_WARNING
, "No extradata to dump in stream #%d:%d.\n",
759 nb_input_files
- 1, st
->index
);
762 if (!*filename
&& (e
= av_dict_get(st
->metadata
, "filename", NULL
, 0)))
765 av_log(NULL
, AV_LOG_FATAL
, "No filename specified and no 'filename' tag"
766 "in stream #%d:%d.\n", nb_input_files
- 1, st
->index
);
770 assert_file_overwrite(filename
);
772 if ((ret
= avio_open2(&out
, filename
, AVIO_FLAG_WRITE
, &int_cb
, NULL
)) < 0) {
773 av_log(NULL
, AV_LOG_FATAL
, "Could not open file %s for writing.\n",
778 avio_write(out
, st
->codec
->extradata
, st
->codec
->extradata_size
);
783 static int open_input_file(OptionsContext
*o
, const char *filename
)
787 AVInputFormat
*file_iformat
= NULL
;
791 AVDictionary
*unused_opts
= NULL
;
792 AVDictionaryEntry
*e
= NULL
;
793 int orig_nb_streams
; // number of streams before avformat_find_stream_info
794 char * video_codec_name
= NULL
;
795 char * audio_codec_name
= NULL
;
796 char *subtitle_codec_name
= NULL
;
797 int scan_all_pmts_set
= 0;
800 if (!(file_iformat
= av_find_input_format(o
->format
))) {
801 av_log(NULL
, AV_LOG_FATAL
, "Unknown input format: '%s'\n", o
->format
);
806 if (!strcmp(filename
, "-"))
809 stdin_interaction
&= strncmp(filename
, "pipe:", 5) &&
810 strcmp(filename
, "/dev/stdin");
812 /* get default parameters from command line */
813 ic
= avformat_alloc_context();
815 print_error(filename
, AVERROR(ENOMEM
));
818 if (o
->nb_audio_sample_rate
) {
819 av_dict_set_int(&o
->g
->format_opts
, "sample_rate", o
->audio_sample_rate
[o
->nb_audio_sample_rate
- 1].u
.i
, 0);
821 if (o
->nb_audio_channels
) {
822 /* because we set audio_channels based on both the "ac" and
823 * "channel_layout" options, we need to check that the specified
824 * demuxer actually has the "channels" option before setting it */
825 if (file_iformat
&& file_iformat
->priv_class
&&
826 av_opt_find(&file_iformat
->priv_class
, "channels", NULL
, 0,
827 AV_OPT_SEARCH_FAKE_OBJ
)) {
828 av_dict_set_int(&o
->g
->format_opts
, "channels", o
->audio_channels
[o
->nb_audio_channels
- 1].u
.i
, 0);
831 if (o
->nb_frame_rates
) {
832 /* set the format-level framerate option;
833 * this is important for video grabbers, e.g. x11 */
834 if (file_iformat
&& file_iformat
->priv_class
&&
835 av_opt_find(&file_iformat
->priv_class
, "framerate", NULL
, 0,
836 AV_OPT_SEARCH_FAKE_OBJ
)) {
837 av_dict_set(&o
->g
->format_opts
, "framerate",
838 o
->frame_rates
[o
->nb_frame_rates
- 1].u
.str
, 0);
841 if (o
->nb_frame_sizes
) {
842 av_dict_set(&o
->g
->format_opts
, "video_size", o
->frame_sizes
[o
->nb_frame_sizes
- 1].u
.str
, 0);
844 if (o
->nb_frame_pix_fmts
)
845 av_dict_set(&o
->g
->format_opts
, "pixel_format", o
->frame_pix_fmts
[o
->nb_frame_pix_fmts
- 1].u
.str
, 0);
847 MATCH_PER_TYPE_OPT(codec_names
, str
, video_codec_name
, ic
, "v");
848 MATCH_PER_TYPE_OPT(codec_names
, str
, audio_codec_name
, ic
, "a");
849 MATCH_PER_TYPE_OPT(codec_names
, str
, subtitle_codec_name
, ic
, "s");
851 ic
->video_codec_id
= video_codec_name
?
852 find_codec_or_die(video_codec_name
, AVMEDIA_TYPE_VIDEO
, 0)->id
: AV_CODEC_ID_NONE
;
853 ic
->audio_codec_id
= audio_codec_name
?
854 find_codec_or_die(audio_codec_name
, AVMEDIA_TYPE_AUDIO
, 0)->id
: AV_CODEC_ID_NONE
;
855 ic
->subtitle_codec_id
= subtitle_codec_name
?
856 find_codec_or_die(subtitle_codec_name
, AVMEDIA_TYPE_SUBTITLE
, 0)->id
: AV_CODEC_ID_NONE
;
858 if (video_codec_name
)
859 av_format_set_video_codec (ic
, find_codec_or_die(video_codec_name
, AVMEDIA_TYPE_VIDEO
, 0));
860 if (audio_codec_name
)
861 av_format_set_audio_codec (ic
, find_codec_or_die(audio_codec_name
, AVMEDIA_TYPE_AUDIO
, 0));
862 if (subtitle_codec_name
)
863 av_format_set_subtitle_codec(ic
, find_codec_or_die(subtitle_codec_name
, AVMEDIA_TYPE_SUBTITLE
, 0));
865 ic
->flags
|= AVFMT_FLAG_NONBLOCK
;
866 ic
->interrupt_callback
= int_cb
;
868 if (!av_dict_get(o
->g
->format_opts
, "scan_all_pmts", NULL
, AV_DICT_MATCH_CASE
)) {
869 av_dict_set(&o
->g
->format_opts
, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE
);
870 scan_all_pmts_set
= 1;
872 /* open the input file with generic avformat function */
873 err
= avformat_open_input(&ic
, filename
, file_iformat
, &o
->g
->format_opts
);
875 print_error(filename
, err
);
878 if (scan_all_pmts_set
)
879 av_dict_set(&o
->g
->format_opts
, "scan_all_pmts", NULL
, AV_DICT_MATCH_CASE
);
880 remove_avoptions(&o
->g
->format_opts
, o
->g
->codec_opts
);
881 assert_avoptions(o
->g
->format_opts
);
883 /* apply forced codec ids */
884 for (i
= 0; i
< ic
->nb_streams
; i
++)
885 choose_decoder(o
, ic
, ic
->streams
[i
]);
887 /* Set AVCodecContext options for avformat_find_stream_info */
888 opts
= setup_find_stream_info_opts(ic
, o
->g
->codec_opts
);
889 orig_nb_streams
= ic
->nb_streams
;
891 /* If not enough info to get the stream parameters, we decode the
892 first frames to get it. (used in mpeg case for example) */
893 ret
= avformat_find_stream_info(ic
, opts
);
895 av_log(NULL
, AV_LOG_FATAL
, "%s: could not find codec parameters\n", filename
);
896 if (ic
->nb_streams
== 0) {
897 avformat_close_input(&ic
);
902 timestamp
= (o
->start_time
== AV_NOPTS_VALUE
) ? 0 : o
->start_time
;
903 /* add the stream start time */
904 if (ic
->start_time
!= AV_NOPTS_VALUE
)
905 timestamp
+= ic
->start_time
;
907 /* if seeking requested, we execute it */
908 if (o
->start_time
!= AV_NOPTS_VALUE
) {
909 ret
= avformat_seek_file(ic
, -1, INT64_MIN
, timestamp
, timestamp
, 0);
911 av_log(NULL
, AV_LOG_WARNING
, "%s: could not seek to position %0.3f\n",
912 filename
, (double)timestamp
/ AV_TIME_BASE
);
916 /* update the current parameters so that they match the one of the input stream */
917 add_input_streams(o
, ic
);
919 /* dump the file content */
920 av_dump_format(ic
, nb_input_files
, filename
, 0);
922 GROW_ARRAY(input_files
, nb_input_files
);
923 f
= av_mallocz(sizeof(*f
));
926 input_files
[nb_input_files
- 1] = f
;
929 f
->ist_index
= nb_input_streams
- ic
->nb_streams
;
930 f
->start_time
= o
->start_time
;
931 f
->recording_time
= o
->recording_time
;
932 f
->input_ts_offset
= o
->input_ts_offset
;
933 f
->ts_offset
= o
->input_ts_offset
- (copy_ts
? (start_at_zero
&& ic
->start_time
!= AV_NOPTS_VALUE
? ic
->start_time
: 0) : timestamp
);
934 f
->nb_streams
= ic
->nb_streams
;
935 f
->rate_emu
= o
->rate_emu
;
936 f
->accurate_seek
= o
->accurate_seek
;
938 /* check if all codec options have been used */
939 unused_opts
= strip_specifiers(o
->g
->codec_opts
);
940 for (i
= f
->ist_index
; i
< nb_input_streams
; i
++) {
942 while ((e
= av_dict_get(input_streams
[i
]->decoder_opts
, "", e
,
943 AV_DICT_IGNORE_SUFFIX
)))
944 av_dict_set(&unused_opts
, e
->key
, NULL
, 0);
948 while ((e
= av_dict_get(unused_opts
, "", e
, AV_DICT_IGNORE_SUFFIX
))) {
949 const AVClass
*class = avcodec_get_class();
950 const AVOption
*option
= av_opt_find(&class, e
->key
, NULL
, 0,
951 AV_OPT_SEARCH_CHILDREN
| AV_OPT_SEARCH_FAKE_OBJ
);
952 const AVClass
*fclass
= avformat_get_class();
953 const AVOption
*foption
= av_opt_find(&fclass
, e
->key
, NULL
, 0,
954 AV_OPT_SEARCH_CHILDREN
| AV_OPT_SEARCH_FAKE_OBJ
);
955 if (!option
|| foption
)
959 if (!(option
->flags
& AV_OPT_FLAG_DECODING_PARAM
)) {
960 av_log(NULL
, AV_LOG_ERROR
, "Codec AVOption %s (%s) specified for "
961 "input file #%d (%s) is not a decoding option.\n", e
->key
,
962 option
->help
? option
->help
: "", nb_input_files
- 1,
967 av_log(NULL
, AV_LOG_WARNING
, "Codec AVOption %s (%s) specified for "
968 "input file #%d (%s) has not been used for any stream. The most "
969 "likely reason is either wrong type (e.g. a video option with "
970 "no video streams) or that it is a private option of some decoder "
971 "which was not actually used for any stream.\n", e
->key
,
972 option
->help
? option
->help
: "", nb_input_files
- 1, filename
);
974 av_dict_free(&unused_opts
);
976 for (i
= 0; i
< o
->nb_dump_attachment
; i
++) {
979 for (j
= 0; j
< ic
->nb_streams
; j
++) {
980 AVStream
*st
= ic
->streams
[j
];
982 if (check_stream_specifier(ic
, st
, o
->dump_attachment
[i
].specifier
) == 1)
983 dump_attachment(st
, o
->dump_attachment
[i
].u
.str
);
987 for (i
= 0; i
< orig_nb_streams
; i
++)
988 av_dict_free(&opts
[i
]);
994 static uint8_t *get_line(AVIOContext
*s
)
1000 if (avio_open_dyn_buf(&line
) < 0) {
1001 av_log(NULL
, AV_LOG_FATAL
, "Could not alloc buffer for reading preset.\n");
1005 while ((c
= avio_r8(s
)) && c
!= '\n')
1008 avio_close_dyn_buf(line
, &buf
);
1013 static int get_preset_file_2(const char *preset_name
, const char *codec_name
, AVIOContext
**s
)
1016 char filename
[1000];
1017 const char *base
[3] = { getenv("AVCONV_DATADIR"),
1022 for (i
= 0; i
< FF_ARRAY_ELEMS(base
) && ret
< 0; i
++) {
1026 snprintf(filename
, sizeof(filename
), "%s%s/%s-%s.avpreset", base
[i
],
1027 i
!= 1 ? "" : "/.avconv", codec_name
, preset_name
);
1028 ret
= avio_open2(s
, filename
, AVIO_FLAG_READ
, &int_cb
, NULL
);
1031 snprintf(filename
, sizeof(filename
), "%s%s/%s.avpreset", base
[i
],
1032 i
!= 1 ? "" : "/.avconv", preset_name
);
1033 ret
= avio_open2(s
, filename
, AVIO_FLAG_READ
, &int_cb
, NULL
);
1039 static void choose_encoder(OptionsContext
*o
, AVFormatContext
*s
, OutputStream
*ost
)
1041 char *codec_name
= NULL
;
1043 MATCH_PER_STREAM_OPT(codec_names
, str
, codec_name
, s
, ost
->st
);
1045 ost
->st
->codec
->codec_id
= av_guess_codec(s
->oformat
, NULL
, s
->filename
,
1046 NULL
, ost
->st
->codec
->codec_type
);
1047 ost
->enc
= avcodec_find_encoder(ost
->st
->codec
->codec_id
);
1048 } else if (!strcmp(codec_name
, "copy"))
1049 ost
->stream_copy
= 1;
1051 ost
->enc
= find_codec_or_die(codec_name
, ost
->st
->codec
->codec_type
, 1);
1052 ost
->st
->codec
->codec_id
= ost
->enc
->id
;
1056 static OutputStream
*new_output_stream(OptionsContext
*o
, AVFormatContext
*oc
, enum AVMediaType type
, int source_index
)
1059 AVStream
*st
= avformat_new_stream(oc
, NULL
);
1060 int idx
= oc
->nb_streams
- 1, ret
= 0;
1061 char *bsf
= NULL
, *next
, *codec_tag
= NULL
;
1062 AVBitStreamFilterContext
*bsfc
, *bsfc_prev
= NULL
;
1067 av_log(NULL
, AV_LOG_FATAL
, "Could not alloc stream.\n");
1071 if (oc
->nb_streams
- 1 < o
->nb_streamid_map
)
1072 st
->id
= o
->streamid_map
[oc
->nb_streams
- 1];
1074 GROW_ARRAY(output_streams
, nb_output_streams
);
1075 if (!(ost
= av_mallocz(sizeof(*ost
))))
1077 output_streams
[nb_output_streams
- 1] = ost
;
1079 ost
->file_index
= nb_output_files
- 1;
1082 st
->codec
->codec_type
= type
;
1083 choose_encoder(o
, oc
, ost
);
1085 ost
->enc_ctx
= avcodec_alloc_context3(ost
->enc
);
1086 if (!ost
->enc_ctx
) {
1087 av_log(NULL
, AV_LOG_ERROR
, "Error allocating the encoding context.\n");
1090 ost
->enc_ctx
->codec_type
= type
;
1093 AVIOContext
*s
= NULL
;
1094 char *buf
= NULL
, *arg
= NULL
, *preset
= NULL
;
1096 ost
->encoder_opts
= filter_codec_opts(o
->g
->codec_opts
, ost
->enc
->id
, oc
, st
, ost
->enc
);
1098 MATCH_PER_STREAM_OPT(presets
, str
, preset
, oc
, st
);
1099 if (preset
&& (!(ret
= get_preset_file_2(preset
, ost
->enc
->name
, &s
)))) {
1102 if (!buf
[0] || buf
[0] == '#') {
1106 if (!(arg
= strchr(buf
, '='))) {
1107 av_log(NULL
, AV_LOG_FATAL
, "Invalid line found in the preset file.\n");
1111 av_dict_set(&ost
->encoder_opts
, buf
, arg
, AV_DICT_DONT_OVERWRITE
);
1113 } while (!s
->eof_reached
);
1117 av_log(NULL
, AV_LOG_FATAL
,
1118 "Preset %s specified for stream %d:%d, but could not be opened.\n",
1119 preset
, ost
->file_index
, ost
->index
);
1123 ost
->encoder_opts
= filter_codec_opts(o
->g
->codec_opts
, AV_CODEC_ID_NONE
, oc
, st
, NULL
);
1126 ost
->max_frames
= INT64_MAX
;
1127 MATCH_PER_STREAM_OPT(max_frames
, i64
, ost
->max_frames
, oc
, st
);
1128 for (i
= 0; i
<o
->nb_max_frames
; i
++) {
1129 char *p
= o
->max_frames
[i
].specifier
;
1130 if (!*p
&& type
!= AVMEDIA_TYPE_VIDEO
) {
1131 av_log(NULL
, AV_LOG_WARNING
, "Applying unspecific -frames to non video streams, maybe you meant -vframes ?\n");
1136 ost
->copy_prior_start
= -1;
1137 MATCH_PER_STREAM_OPT(copy_prior_start
, i
, ost
->copy_prior_start
, oc
,st
);
1139 MATCH_PER_STREAM_OPT(bitstream_filters
, str
, bsf
, oc
, st
);
1142 if (next
= strchr(bsf
, ','))
1144 if (arg
= strchr(bsf
, '='))
1146 if (!(bsfc
= av_bitstream_filter_init(bsf
))) {
1147 av_log(NULL
, AV_LOG_FATAL
, "Unknown bitstream filter %s\n", bsf
);
1151 bsfc_prev
->next
= bsfc
;
1153 ost
->bitstream_filters
= bsfc
;
1154 av_dict_set(&ost
->bsf_args
, bsfc
->filter
->name
, arg
, 0);
1160 MATCH_PER_STREAM_OPT(codec_tags
, str
, codec_tag
, oc
, st
);
1162 uint32_t tag
= strtol(codec_tag
, &next
, 0);
1164 tag
= AV_RL32(codec_tag
);
1165 ost
->enc_ctx
->codec_tag
= tag
;
1168 MATCH_PER_STREAM_OPT(qscale
, dbl
, qscale
, oc
, st
);
1170 ost
->enc_ctx
->flags
|= CODEC_FLAG_QSCALE
;
1171 ost
->enc_ctx
->global_quality
= FF_QP2LAMBDA
* qscale
;
1174 if (oc
->oformat
->flags
& AVFMT_GLOBALHEADER
)
1175 ost
->enc_ctx
->flags
|= CODEC_FLAG_GLOBAL_HEADER
;
1177 av_opt_get_int(o
->g
->sws_opts
, "sws_flags", 0, &ost
->sws_flags
);
1179 av_dict_copy(&ost
->swr_opts
, o
->g
->swr_opts
, 0);
1180 if (ost
->enc
&& av_get_exact_bits_per_sample(ost
->enc
->id
) == 24)
1181 av_dict_set(&ost
->swr_opts
, "output_sample_bits", "24", 0);
1183 av_dict_copy(&ost
->resample_opts
, o
->g
->resample_opts
, 0);
1185 ost
->source_index
= source_index
;
1186 if (source_index
>= 0) {
1187 ost
->sync_ist
= input_streams
[source_index
];
1188 input_streams
[source_index
]->discard
= 0;
1189 input_streams
[source_index
]->st
->discard
= input_streams
[source_index
]->user_set_discard
;
1191 ost
->last_mux_dts
= AV_NOPTS_VALUE
;
1196 static void parse_matrix_coeffs(uint16_t *dest
, const char *str
)
1199 const char *p
= str
;
1206 av_log(NULL
, AV_LOG_FATAL
, "Syntax error in matrix \"%s\" at coeff %d\n", str
, i
);
1213 /* read file contents into a string */
1214 static uint8_t *read_file(const char *filename
)
1216 AVIOContext
*pb
= NULL
;
1217 AVIOContext
*dyn_buf
= NULL
;
1218 int ret
= avio_open(&pb
, filename
, AVIO_FLAG_READ
);
1219 uint8_t buf
[1024], *str
;
1222 av_log(NULL
, AV_LOG_ERROR
, "Error opening file %s.\n", filename
);
1226 ret
= avio_open_dyn_buf(&dyn_buf
);
1231 while ((ret
= avio_read(pb
, buf
, sizeof(buf
))) > 0)
1232 avio_write(dyn_buf
, buf
, ret
);
1233 avio_w8(dyn_buf
, 0);
1236 ret
= avio_close_dyn_buf(dyn_buf
, &str
);
1242 static char *get_ost_filters(OptionsContext
*o
, AVFormatContext
*oc
,
1245 AVStream
*st
= ost
->st
;
1247 if (ost
->filters_script
&& ost
->filters
) {
1248 av_log(NULL
, AV_LOG_ERROR
, "Both -filter and -filter_script set for "
1249 "output stream #%d:%d.\n", nb_output_files
, st
->index
);
1253 if (ost
->filters_script
)
1254 return read_file(ost
->filters_script
);
1255 else if (ost
->filters
)
1256 return av_strdup(ost
->filters
);
1258 return av_strdup(st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
?
1262 static void check_streamcopy_filters(OptionsContext
*o
, AVFormatContext
*oc
,
1263 const OutputStream
*ost
, enum AVMediaType type
)
1265 if (ost
->filters_script
|| ost
->filters
) {
1266 av_log(NULL
, AV_LOG_ERROR
,
1267 "%s '%s' was defined for %s output stream %d:%d but codec copy was selected.\n"
1268 "Filtering and streamcopy cannot be used together.\n",
1269 ost
->filters
? "Filtergraph" : "Filtergraph script",
1270 ost
->filters
? ost
->filters
: ost
->filters_script
,
1271 av_get_media_type_string(type
), ost
->file_index
, ost
->index
);
1276 static OutputStream
*new_video_stream(OptionsContext
*o
, AVFormatContext
*oc
, int source_index
)
1280 AVCodecContext
*video_enc
;
1281 char *frame_rate
= NULL
, *frame_aspect_ratio
= NULL
;
1283 ost
= new_output_stream(o
, oc
, AVMEDIA_TYPE_VIDEO
, source_index
);
1285 video_enc
= ost
->enc_ctx
;
1287 MATCH_PER_STREAM_OPT(frame_rates
, str
, frame_rate
, oc
, st
);
1288 if (frame_rate
&& av_parse_video_rate(&ost
->frame_rate
, frame_rate
) < 0) {
1289 av_log(NULL
, AV_LOG_FATAL
, "Invalid framerate value: %s\n", frame_rate
);
1292 if (frame_rate
&& video_sync_method
== VSYNC_PASSTHROUGH
)
1293 av_log(NULL
, AV_LOG_ERROR
, "Using -vsync 0 and -r can produce invalid output files\n");
1295 MATCH_PER_STREAM_OPT(frame_aspect_ratios
, str
, frame_aspect_ratio
, oc
, st
);
1296 if (frame_aspect_ratio
) {
1298 if (av_parse_ratio(&q
, frame_aspect_ratio
, 255, 0, NULL
) < 0 ||
1299 q
.num
<= 0 || q
.den
<= 0) {
1300 av_log(NULL
, AV_LOG_FATAL
, "Invalid aspect ratio: %s\n", frame_aspect_ratio
);
1303 ost
->frame_aspect_ratio
= q
;
1306 MATCH_PER_STREAM_OPT(filter_scripts
, str
, ost
->filters_script
, oc
, st
);
1307 MATCH_PER_STREAM_OPT(filters
, str
, ost
->filters
, oc
, st
);
1309 if (!ost
->stream_copy
) {
1310 const char *p
= NULL
;
1311 char *frame_size
= NULL
;
1312 char *frame_pix_fmt
= NULL
;
1313 char *intra_matrix
= NULL
, *inter_matrix
= NULL
;
1314 char *chroma_intra_matrix
= NULL
;
1318 MATCH_PER_STREAM_OPT(frame_sizes
, str
, frame_size
, oc
, st
);
1319 if (frame_size
&& av_parse_video_size(&video_enc
->width
, &video_enc
->height
, frame_size
) < 0) {
1320 av_log(NULL
, AV_LOG_FATAL
, "Invalid frame size: %s.\n", frame_size
);
1324 video_enc
->bits_per_raw_sample
= frame_bits_per_raw_sample
;
1325 MATCH_PER_STREAM_OPT(frame_pix_fmts
, str
, frame_pix_fmt
, oc
, st
);
1326 if (frame_pix_fmt
&& *frame_pix_fmt
== '+') {
1327 ost
->keep_pix_fmt
= 1;
1328 if (!*++frame_pix_fmt
)
1329 frame_pix_fmt
= NULL
;
1331 if (frame_pix_fmt
&& (video_enc
->pix_fmt
= av_get_pix_fmt(frame_pix_fmt
)) == AV_PIX_FMT_NONE
) {
1332 av_log(NULL
, AV_LOG_FATAL
, "Unknown pixel format requested: %s.\n", frame_pix_fmt
);
1335 st
->sample_aspect_ratio
= video_enc
->sample_aspect_ratio
;
1338 video_enc
->gop_size
= 0;
1339 MATCH_PER_STREAM_OPT(intra_matrices
, str
, intra_matrix
, oc
, st
);
1341 if (!(video_enc
->intra_matrix
= av_mallocz(sizeof(*video_enc
->intra_matrix
) * 64))) {
1342 av_log(NULL
, AV_LOG_FATAL
, "Could not allocate memory for intra matrix.\n");
1345 parse_matrix_coeffs(video_enc
->intra_matrix
, intra_matrix
);
1347 MATCH_PER_STREAM_OPT(chroma_intra_matrices
, str
, chroma_intra_matrix
, oc
, st
);
1348 if (chroma_intra_matrix
) {
1349 uint16_t *p
= av_mallocz(sizeof(*video_enc
->chroma_intra_matrix
) * 64);
1351 av_log(NULL
, AV_LOG_FATAL
, "Could not allocate memory for intra matrix.\n");
1354 av_codec_set_chroma_intra_matrix(video_enc
, p
);
1355 parse_matrix_coeffs(p
, chroma_intra_matrix
);
1357 MATCH_PER_STREAM_OPT(inter_matrices
, str
, inter_matrix
, oc
, st
);
1359 if (!(video_enc
->inter_matrix
= av_mallocz(sizeof(*video_enc
->inter_matrix
) * 64))) {
1360 av_log(NULL
, AV_LOG_FATAL
, "Could not allocate memory for inter matrix.\n");
1363 parse_matrix_coeffs(video_enc
->inter_matrix
, inter_matrix
);
1366 MATCH_PER_STREAM_OPT(rc_overrides
, str
, p
, oc
, st
);
1367 for (i
= 0; p
; i
++) {
1369 int e
= sscanf(p
, "%d,%d,%d", &start
, &end
, &q
);
1371 av_log(NULL
, AV_LOG_FATAL
, "error parsing rc_override\n");
1374 /* FIXME realloc failure */
1375 video_enc
->rc_override
=
1376 av_realloc(video_enc
->rc_override
,
1377 sizeof(RcOverride
) * (i
+ 1));
1378 video_enc
->rc_override
[i
].start_frame
= start
;
1379 video_enc
->rc_override
[i
].end_frame
= end
;
1381 video_enc
->rc_override
[i
].qscale
= q
;
1382 video_enc
->rc_override
[i
].quality_factor
= 1.0;
1385 video_enc
->rc_override
[i
].qscale
= 0;
1386 video_enc
->rc_override
[i
].quality_factor
= -q
/100.0;
1391 video_enc
->rc_override_count
= i
;
1394 video_enc
->flags
|= CODEC_FLAG_PSNR
;
1397 MATCH_PER_STREAM_OPT(pass
, i
, do_pass
, oc
, st
);
1400 video_enc
->flags
|= CODEC_FLAG_PASS1
;
1401 av_dict_set(&ost
->encoder_opts
, "flags", "+pass1", AV_DICT_APPEND
);
1404 video_enc
->flags
|= CODEC_FLAG_PASS2
;
1405 av_dict_set(&ost
->encoder_opts
, "flags", "+pass2", AV_DICT_APPEND
);
1409 MATCH_PER_STREAM_OPT(passlogfiles
, str
, ost
->logfile_prefix
, oc
, st
);
1410 if (ost
->logfile_prefix
&&
1411 !(ost
->logfile_prefix
= av_strdup(ost
->logfile_prefix
)))
1414 MATCH_PER_STREAM_OPT(forced_key_frames
, str
, ost
->forced_keyframes
, oc
, st
);
1415 if (ost
->forced_keyframes
)
1416 ost
->forced_keyframes
= av_strdup(ost
->forced_keyframes
);
1418 MATCH_PER_STREAM_OPT(force_fps
, i
, ost
->force_fps
, oc
, st
);
1420 ost
->top_field_first
= -1;
1421 MATCH_PER_STREAM_OPT(top_field_first
, i
, ost
->top_field_first
, oc
, st
);
1424 ost
->avfilter
= get_ost_filters(o
, oc
, ost
);
1428 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes
, i
, ost
->copy_initial_nonkeyframes
, oc
,st
);
1431 if (ost
->stream_copy
)
1432 check_streamcopy_filters(o
, oc
, ost
, AVMEDIA_TYPE_VIDEO
);
1437 static OutputStream
*new_audio_stream(OptionsContext
*o
, AVFormatContext
*oc
, int source_index
)
1442 AVCodecContext
*audio_enc
;
1444 ost
= new_output_stream(o
, oc
, AVMEDIA_TYPE_AUDIO
, source_index
);
1447 audio_enc
= ost
->enc_ctx
;
1448 audio_enc
->codec_type
= AVMEDIA_TYPE_AUDIO
;
1450 MATCH_PER_STREAM_OPT(filter_scripts
, str
, ost
->filters_script
, oc
, st
);
1451 MATCH_PER_STREAM_OPT(filters
, str
, ost
->filters
, oc
, st
);
1453 if (!ost
->stream_copy
) {
1454 char *sample_fmt
= NULL
;
1456 MATCH_PER_STREAM_OPT(audio_channels
, i
, audio_enc
->channels
, oc
, st
);
1458 MATCH_PER_STREAM_OPT(sample_fmts
, str
, sample_fmt
, oc
, st
);
1460 (audio_enc
->sample_fmt
= av_get_sample_fmt(sample_fmt
)) == AV_SAMPLE_FMT_NONE
) {
1461 av_log(NULL
, AV_LOG_FATAL
, "Invalid sample format '%s'\n", sample_fmt
);
1465 MATCH_PER_STREAM_OPT(audio_sample_rate
, i
, audio_enc
->sample_rate
, oc
, st
);
1467 MATCH_PER_STREAM_OPT(apad
, str
, ost
->apad
, oc
, st
);
1468 ost
->apad
= av_strdup(ost
->apad
);
1470 ost
->avfilter
= get_ost_filters(o
, oc
, ost
);
1474 /* check for channel mapping for this audio stream */
1475 for (n
= 0; n
< o
->nb_audio_channel_maps
; n
++) {
1476 AudioChannelMap
*map
= &o
->audio_channel_maps
[n
];
1477 if ((map
->ofile_idx
== -1 || ost
->file_index
== map
->ofile_idx
) &&
1478 (map
->ostream_idx
== -1 || ost
->st
->index
== map
->ostream_idx
)) {
1481 if (map
->channel_idx
== -1) {
1483 } else if (ost
->source_index
< 0) {
1484 av_log(NULL
, AV_LOG_FATAL
, "Cannot determine input stream for channel mapping %d.%d\n",
1485 ost
->file_index
, ost
->st
->index
);
1488 ist
= input_streams
[ost
->source_index
];
1491 if (!ist
|| (ist
->file_index
== map
->file_idx
&& ist
->st
->index
== map
->stream_idx
)) {
1492 if (av_reallocp_array(&ost
->audio_channels_map
,
1493 ost
->audio_channels_mapped
+ 1,
1494 sizeof(*ost
->audio_channels_map
)
1498 ost
->audio_channels_map
[ost
->audio_channels_mapped
++] = map
->channel_idx
;
1504 if (ost
->stream_copy
)
1505 check_streamcopy_filters(o
, oc
, ost
, AVMEDIA_TYPE_AUDIO
);
1510 static OutputStream
*new_data_stream(OptionsContext
*o
, AVFormatContext
*oc
, int source_index
)
1514 ost
= new_output_stream(o
, oc
, AVMEDIA_TYPE_DATA
, source_index
);
1515 if (!ost
->stream_copy
) {
1516 av_log(NULL
, AV_LOG_FATAL
, "Data stream encoding not supported yet (only streamcopy)\n");
1523 static OutputStream
*new_attachment_stream(OptionsContext
*o
, AVFormatContext
*oc
, int source_index
)
1525 OutputStream
*ost
= new_output_stream(o
, oc
, AVMEDIA_TYPE_ATTACHMENT
, source_index
);
1526 ost
->stream_copy
= 1;
1531 static OutputStream
*new_subtitle_stream(OptionsContext
*o
, AVFormatContext
*oc
, int source_index
)
1535 AVCodecContext
*subtitle_enc
;
1537 ost
= new_output_stream(o
, oc
, AVMEDIA_TYPE_SUBTITLE
, source_index
);
1539 subtitle_enc
= ost
->enc_ctx
;
1541 subtitle_enc
->codec_type
= AVMEDIA_TYPE_SUBTITLE
;
1543 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes
, i
, ost
->copy_initial_nonkeyframes
, oc
, st
);
1545 if (!ost
->stream_copy
) {
1546 char *frame_size
= NULL
;
1548 MATCH_PER_STREAM_OPT(frame_sizes
, str
, frame_size
, oc
, st
);
1549 if (frame_size
&& av_parse_video_size(&subtitle_enc
->width
, &subtitle_enc
->height
, frame_size
) < 0) {
1550 av_log(NULL
, AV_LOG_FATAL
, "Invalid frame size: %s.\n", frame_size
);
1558 /* arg format is "output-stream-index:streamid-value". */
1559 static int opt_streamid(void *optctx
, const char *opt
, const char *arg
)
1561 OptionsContext
*o
= optctx
;
1566 av_strlcpy(idx_str
, arg
, sizeof(idx_str
));
1567 p
= strchr(idx_str
, ':');
1569 av_log(NULL
, AV_LOG_FATAL
,
1570 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
1575 idx
= parse_number_or_die(opt
, idx_str
, OPT_INT
, 0, MAX_STREAMS
-1);
1576 o
->streamid_map
= grow_array(o
->streamid_map
, sizeof(*o
->streamid_map
), &o
->nb_streamid_map
, idx
+1);
1577 o
->streamid_map
[idx
] = parse_number_or_die(opt
, p
, OPT_INT
, 0, INT_MAX
);
1581 static int copy_chapters(InputFile
*ifile
, OutputFile
*ofile
, int copy_metadata
)
1583 AVFormatContext
*is
= ifile
->ctx
;
1584 AVFormatContext
*os
= ofile
->ctx
;
1588 tmp
= av_realloc_f(os
->chapters
, is
->nb_chapters
+ os
->nb_chapters
, sizeof(*os
->chapters
));
1590 return AVERROR(ENOMEM
);
1593 for (i
= 0; i
< is
->nb_chapters
; i
++) {
1594 AVChapter
*in_ch
= is
->chapters
[i
], *out_ch
;
1595 int64_t start_time
= (ofile
->start_time
== AV_NOPTS_VALUE
) ? 0 : ofile
->start_time
;
1596 int64_t ts_off
= av_rescale_q(start_time
- ifile
->ts_offset
,
1597 AV_TIME_BASE_Q
, in_ch
->time_base
);
1598 int64_t rt
= (ofile
->recording_time
== INT64_MAX
) ? INT64_MAX
:
1599 av_rescale_q(ofile
->recording_time
, AV_TIME_BASE_Q
, in_ch
->time_base
);
1602 if (in_ch
->end
< ts_off
)
1604 if (rt
!= INT64_MAX
&& in_ch
->start
> rt
+ ts_off
)
1607 out_ch
= av_mallocz(sizeof(AVChapter
));
1609 return AVERROR(ENOMEM
);
1611 out_ch
->id
= in_ch
->id
;
1612 out_ch
->time_base
= in_ch
->time_base
;
1613 out_ch
->start
= FFMAX(0, in_ch
->start
- ts_off
);
1614 out_ch
->end
= FFMIN(rt
, in_ch
->end
- ts_off
);
1617 av_dict_copy(&out_ch
->metadata
, in_ch
->metadata
, 0);
1619 os
->chapters
[os
->nb_chapters
++] = out_ch
;
1624 static int read_ffserver_streams(OptionsContext
*o
, AVFormatContext
*s
, const char *filename
)
1627 AVFormatContext
*ic
= avformat_alloc_context();
1629 ic
->interrupt_callback
= int_cb
;
1630 err
= avformat_open_input(&ic
, filename
, NULL
, NULL
);
1633 /* copy stream format */
1634 for(i
=0;i
<ic
->nb_streams
;i
++) {
1638 const char *enc_config
;
1640 codec
= avcodec_find_encoder(ic
->streams
[i
]->codec
->codec_id
);
1642 av_log(s
, AV_LOG_ERROR
, "no encoder found for codec id %i\n", ic
->streams
[i
]->codec
->codec_id
);
1643 return AVERROR(EINVAL
);
1645 if (codec
->type
== AVMEDIA_TYPE_AUDIO
)
1646 opt_audio_codec(o
, "c:a", codec
->name
);
1647 else if (codec
->type
== AVMEDIA_TYPE_VIDEO
)
1648 opt_video_codec(o
, "c:v", codec
->name
);
1649 ost
= new_output_stream(o
, s
, codec
->type
, -1);
1652 avcodec_get_context_defaults3(st
->codec
, codec
);
1653 enc_config
= av_stream_get_recommended_encoder_configuration(ic
->streams
[i
]);
1655 AVDictionary
*opts
= NULL
;
1656 av_dict_parse_string(&opts
, enc_config
, "=", ",", 0);
1657 av_opt_set_dict2(st
->codec
, &opts
, AV_OPT_SEARCH_CHILDREN
);
1658 av_dict_free(&opts
);
1661 if (st
->codec
->codec_type
== AVMEDIA_TYPE_AUDIO
&& !ost
->stream_copy
)
1662 choose_sample_fmt(st
, codec
);
1663 else if (st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
&& !ost
->stream_copy
)
1664 choose_pixel_fmt(st
, st
->codec
, codec
, st
->codec
->pix_fmt
);
1665 avcodec_copy_context(ost
->enc_ctx
, st
->codec
);
1667 av_dict_parse_string(&ost
->encoder_opts
, enc_config
, "=", ",", 0);
1670 avformat_close_input(&ic
);
1674 static void init_output_filter(OutputFilter
*ofilter
, OptionsContext
*o
,
1675 AVFormatContext
*oc
)
1679 switch (avfilter_pad_get_type(ofilter
->out_tmp
->filter_ctx
->output_pads
,
1680 ofilter
->out_tmp
->pad_idx
)) {
1681 case AVMEDIA_TYPE_VIDEO
: ost
= new_video_stream(o
, oc
, -1); break;
1682 case AVMEDIA_TYPE_AUDIO
: ost
= new_audio_stream(o
, oc
, -1); break;
1684 av_log(NULL
, AV_LOG_FATAL
, "Only video and audio filters are supported "
1689 ost
->source_index
= -1;
1690 ost
->filter
= ofilter
;
1694 if (ost
->stream_copy
) {
1695 av_log(NULL
, AV_LOG_ERROR
, "Streamcopy requested for output stream %d:%d, "
1696 "which is fed from a complex filtergraph. Filtering and streamcopy "
1697 "cannot be used together.\n", ost
->file_index
, ost
->index
);
1701 if (ost
->avfilter
&& (ost
->filters
|| ost
->filters_script
)) {
1702 const char *opt
= ost
->filters
? "-vf/-af/-filter" : "-filter_script";
1703 av_log(NULL
, AV_LOG_ERROR
,
1704 "%s '%s' was specified through the %s option "
1705 "for output stream %d:%d, which is fed from a complex filtergraph.\n"
1706 "%s and -filter_complex cannot be used together for the same stream.\n",
1707 ost
->filters
? "Filtergraph" : "Filtergraph script",
1708 ost
->filters
? ost
->filters
: ost
->filters_script
,
1709 opt
, ost
->file_index
, ost
->index
, opt
);
1713 if (configure_output_filter(ofilter
->graph
, ofilter
, ofilter
->out_tmp
) < 0) {
1714 av_log(NULL
, AV_LOG_FATAL
, "Error configuring filter.\n");
1717 avfilter_inout_free(&ofilter
->out_tmp
);
1720 static int configure_complex_filters(void)
1724 for (i
= 0; i
< nb_filtergraphs
; i
++)
1725 if (!filtergraphs
[i
]->graph
&&
1726 (ret
= configure_filtergraph(filtergraphs
[i
])) < 0)
1731 static int open_output_file(OptionsContext
*o
, const char *filename
)
1733 AVFormatContext
*oc
;
1735 AVOutputFormat
*file_oformat
;
1739 AVDictionary
*unused_opts
= NULL
;
1740 AVDictionaryEntry
*e
= NULL
;
1742 if (configure_complex_filters() < 0) {
1743 av_log(NULL
, AV_LOG_FATAL
, "Error configuring filters.\n");
1747 if (o
->stop_time
!= INT64_MAX
&& o
->recording_time
!= INT64_MAX
) {
1748 o
->stop_time
= INT64_MAX
;
1749 av_log(NULL
, AV_LOG_WARNING
, "-t and -to cannot be used together; using -t.\n");
1752 if (o
->stop_time
!= INT64_MAX
&& o
->recording_time
== INT64_MAX
) {
1753 int64_t start_time
= o
->start_time
== AV_NOPTS_VALUE
? 0 : o
->start_time
;
1754 if (o
->stop_time
<= start_time
) {
1755 av_log(NULL
, AV_LOG_ERROR
, "-to value smaller than -ss; aborting.\n");
1758 o
->recording_time
= o
->stop_time
- start_time
;
1762 GROW_ARRAY(output_files
, nb_output_files
);
1763 of
= av_mallocz(sizeof(*of
));
1766 output_files
[nb_output_files
- 1] = of
;
1768 of
->ost_index
= nb_output_streams
;
1769 of
->recording_time
= o
->recording_time
;
1770 of
->start_time
= o
->start_time
;
1771 of
->limit_filesize
= o
->limit_filesize
;
1772 of
->shortest
= o
->shortest
;
1773 av_dict_copy(&of
->opts
, o
->g
->format_opts
, 0);
1775 if (!strcmp(filename
, "-"))
1778 err
= avformat_alloc_output_context2(&oc
, NULL
, o
->format
, filename
);
1780 print_error(filename
, err
);
1785 if (o
->recording_time
!= INT64_MAX
)
1786 oc
->duration
= o
->recording_time
;
1788 file_oformat
= oc
->oformat
;
1789 oc
->interrupt_callback
= int_cb
;
1791 /* create streams for all unlabeled output pads */
1792 for (i
= 0; i
< nb_filtergraphs
; i
++) {
1793 FilterGraph
*fg
= filtergraphs
[i
];
1794 for (j
= 0; j
< fg
->nb_outputs
; j
++) {
1795 OutputFilter
*ofilter
= fg
->outputs
[j
];
1797 if (!ofilter
->out_tmp
|| ofilter
->out_tmp
->name
)
1800 switch (avfilter_pad_get_type(ofilter
->out_tmp
->filter_ctx
->output_pads
,
1801 ofilter
->out_tmp
->pad_idx
)) {
1802 case AVMEDIA_TYPE_VIDEO
: o
->video_disable
= 1; break;
1803 case AVMEDIA_TYPE_AUDIO
: o
->audio_disable
= 1; break;
1804 case AVMEDIA_TYPE_SUBTITLE
: o
->subtitle_disable
= 1; break;
1806 init_output_filter(ofilter
, o
, oc
);
1810 /* ffserver seeking with date=... needs a date reference */
1811 if (!strcmp(file_oformat
->name
, "ffm") &&
1812 av_strstart(filename
, "http:", NULL
)) {
1813 int err
= parse_option(o
, "metadata", "creation_time=now", options
);
1815 print_error(filename
, err
);
1820 if (!strcmp(file_oformat
->name
, "ffm") && !override_ffserver
&&
1821 av_strstart(filename
, "http:", NULL
)) {
1823 /* special case for files sent to ffserver: we get the stream
1824 parameters from ffserver */
1825 int err
= read_ffserver_streams(o
, oc
, filename
);
1827 print_error(filename
, err
);
1830 for(j
= nb_output_streams
- oc
->nb_streams
; j
< nb_output_streams
; j
++) {
1831 ost
= output_streams
[j
];
1832 for (i
= 0; i
< nb_input_streams
; i
++) {
1833 ist
= input_streams
[i
];
1834 if(ist
->st
->codec
->codec_type
== ost
->st
->codec
->codec_type
){
1836 ost
->source_index
= i
;
1837 if(ost
->st
->codec
->codec_type
== AVMEDIA_TYPE_AUDIO
) ost
->avfilter
= av_strdup("anull");
1838 if(ost
->st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
) ost
->avfilter
= av_strdup("null");
1840 ist
->st
->discard
= ist
->user_set_discard
;
1845 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
));
1849 } else if (!o
->nb_stream_maps
) {
1850 char *subtitle_codec_name
= NULL
;
1851 /* pick the "best" stream of each type */
1853 /* video: highest resolution */
1854 if (!o
->video_disable
&& av_guess_codec(oc
->oformat
, NULL
, filename
, NULL
, AVMEDIA_TYPE_VIDEO
) != AV_CODEC_ID_NONE
) {
1855 int area
= 0, idx
= -1;
1856 int qcr
= avformat_query_codec(oc
->oformat
, oc
->oformat
->video_codec
, 0);
1857 for (i
= 0; i
< nb_input_streams
; i
++) {
1859 ist
= input_streams
[i
];
1860 new_area
= ist
->st
->codec
->width
* ist
->st
->codec
->height
;
1861 if((qcr
!=MKTAG('A', 'P', 'I', 'C')) && (ist
->st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
))
1863 if (ist
->st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
&&
1865 if((qcr
==MKTAG('A', 'P', 'I', 'C')) && !(ist
->st
->disposition
& AV_DISPOSITION_ATTACHED_PIC
))
1872 new_video_stream(o
, oc
, idx
);
1875 /* audio: most channels */
1876 if (!o
->audio_disable
&& av_guess_codec(oc
->oformat
, NULL
, filename
, NULL
, AVMEDIA_TYPE_AUDIO
) != AV_CODEC_ID_NONE
) {
1877 int channels
= 0, idx
= -1;
1878 for (i
= 0; i
< nb_input_streams
; i
++) {
1879 ist
= input_streams
[i
];
1880 if (ist
->st
->codec
->codec_type
== AVMEDIA_TYPE_AUDIO
&&
1881 ist
->st
->codec
->channels
> channels
) {
1882 channels
= ist
->st
->codec
->channels
;
1887 new_audio_stream(o
, oc
, idx
);
1890 /* subtitles: pick first */
1891 MATCH_PER_TYPE_OPT(codec_names
, str
, subtitle_codec_name
, oc
, "s");
1892 if (!o
->subtitle_disable
&& (avcodec_find_encoder(oc
->oformat
->subtitle_codec
) || subtitle_codec_name
)) {
1893 for (i
= 0; i
< nb_input_streams
; i
++)
1894 if (input_streams
[i
]->st
->codec
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
1895 AVCodecDescriptor
const *input_descriptor
=
1896 avcodec_descriptor_get(input_streams
[i
]->st
->codec
->codec_id
);
1897 AVCodecDescriptor
const *output_descriptor
= NULL
;
1898 AVCodec
const *output_codec
=
1899 avcodec_find_encoder(oc
->oformat
->subtitle_codec
);
1900 int input_props
= 0, output_props
= 0;
1902 output_descriptor
= avcodec_descriptor_get(output_codec
->id
);
1903 if (input_descriptor
)
1904 input_props
= input_descriptor
->props
& (AV_CODEC_PROP_TEXT_SUB
| AV_CODEC_PROP_BITMAP_SUB
);
1905 if (output_descriptor
)
1906 output_props
= output_descriptor
->props
& (AV_CODEC_PROP_TEXT_SUB
| AV_CODEC_PROP_BITMAP_SUB
);
1907 if (subtitle_codec_name
||
1908 input_props
& output_props
||
1909 // Map dvb teletext which has neither property to any output subtitle encoder
1910 input_descriptor
&& output_descriptor
&&
1911 (!input_descriptor
->props
||
1912 !output_descriptor
->props
)) {
1913 new_subtitle_stream(o
, oc
, i
);
1918 /* do something with data? */
1920 for (i
= 0; i
< o
->nb_stream_maps
; i
++) {
1921 StreamMap
*map
= &o
->stream_maps
[i
];
1926 if (map
->linklabel
) {
1928 OutputFilter
*ofilter
= NULL
;
1931 for (j
= 0; j
< nb_filtergraphs
; j
++) {
1932 fg
= filtergraphs
[j
];
1933 for (k
= 0; k
< fg
->nb_outputs
; k
++) {
1934 AVFilterInOut
*out
= fg
->outputs
[k
]->out_tmp
;
1935 if (out
&& !strcmp(out
->name
, map
->linklabel
)) {
1936 ofilter
= fg
->outputs
[k
];
1943 av_log(NULL
, AV_LOG_FATAL
, "Output with label '%s' does not exist "
1944 "in any defined filter graph, or was already used elsewhere.\n", map
->linklabel
);
1947 init_output_filter(ofilter
, o
, oc
);
1949 int src_idx
= input_files
[map
->file_index
]->ist_index
+ map
->stream_index
;
1951 ist
= input_streams
[input_files
[map
->file_index
]->ist_index
+ map
->stream_index
];
1952 if(o
->subtitle_disable
&& ist
->st
->codec
->codec_type
== AVMEDIA_TYPE_SUBTITLE
)
1954 if(o
-> audio_disable
&& ist
->st
->codec
->codec_type
== AVMEDIA_TYPE_AUDIO
)
1956 if(o
-> video_disable
&& ist
->st
->codec
->codec_type
== AVMEDIA_TYPE_VIDEO
)
1958 if(o
-> data_disable
&& ist
->st
->codec
->codec_type
== AVMEDIA_TYPE_DATA
)
1961 switch (ist
->st
->codec
->codec_type
) {
1962 case AVMEDIA_TYPE_VIDEO
: ost
= new_video_stream (o
, oc
, src_idx
); break;
1963 case AVMEDIA_TYPE_AUDIO
: ost
= new_audio_stream (o
, oc
, src_idx
); break;
1964 case AVMEDIA_TYPE_SUBTITLE
: ost
= new_subtitle_stream (o
, oc
, src_idx
); break;
1965 case AVMEDIA_TYPE_DATA
: ost
= new_data_stream (o
, oc
, src_idx
); break;
1966 case AVMEDIA_TYPE_ATTACHMENT
: ost
= new_attachment_stream(o
, oc
, src_idx
); break;
1968 av_log(NULL
, AV_LOG_FATAL
, "Cannot map stream #%d:%d - unsupported type.\n",
1969 map
->file_index
, map
->stream_index
);
1976 /* handle attached files */
1977 for (i
= 0; i
< o
->nb_attachments
; i
++) {
1979 uint8_t *attachment
;
1983 if ((err
= avio_open2(&pb
, o
->attachments
[i
], AVIO_FLAG_READ
, &int_cb
, NULL
)) < 0) {
1984 av_log(NULL
, AV_LOG_FATAL
, "Could not open attachment file %s.\n",
1988 if ((len
= avio_size(pb
)) <= 0) {
1989 av_log(NULL
, AV_LOG_FATAL
, "Could not get size of the attachment %s.\n",
1993 if (!(attachment
= av_malloc(len
))) {
1994 av_log(NULL
, AV_LOG_FATAL
, "Attachment %s too large to fit into memory.\n",
1998 avio_read(pb
, attachment
, len
);
2000 ost
= new_attachment_stream(o
, oc
, -1);
2001 ost
->stream_copy
= 0;
2002 ost
->attachment_filename
= o
->attachments
[i
];
2004 ost
->enc_ctx
->extradata
= attachment
;
2005 ost
->enc_ctx
->extradata_size
= len
;
2007 p
= strrchr(o
->attachments
[i
], '/');
2008 av_dict_set(&ost
->st
->metadata
, "filename", (p
&& *p
) ? p
+ 1 : o
->attachments
[i
], AV_DICT_DONT_OVERWRITE
);
2012 for (i
= nb_output_streams
- oc
->nb_streams
; i
< nb_output_streams
; i
++) { //for all streams of this output file
2013 AVDictionaryEntry
*e
;
2014 ost
= output_streams
[i
];
2016 if ((ost
->stream_copy
|| ost
->attachment_filename
)
2017 && (e
= av_dict_get(o
->g
->codec_opts
, "flags", NULL
, AV_DICT_IGNORE_SUFFIX
))
2018 && (!e
->key
[5] || check_stream_specifier(oc
, ost
->st
, e
->key
+6)))
2019 if (av_opt_set(ost
->st
->codec
, "flags", e
->value
, 0) < 0)
2023 /* check if all codec options have been used */
2024 unused_opts
= strip_specifiers(o
->g
->codec_opts
);
2025 for (i
= of
->ost_index
; i
< nb_output_streams
; i
++) {
2027 while ((e
= av_dict_get(output_streams
[i
]->encoder_opts
, "", e
,
2028 AV_DICT_IGNORE_SUFFIX
)))
2029 av_dict_set(&unused_opts
, e
->key
, NULL
, 0);
2033 while ((e
= av_dict_get(unused_opts
, "", e
, AV_DICT_IGNORE_SUFFIX
))) {
2034 const AVClass
*class = avcodec_get_class();
2035 const AVOption
*option
= av_opt_find(&class, e
->key
, NULL
, 0,
2036 AV_OPT_SEARCH_CHILDREN
| AV_OPT_SEARCH_FAKE_OBJ
);
2037 const AVClass
*fclass
= avformat_get_class();
2038 const AVOption
*foption
= av_opt_find(&fclass
, e
->key
, NULL
, 0,
2039 AV_OPT_SEARCH_CHILDREN
| AV_OPT_SEARCH_FAKE_OBJ
);
2040 if (!option
|| foption
)
2044 if (!(option
->flags
& AV_OPT_FLAG_ENCODING_PARAM
)) {
2045 av_log(NULL
, AV_LOG_ERROR
, "Codec AVOption %s (%s) specified for "
2046 "output file #%d (%s) is not an encoding option.\n", e
->key
,
2047 option
->help
? option
->help
: "", nb_output_files
- 1,
2052 // gop_timecode is injected by generic code but not always used
2053 if (!strcmp(e
->key
, "gop_timecode"))
2056 av_log(NULL
, AV_LOG_WARNING
, "Codec AVOption %s (%s) specified for "
2057 "output file #%d (%s) has not been used for any stream. The most "
2058 "likely reason is either wrong type (e.g. a video option with "
2059 "no video streams) or that it is a private option of some encoder "
2060 "which was not actually used for any stream.\n", e
->key
,
2061 option
->help
? option
->help
: "", nb_output_files
- 1, filename
);
2063 av_dict_free(&unused_opts
);
2065 /* check filename in case of an image number is expected */
2066 if (oc
->oformat
->flags
& AVFMT_NEEDNUMBER
) {
2067 if (!av_filename_number_test(oc
->filename
)) {
2068 print_error(oc
->filename
, AVERROR(EINVAL
));
2073 if (!(oc
->oformat
->flags
& AVFMT_NOFILE
)) {
2074 /* test if it already exists to avoid losing precious files */
2075 assert_file_overwrite(filename
);
2078 if ((err
= avio_open2(&oc
->pb
, filename
, AVIO_FLAG_WRITE
,
2079 &oc
->interrupt_callback
,
2081 print_error(filename
, err
);
2084 } else if (strcmp(oc
->oformat
->name
, "image2")==0 && !av_filename_number_test(filename
))
2085 assert_file_overwrite(filename
);
2087 if (o
->mux_preload
) {
2088 av_dict_set_int(&of
->opts
, "preload", o
->mux_preload
*AV_TIME_BASE
, 0);
2090 oc
->max_delay
= (int)(o
->mux_max_delay
* AV_TIME_BASE
);
2093 for (i
= 0; i
< o
->nb_metadata_map
; i
++) {
2095 int in_file_index
= strtol(o
->metadata_map
[i
].u
.str
, &p
, 0);
2097 if (in_file_index
>= nb_input_files
) {
2098 av_log(NULL
, AV_LOG_FATAL
, "Invalid input file index %d while processing metadata maps\n", in_file_index
);
2101 copy_metadata(o
->metadata_map
[i
].specifier
, *p
? p
+ 1 : p
, oc
,
2102 in_file_index
>= 0 ?
2103 input_files
[in_file_index
]->ctx
: NULL
, o
);
2107 if (o
->chapters_input_file
>= nb_input_files
) {
2108 if (o
->chapters_input_file
== INT_MAX
) {
2109 /* copy chapters from the first input file that has them*/
2110 o
->chapters_input_file
= -1;
2111 for (i
= 0; i
< nb_input_files
; i
++)
2112 if (input_files
[i
]->ctx
->nb_chapters
) {
2113 o
->chapters_input_file
= i
;
2117 av_log(NULL
, AV_LOG_FATAL
, "Invalid input file index %d in chapter mapping.\n",
2118 o
->chapters_input_file
);
2122 if (o
->chapters_input_file
>= 0)
2123 copy_chapters(input_files
[o
->chapters_input_file
], of
,
2124 !o
->metadata_chapters_manual
);
2126 /* copy global metadata by default */
2127 if (!o
->metadata_global_manual
&& nb_input_files
){
2128 av_dict_copy(&oc
->metadata
, input_files
[0]->ctx
->metadata
,
2129 AV_DICT_DONT_OVERWRITE
);
2130 if(o
->recording_time
!= INT64_MAX
)
2131 av_dict_set(&oc
->metadata
, "duration", NULL
, 0);
2132 av_dict_set(&oc
->metadata
, "creation_time", NULL
, 0);
2134 if (!o
->metadata_streams_manual
)
2135 for (i
= of
->ost_index
; i
< nb_output_streams
; i
++) {
2137 if (output_streams
[i
]->source_index
< 0) /* this is true e.g. for attached files */
2139 ist
= input_streams
[output_streams
[i
]->source_index
];
2140 av_dict_copy(&output_streams
[i
]->st
->metadata
, ist
->st
->metadata
, AV_DICT_DONT_OVERWRITE
);
2141 if (!output_streams
[i
]->stream_copy
)
2142 av_dict_set(&output_streams
[i
]->st
->metadata
, "encoder", NULL
, 0);
2145 /* process manually set metadata */
2146 for (i
= 0; i
< o
->nb_metadata
; i
++) {
2149 const char *stream_spec
;
2150 int index
= 0, j
, ret
= 0;
2152 val
= strchr(o
->metadata
[i
].u
.str
, '=');
2154 av_log(NULL
, AV_LOG_FATAL
, "No '=' character in metadata string %s.\n",
2155 o
->metadata
[i
].u
.str
);
2160 parse_meta_type(o
->metadata
[i
].specifier
, &type
, &index
, &stream_spec
);
2162 for (j
= 0; j
< oc
->nb_streams
; j
++) {
2163 if ((ret
= check_stream_specifier(oc
, oc
->streams
[j
], stream_spec
)) > 0) {
2164 av_dict_set(&oc
->streams
[j
]->metadata
, o
->metadata
[i
].u
.str
, *val
? val
: NULL
, 0);
2175 if (index
< 0 || index
>= oc
->nb_chapters
) {
2176 av_log(NULL
, AV_LOG_FATAL
, "Invalid chapter index %d in metadata specifier.\n", index
);
2179 m
= &oc
->chapters
[index
]->metadata
;
2182 av_log(NULL
, AV_LOG_FATAL
, "Invalid metadata specifier %s.\n", o
->metadata
[i
].specifier
);
2185 av_dict_set(m
, o
->metadata
[i
].u
.str
, *val
? val
: NULL
, 0);
2192 static int opt_target(void *optctx
, const char *opt
, const char *arg
)
2194 OptionsContext
*o
= optctx
;
2195 enum { PAL
, NTSC
, FILM
, UNKNOWN
} norm
= UNKNOWN
;
2196 static const char *const frame_rates
[] = { "25", "30000/1001", "24000/1001" };
2198 if (!strncmp(arg
, "pal-", 4)) {
2201 } else if (!strncmp(arg
, "ntsc-", 5)) {
2204 } else if (!strncmp(arg
, "film-", 5)) {
2208 /* Try to determine PAL/NTSC by peeking in the input files */
2209 if (nb_input_files
) {
2211 for (j
= 0; j
< nb_input_files
; j
++) {
2212 for (i
= 0; i
< input_files
[j
]->nb_streams
; i
++) {
2213 AVCodecContext
*c
= input_files
[j
]->ctx
->streams
[i
]->codec
;
2214 if (c
->codec_type
!= AVMEDIA_TYPE_VIDEO
||
2217 fr
= c
->time_base
.den
* 1000 / c
->time_base
.num
;
2221 } else if ((fr
== 29970) || (fr
== 23976)) {
2226 if (norm
!= UNKNOWN
)
2230 if (norm
!= UNKNOWN
)
2231 av_log(NULL
, AV_LOG_INFO
, "Assuming %s for target.\n", norm
== PAL
? "PAL" : "NTSC");
2234 if (norm
== UNKNOWN
) {
2235 av_log(NULL
, AV_LOG_FATAL
, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
2236 av_log(NULL
, AV_LOG_FATAL
, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
2237 av_log(NULL
, AV_LOG_FATAL
, "or set a framerate with \"-r xxx\".\n");
2241 if (!strcmp(arg
, "vcd")) {
2242 opt_video_codec(o
, "c:v", "mpeg1video");
2243 opt_audio_codec(o
, "c:a", "mp2");
2244 parse_option(o
, "f", "vcd", options
);
2246 parse_option(o
, "s", norm
== PAL
? "352x288" : "352x240", options
);
2247 parse_option(o
, "r", frame_rates
[norm
], options
);
2248 opt_default(NULL
, "g", norm
== PAL
? "15" : "18");
2250 opt_default(NULL
, "b:v", "1150000");
2251 opt_default(NULL
, "maxrate", "1150000");
2252 opt_default(NULL
, "minrate", "1150000");
2253 opt_default(NULL
, "bufsize", "327680"); // 40*1024*8;
2255 opt_default(NULL
, "b:a", "224000");
2256 parse_option(o
, "ar", "44100", options
);
2257 parse_option(o
, "ac", "2", options
);
2259 opt_default(NULL
, "packetsize", "2324");
2260 opt_default(NULL
, "muxrate", "1411200"); // 2352 * 75 * 8;
2262 /* We have to offset the PTS, so that it is consistent with the SCR.
2263 SCR starts at 36000, but the first two packs contain only padding
2264 and the first pack from the other stream, respectively, may also have
2265 been written before.
2266 So the real data starts at SCR 36000+3*1200. */
2267 o
->mux_preload
= (36000 + 3 * 1200) / 90000.0; // 0.44
2268 } else if (!strcmp(arg
, "svcd")) {
2270 opt_video_codec(o
, "c:v", "mpeg2video");
2271 opt_audio_codec(o
, "c:a", "mp2");
2272 parse_option(o
, "f", "svcd", options
);
2274 parse_option(o
, "s", norm
== PAL
? "480x576" : "480x480", options
);
2275 parse_option(o
, "r", frame_rates
[norm
], options
);
2276 parse_option(o
, "pix_fmt", "yuv420p", options
);
2277 opt_default(NULL
, "g", norm
== PAL
? "15" : "18");
2279 opt_default(NULL
, "b:v", "2040000");
2280 opt_default(NULL
, "maxrate", "2516000");
2281 opt_default(NULL
, "minrate", "0"); // 1145000;
2282 opt_default(NULL
, "bufsize", "1835008"); // 224*1024*8;
2283 opt_default(NULL
, "scan_offset", "1");
2285 opt_default(NULL
, "b:a", "224000");
2286 parse_option(o
, "ar", "44100", options
);
2288 opt_default(NULL
, "packetsize", "2324");
2290 } else if (!strcmp(arg
, "dvd")) {
2292 opt_video_codec(o
, "c:v", "mpeg2video");
2293 opt_audio_codec(o
, "c:a", "ac3");
2294 parse_option(o
, "f", "dvd", options
);
2296 parse_option(o
, "s", norm
== PAL
? "720x576" : "720x480", options
);
2297 parse_option(o
, "r", frame_rates
[norm
], options
);
2298 parse_option(o
, "pix_fmt", "yuv420p", options
);
2299 opt_default(NULL
, "g", norm
== PAL
? "15" : "18");
2301 opt_default(NULL
, "b:v", "6000000");
2302 opt_default(NULL
, "maxrate", "9000000");
2303 opt_default(NULL
, "minrate", "0"); // 1500000;
2304 opt_default(NULL
, "bufsize", "1835008"); // 224*1024*8;
2306 opt_default(NULL
, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
2307 opt_default(NULL
, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
2309 opt_default(NULL
, "b:a", "448000");
2310 parse_option(o
, "ar", "48000", options
);
2312 } else if (!strncmp(arg
, "dv", 2)) {
2314 parse_option(o
, "f", "dv", options
);
2316 parse_option(o
, "s", norm
== PAL
? "720x576" : "720x480", options
);
2317 parse_option(o
, "pix_fmt", !strncmp(arg
, "dv50", 4) ? "yuv422p" :
2318 norm
== PAL
? "yuv420p" : "yuv411p", options
);
2319 parse_option(o
, "r", frame_rates
[norm
], options
);
2321 parse_option(o
, "ar", "48000", options
);
2322 parse_option(o
, "ac", "2", options
);
2325 av_log(NULL
, AV_LOG_ERROR
, "Unknown target: %s\n", arg
);
2326 return AVERROR(EINVAL
);
2329 av_dict_copy(&o
->g
->codec_opts
, codec_opts
, AV_DICT_DONT_OVERWRITE
);
2330 av_dict_copy(&o
->g
->format_opts
, format_opts
, AV_DICT_DONT_OVERWRITE
);
2335 static int opt_vstats_file(void *optctx
, const char *opt
, const char *arg
)
2337 av_free (vstats_filename
);
2338 vstats_filename
= av_strdup (arg
);
2342 static int opt_vstats(void *optctx
, const char *opt
, const char *arg
)
2345 time_t today2
= time(NULL
);
2346 struct tm
*today
= localtime(&today2
);
2348 snprintf(filename
, sizeof(filename
), "vstats_%02d%02d%02d.log", today
->tm_hour
, today
->tm_min
,
2350 return opt_vstats_file(NULL
, opt
, filename
);
2353 static int opt_video_frames(void *optctx
, const char *opt
, const char *arg
)
2355 OptionsContext
*o
= optctx
;
2356 return parse_option(o
, "frames:v", arg
, options
);
2359 static int opt_audio_frames(void *optctx
, const char *opt
, const char *arg
)
2361 OptionsContext
*o
= optctx
;
2362 return parse_option(o
, "frames:a", arg
, options
);
2365 static int opt_data_frames(void *optctx
, const char *opt
, const char *arg
)
2367 OptionsContext
*o
= optctx
;
2368 return parse_option(o
, "frames:d", arg
, options
);
2371 static int opt_default_new(OptionsContext
*o
, const char *opt
, const char *arg
)
2374 AVDictionary
*cbak
= codec_opts
;
2375 AVDictionary
*fbak
= format_opts
;
2379 ret
= opt_default(NULL
, opt
, arg
);
2381 av_dict_copy(&o
->g
->codec_opts
, codec_opts
, 0);
2382 av_dict_copy(&o
->g
->format_opts
, format_opts
, 0);
2383 av_dict_free(&codec_opts
);
2384 av_dict_free(&format_opts
);
2391 static int opt_preset(void *optctx
, const char *opt
, const char *arg
)
2393 OptionsContext
*o
= optctx
;
2395 char filename
[1000], line
[1000], tmp_line
[1000];
2396 const char *codec_name
= NULL
;
2400 MATCH_PER_TYPE_OPT(codec_names
, str
, codec_name
, NULL
, tmp_line
);
2402 if (!(f
= get_preset_file(filename
, sizeof(filename
), arg
, *opt
== 'f', codec_name
))) {
2403 if(!strncmp(arg
, "libx264-lossless", strlen("libx264-lossless"))){
2404 av_log(NULL
, AV_LOG_FATAL
, "Please use -preset <speed> -qp 0\n");
2406 av_log(NULL
, AV_LOG_FATAL
, "File for preset '%s' not found\n", arg
);
2410 while (fgets(line
, sizeof(line
), f
)) {
2411 char *key
= tmp_line
, *value
, *endptr
;
2413 if (strcspn(line
, "#\n\r") == 0)
2415 av_strlcpy(tmp_line
, line
, sizeof(tmp_line
));
2416 if (!av_strtok(key
, "=", &value
) ||
2417 !av_strtok(value
, "\r\n", &endptr
)) {
2418 av_log(NULL
, AV_LOG_FATAL
, "%s: Invalid syntax: '%s'\n", filename
, line
);
2421 av_log(NULL
, AV_LOG_DEBUG
, "ffpreset[%s]: set '%s' = '%s'\n", filename
, key
, value
);
2423 if (!strcmp(key
, "acodec")) opt_audio_codec (o
, key
, value
);
2424 else if (!strcmp(key
, "vcodec")) opt_video_codec (o
, key
, value
);
2425 else if (!strcmp(key
, "scodec")) opt_subtitle_codec(o
, key
, value
);
2426 else if (!strcmp(key
, "dcodec")) opt_data_codec (o
, key
, value
);
2427 else if (opt_default_new(o
, key
, value
) < 0) {
2428 av_log(NULL
, AV_LOG_FATAL
, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
2429 filename
, line
, key
, value
);
2439 static int opt_old2new(void *optctx
, const char *opt
, const char *arg
)
2441 OptionsContext
*o
= optctx
;
2442 char *s
= av_asprintf("%s:%c", opt
+ 1, *opt
);
2443 int ret
= parse_option(o
, s
, arg
, options
);
2448 static int opt_bitrate(void *optctx
, const char *opt
, const char *arg
)
2450 OptionsContext
*o
= optctx
;
2452 if(!strcmp(opt
, "ab")){
2453 av_dict_set(&o
->g
->codec_opts
, "b:a", arg
, 0);
2455 } else if(!strcmp(opt
, "b")){
2456 av_log(NULL
, AV_LOG_WARNING
, "Please use -b:a or -b:v, -b is ambiguous\n");
2457 av_dict_set(&o
->g
->codec_opts
, "b:v", arg
, 0);
2460 av_dict_set(&o
->g
->codec_opts
, opt
, arg
, 0);
2464 static int opt_qscale(void *optctx
, const char *opt
, const char *arg
)
2466 OptionsContext
*o
= optctx
;
2469 if(!strcmp(opt
, "qscale")){
2470 av_log(NULL
, AV_LOG_WARNING
, "Please use -q:a or -q:v, -qscale is ambiguous\n");
2471 return parse_option(o
, "q:v", arg
, options
);
2473 s
= av_asprintf("q%s", opt
+ 6);
2474 ret
= parse_option(o
, s
, arg
, options
);
2479 static int opt_profile(void *optctx
, const char *opt
, const char *arg
)
2481 OptionsContext
*o
= optctx
;
2482 if(!strcmp(opt
, "profile")){
2483 av_log(NULL
, AV_LOG_WARNING
, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
2484 av_dict_set(&o
->g
->codec_opts
, "profile:v", arg
, 0);
2487 av_dict_set(&o
->g
->codec_opts
, opt
, arg
, 0);
2491 static int opt_video_filters(void *optctx
, const char *opt
, const char *arg
)
2493 OptionsContext
*o
= optctx
;
2494 return parse_option(o
, "filter:v", arg
, options
);
2497 static int opt_audio_filters(void *optctx
, const char *opt
, const char *arg
)
2499 OptionsContext
*o
= optctx
;
2500 return parse_option(o
, "filter:a", arg
, options
);
2503 static int opt_vsync(void *optctx
, const char *opt
, const char *arg
)
2505 if (!av_strcasecmp(arg
, "cfr")) video_sync_method
= VSYNC_CFR
;
2506 else if (!av_strcasecmp(arg
, "vfr")) video_sync_method
= VSYNC_VFR
;
2507 else if (!av_strcasecmp(arg
, "passthrough")) video_sync_method
= VSYNC_PASSTHROUGH
;
2508 else if (!av_strcasecmp(arg
, "drop")) video_sync_method
= VSYNC_DROP
;
2510 if (video_sync_method
== VSYNC_AUTO
)
2511 video_sync_method
= parse_number_or_die("vsync", arg
, OPT_INT
, VSYNC_AUTO
, VSYNC_VFR
);
2515 static int opt_timecode(void *optctx
, const char *opt
, const char *arg
)
2517 OptionsContext
*o
= optctx
;
2518 char *tcr
= av_asprintf("timecode=%s", arg
);
2519 int ret
= parse_option(o
, "metadata:g", tcr
, options
);
2521 ret
= av_dict_set(&o
->g
->codec_opts
, "gop_timecode", arg
, 0);
2526 static int opt_channel_layout(void *optctx
, const char *opt
, const char *arg
)
2528 OptionsContext
*o
= optctx
;
2529 char layout_str
[32];
2532 int ret
, channels
, ac_str_size
;
2535 layout
= av_get_channel_layout(arg
);
2537 av_log(NULL
, AV_LOG_ERROR
, "Unknown channel layout: %s\n", arg
);
2538 return AVERROR(EINVAL
);
2540 snprintf(layout_str
, sizeof(layout_str
), "%"PRIu64
, layout
);
2541 ret
= opt_default_new(o
, opt
, layout_str
);
2545 /* set 'ac' option based on channel layout */
2546 channels
= av_get_channel_layout_nb_channels(layout
);
2547 snprintf(layout_str
, sizeof(layout_str
), "%d", channels
);
2548 stream_str
= strchr(opt
, ':');
2549 ac_str_size
= 3 + (stream_str
? strlen(stream_str
) : 0);
2550 ac_str
= av_mallocz(ac_str_size
);
2552 return AVERROR(ENOMEM
);
2553 av_strlcpy(ac_str
, "ac", 3);
2555 av_strlcat(ac_str
, stream_str
, ac_str_size
);
2556 ret
= parse_option(o
, ac_str
, layout_str
, options
);
2562 static int opt_audio_qscale(void *optctx
, const char *opt
, const char *arg
)
2564 OptionsContext
*o
= optctx
;
2565 return parse_option(o
, "q:a", arg
, options
);
2568 static int opt_filter_complex(void *optctx
, const char *opt
, const char *arg
)
2570 GROW_ARRAY(filtergraphs
, nb_filtergraphs
);
2571 if (!(filtergraphs
[nb_filtergraphs
- 1] = av_mallocz(sizeof(*filtergraphs
[0]))))
2572 return AVERROR(ENOMEM
);
2573 filtergraphs
[nb_filtergraphs
- 1]->index
= nb_filtergraphs
- 1;
2574 filtergraphs
[nb_filtergraphs
- 1]->graph_desc
= av_strdup(arg
);
2575 if (!filtergraphs
[nb_filtergraphs
- 1]->graph_desc
)
2576 return AVERROR(ENOMEM
);
2580 static int opt_filter_complex_script(void *optctx
, const char *opt
, const char *arg
)
2582 uint8_t *graph_desc
= read_file(arg
);
2584 return AVERROR(EINVAL
);
2586 GROW_ARRAY(filtergraphs
, nb_filtergraphs
);
2587 if (!(filtergraphs
[nb_filtergraphs
- 1] = av_mallocz(sizeof(*filtergraphs
[0]))))
2588 return AVERROR(ENOMEM
);
2589 filtergraphs
[nb_filtergraphs
- 1]->index
= nb_filtergraphs
- 1;
2590 filtergraphs
[nb_filtergraphs
- 1]->graph_desc
= graph_desc
;
2594 void show_help_default(const char *opt
, const char *arg
)
2596 /* per-file options have at least one of those set */
2597 const int per_file
= OPT_SPEC
| OPT_OFFSET
| OPT_PERFILE
;
2598 int show_advanced
= 0, show_avoptions
= 0;
2601 if (!strcmp(opt
, "long"))
2603 else if (!strcmp(opt
, "full"))
2604 show_advanced
= show_avoptions
= 1;
2606 av_log(NULL
, AV_LOG_ERROR
, "Unknown help option '%s'.\n", opt
);
2611 printf("Getting help:\n"
2612 " -h -- print basic options\n"
2613 " -h long -- print more options\n"
2614 " -h full -- print all options (including all format and codec specific options, very long)\n"
2615 " See man %s for detailed description of the options.\n"
2616 "\n", program_name
);
2618 show_help_options(options
, "Print help / information / capabilities:",
2621 show_help_options(options
, "Global options (affect whole program "
2622 "instead of just one file:",
2623 0, per_file
| OPT_EXIT
| OPT_EXPERT
, 0);
2625 show_help_options(options
, "Advanced global options:", OPT_EXPERT
,
2626 per_file
| OPT_EXIT
, 0);
2628 show_help_options(options
, "Per-file main options:", 0,
2629 OPT_EXPERT
| OPT_AUDIO
| OPT_VIDEO
| OPT_SUBTITLE
|
2630 OPT_EXIT
, per_file
);
2632 show_help_options(options
, "Advanced per-file options:",
2633 OPT_EXPERT
, OPT_AUDIO
| OPT_VIDEO
| OPT_SUBTITLE
, per_file
);
2635 show_help_options(options
, "Video options:",
2636 OPT_VIDEO
, OPT_EXPERT
| OPT_AUDIO
, 0);
2638 show_help_options(options
, "Advanced Video options:",
2639 OPT_EXPERT
| OPT_VIDEO
, OPT_AUDIO
, 0);
2641 show_help_options(options
, "Audio options:",
2642 OPT_AUDIO
, OPT_EXPERT
| OPT_VIDEO
, 0);
2644 show_help_options(options
, "Advanced Audio options:",
2645 OPT_EXPERT
| OPT_AUDIO
, OPT_VIDEO
, 0);
2646 show_help_options(options
, "Subtitle options:",
2647 OPT_SUBTITLE
, 0, 0);
2650 if (show_avoptions
) {
2651 int flags
= AV_OPT_FLAG_DECODING_PARAM
| AV_OPT_FLAG_ENCODING_PARAM
;
2652 show_help_children(avcodec_get_class(), flags
);
2653 show_help_children(avformat_get_class(), flags
);
2655 show_help_children(sws_get_class(), flags
);
2657 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM
);
2658 show_help_children(avfilter_get_class(), AV_OPT_FLAG_VIDEO_PARAM
| AV_OPT_FLAG_AUDIO_PARAM
| AV_OPT_FLAG_FILTERING_PARAM
);
2662 void show_usage(void)
2664 av_log(NULL
, AV_LOG_INFO
, "Hyper fast Audio and Video encoder\n");
2665 av_log(NULL
, AV_LOG_INFO
, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name
);
2666 av_log(NULL
, AV_LOG_INFO
, "\n");
2674 static const OptionGroupDef groups
[] = {
2675 [GROUP_OUTFILE
] = { "output file", NULL
, OPT_OUTPUT
},
2676 [GROUP_INFILE
] = { "input file", "i", OPT_INPUT
},
2679 static int open_files(OptionGroupList
*l
, const char *inout
,
2680 int (*open_file
)(OptionsContext
*, const char*))
2684 for (i
= 0; i
< l
->nb_groups
; i
++) {
2685 OptionGroup
*g
= &l
->groups
[i
];
2691 ret
= parse_optgroup(&o
, g
);
2693 av_log(NULL
, AV_LOG_ERROR
, "Error parsing options for %s file "
2694 "%s.\n", inout
, g
->arg
);
2698 av_log(NULL
, AV_LOG_DEBUG
, "Opening an %s file: %s.\n", inout
, g
->arg
);
2699 ret
= open_file(&o
, g
->arg
);
2702 av_log(NULL
, AV_LOG_ERROR
, "Error opening %s file %s.\n",
2706 av_log(NULL
, AV_LOG_DEBUG
, "Successfully opened the file.\n");
2712 int ffmpeg_parse_options(int argc
, char **argv
)
2714 OptionParseContext octx
;
2718 memset(&octx
, 0, sizeof(octx
));
2720 /* split the commandline into an internal representation */
2721 ret
= split_commandline(&octx
, argc
, argv
, options
, groups
,
2722 FF_ARRAY_ELEMS(groups
));
2724 av_log(NULL
, AV_LOG_FATAL
, "Error splitting the argument list: ");
2728 /* apply global options */
2729 ret
= parse_optgroup(NULL
, &octx
.global_opts
);
2731 av_log(NULL
, AV_LOG_FATAL
, "Error parsing global options: ");
2735 /* open input files */
2736 ret
= open_files(&octx
.groups
[GROUP_INFILE
], "input", open_input_file
);
2738 av_log(NULL
, AV_LOG_FATAL
, "Error opening input files: ");
2742 /* open output files */
2743 ret
= open_files(&octx
.groups
[GROUP_OUTFILE
], "output", open_output_file
);
2745 av_log(NULL
, AV_LOG_FATAL
, "Error opening output files: ");
2750 uninit_parse_context(&octx
);
2752 av_strerror(ret
, error
, sizeof(error
));
2753 av_log(NULL
, AV_LOG_FATAL
, "%s\n", error
);
2758 static int opt_progress(void *optctx
, const char *opt
, const char *arg
)
2760 AVIOContext
*avio
= NULL
;
2763 if (!strcmp(arg
, "-"))
2765 ret
= avio_open2(&avio
, arg
, AVIO_FLAG_WRITE
, &int_cb
, NULL
);
2767 av_log(NULL
, AV_LOG_ERROR
, "Failed to open progress URL \"%s\": %s\n",
2768 arg
, av_err2str(ret
));
2771 progress_avio
= avio
;
2775 #define OFFSET(x) offsetof(OptionsContext, x)
2776 const OptionDef options
[] = {
2778 #include "cmdutils_common_opts.h"
2779 { "f", HAS_ARG
| OPT_STRING
| OPT_OFFSET
|
2780 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(format
) },
2781 "force format", "fmt" },
2782 { "y", OPT_BOOL
, { &file_overwrite
},
2783 "overwrite output files" },
2784 { "n", OPT_BOOL
, { &no_file_overwrite
},
2785 "never overwrite output files" },
2786 { "c", HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2787 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(codec_names
) },
2788 "codec name", "codec" },
2789 { "codec", HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2790 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(codec_names
) },
2791 "codec name", "codec" },
2792 { "pre", HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2793 OPT_OUTPUT
, { .off
= OFFSET(presets
) },
2794 "preset name", "preset" },
2795 { "map", HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
|
2796 OPT_OUTPUT
, { .func_arg
= opt_map
},
2797 "set input stream mapping",
2798 "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
2799 { "map_channel", HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_map_channel
},
2800 "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
2801 { "map_metadata", HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2802 OPT_OUTPUT
, { .off
= OFFSET(metadata_map
) },
2803 "set metadata information of outfile from infile",
2804 "outfile[,metadata]:infile[,metadata]" },
2805 { "map_chapters", HAS_ARG
| OPT_INT
| OPT_EXPERT
| OPT_OFFSET
|
2806 OPT_OUTPUT
, { .off
= OFFSET(chapters_input_file
) },
2807 "set chapters mapping", "input_file_index" },
2808 { "t", HAS_ARG
| OPT_TIME
| OPT_OFFSET
|
2809 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(recording_time
) },
2810 "record or transcode \"duration\" seconds of audio/video",
2812 { "to", HAS_ARG
| OPT_TIME
| OPT_OFFSET
| OPT_OUTPUT
, { .off
= OFFSET(stop_time
) },
2813 "record or transcode stop time", "time_stop" },
2814 { "fs", HAS_ARG
| OPT_INT64
| OPT_OFFSET
| OPT_OUTPUT
, { .off
= OFFSET(limit_filesize
) },
2815 "set the limit file size in bytes", "limit_size" },
2816 { "ss", HAS_ARG
| OPT_TIME
| OPT_OFFSET
|
2817 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(start_time
) },
2818 "set the start time offset", "time_off" },
2819 { "accurate_seek", OPT_BOOL
| OPT_OFFSET
| OPT_EXPERT
|
2820 OPT_INPUT
, { .off
= OFFSET(accurate_seek
) },
2821 "enable/disable accurate seeking with -ss" },
2822 { "itsoffset", HAS_ARG
| OPT_TIME
| OPT_OFFSET
|
2823 OPT_EXPERT
| OPT_INPUT
, { .off
= OFFSET(input_ts_offset
) },
2824 "set the input ts offset", "time_off" },
2825 { "itsscale", HAS_ARG
| OPT_DOUBLE
| OPT_SPEC
|
2826 OPT_EXPERT
| OPT_INPUT
, { .off
= OFFSET(ts_scale
) },
2827 "set the input ts scale", "scale" },
2828 { "timestamp", HAS_ARG
| OPT_PERFILE
, { .func_arg
= opt_recording_timestamp
},
2829 "set the recording timestamp ('now' to set the current time)", "time" },
2830 { "metadata", HAS_ARG
| OPT_STRING
| OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(metadata
) },
2831 "add metadata", "string=string" },
2832 { "dframes", HAS_ARG
| OPT_PERFILE
| OPT_EXPERT
|
2833 OPT_OUTPUT
, { .func_arg
= opt_data_frames
},
2834 "set the number of data frames to output", "number" },
2835 { "benchmark", OPT_BOOL
| OPT_EXPERT
, { &do_benchmark
},
2836 "add timings for benchmarking" },
2837 { "benchmark_all", OPT_BOOL
| OPT_EXPERT
, { &do_benchmark_all
},
2838 "add timings for each task" },
2839 { "progress", HAS_ARG
| OPT_EXPERT
, { .func_arg
= opt_progress
},
2840 "write program-readable progress information", "url" },
2841 { "stdin", OPT_BOOL
| OPT_EXPERT
, { &stdin_interaction
},
2842 "enable or disable interaction on standard input" },
2843 { "timelimit", HAS_ARG
| OPT_EXPERT
, { .func_arg
= opt_timelimit
},
2844 "set max runtime in seconds", "limit" },
2845 { "dump", OPT_BOOL
| OPT_EXPERT
, { &do_pkt_dump
},
2846 "dump each input packet" },
2847 { "hex", OPT_BOOL
| OPT_EXPERT
, { &do_hex_dump
},
2848 "when dumping packets, also dump the payload" },
2849 { "re", OPT_BOOL
| OPT_EXPERT
| OPT_OFFSET
|
2850 OPT_INPUT
, { .off
= OFFSET(rate_emu
) },
2851 "read input at native frame rate", "" },
2852 { "target", HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_target
},
2853 "specify target file type (\"vcd\", \"svcd\", \"dvd\","
2854 " \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
2855 { "vsync", HAS_ARG
| OPT_EXPERT
, { opt_vsync
},
2856 "video sync method", "" },
2857 { "async", HAS_ARG
| OPT_INT
| OPT_EXPERT
, { &audio_sync_method
},
2858 "audio sync method", "" },
2859 { "adrift_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, { &audio_drift_threshold
},
2860 "audio drift threshold", "threshold" },
2861 { "copyts", OPT_BOOL
| OPT_EXPERT
, { ©_ts
},
2862 "copy timestamps" },
2863 { "start_at_zero", OPT_BOOL
| OPT_EXPERT
, { &start_at_zero
},
2864 "shift input timestamps to start at 0 when using copyts" },
2865 { "copytb", HAS_ARG
| OPT_INT
| OPT_EXPERT
, { ©_tb
},
2866 "copy input stream time base when stream copying", "mode" },
2867 { "shortest", OPT_BOOL
| OPT_EXPERT
| OPT_OFFSET
|
2868 OPT_OUTPUT
, { .off
= OFFSET(shortest
) },
2869 "finish encoding within shortest input" },
2870 { "apad", OPT_STRING
| HAS_ARG
| OPT_SPEC
|
2871 OPT_OUTPUT
, { .off
= OFFSET(apad
) },
2873 { "dts_delta_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, { &dts_delta_threshold
},
2874 "timestamp discontinuity delta threshold", "threshold" },
2875 { "dts_error_threshold", HAS_ARG
| OPT_FLOAT
| OPT_EXPERT
, { &dts_error_threshold
},
2876 "timestamp error delta threshold", "threshold" },
2877 { "xerror", OPT_BOOL
| OPT_EXPERT
, { &exit_on_error
},
2878 "exit on error", "error" },
2879 { "copyinkf", OPT_BOOL
| OPT_EXPERT
| OPT_SPEC
|
2880 OPT_OUTPUT
, { .off
= OFFSET(copy_initial_nonkeyframes
) },
2881 "copy initial non-keyframes" },
2882 { "copypriorss", OPT_INT
| HAS_ARG
| OPT_EXPERT
| OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(copy_prior_start
) },
2883 "copy or discard frames before start time" },
2884 { "frames", OPT_INT64
| HAS_ARG
| OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(max_frames
) },
2885 "set the number of frames to output", "number" },
2886 { "tag", OPT_STRING
| HAS_ARG
| OPT_SPEC
|
2887 OPT_EXPERT
| OPT_OUTPUT
| OPT_INPUT
, { .off
= OFFSET(codec_tags
) },
2888 "force codec tag/fourcc", "fourcc/tag" },
2889 { "q", HAS_ARG
| OPT_EXPERT
| OPT_DOUBLE
|
2890 OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(qscale
) },
2891 "use fixed quality scale (VBR)", "q" },
2892 { "qscale", HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
|
2893 OPT_OUTPUT
, { .func_arg
= opt_qscale
},
2894 "use fixed quality scale (VBR)", "q" },
2895 { "profile", HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_profile
},
2896 "set profile", "profile" },
2897 { "filter", HAS_ARG
| OPT_STRING
| OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(filters
) },
2898 "set stream filtergraph", "filter_graph" },
2899 { "filter_script", HAS_ARG
| OPT_STRING
| OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(filter_scripts
) },
2900 "read stream filtergraph description from a file", "filename" },
2901 { "reinit_filter", HAS_ARG
| OPT_INT
| OPT_SPEC
| OPT_INPUT
, { .off
= OFFSET(reinit_filters
) },
2902 "reinit filtergraph on input parameter changes", "" },
2903 { "filter_complex", HAS_ARG
| OPT_EXPERT
, { .func_arg
= opt_filter_complex
},
2904 "create a complex filtergraph", "graph_description" },
2905 { "lavfi", HAS_ARG
| OPT_EXPERT
, { .func_arg
= opt_filter_complex
},
2906 "create a complex filtergraph", "graph_description" },
2907 { "filter_complex_script", HAS_ARG
| OPT_EXPERT
, { .func_arg
= opt_filter_complex_script
},
2908 "read complex filtergraph description from a file", "filename" },
2909 { "stats", OPT_BOOL
, { &print_stats
},
2910 "print progress report during encoding", },
2911 { "attach", HAS_ARG
| OPT_PERFILE
| OPT_EXPERT
|
2912 OPT_OUTPUT
, { .func_arg
= opt_attach
},
2913 "add an attachment to the output file", "filename" },
2914 { "dump_attachment", HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2915 OPT_EXPERT
| OPT_INPUT
, { .off
= OFFSET(dump_attachment
) },
2916 "extract an attachment into a file", "filename" },
2917 { "debug_ts", OPT_BOOL
| OPT_EXPERT
, { &debug_ts
},
2918 "print timestamp debugging info" },
2919 { "max_error_rate", HAS_ARG
| OPT_FLOAT
, { &max_error_rate
},
2920 "maximum error rate", "ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success." },
2921 { "discard", OPT_STRING
| HAS_ARG
| OPT_SPEC
|
2922 OPT_INPUT
, { .off
= OFFSET(discard
) },
2926 { "vframes", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_video_frames
},
2927 "set the number of video frames to output", "number" },
2928 { "r", OPT_VIDEO
| HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2929 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(frame_rates
) },
2930 "set frame rate (Hz value, fraction or abbreviation)", "rate" },
2931 { "s", OPT_VIDEO
| HAS_ARG
| OPT_SUBTITLE
| OPT_STRING
| OPT_SPEC
|
2932 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(frame_sizes
) },
2933 "set frame size (WxH or abbreviation)", "size" },
2934 { "aspect", OPT_VIDEO
| HAS_ARG
| OPT_STRING
| OPT_SPEC
|
2935 OPT_OUTPUT
, { .off
= OFFSET(frame_aspect_ratios
) },
2936 "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
2937 { "pix_fmt", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_STRING
| OPT_SPEC
|
2938 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(frame_pix_fmts
) },
2939 "set pixel format", "format" },
2940 { "bits_per_raw_sample", OPT_VIDEO
| OPT_INT
| HAS_ARG
, { &frame_bits_per_raw_sample
},
2941 "set the number of bits per raw sample", "number" },
2942 { "intra", OPT_VIDEO
| OPT_BOOL
| OPT_EXPERT
, { &intra_only
},
2943 "deprecated use -g 1" },
2944 { "vn", OPT_VIDEO
| OPT_BOOL
| OPT_OFFSET
| OPT_INPUT
| OPT_OUTPUT
,{ .off
= OFFSET(video_disable
) },
2946 { "rc_override", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_STRING
| OPT_SPEC
|
2947 OPT_OUTPUT
, { .off
= OFFSET(rc_overrides
) },
2948 "rate control override for specific intervals", "override" },
2949 { "vcodec", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_INPUT
|
2950 OPT_OUTPUT
, { .func_arg
= opt_video_codec
},
2951 "force video codec ('copy' to copy stream)", "codec" },
2952 { "sameq", OPT_VIDEO
| OPT_EXPERT
, { .func_arg
= opt_sameq
},
2954 { "same_quant", OPT_VIDEO
| OPT_EXPERT
, { .func_arg
= opt_sameq
},
2956 { "timecode", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_timecode
},
2957 "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
2958 { "pass", OPT_VIDEO
| HAS_ARG
| OPT_SPEC
| OPT_INT
| OPT_OUTPUT
, { .off
= OFFSET(pass
) },
2959 "select the pass number (1 to 3)", "n" },
2960 { "passlogfile", OPT_VIDEO
| HAS_ARG
| OPT_STRING
| OPT_EXPERT
| OPT_SPEC
|
2961 OPT_OUTPUT
, { .off
= OFFSET(passlogfiles
) },
2962 "select two pass log file name prefix", "prefix" },
2963 { "deinterlace", OPT_VIDEO
| OPT_BOOL
| OPT_EXPERT
, { &do_deinterlace
},
2964 "this option is deprecated, use the yadif filter instead" },
2965 { "psnr", OPT_VIDEO
| OPT_BOOL
| OPT_EXPERT
, { &do_psnr
},
2966 "calculate PSNR of compressed frames" },
2967 { "vstats", OPT_VIDEO
| OPT_EXPERT
, { &opt_vstats
},
2968 "dump video coding statistics to file" },
2969 { "vstats_file", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
, { opt_vstats_file
},
2970 "dump video coding statistics to file", "file" },
2971 { "vf", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_video_filters
},
2972 "set video filters", "filter_graph" },
2973 { "intra_matrix", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_STRING
| OPT_SPEC
|
2974 OPT_OUTPUT
, { .off
= OFFSET(intra_matrices
) },
2975 "specify intra matrix coeffs", "matrix" },
2976 { "inter_matrix", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_STRING
| OPT_SPEC
|
2977 OPT_OUTPUT
, { .off
= OFFSET(inter_matrices
) },
2978 "specify inter matrix coeffs", "matrix" },
2979 { "chroma_intra_matrix", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_STRING
| OPT_SPEC
|
2980 OPT_OUTPUT
, { .off
= OFFSET(chroma_intra_matrices
) },
2981 "specify intra matrix coeffs", "matrix" },
2982 { "top", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_INT
| OPT_SPEC
|
2983 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(top_field_first
) },
2984 "top=1/bottom=0/auto=-1 field first", "" },
2985 { "vtag", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
|
2986 OPT_OUTPUT
, { .func_arg
= opt_old2new
},
2987 "force video tag/fourcc", "fourcc/tag" },
2988 { "qphist", OPT_VIDEO
| OPT_BOOL
| OPT_EXPERT
, { &qp_hist
},
2989 "show QP histogram" },
2990 { "force_fps", OPT_VIDEO
| OPT_BOOL
| OPT_EXPERT
| OPT_SPEC
|
2991 OPT_OUTPUT
, { .off
= OFFSET(force_fps
) },
2992 "force the selected framerate, disable the best supported framerate selection" },
2993 { "streamid", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
|
2994 OPT_OUTPUT
, { .func_arg
= opt_streamid
},
2995 "set the value of an outfile streamid", "streamIndex:value" },
2996 { "force_key_frames", OPT_VIDEO
| OPT_STRING
| HAS_ARG
| OPT_EXPERT
|
2997 OPT_SPEC
| OPT_OUTPUT
, { .off
= OFFSET(forced_key_frames
) },
2998 "force key frames at specified timestamps", "timestamps" },
2999 { "ab", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_bitrate
},
3000 "audio bitrate (please use -b:a)", "bitrate" },
3001 { "b", OPT_VIDEO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_bitrate
},
3002 "video bitrate (please use -b:v)", "bitrate" },
3003 { "hwaccel", OPT_VIDEO
| OPT_STRING
| HAS_ARG
| OPT_EXPERT
|
3004 OPT_SPEC
| OPT_INPUT
, { .off
= OFFSET(hwaccels
) },
3005 "use HW accelerated decoding", "hwaccel name" },
3006 { "hwaccel_device", OPT_VIDEO
| OPT_STRING
| HAS_ARG
| OPT_EXPERT
|
3007 OPT_SPEC
| OPT_INPUT
, { .off
= OFFSET(hwaccel_devices
) },
3008 "select a device for HW acceleration" "devicename" },
3010 { "vdpau_api_ver", HAS_ARG
| OPT_INT
| OPT_EXPERT
, { &vdpau_api_ver
}, "" },
3014 { "aframes", OPT_AUDIO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_audio_frames
},
3015 "set the number of audio frames to output", "number" },
3016 { "aq", OPT_AUDIO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_audio_qscale
},
3017 "set audio quality (codec-specific)", "quality", },
3018 { "ar", OPT_AUDIO
| HAS_ARG
| OPT_INT
| OPT_SPEC
|
3019 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(audio_sample_rate
) },
3020 "set audio sampling rate (in Hz)", "rate" },
3021 { "ac", OPT_AUDIO
| HAS_ARG
| OPT_INT
| OPT_SPEC
|
3022 OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(audio_channels
) },
3023 "set number of audio channels", "channels" },
3024 { "an", OPT_AUDIO
| OPT_BOOL
| OPT_OFFSET
| OPT_INPUT
| OPT_OUTPUT
,{ .off
= OFFSET(audio_disable
) },
3026 { "acodec", OPT_AUDIO
| HAS_ARG
| OPT_PERFILE
|
3027 OPT_INPUT
| OPT_OUTPUT
, { .func_arg
= opt_audio_codec
},
3028 "force audio codec ('copy' to copy stream)", "codec" },
3029 { "atag", OPT_AUDIO
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
|
3030 OPT_OUTPUT
, { .func_arg
= opt_old2new
},
3031 "force audio tag/fourcc", "fourcc/tag" },
3032 { "vol", OPT_AUDIO
| HAS_ARG
| OPT_INT
, { &audio_volume
},
3033 "change audio volume (256=normal)" , "volume" },
3034 { "sample_fmt", OPT_AUDIO
| HAS_ARG
| OPT_EXPERT
| OPT_SPEC
|
3035 OPT_STRING
| OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(sample_fmts
) },
3036 "set sample format", "format" },
3037 { "channel_layout", OPT_AUDIO
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
|
3038 OPT_INPUT
| OPT_OUTPUT
, { .func_arg
= opt_channel_layout
},
3039 "set channel layout", "layout" },
3040 { "af", OPT_AUDIO
| HAS_ARG
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_audio_filters
},
3041 "set audio filters", "filter_graph" },
3042 { "guess_layout_max", OPT_AUDIO
| HAS_ARG
| OPT_INT
| OPT_SPEC
| OPT_EXPERT
| OPT_INPUT
, { .off
= OFFSET(guess_layout_max
) },
3043 "set the maximum number of channels to try to guess the channel layout" },
3045 /* subtitle options */
3046 { "sn", OPT_SUBTITLE
| OPT_BOOL
| OPT_OFFSET
| OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(subtitle_disable
) },
3047 "disable subtitle" },
3048 { "scodec", OPT_SUBTITLE
| HAS_ARG
| OPT_PERFILE
| OPT_INPUT
| OPT_OUTPUT
, { .func_arg
= opt_subtitle_codec
},
3049 "force subtitle codec ('copy' to copy stream)", "codec" },
3050 { "stag", OPT_SUBTITLE
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_old2new
}
3051 , "force subtitle tag/fourcc", "fourcc/tag" },
3052 { "fix_sub_duration", OPT_BOOL
| OPT_EXPERT
| OPT_SUBTITLE
| OPT_SPEC
| OPT_INPUT
, { .off
= OFFSET(fix_sub_duration
) },
3053 "fix subtitles duration" },
3054 { "canvas_size", OPT_SUBTITLE
| HAS_ARG
| OPT_STRING
| OPT_SPEC
| OPT_INPUT
, { .off
= OFFSET(canvas_sizes
) },
3055 "set canvas size (WxH or abbreviation)", "size" },
3058 { "vc", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, { .func_arg
= opt_video_channel
},
3059 "deprecated, use -channel", "channel" },
3060 { "tvstd", HAS_ARG
| OPT_EXPERT
| OPT_VIDEO
, { .func_arg
= opt_video_standard
},
3061 "deprecated, use -standard", "standard" },
3062 { "isync", OPT_BOOL
| OPT_EXPERT
, { &input_sync
}, "this option is deprecated and does nothing", "" },
3065 { "muxdelay", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
| OPT_OFFSET
| OPT_OUTPUT
, { .off
= OFFSET(mux_max_delay
) },
3066 "set the maximum demux-decode delay", "seconds" },
3067 { "muxpreload", OPT_FLOAT
| HAS_ARG
| OPT_EXPERT
| OPT_OFFSET
| OPT_OUTPUT
, { .off
= OFFSET(mux_preload
) },
3068 "set the initial demux-decode delay", "seconds" },
3069 { "override_ffserver", OPT_BOOL
| OPT_EXPERT
| OPT_OUTPUT
, { &override_ffserver
},
3070 "override the options from ffserver", "" },
3072 { "bsf", HAS_ARG
| OPT_STRING
| OPT_SPEC
| OPT_EXPERT
| OPT_OUTPUT
, { .off
= OFFSET(bitstream_filters
) },
3073 "A comma-separated list of bitstream filters", "bitstream_filters" },
3074 { "absf", HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_old2new
},
3075 "deprecated", "audio bitstream_filters" },
3076 { "vbsf", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_old2new
},
3077 "deprecated", "video bitstream_filters" },
3079 { "apre", HAS_ARG
| OPT_AUDIO
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_preset
},
3080 "set the audio options to the indicated preset", "preset" },
3081 { "vpre", OPT_VIDEO
| HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_preset
},
3082 "set the video options to the indicated preset", "preset" },
3083 { "spre", HAS_ARG
| OPT_SUBTITLE
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_preset
},
3084 "set the subtitle options to the indicated preset", "preset" },
3085 { "fpre", HAS_ARG
| OPT_EXPERT
| OPT_PERFILE
| OPT_OUTPUT
, { .func_arg
= opt_preset
},
3086 "set options from indicated preset file", "filename" },
3087 /* data codec support */
3088 { "dcodec", HAS_ARG
| OPT_DATA
| OPT_PERFILE
| OPT_EXPERT
| OPT_INPUT
| OPT_OUTPUT
, { .func_arg
= opt_data_codec
},
3089 "force data codec ('copy' to copy stream)", "codec" },
3090 { "dn", OPT_BOOL
| OPT_VIDEO
| OPT_OFFSET
| OPT_INPUT
| OPT_OUTPUT
, { .off
= OFFSET(data_disable
) },