Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
77bd1bc7
Commit
77bd1bc7
authored
Jun 08, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avconv: use new options parser.
parent
0ec1642b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
116 additions
and
41 deletions
+116
-41
avconv.c
avconv.c
+5
-14
avconv.h
avconv.h
+4
-0
avconv_opt.c
avconv_opt.c
+107
-27
No files found.
avconv.c
View file @
77bd1bc7
...
...
@@ -2345,22 +2345,13 @@ static int64_t getmaxrss(void)
#endif
}
static
void
parse_cpuflags
(
int
argc
,
char
**
argv
,
const
OptionDef
*
options
)
{
int
idx
=
locate_option
(
argc
,
argv
,
options
,
"cpuflags"
);
if
(
idx
&&
argv
[
idx
+
1
])
opt_cpuflags
(
NULL
,
"cpuflags"
,
argv
[
idx
+
1
]);
}
int
main
(
int
argc
,
char
**
argv
)
{
OptionsContext
o
=
{
0
}
;
int
ret
;
int64_t
ti
;
atexit
(
exit_program
);
reset_options
(
&
o
);
av_log_set_flags
(
AV_LOG_SKIP_REPEATED
);
parse_loglevel
(
argc
,
argv
,
options
);
...
...
@@ -2374,10 +2365,10 @@ int main(int argc, char **argv)
show_banner
();
parse_cpuflags
(
argc
,
argv
,
options
);
/* parse options */
parse_options
(
&
o
,
argc
,
argv
,
options
,
opt_output_file
);
/* parse options and open all input/output files */
ret
=
avconv_parse_options
(
argc
,
argv
);
if
(
ret
<
0
)
exit
(
1
);
if
(
nb_output_files
<=
0
&&
nb_input_files
==
0
)
{
show_usage
();
...
...
avconv.h
View file @
77bd1bc7
...
...
@@ -67,6 +67,8 @@ typedef struct MetadataMap {
}
MetadataMap
;
typedef
struct
OptionsContext
{
OptionGroup
*
g
;
/* input/output options */
int64_t
start_time
;
const
char
*
format
;
...
...
@@ -361,4 +363,6 @@ int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOu
int
ist_in_filtergraph
(
FilterGraph
*
fg
,
InputStream
*
ist
);
FilterGraph
*
init_simple_filtergraph
(
InputStream
*
ist
,
OutputStream
*
ost
);
int
avconv_parse_options
(
int
argc
,
char
**
argv
);
#endif
/* AVCONV_H */
avconv_opt.c
View file @
77bd1bc7
...
...
@@ -78,7 +78,7 @@ static int intra_dc_precision = 8;
static
int
using_stdin
=
0
;
static
int
input_sync
;
void
rese
t_options
(
OptionsContext
*
o
)
static
void
unini
t_options
(
OptionsContext
*
o
)
{
const
OptionDef
*
po
=
options
;
int
i
;
...
...
@@ -107,19 +107,18 @@ void reset_options(OptionsContext *o)
av_freep
(
&
o
->
stream_maps
);
av_freep
(
&
o
->
meta_data_maps
);
av_freep
(
&
o
->
streamid_map
);
}
static
void
init_options
(
OptionsContext
*
o
)
{
memset
(
o
,
0
,
sizeof
(
*
o
));
o
->
mux_max_delay
=
0
.
7
;
o
->
recording_time
=
INT64_MAX
;
o
->
limit_filesize
=
UINT64_MAX
;
o
->
chapters_input_file
=
INT_MAX
;
uninit_opts
();
init_opts
();
}
static
double
parse_frame_aspect_ratio
(
const
char
*
arg
)
{
int
x
=
0
,
y
=
0
;
...
...
@@ -449,7 +448,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
ist
->
file_index
=
nb_input_files
;
ist
->
discard
=
1
;
st
->
discard
=
AVDISCARD_ALL
;
ist
->
opts
=
filter_codec_opts
(
codec_opts
,
ist
->
st
->
codec
->
codec_id
,
ic
,
st
,
NULL
);
ist
->
opts
=
filter_codec_opts
(
o
->
g
->
codec_opts
,
ist
->
st
->
codec
->
codec_id
,
ic
,
st
,
NULL
);
ist
->
ts_scale
=
1
.
0
;
MATCH_PER_STREAM_OPT
(
ts_scale
,
dbl
,
ist
->
ts_scale
,
ic
,
st
);
...
...
@@ -545,9 +544,8 @@ static void dump_attachment(AVStream *st, const char *filename)
avio_close
(
out
);
}
static
int
op
t_input_file
(
void
*
optctx
,
const
char
*
opt
,
const
char
*
filename
)
static
int
op
en_input_file
(
OptionsContext
*
o
,
const
char
*
filename
)
{
OptionsContext
*
o
=
optctx
;
AVFormatContext
*
ic
;
AVInputFormat
*
file_iformat
=
NULL
;
int
err
,
i
,
ret
;
...
...
@@ -577,7 +575,7 @@ static int opt_input_file(void *optctx, const char *opt, const char *filename)
}
if
(
o
->
nb_audio_sample_rate
)
{
snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
o
->
audio_sample_rate
[
o
->
nb_audio_sample_rate
-
1
].
u
.
i
);
av_dict_set
(
&
format_opts
,
"sample_rate"
,
buf
,
0
);
av_dict_set
(
&
o
->
g
->
format_opts
,
"sample_rate"
,
buf
,
0
);
}
if
(
o
->
nb_audio_channels
)
{
/* because we set audio_channels based on both the "ac" and
...
...
@@ -588,7 +586,7 @@ static int opt_input_file(void *optctx, const char *opt, const char *filename)
AV_OPT_SEARCH_FAKE_OBJ
))
{
snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
o
->
audio_channels
[
o
->
nb_audio_channels
-
1
].
u
.
i
);
av_dict_set
(
&
format_opts
,
"channels"
,
buf
,
0
);
av_dict_set
(
&
o
->
g
->
format_opts
,
"channels"
,
buf
,
0
);
}
}
if
(
o
->
nb_frame_rates
)
{
...
...
@@ -597,33 +595,33 @@ static int opt_input_file(void *optctx, const char *opt, const char *filename)
if
(
file_iformat
&&
file_iformat
->
priv_class
&&
av_opt_find
(
&
file_iformat
->
priv_class
,
"framerate"
,
NULL
,
0
,
AV_OPT_SEARCH_FAKE_OBJ
))
{
av_dict_set
(
&
format_opts
,
"framerate"
,
av_dict_set
(
&
o
->
g
->
format_opts
,
"framerate"
,
o
->
frame_rates
[
o
->
nb_frame_rates
-
1
].
u
.
str
,
0
);
}
}
if
(
o
->
nb_frame_sizes
)
{
av_dict_set
(
&
format_opts
,
"video_size"
,
o
->
frame_sizes
[
o
->
nb_frame_sizes
-
1
].
u
.
str
,
0
);
av_dict_set
(
&
o
->
g
->
format_opts
,
"video_size"
,
o
->
frame_sizes
[
o
->
nb_frame_sizes
-
1
].
u
.
str
,
0
);
}
if
(
o
->
nb_frame_pix_fmts
)
av_dict_set
(
&
format_opts
,
"pixel_format"
,
o
->
frame_pix_fmts
[
o
->
nb_frame_pix_fmts
-
1
].
u
.
str
,
0
);
av_dict_set
(
&
o
->
g
->
format_opts
,
"pixel_format"
,
o
->
frame_pix_fmts
[
o
->
nb_frame_pix_fmts
-
1
].
u
.
str
,
0
);
ic
->
flags
|=
AVFMT_FLAG_NONBLOCK
;
ic
->
interrupt_callback
=
int_cb
;
/* open the input file with generic libav function */
err
=
avformat_open_input
(
&
ic
,
filename
,
file_iformat
,
&
format_opts
);
err
=
avformat_open_input
(
&
ic
,
filename
,
file_iformat
,
&
o
->
g
->
format_opts
);
if
(
err
<
0
)
{
print_error
(
filename
,
err
);
exit
(
1
);
}
assert_avoptions
(
format_opts
);
assert_avoptions
(
o
->
g
->
format_opts
);
/* apply forced codec ids */
for
(
i
=
0
;
i
<
ic
->
nb_streams
;
i
++
)
choose_decoder
(
o
,
ic
,
ic
->
streams
[
i
]);
/* Set AVCodecContext options for avformat_find_stream_info */
opts
=
setup_find_stream_info_opts
(
ic
,
codec_opts
);
opts
=
setup_find_stream_info_opts
(
ic
,
o
->
g
->
codec_opts
);
orig_nb_streams
=
ic
->
nb_streams
;
/* If not enough info to get the stream parameters, we decode the
...
...
@@ -680,7 +678,6 @@ static int opt_input_file(void *optctx, const char *opt, const char *filename)
av_dict_free
(
&
opts
[
i
]);
av_freep
(
&
opts
);
reset_options
(
o
);
return
0
;
}
...
...
@@ -777,7 +774,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
AVIOContext
*
s
=
NULL
;
char
*
buf
=
NULL
,
*
arg
=
NULL
,
*
preset
=
NULL
;
ost
->
opts
=
filter_codec_opts
(
codec_opts
,
ost
->
enc
->
id
,
oc
,
st
,
ost
->
enc
);
ost
->
opts
=
filter_codec_opts
(
o
->
g
->
codec_opts
,
ost
->
enc
->
id
,
oc
,
st
,
ost
->
enc
);
MATCH_PER_STREAM_OPT
(
presets
,
str
,
preset
,
oc
,
st
);
if
(
preset
&&
(
!
(
ret
=
get_preset_file_2
(
preset
,
ost
->
enc
->
name
,
&
s
))))
{
...
...
@@ -845,7 +842,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
if
(
oc
->
oformat
->
flags
&
AVFMT_GLOBALHEADER
)
st
->
codec
->
flags
|=
CODEC_FLAG_GLOBAL_HEADER
;
av_opt_get_int
(
sws_opts
,
"sws_flags"
,
0
,
&
ost
->
sws_flags
);
av_opt_get_int
(
o
->
g
->
sws_opts
,
"sws_flags"
,
0
,
&
ost
->
sws_flags
);
ost
->
pix_fmts
[
0
]
=
ost
->
pix_fmts
[
1
]
=
AV_PIX_FMT_NONE
;
...
...
@@ -1169,9 +1166,8 @@ static int configure_complex_filters(void)
return
0
;
}
void
opt_output_file
(
void
*
optctx
,
const
char
*
filename
)
static
int
open_output_file
(
OptionsContext
*
o
,
const
char
*
filename
)
{
OptionsContext
*
o
=
optctx
;
AVFormatContext
*
oc
;
int
i
,
j
,
err
;
AVOutputFormat
*
file_oformat
;
...
...
@@ -1378,7 +1374,7 @@ loop_end:
output_files
[
nb_output_files
-
1
]
->
start_time
=
o
->
start_time
;
output_files
[
nb_output_files
-
1
]
->
limit_filesize
=
o
->
limit_filesize
;
output_files
[
nb_output_files
-
1
]
->
shortest
=
o
->
shortest
;
av_dict_copy
(
&
output_files
[
nb_output_files
-
1
]
->
opts
,
format_opts
,
0
);
av_dict_copy
(
&
output_files
[
nb_output_files
-
1
]
->
opts
,
o
->
g
->
format_opts
,
0
);
/* check filename in case of an image number is expected */
if
(
oc
->
oformat
->
flags
&
AVFMT_NEEDNUMBER
)
{
...
...
@@ -1500,7 +1496,7 @@ loop_end:
}
}
re
set_options
(
o
)
;
re
turn
0
;
}
static
int
opt_target
(
void
*
optctx
,
const
char
*
opt
,
const
char
*
arg
)
...
...
@@ -1858,6 +1854,94 @@ void show_usage(void)
printf
(
"
\n
"
);
}
enum
OptGroup
{
GROUP_OUTFILE
,
GROUP_INFILE
,
};
static
const
OptionGroupDef
groups
[]
=
{
[
GROUP_OUTFILE
]
=
{
"output file"
,
NULL
},
[
GROUP_INFILE
]
=
{
"input file"
,
"i"
},
{
0
},
};
static
int
open_files
(
OptionGroupList
*
l
,
const
char
*
inout
,
int
(
*
open_file
)(
OptionsContext
*
,
const
char
*
))
{
int
i
,
ret
;
for
(
i
=
0
;
i
<
l
->
nb_groups
;
i
++
)
{
OptionGroup
*
g
=
&
l
->
groups
[
i
];
OptionsContext
o
;
init_options
(
&
o
);
o
.
g
=
g
;
ret
=
parse_optgroup
(
&
o
,
g
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error parsing options for %s file "
"%s.
\n
"
,
inout
,
g
->
arg
);
return
ret
;
}
av_log
(
NULL
,
AV_LOG_DEBUG
,
"Opening an %s file: %s.
\n
"
,
inout
,
g
->
arg
);
ret
=
open_file
(
&
o
,
g
->
arg
);
uninit_options
(
&
o
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_ERROR
,
"Error opening %s file %s.
\n
"
,
inout
,
g
->
arg
);
return
ret
;
}
av_log
(
NULL
,
AV_LOG_DEBUG
,
"Successfully openened the file.
\n
"
);
}
return
0
;
}
int
avconv_parse_options
(
int
argc
,
char
**
argv
)
{
OptionParseContext
octx
;
uint8_t
error
[
128
];
int
ret
;
memset
(
&
octx
,
0
,
sizeof
(
octx
));
/* split the commandline into an internal representation */
ret
=
split_commandline
(
&
octx
,
argc
,
argv
,
options
,
groups
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error splitting the argument list: "
);
goto
fail
;
}
/* apply global options */
ret
=
parse_optgroup
(
NULL
,
&
octx
.
global_opts
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error parsing global options: "
);
goto
fail
;
}
/* open input files */
ret
=
open_files
(
&
octx
.
groups
[
GROUP_INFILE
],
"input"
,
open_input_file
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error opening input files: "
);
goto
fail
;
}
/* open output files */
ret
=
open_files
(
&
octx
.
groups
[
GROUP_OUTFILE
],
"output"
,
open_output_file
);
if
(
ret
<
0
)
{
av_log
(
NULL
,
AV_LOG_FATAL
,
"Error opening output files: "
);
goto
fail
;
}
fail:
uninit_parse_context
(
&
octx
);
if
(
ret
<
0
)
{
av_strerror
(
ret
,
error
,
sizeof
(
error
));
av_log
(
NULL
,
AV_LOG_FATAL
,
"%s
\n
"
,
error
);
}
return
ret
;
}
#define OFFSET(x) offsetof(OptionsContext, x)
const
OptionDef
options
[]
=
{
...
...
@@ -1865,8 +1949,6 @@ const OptionDef options[] = {
#include "cmdutils_common_opts.h"
{
"f"
,
HAS_ARG
|
OPT_STRING
|
OPT_OFFSET
,
{
.
off
=
OFFSET
(
format
)
},
"force format"
,
"fmt"
},
{
"i"
,
HAS_ARG
|
OPT_PERFILE
,
{
.
func_arg
=
opt_input_file
},
"input file name"
,
"filename"
},
{
"y"
,
OPT_BOOL
,
{
&
file_overwrite
},
"overwrite output files"
},
{
"c"
,
HAS_ARG
|
OPT_STRING
|
OPT_SPEC
,
{
.
off
=
OFFSET
(
codec_names
)
},
...
...
@@ -2048,7 +2130,5 @@ const OptionDef options[] = {
{
"dcodec"
,
HAS_ARG
|
OPT_DATA
|
OPT_PERFILE
|
OPT_EXPERT
,
{
.
func_arg
=
opt_data_codec
},
"force data codec ('copy' to copy stream)"
,
"codec"
},
{
"default"
,
HAS_ARG
|
OPT_AUDIO
|
OPT_VIDEO
|
OPT_EXPERT
,
{
.
func_arg
=
opt_default
},
"generic catch all option"
,
""
},
{
NULL
,
},
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment