Skip to content

Commit

Permalink
refactor metadata propagating functionality according to new API
Browse files Browse the repository at this point in the history
  • Loading branch information
yigithanyigit committed Jul 6, 2024
1 parent 4fb3611 commit 35bf717
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 68 deletions.
6 changes: 3 additions & 3 deletions libvmaf/include/libvmaf/libvmaf.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "libvmaf/model.h"
#include "libvmaf/picture.h"
#include "libvmaf/feature.h"
#include "libvmaf/propagate_metadata.h"

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -82,9 +83,6 @@ enum VmafPoolingMethod {
*/
typedef struct VmafConfiguration {
enum VmafLogLevel log_level;
void (*callback)(void*, const char *, double);
void* meta_data;
size_t meta_data_sz;
unsigned n_threads;
unsigned n_subsample;
uint64_t cpumask;
Expand Down Expand Up @@ -256,6 +254,8 @@ int vmaf_score_at_index_model_collection(VmafContext *vmaf,
int vmaf_feature_score_at_index(VmafContext *vmaf, const char *feature_name,
double *score, unsigned index);

int vmaf_register_metadata_callback(VmafContext *vmaf, VmafMetadataConfig *cfg);

/**
* Pooled VMAF score for a specific interval.
*
Expand Down
3 changes: 2 additions & 1 deletion libvmaf/include/libvmaf/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ endif
install_headers(['libvmaf.h',
'feature.h',
'model.h',
'picture.h'],
'picture.h',
'propagate_metadata.h',],
version_h_target,
platform_specific_headers,
subdir : 'libvmaf')
101 changes: 53 additions & 48 deletions libvmaf/src/feature/feature_collector.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <string.h>

#include "dict.h"
#include "propagate_metadata.h"
#include "feature_collector.h"
#include "feature_name.h"
#include "libvmaf/libvmaf.h"
Expand Down Expand Up @@ -201,7 +202,7 @@ static int feature_vector_append(FeatureVector *feature_vector,
return 0;
}

int vmaf_feature_collector_init(VmafFeatureCollector **const feature_collector, void *metadata)
int vmaf_feature_collector_init(VmafFeatureCollector **const feature_collector)
{
if (!feature_collector) return -EINVAL;
int err = 0;
Expand All @@ -217,26 +218,12 @@ int vmaf_feature_collector_init(VmafFeatureCollector **const feature_collector,
if (err) goto free_feature_vector;
err = pthread_mutex_init(&(fc->lock), NULL);
if (err) goto free_aggregate_vector;

if (metadata) {
VmafMetadata *m = metadata;
fc->metadata = malloc(sizeof(VmafMetadata));
if(!fc->metadata) goto fail;
memcpy(fc->metadata, m, sizeof(*m));
if (m->data && m->data_sz > 0) {
fc->metadata->data = malloc(m->data_sz);
if(!fc->metadata->data) goto free_metadata;
memcpy(fc->metadata->data, m->data, m->data_sz);
} else {
fc->metadata->data = NULL;
fc->metadata->data_sz = 0;
}
}

err = vmaf_metadata_init(&(fc->metadata));
if (err) goto free_mutex;
return 0;

free_metadata:
free(fc->metadata);
free_mutex:
pthread_mutex_destroy(&(fc->lock));
free_aggregate_vector:
aggregate_vector_destroy(&(fc->aggregate_vector));
free_feature_vector:
Expand All @@ -247,7 +234,8 @@ int vmaf_feature_collector_init(VmafFeatureCollector **const feature_collector,
return -ENOMEM;
}

int vmaf_feature_collector_mount_model(VmafFeatureCollector *feature_collector, VmafModel *model)
int vmaf_feature_collector_mount_model(VmafFeatureCollector *feature_collector,
VmafModel *model)
{
if (!feature_collector) return -EINVAL;
if (!model) return -EINVAL;
Expand All @@ -269,7 +257,8 @@ int vmaf_feature_collector_mount_model(VmafFeatureCollector *feature_collector,
return 0;
}

int vmaf_feature_collector_unmount_model(VmafFeatureCollector *feature_collector, VmafModel *model)
int vmaf_feature_collector_unmount_model(VmafFeatureCollector *feature_collector,
VmafModel *model)
{
if (!feature_collector) return -EINVAL;
if (!model) return -EINVAL;
Expand All @@ -286,6 +275,20 @@ int vmaf_feature_collector_unmount_model(VmafFeatureCollector *feature_collector

return 0;
}

int vmaf_feature_collector_register_metadata(VmafFeatureCollector *feature_collector,
VmafMetadataConfig *metadata_config)
{
if (!feature_collector) return -EINVAL;
if (!metadata_config) return -EINVAL;

VmafMetadata *metadata = feature_collector->metadata;
int err = vmaf_metadata_append(metadata, metadata_config);
if (err) return err;

return 0;
}

static FeatureVector *find_feature_vector(VmafFeatureCollector *fc,
const char *feature_name)
{
Expand Down Expand Up @@ -342,30 +345,35 @@ int vmaf_feature_collector_append(VmafFeatureCollector *feature_collector,
if (err) goto unlock;

int res = 0;
VmafPredictModel *head = feature_collector->models;
while (head != NULL && feature_collector->metadata
&& feature_collector->metadata->callback)

VmafMetadataNode *metadata_iter = feature_collector->metadata ?
feature_collector->metadata->head : NULL;
while(metadata_iter)
{
VmafModel *model = head->model;
double score = 0.0;
pthread_mutex_unlock(&(feature_collector->lock));
res = vmaf_feature_collector_get_score(feature_collector, model->name,
&score, picture_index);
pthread_mutex_lock(&(feature_collector->lock));
if (!res) {
head = head->next;
continue;
}
pthread_mutex_unlock(&(feature_collector->lock));
res = vmaf_predict_score_at_index(model, feature_collector, picture_index,
&score, true, true, 0);
pthread_mutex_lock(&(feature_collector->lock));
if (res) goto unlock;
char key[128];
snprintf(key, sizeof(key), "%s_%d", model->name, picture_index);
feature_collector->metadata->callback(feature_collector->metadata->data,
key, score);
head = head->next;
VmafPredictModel *model_iter = feature_collector->models;
while (model_iter)
{
VmafModel *model = model_iter->model;
double score = 0.0;
pthread_mutex_unlock(&(feature_collector->lock));
res = vmaf_feature_collector_get_score(feature_collector, model->name,
&score, picture_index);
pthread_mutex_lock(&(feature_collector->lock));
if (!res) {
model_iter = model_iter->next;
continue;
}
pthread_mutex_unlock(&(feature_collector->lock));
res = vmaf_predict_score_at_index(model, feature_collector, picture_index,
&score, true, true, 0);
pthread_mutex_lock(&(feature_collector->lock));
if (res) goto unlock;
char key[128];
snprintf(key, sizeof(key), "%s_%d", model->name, picture_index);
metadata_iter->callback(metadata_iter->data, key, score);
model_iter = model_iter->next;
}
metadata_iter = metadata_iter->next;
}

unlock:
Expand Down Expand Up @@ -434,10 +442,7 @@ void vmaf_feature_collector_destroy(VmafFeatureCollector *feature_collector)
head = next;
}
}
if (feature_collector->metadata) {
free(feature_collector->metadata->data);
free(feature_collector->metadata);
}
vmaf_metadata_destroy(feature_collector->metadata);
free(feature_collector->feature_vector);
pthread_mutex_unlock(&(feature_collector->lock));
pthread_mutex_destroy(&(feature_collector->lock));
Expand Down
12 changes: 5 additions & 7 deletions libvmaf/src/feature/feature_collector.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

#include "dict.h"
#include "model.h"
#include "propagate_metadata.h"

typedef struct {
char *name;
Expand All @@ -43,12 +44,6 @@ typedef struct {
unsigned cnt, capacity;
} AggregateVector;

typedef struct {
void (*callback)(void *, const char * ,double);
void *data;
size_t data_sz;
} VmafMetadata;

typedef struct VmafPredictModel {
VmafModel *model;
struct VmafPredictModel *next;
Expand All @@ -64,14 +59,17 @@ typedef struct VmafFeatureCollector {
pthread_mutex_t lock;
} VmafFeatureCollector;

int vmaf_feature_collector_init(VmafFeatureCollector **const feature_collector, void *metadata);
int vmaf_feature_collector_init(VmafFeatureCollector **const feature_collector);

int vmaf_feature_collector_mount_model(VmafFeatureCollector *feature_collector, VmafModel *model);

int vmaf_feature_collector_append(VmafFeatureCollector *feature_collector,
const char *feature_name, double score,
unsigned index);

int vmaf_feature_collector_register_metadata(VmafFeatureCollector *feature_collector,
VmafMetadataConfig *metadata_config);

int vmaf_feature_collector_append_with_dict(VmafFeatureCollector *fc,
VmafDictionary *dict, const char *feature_name, double score,
unsigned index);
Expand Down
18 changes: 10 additions & 8 deletions libvmaf/src/libvmaf.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "cpu.h"
#include "feature/feature_extractor.h"
#include "feature/feature_collector.h"
#include "propagate_metadata.h"
#include "fex_ctx_vector.h"
#include "log.h"
#include "model.h"
Expand Down Expand Up @@ -102,14 +103,7 @@ int vmaf_init(VmafContext **vmaf, VmafConfiguration cfg)

err = vmaf_framesync_init(&(v->framesync));
if (err) goto free_v;

VmafMetadata m = {
.callback = v->cfg.callback,
.data = v->cfg.meta_data,
.data_sz = v->cfg.meta_data_sz
};

err = vmaf_feature_collector_init(&(v->feature_collector), &m);
err = vmaf_feature_collector_init(&(v->feature_collector));
if (err) goto free_framesync;
err = feature_extractor_vector_init(&(v->registered_feature_extractors));
if (err) goto free_feature_collector;
Expand Down Expand Up @@ -750,6 +744,14 @@ int vmaf_read_pictures(VmafContext *vmaf, VmafPicture *ref, VmafPicture *dist,
return err;
}

int vmaf_register_metadata_callback(VmafContext *vmaf, VmafMetadataConfig *cfg)
{
if (!vmaf) return -EINVAL;
if (!cfg) return -EINVAL;

return vmaf_feature_collector_register_metadata(vmaf->feature_collector, cfg);
}

int vmaf_feature_score_at_index(VmafContext *vmaf, const char *feature_name,
double *score, unsigned index)
{
Expand Down
3 changes: 2 additions & 1 deletion libvmaf/src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ is_cuda_enabled = get_option('enable_cuda') == true
is_avx512_enabled = get_option('enable_avx512') == true
is_nvtx_enabled = get_option('enable_nvtx') == true

if is_nvtx_enabled
if is_nvtx_enabled
cdata.set10('HAVE_NVTX', is_nvtx_enabled)
endif

Expand Down Expand Up @@ -462,6 +462,7 @@ libvmaf_sources = [
src_dir + 'pdjson.c',
src_dir + 'log.c',
src_dir + 'framesync.c',
src_dir + 'propagate_metadata.c',
]

if is_cuda_enabled
Expand Down

0 comments on commit 35bf717

Please sign in to comment.