From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH] avfilter/vf_libvmaf: update filter for libvmaf v2.0.0
Date: Mon, 10 Jan 2022 19:22:18 +0100
Message-ID: <AM7PR03MB6660859C925C0A9DC3F0AAF28F509@AM7PR03MB6660.eurprd03.prod.outlook.com> (raw)
In-Reply-To: <CALbjRO+2dqAwvbfQZE-QdMjiyP9oL9zCX3rHg+6THVuJcpnHpA@mail.gmail.com>
Kyle Swanson:
> Hi,
>
> On Sun, Jan 2, 2022 at 9:21 PM Andreas Rheinhardt
> <andreas.rheinhardt@outlook.com> wrote:
>>>
>>> static const AVOption libvmaf_options[] = {
>>> - {"model_path", "Set the model to be used for computing vmaf.", OFFSET(model_path), AV_OPT_TYPE_STRING, {.str="/usr/local/share/model/vmaf_v0.6.1.pkl"}, 0, 1, FLAGS},
>>> - {"log_path", "Set the file path to be used to store logs.", OFFSET(log_path), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS},
>>> - {"log_fmt", "Set the format of the log (csv, json or xml).", OFFSET(log_fmt), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS},
>>> - {"enable_transform", "Enables transform for computing vmaf.", OFFSET(enable_transform), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
>>> - {"phone_model", "Invokes the phone model that will generate higher VMAF scores.", OFFSET(phone_model), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
>>> - {"psnr", "Enables computing psnr along with vmaf.", OFFSET(psnr), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
>>> - {"ssim", "Enables computing ssim along with vmaf.", OFFSET(ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
>>> - {"ms_ssim", "Enables computing ms-ssim along with vmaf.", OFFSET(ms_ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
>>> - {"pool", "Set the pool method to be used for computing vmaf.", OFFSET(pool), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS},
>>> + {"model", "Set the model to be used for computing vmaf.", OFFSET(model_cfg), AV_OPT_TYPE_STRING, {.str="version=vmaf_v0.6.1"}, 0, 1, FLAGS},
>>> + {"feature", "Set the feature to be used for computing vmaf.", OFFSET(feature_cfg), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS},
>>> + {"log_path", "Set the file path to be used to write log.", OFFSET(log_path), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS},
>>> + {"log_fmt", "Set the format of the log (csv, json, xml, or sub).", OFFSET(log_fmt), AV_OPT_TYPE_STRING, {.str="xml"}, 0, 1, FLAGS},
>>> {"n_threads", "Set number of threads to be used when computing vmaf.", OFFSET(n_threads), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT_MAX, FLAGS},
>>> {"n_subsample", "Set interval for frame subsampling used when computing vmaf.", OFFSET(n_subsample), AV_OPT_TYPE_INT, {.i64=1}, 1, UINT_MAX, FLAGS},
>>> - {"enable_conf_interval", "Enables confidence interval.", OFFSET(enable_conf_interval), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
>>> { NULL }
>>> };
>>
>> You are removing lots of options; removing options is only permissible
>> during a major break and even then the options need to have been
>> deprecated before that.
>
> Good point, thanks. New patch attached. No more missing options,
> everything that should be deprecated has been marked as deprecated and
> appropriate fallback behavior implemented.
>
> +static AVDictionary **delimited_dict_parse(char *str, unsigned *cnt)
> {
> - LIBVMAFContext *s = (LIBVMAFContext *) ctx;
> - compute_vmaf_score(s);
> - if (!s->error) {
> - av_log(ctx, AV_LOG_INFO, "VMAF score: %f\n",s->vmaf_score);
> - } else {
> - pthread_mutex_lock(&s->lock);
> - pthread_cond_signal(&s->cond);
> - pthread_mutex_unlock(&s->lock);
> + int err = 0;
> + if (!str)
> + return NULL;
> +
> + *cnt = 1;
> + for (char *p = str; *p; p++) {
> + if (*p == '|')
> + (*cnt)++;
> }
> - pthread_exit(NULL);
> +
> + AVDictionary **dict = av_calloc(*cnt, sizeof(*dict));
> + if (!dict)
> + goto fail;
> +
> + char *str_copy = av_strdup(str);
> + if (!str_copy)
> + goto fail;
> +
> + char *saveptr = NULL;
> + for (unsigned i = 0; i < *cnt; i++) {
> + char *s = av_strtok(i == 0 ? str_copy : NULL, "|", &saveptr);
> + err = av_dict_parse_string(&dict[i], s, "=", ":", 0);
> + if (err)
> + goto fail;
> + }
> +
> + av_free(str_copy);
> + return dict;
> +
> +fail:
> + if (dict) {
> + for (unsigned i = 0; i < *cnt; i++) {
> + if (dict[i])
> + av_dict_free(&dict[i]);
> + }
> + av_free(dict);
> + }
> +
> + av_free(str_copy);
> + *cnt = 0;
> return NULL;
> }
1. FFmpeg uses the ancient C90 rule that only allows variable
declarations at the beginning of a block (before all statements). You
should actually have received a compiler warning because of the above
code (unless you use Clang, which claims to support this type of
warning, yet doesn't).
2. You jump over the initializion of str_copy if the dict allocation
fails and consequently you free an uninitialized string.
- Andreas
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2022-01-10 18:22 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CALbjROLP4=3xmpvM8EW1A3fA4==oo=YpK+vjeB-ueoQSpomoKA@mail.gmail.com>
[not found] ` <CALbjROJOuyUN8gL6eJ2KGHQV4VRQ5-kcdkOUNg2SC8L4wF-hUA@mail.gmail.com>
[not found] ` <YNx3sBpzP3r6p++p@sunshine.barsnick.net>
2021-12-24 20:51 ` Kyle Swanson
2021-12-24 20:54 ` Timo Rothenpieler
2021-12-31 1:01 ` Kyle Swanson
2021-12-25 9:24 ` Paul B Mahol
2021-12-31 1:03 ` Kyle Swanson
2022-01-02 18:24 ` Kyle Swanson
2022-01-03 5:21 ` Andreas Rheinhardt
2022-01-03 22:32 ` Kyle Swanson
2022-01-08 22:08 ` Kyle Swanson
2022-01-10 18:22 ` Andreas Rheinhardt [this message]
2022-01-14 2:38 ` Kyle Swanson
2022-01-19 18:23 ` Kyle Swanson
2022-01-20 21:06 ` Kyle Swanson
2022-01-23 21:22 ` Kyle Swanson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AM7PR03MB6660859C925C0A9DC3F0AAF28F509@AM7PR03MB6660.eurprd03.prod.outlook.com \
--to=andreas.rheinhardt@outlook.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git