avfilter/vf_libvmaf: pass frame colorimetry to libvmaf

Signed-off-by: Kyle Swanson <kswanson@netflix.com>
This commit is contained in:
Kyle Swanson committed 2026-10-27 20:01:52 +00:00
1 parent a23e094488
commit 58584087cf
2 files changed
+52 -12

No files matched your search

Vendored
+2
View File
@@ -2659,6 +2659,7 @@ HAVE_LIST="
ioctl_posix
iokit
libdrm_getfb2
libvmaf_picture_convert
libvmaf_picture_wrap
makeinfo_html
opencl_d3d11
@@ -7373,6 +7374,7 @@ enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_i
enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init &&
{ check_pkg_config libvmaf_cuda "libvmaf >= 2.0.0" libvmaf_cuda.h vmaf_cuda_state_init;
check_pkg_config libvmaf_picture_convert "libvmaf >= 2.0.0" libvmaf.h vmaf_picture_convert;
check_pkg_config libvmaf_picture_wrap "libvmaf >= 2.0.0" libvmaf.h vmaf_picture_wrap; }
enabled libvo_amrwbenc && { check_pkg_config libvo_amrwbenc vo-amrwbenc vo-amrwbenc/enc_if.h E_IF_init ||
require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc; }
+50 -12
View File
@@ -106,6 +106,44 @@ static enum VmafPixelFormat pix_fmt_map(enum AVPixelFormat av_pix_fmt)
}
}
#if HAVE_LIBVMAF_PICTURE_CONVERT
static VmafColor color_map(const AVFrame *f)
{
VmafColor c = { 0 };
switch (f->color_range) {
case AVCOL_RANGE_MPEG: c.range = VMAF_COLOR_RANGE_LIMITED; break;
case AVCOL_RANGE_JPEG: c.range = VMAF_COLOR_RANGE_FULL; break;
default: c.range = VMAF_COLOR_RANGE_UNKNOWN; break;
}
switch (f->color_primaries) {
case AVCOL_PRI_BT709: c.primaries = VMAF_COLOR_PRIMARIES_BT709; break;
case AVCOL_PRI_BT2020: c.primaries = VMAF_COLOR_PRIMARIES_BT2020; break;
case AVCOL_PRI_SMPTE432: c.primaries = VMAF_COLOR_PRIMARIES_SMPTE432; break;
default: c.primaries = VMAF_COLOR_PRIMARIES_UNKNOWN; break;
}
switch (f->color_trc) {
case AVCOL_TRC_SMPTE170M:
case AVCOL_TRC_BT2020_10:
case AVCOL_TRC_BT2020_12:
case AVCOL_TRC_BT709: c.trc = VMAF_COLOR_TRC_BT709; break;
case AVCOL_TRC_SMPTE2084: c.trc = VMAF_COLOR_TRC_SMPTE2084; break;
default: c.trc = VMAF_COLOR_TRC_UNKNOWN; break;
}
switch (f->colorspace) {
case AVCOL_SPC_BT709: c.matrix = VMAF_COLOR_MATRIX_BT709; break;
case AVCOL_SPC_BT2020_NCL: c.matrix = VMAF_COLOR_MATRIX_BT2020_NCL; break;
case AVCOL_SPC_ICTCP: c.matrix = VMAF_COLOR_MATRIX_ICTCP; break;
default: c.matrix = VMAF_COLOR_MATRIX_UNKNOWN; break;
}
return c;
}
#endif
#if HAVE_LIBVMAF_PICTURE_WRAP
static int release_frame(VmafPicture *pic, void *cookie)
{
@@ -164,10 +202,15 @@ static int copy_picture_data(AVFrame *src, VmafPicture *dst, unsigned bpc)
static int get_picture(AVFrame *src, VmafPicture *dst, unsigned bpc)
{
#if HAVE_LIBVMAF_PICTURE_WRAP
return wrap_picture_data(src, dst, bpc);
int err = wrap_picture_data(src, dst, bpc);
#else
return copy_picture_data(src, dst, bpc);
int err = copy_picture_data(src, dst, bpc);
#endif
#if HAVE_LIBVMAF_PICTURE_CONVERT
if (!err)
dst->color = color_map(src);
#endif
return err;
}
static int do_vmaf(FFFrameSync *fs)
@@ -518,16 +561,6 @@ static int config_input_ref(AVFilterLink *inlink)
const AVPixFmtDescriptor *desc;
int err = 0;
if (ctx->inputs[0]->w != ctx->inputs[1]->w) {
av_log(ctx, AV_LOG_ERROR, "input width must match.\n");
err |= AVERROR(EINVAL);
}
if (ctx->inputs[0]->h != ctx->inputs[1]->h) {
av_log(ctx, AV_LOG_ERROR, "input height must match.\n");
err |= AVERROR(EINVAL);
}
if (ctx->inputs[0]->format != ctx->inputs[1]->format) {
av_log(ctx, AV_LOG_ERROR, "input pix_fmt must match.\n");
err |= AVERROR(EINVAL);
@@ -735,6 +768,11 @@ static int config_props_cuda(AVFilterLink *outlink)
return AVERROR(EINVAL);
}
if (ctx->inputs[1]->w != inlink->w || ctx->inputs[1]->h != inlink->h) {
av_log(ctx, AV_LOG_ERROR, "CUDA input dimensions must match.\n");
return AVERROR(EINVAL);
}
err = vmaf_init(&s->vmaf, cfg);
if (err)
return AVERROR(EINVAL);