avfilter/avfilter: Honour the short options documentation

The documentation for filter arguments states that short options must
precede long options (i.e. those of the form key=value). Yet if
process_options() encounters arguments not abiding by this, it simply
treats short options after a long option as if it were parsing short
options for the first time. In particular, it overwrites options already
set earlier, possibly via other short options. This is not how it is
intended (as a comment in the code indicates).

This commit modifies the code to reject further shorthand options
after a long option has been encountered. After all, avfilter_init_str()
errors out upon unrecognized options, so it is intended to be picky.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2021-09-11 13:07:00 +02:00
parent c96d0a0b85
commit 0c800c0b48
1 changed files with 2 additions and 6 deletions

View File

@ -846,9 +846,7 @@ int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
const char *shorthand = NULL;
int additional_flags = 0;
if (priv_class)
o = av_opt_next(&priv_class, o);
if (o) {
if (priv_class && (o = av_opt_next(&priv_class, o))) {
if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
continue;
offset = o->offset;
@ -871,9 +869,7 @@ int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
if (parsed_key) {
key = parsed_key;
additional_flags = AV_DICT_DONT_STRDUP_KEY;
/* discard all remaining shorthand */
if (priv_class)
while ((o = av_opt_next(&priv_class, o)));
priv_class = NULL; /* reject all remaining shorthand */
} else {
key = shorthand;
}