Andreas Rheinhardt (12021-09-12): > 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.rheinha...@outlook.com> > --- > The while loop that is removed below is actually just an elaborate > "o = NULL", which av_opt_next() interprets as "start the iteration". > > libavfilter/avfilter.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c > index cc499fd5ed..165ab1f44a 100644 > --- a/libavfilter/avfilter.c > +++ b/libavfilter/avfilter.c > @@ -814,6 +814,7 @@ static int process_options(AVFilterContext *ctx, > AVDictionary **options, > const AVOption *o = NULL; > int ret; > char *av_uninit(parsed_key), *av_uninit(value);
> + const AVClass *priv = ctx->filter->priv_class; I do not understand why you make this a pointer rather than an int, since it is only used as a boolean. "int shorthand_allowed" would be clearer IMHO. > const char *key; > int offset= -1; > > @@ -824,8 +825,7 @@ static int process_options(AVFilterContext *ctx, > AVDictionary **options, > const char *shorthand = NULL; > int flags = AV_DICT_DONT_STRDUP_VAL; > > - o = av_opt_next(ctx->priv, o); > - if (o) { > + if (priv && (o = av_opt_next(ctx->priv, o))) { > if (o->type == AV_OPT_TYPE_CONST || o->offset == offset) > continue; > offset = o->offset; > @@ -848,7 +848,7 @@ static int process_options(AVFilterContext *ctx, > AVDictionary **options, > if (parsed_key) { > key = parsed_key; > flags |= AV_DICT_DONT_STRDUP_KEY; > - while ((o = av_opt_next(ctx->priv, o))); /* discard all > remaining shorthand */ > + priv = NULL; /* reject all remaining shorthand */ > } else { > key = shorthand; > } Regards, -- Nicolas George
signature.asc
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".