#include "test.h"
#include "feature/luminance_tools.c"
#define EPS 0.00001
int almost_equal(double a, double b)
{
double diff = a > b ? a - b : b - a;
return diff < EPS;
}
static char *test_bt1886_eotf()
{
double L = vmaf_luminance_bt1886_eotf(0.5);
mu_assert("wrong bt1886_eotf result", almost_equal(L, 58.716634));
L = vmaf_luminance_bt1886_eotf(0.1);
mu_assert("wrong bt1886_eotf result", almost_equal(L, 1.576653));
L = vmaf_luminance_bt1886_eotf(0.9);
mu_assert("wrong bt1886_eotf result", almost_equal(L, 233.819503));
return NULL;
}
static char *test_pq_eotf()
{
double L;
L = vmaf_luminance_pq_eotf(0.0);
mu_assert("wrong pq_eotf result", almost_equal(L, 0.0));
L = vmaf_luminance_pq_eotf(0.1);
mu_assert("wrong pq_eotf result", almost_equal(L, 0.324565591464487));
L = vmaf_luminance_pq_eotf(0.3);
mu_assert("wrong pq_eotf result", almost_equal(L, 10.038226310511750));
L = vmaf_luminance_pq_eotf(0.8);
mu_assert("wrong pq_eotf result", almost_equal(L, 1555.178364289284673));
return NULL;
}
static char *test_range_foot_head()
{
int foot, head;
range_foot_head(8, VMAF_PIXEL_RANGE_LIMITED, &foot, &head);
mu_assert("wrong 'limited' 8b range computation", (foot==16 && head==235));
range_foot_head(8, VMAF_PIXEL_RANGE_FULL, &foot, &head);
mu_assert("wrong 'full' 8b range computation", (foot==0 && head==255));
range_foot_head(10, VMAF_PIXEL_RANGE_LIMITED, &foot, &head);
mu_assert("wrong 'limited' 10b range computation", (foot==64 && head==940));
return NULL;
}
static char *test_get_luminance()
{
VmafLumaRange range_8b_limited;
vmaf_luminance_init_luma_range(&range_8b_limited, 8, VMAF_PIXEL_RANGE_LIMITED);
VmafLumaRange range_10b_limited;
vmaf_luminance_init_luma_range(&range_10b_limited, 10, VMAF_PIXEL_RANGE_LIMITED);
VmafLumaRange range_10b_full;
vmaf_luminance_init_luma_range(&range_10b_full, 10, VMAF_PIXEL_RANGE_FULL);
double L;
L = vmaf_luminance_get_luminance(100, range_8b_limited, vmaf_luminance_bt1886_eotf);
mu_assert("wrong 'limited' 8b luminance bt1886", almost_equal(L, 31.68933962217197));
L = vmaf_luminance_get_luminance(400, range_10b_limited, vmaf_luminance_bt1886_eotf);
mu_assert("wrong 'limited' 10b luminance bt1886", almost_equal(L, 31.68933962217197));
L = vmaf_luminance_get_luminance(400, range_10b_full, vmaf_luminance_bt1886_eotf);
mu_assert("wrong 'full' 10b luminance bt1886", almost_equal(L, 33.133003757557773));
L = vmaf_luminance_get_luminance(100, range_8b_limited, vmaf_luminance_pq_eotf);
mu_assert("wrong 'limited' 8b luminance pq", almost_equal(L, 27.048765018959795));
L = vmaf_luminance_get_luminance(400, range_10b_limited, vmaf_luminance_pq_eotf);
mu_assert("wrong 'limited' 10b luminance pq", almost_equal(L, 27.048765018959795));
L = vmaf_luminance_get_luminance(400, range_10b_full, vmaf_luminance_pq_eotf);
mu_assert("wrong 'full' 10b luminance pq", almost_equal(L, 29.385657130952264));
return NULL;
}
static char *test_normalize_range()
{
VmafLumaRange range_8b_limited;
vmaf_luminance_init_luma_range(&range_8b_limited, 8, VMAF_PIXEL_RANGE_LIMITED);
VmafLumaRange range_8b_full;
vmaf_luminance_init_luma_range(&range_8b_full, 10, VMAF_PIXEL_RANGE_FULL);
VmafLumaRange range_10b_limited;
vmaf_luminance_init_luma_range(&range_10b_limited, 10, VMAF_PIXEL_RANGE_LIMITED);
double n = normalize_range(0, range_8b_full);
mu_assert("wrong 'full' 8b normalize range", almost_equal(n, 0.0));
n = normalize_range(128, range_8b_limited);
mu_assert("wrong 'limited' 8b normalize range", almost_equal(n, 0.5114155251141552));
n = normalize_range(255, range_8b_limited);
mu_assert("wrong 'limited' 8b normalize range", almost_equal(n, 1.0));
n = normalize_range(65, range_10b_limited);
mu_assert("wrong 'limited' 10b normalize range", almost_equal(n, 0.001141552511415525));
n = normalize_range(512, range_10b_limited);
mu_assert("wrong 'limited' 10b normalize range", almost_equal(n, 0.5114155251141552));
n = normalize_range(939, range_10b_limited);
mu_assert("wrong 'limited' 10b normalize range", almost_equal(n, 0.9988584474885844));
return NULL;
}
char *run_tests()
{
mu_run_test(test_bt1886_eotf);
mu_run_test(test_pq_eotf);
mu_run_test(test_range_foot_head);
mu_run_test(test_get_luminance);
mu_run_test(test_normalize_range);
return NULL;
}