[FFmpeg-devel] [PATCH v2 13/14] avfilter/avfilter: Don't fail upon options for filter without AVClass

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Tue Sep 14 02:23:38 EEST 2021


Commit 62549f9655c48f0ec061087fa33a96040ce01145 added a check to
(the predecessor of) avfilter_init_str() to error out if options
were provided to a filter without options (or rather, without private
class). This was fine at the time, yet soon afterwards commit
fdd93eabfb2644f541f7aac9943abce26776ea73 added a generic option
for all AVFilterContexts and since then it is wrong to error out
in case options have been provided to a filter without AVClass.

To workaround this issue, several filters with timeline support
added AVClasses and empty options; these will be removed in subsequent
commits. Furthermore, the super2xsai filter supports slice threading,
but no options and so has no AVClass, making it impossible to set
the number of threads when using avfilter_init_str() (and therefore
from the ffmpeg-tool). This is fixed by this commit, too.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
Now with a comment explaining the two functions of checking for priv.

 libavfilter/avfilter.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 165ab1f44a..4971ad9d9f 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -825,6 +825,9 @@ static int process_options(AVFilterContext *ctx, AVDictionary **options,
         const char *shorthand = NULL;
         int flags = AV_DICT_DONT_STRDUP_VAL;
 
+        /* Besides ensuring that shorthand options after long options
+         * are rejected checking for priv also ensures that we don't call
+         * av_opt_next when ctx->priv is not AVOpt-enabled. */
         if (priv && (o = av_opt_next(ctx->priv, o))) {
             if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
                 continue;
@@ -922,12 +925,6 @@ int avfilter_init_str(AVFilterContext *filter, const char *args)
     int ret = 0;
 
     if (args && *args) {
-        if (!filter->filter->priv_class) {
-            av_log(filter, AV_LOG_ERROR, "This filter does not take any "
-                   "options, but options were provided: %s.\n", args);
-            return AVERROR(EINVAL);
-        }
-
         ret = process_options(filter, &options, args);
         if (ret < 0)
             goto fail;
-- 
2.30.2



More information about the ffmpeg-devel mailing list