From 0c2429125ece80f4bf24217334ea350346b646c7 Mon Sep 17 00:00:00 2001 From: Yigithan Yigit Date: Sat, 6 Jul 2024 15:51:00 +0300 Subject: [PATCH] update tests according to new API --- libvmaf/test/meson.build | 17 ++- libvmaf/test/test_feature_collector.c | 86 +-------------- libvmaf/test/test_feature_extractor.c | 4 +- libvmaf/test/test_predict.c | 151 ++++++++++++++++++++++++++ libvmaf/test/test_psnr.c | 4 +- 5 files changed, 170 insertions(+), 92 deletions(-) diff --git a/libvmaf/test/meson.build b/libvmaf/test/meson.build index b0f3c629f..849de3215 100644 --- a/libvmaf/test/meson.build +++ b/libvmaf/test/meson.build @@ -17,8 +17,13 @@ test_picture = executable('test_picture', dependencies:[stdatomic_dependency, thread_lib, cuda_dependency], ) +test_propagate_metadata = executable('test_propagate_metadata', + ['test.c', 'test_propagate_metadata.c', '../src/propagate_metadata.c'], + include_directories : [libvmaf_inc, test_inc, include_directories('../src/')], +) + test_feature_collector = executable('test_feature_collector', - ['test.c', 'test_feature_collector.c', '../src/log.c', '../src/predict.c', '../src/svm.cpp'], + ['test.c', 'test_feature_collector.c', '../src/log.c', '../src/predict.c', '../src/svm.cpp', '../src/propagate_metadata.c'], include_directories : [libvmaf_inc, test_inc, include_directories('../src/feature/'), include_directories('../src')], link_with : get_option('default_library') == 'both' ? libvmaf.get_static_lib() : libvmaf, dependencies: cuda_dependency @@ -45,10 +50,10 @@ test_model = executable('test_model', ) test_predict = executable('test_predict', - ['test.c', 'test_predict.c', '../src/dict.c', + ['test.c', 'test_predict.c', '../src/dict.c', '../src/propagate_metadata.c', '../src/feature/feature_collector.c', '../src/feature/alias.c', '../src/model.c', '../src/svm.cpp', '../src/log.c', - '../src/read_json_model.c', '../src/pdjson.c', json_model_c_sources, '../src/feature/feature_name.c', '../src/feature/feature_extractor.c'], - include_directories : [libvmaf_inc, test_inc, include_directories('../src')], + '../src/read_json_model.c', '../src/pdjson.c', json_model_c_sources, '../src/feature/feature_name.c', '../src/feature/feature_extractor.c',], + include_directories : [libvmaf_inc, test_inc, include_directories('../src/')], link_with : get_option('default_library') == 'both' ? libvmaf.get_static_lib() : libvmaf, c_args : vmaf_cflags_common, cpp_args : vmaf_cflags_common, @@ -57,7 +62,8 @@ test_predict = executable('test_predict', test_feature_extractor = executable('test_feature_extractor', ['test.c', 'test_feature_extractor.c', '../src/mem.c', '../src/picture.c', '../src/ref.c', - '../src/dict.c', '../src/opt.c', '../src/log.c', '../src/predict.c', '../src/svm.cpp'], + '../src/dict.c', '../src/opt.c', '../src/log.c', '../src/predict.c', '../src/svm.cpp', + '../src/propagate_metadata.c'], include_directories : [libvmaf_inc, test_inc, include_directories('../src/')], dependencies : [math_lib, stdatomic_dependency, thread_lib, cuda_dependency], objects : [ @@ -168,3 +174,4 @@ test('test_luminance_tools', test_luminance_tools) test('test_cli_parse', test_cli_parse) test('test_psnr', test_psnr) test('test_framesync', test_framesync) +test('test_propagate_metadata', test_propagate_metadata) diff --git a/libvmaf/test/test_feature_collector.c b/libvmaf/test/test_feature_collector.c index ddc412277..647d07703 100644 --- a/libvmaf/test/test_feature_collector.c +++ b/libvmaf/test/test_feature_collector.c @@ -54,7 +54,7 @@ static char* test_model_mount() int err = 0; VmafFeatureCollector *feature_collector; - err = vmaf_feature_collector_init(&feature_collector, NULL); + err = vmaf_feature_collector_init(&feature_collector); mu_assert("problem during vmaf_feature_collector_init", !err); VmafModelConfig model_cfg = { 0 }; @@ -82,7 +82,7 @@ static char* test_model_unmount() int err = 0; VmafFeatureCollector *feature_collector; - err = vmaf_feature_collector_init(&feature_collector, NULL); + err = vmaf_feature_collector_init(&feature_collector); mu_assert("problem during vmaf_feature_collector_init", !err); VmafModelConfig model_cfg = { 0 }; @@ -169,91 +169,12 @@ static char *test_feature_vector_init_append_and_destroy() return NULL; } -static char *test_feature_collector_init_append_get_and_destroy_with_meta() -{ - int err; - - VmafMetadata m = { - .callback = NULL, - .data = NULL, - .data_sz = 0, - }; - - VmafFeatureCollector *feature_collector; - err = vmaf_feature_collector_init(&feature_collector, &m); - mu_assert("problem during vmaf_feature_collector_init", !err); - unsigned initial_capacity = feature_collector->capacity; - mu_assert("this test assumes an initial capacity of 8", - initial_capacity == 8); - err = vmaf_feature_collector_append(feature_collector, "feature0", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature1", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature2", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature3", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature4", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature5", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature6", 60., 1); - err |= vmaf_feature_collector_append(feature_collector, "feature7", 60., 1); - mu_assert("problem during vmaf_feature_collector_append", !err); - mu_assert("feature_collector->capacity should not have changed", - feature_collector->capacity == initial_capacity); - err = vmaf_feature_collector_append(feature_collector, "feature8", 60., 1); - mu_assert("problem during vmaf_feature_collector_append", !err); - mu_assert("feature_collector->capacity did not double its allocation", - feature_collector->capacity == initial_capacity * 2); - - double score; - err = vmaf_feature_collector_get_score(feature_collector, "feature5", - &score, 1); - mu_assert("problem during vmaf_feature_collector_get_score", !err); - mu_assert("vmaf_feature_collector_get_score did not get the expected score", - score == 60.); - err = vmaf_feature_collector_get_score(feature_collector, "feature5", - &score, 2); - mu_assert("vmaf_feature_collector_get_score did not fail with bad index", - err); - - err = vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate0", 100.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate1", 101.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate2", 102.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate3", 103.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate4", 104.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate5", 105.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate6", 106.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate7", 107.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate8", 108.); - err |= vmaf_feature_collector_set_aggregate(feature_collector, - "aggregate9", 109.); - mu_assert("problem during vmaf_feature_collector_set_aggregate", !err); - - err = vmaf_feature_collector_get_aggregate(feature_collector, - "aggregate5", &score); - mu_assert("problem during vmaf_feature_collector_get_aggregate", !err); - mu_assert("unexpected aggreggate_score", score = 105.); - err = vmaf_feature_collector_get_aggregate(feature_collector, - "aggregate9", &score); - mu_assert("problem during vmaf_feature_collector_get_aggregate", !err); - mu_assert("unexpected aggreggate_score", score = 109.); - - vmaf_feature_collector_destroy(feature_collector); - return NULL; - -} - static char *test_feature_collector_init_append_get_and_destroy() { int err; VmafFeatureCollector *feature_collector; - err = vmaf_feature_collector_init(&feature_collector, NULL); + err = vmaf_feature_collector_init(&feature_collector); mu_assert("problem during vmaf_feature_collector_init", !err); unsigned initial_capacity = feature_collector->capacity; mu_assert("this test assumes an initial capacity of 8", @@ -324,7 +245,6 @@ char *run_tests() { mu_run_test(test_feature_vector_init_append_and_destroy); mu_run_test(test_feature_collector_init_append_get_and_destroy); - mu_run_test(test_feature_collector_init_append_get_and_destroy_with_meta); mu_run_test(test_aggregate_vector_init_append_and_destroy); mu_run_test(test_model_mount); mu_run_test(test_model_unmount); diff --git a/libvmaf/test/test_feature_extractor.c b/libvmaf/test/test_feature_extractor.c index 67b3d862c..68a5edcd2 100644 --- a/libvmaf/test/test_feature_extractor.c +++ b/libvmaf/test/test_feature_extractor.c @@ -104,7 +104,7 @@ static char *test_feature_extractor_flush() mu_assert("problem during vmaf_picture_alloc", !err); VmafFeatureCollector *vfc; - err = vmaf_feature_collector_init(&vfc, NULL); + err = vmaf_feature_collector_init(&vfc); mu_assert("vmaf_feature_collector_init", !err); double score; @@ -162,7 +162,7 @@ static char *test_feature_extractor_initialization_options() mu_assert("problem during vmaf_picture_alloc", !err); VmafFeatureCollector *vfc; - err = vmaf_feature_collector_init(&vfc, NULL); + err = vmaf_feature_collector_init(&vfc); mu_assert("problem during vmaf_feature_collector_init", !err); err = vmaf_feature_extractor_context_extract(fex_ctx, &ref, NULL, &dist, diff --git a/libvmaf/test/test_predict.c b/libvmaf/test/test_predict.c index 4e57e2fdd..c5243e7b8 100644 --- a/libvmaf/test/test_predict.c +++ b/libvmaf/test/test_predict.c @@ -18,6 +18,8 @@ #include +#include "feature/feature_collector.h" +#include "propagate_metadata.h" #include "test.h" #include "predict.h" #include "predict.c" @@ -30,6 +32,153 @@ typedef struct { int flags; } MetaStruct; + +static char *test_predict_score_at_index() +{ + int err; + + VmafFeatureCollector *feature_collector; + err = vmaf_feature_collector_init(&feature_collector); + mu_assert("problem during vmaf_feature_collector_init", !err); + + VmafModel *model; + VmafModelConfig cfg = { + .name = "vmaf", + .flags = VMAF_MODEL_FLAGS_DEFAULT, + }; + err = vmaf_model_load(&model, &cfg, "vmaf_v0.6.1"); + mu_assert("problem during vmaf_model_load", !err); + + for (unsigned i = 0; i < model->n_features; i++) { + err = vmaf_feature_collector_append(feature_collector, + model->feature[i].name, 60., 0); + mu_assert("problem during vmaf_feature_collector_append", !err); + } + + double vmaf_score = 0.; + err = vmaf_predict_score_at_index(model, feature_collector, 0, &vmaf_score, + true, false, 0); + mu_assert("problem during vmaf_predict_score_at_index", !err); + + vmaf_model_destroy(model); + vmaf_feature_collector_destroy(feature_collector); + return NULL; +} + + +void set_meta(void *data, const char *key, double d) +{ + if (!data) return; + MetaStruct *meta = data; + char value[128]; + snprintf(value, sizeof(value), "%f", d); + vmaf_dictionary_set(meta->metadata, key, value, meta->flags); +} + +static char* test_propagate_metadata() +{ + int err; + + VmafDictionary *dict = NULL; + MetaStruct meta_data = { + .metadata = &dict, + .flags = 0, + }; + + VmafMetadataConfig m = { + .callback = set_meta, + .data = &meta_data, + .data_sz = sizeof(meta_data), + }; + + VmafFeatureCollector *feature_collector; + err = vmaf_feature_collector_init(&feature_collector); + mu_assert("problem during vmaf_feature_collector_init", !err); + + err = vmaf_feature_collector_register_metadata(feature_collector, &m); + mu_assert("problem during vmaf_feature_collector_register_metadata", !err); + + VmafModel *model; + VmafModelConfig cfg = { + .name = "vmaf", + .flags = VMAF_MODEL_FLAGS_DEFAULT, + }; + err = vmaf_model_load(&model, &cfg, "vmaf_v0.6.1"); + mu_assert("problem during vmaf_model_load", !err); + err = vmaf_feature_collector_mount_model(feature_collector, model); + mu_assert("problem during vmaf_mount_model", !err); + + for (unsigned i = 0; i < model->n_features; i++) { + err = vmaf_feature_collector_append(feature_collector, + model->feature[i].name, 60., 0); + mu_assert("problem during vmaf_feature_collector_append", !err); + } + + VmafDictionaryEntry *e = vmaf_dictionary_get(&dict, "vmaf_0", 0); + mu_assert("error on propagaton metadata: propagated data wrong!", + !strcmp(e->val, "100.000000")); + + vmaf_feature_collector_destroy(feature_collector); + + m.data = NULL; + err = vmaf_feature_collector_init(&feature_collector); + mu_assert("problem during vmaf_feature_collector_init", !err); + + err = vmaf_feature_collector_register_metadata(feature_collector, &m); + mu_assert("problem during vmaf_feature_collector_register_metadata", !err); + + for (unsigned i = 0; i < model->n_features; i++) { + err = vmaf_feature_collector_append(feature_collector, + model->feature[i].name, 60., 0); + mu_assert("problem during vmaf_feature_collector_append", !err); + } + + vmaf_feature_collector_destroy(feature_collector); + + m.data = &meta_data; + m.data_sz = 0; + err = vmaf_feature_collector_init(&feature_collector); + mu_assert("problem during vmaf_feature_collector_init", !err); + + err = vmaf_feature_collector_register_metadata(feature_collector, &m); + mu_assert("problem during vmaf_feature_collector_register_metadata", !err); + + for (unsigned i = 0; i < model->n_features; i++) { + err = vmaf_feature_collector_append(feature_collector, + model->feature[i].name, 60., 0); + mu_assert("problem during vmaf_feature_collector_append", !err); + } + + vmaf_feature_collector_destroy(feature_collector); + + m.callback = NULL; + err = vmaf_feature_collector_init(&feature_collector); + mu_assert("problem during vmaf_feature_collector_init", !err); + + err = vmaf_feature_collector_register_metadata(feature_collector, &m); + mu_assert("problem during vmaf_feature_collector_register_metadata", !err); + + for (unsigned i = 0; i < model->n_features; i++) { + err = vmaf_feature_collector_append(feature_collector, + model->feature[i].name, 60., 0); + mu_assert("problem during vmaf_feature_collector_append", !err); + } + + vmaf_feature_collector_destroy(feature_collector); + + vmaf_model_destroy(model); + return NULL; + +} + + +/* +typedef struct { + VmafDictionary **metadata; + int flags; +} MetaStruct; + + static char *test_predict_score_at_index() { int err; @@ -62,6 +211,7 @@ static char *test_predict_score_at_index() return NULL; } + void set_meta(void *data, const char *key, double d) { if (!data) return; @@ -154,6 +304,7 @@ static char* test_propagate_metadata() return NULL; } +*/ static char *test_find_linear_function_parameters() { diff --git a/libvmaf/test/test_psnr.c b/libvmaf/test/test_psnr.c index fe6bdf7e8..e7173ccb1 100644 --- a/libvmaf/test/test_psnr.c +++ b/libvmaf/test/test_psnr.c @@ -57,7 +57,7 @@ static char *test_16b_large_diff() err |= get_picture_16b(&pic2, 1); mu_assert("test_16b_large_diff alloc error", !err); VmafFeatureCollector *fc; - err |= vmaf_feature_collector_init(&fc, NULL); + err |= vmaf_feature_collector_init(&fc); mu_assert("test_16b_large_diff vmaf_feature_collector_init error", !err); PsnrState psnr_state = { .enable_chroma = 1, @@ -85,7 +85,7 @@ static char *test_16b_large_diff() mu_assert("wrong mse_y", almost_equal(mse_y, 4294836225.0)); mu_assert("wrong mse_cb", almost_equal(mse_cb, 4294836225.0)); mu_assert("wrong mse_cr", almost_equal(mse_cr, 4294836225.0)); - + vmaf_feature_collector_destroy(fc); vmaf_picture_unref(&pic1); vmaf_picture_unref(&pic2);