[FFmpeg-devel] [PATCH] libvmaf: exit gracefully if the library fails.
James Almer
jamrial at gmail.com
Tue Dec 19 06:55:34 EET 2017
On 12/8/2017 10:35 PM, Ronald S. Bultje wrote:
> Fixes trac issue #6884 and Netflix/vmaf issue #124.
> ---
> libavfilter/vf_libvmaf.c | 28 ++++++++++++++++++++++------
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/libavfilter/vf_libvmaf.c b/libavfilter/vf_libvmaf.c
> index 7670c51..d628b95 100644
> --- a/libavfilter/vf_libvmaf.c
> +++ b/libavfilter/vf_libvmaf.c
> @@ -61,6 +61,7 @@ typedef struct LIBVMAFContext {
> int ssim;
> int ms_ssim;
> char *pool;
> + int error;
> } LIBVMAFContext;
>
> #define OFFSET(x) offsetof(LIBVMAFContext, x)
> @@ -158,17 +159,24 @@ static void compute_vmaf_score(LIBVMAFContext *s)
>
> format = (char *) s->desc->name;
>
> - s->vmaf_score = compute_vmaf(format, s->width, s->height, read_frame, s,
> - s->model_path, s->log_path, s->log_fmt, 0, 0,
> - s->enable_transform, s->phone_model, s->psnr,
> - s->ssim, s->ms_ssim, s->pool);
> + s->error = compute_vmaf(&s->vmaf_score, format, s->width, s->height,
This is an awful API break. It broke compilation for everyone using the
latest stable release of libvmaf. See ticket #6921.
How hard was for them to add a new function instead?
compute_vmaf_score() or whatever. You can't just go and change a public
function signature like this...
This can still implement this properly before a new release is tagged,
for that matter. Could you suggest that to them?
> + read_frame, s, s->model_path, s->log_path,
> + s->log_fmt, 0, 0, s->enable_transform,
> + s->phone_model, s->psnr, s->ssim,
> + s->ms_ssim, s->pool);
> }
>
> static void *call_vmaf(void *ctx)
> {
> LIBVMAFContext *s = (LIBVMAFContext *) ctx;
> compute_vmaf_score(s);
> - av_log(ctx, AV_LOG_INFO, "VMAF score: %f\n",s->vmaf_score);
> + 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);
> + }
> pthread_exit(NULL);
> }
>
> @@ -187,10 +195,17 @@ static int do_vmaf(FFFrameSync *fs)
>
> pthread_mutex_lock(&s->lock);
>
> - while (s->frame_set != 0) {
> + while (s->frame_set && !s->error) {
> pthread_cond_wait(&s->cond, &s->lock);
> }
>
> + if (s->error) {
> + av_log(ctx, AV_LOG_ERROR,
> + "libvmaf encountered an error, check log for details\n");
> + pthread_mutex_unlock(&s->lock);
> + return AVERROR(EINVAL);
> + }
> +
> av_frame_ref(s->gref, ref);
> av_frame_ref(s->gmain, main);
>
> @@ -208,6 +223,7 @@ static av_cold int init(AVFilterContext *ctx)
>
> s->gref = av_frame_alloc();
> s->gmain = av_frame_alloc();
> + s->error = 0;
>
> pthread_mutex_init(&s->lock, NULL);
> pthread_cond_init (&s->cond, NULL);
>
More information about the ffmpeg-devel
mailing list