int width;
int height;
double vmaf_score;
+ int vmaf_thread_created;
pthread_t vmaf_thread;
pthread_mutex_t lock;
pthread_cond_t cond;
int ssim;
int ms_ssim;
char *pool;
+ int n_threads;
+ int n_subsample;
+ int enable_conf_interval;
int error;
} LIBVMAFContext;
{"ssim", "Enables computing ssim along with vmaf.", OFFSET(ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{"ms_ssim", "Enables computing ms-ssim along with vmaf.", OFFSET(ms_ssim), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{"pool", "Set the pool method to be used for computing vmaf.", OFFSET(pool), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 1, FLAGS},
+ {"n_threads", "Set number of threads to be used when computing vmaf.", OFFSET(n_threads), AV_OPT_TYPE_INT, {.i64=0}, 0, UINT_MAX, FLAGS},
+ {"n_subsample", "Set interval for frame subsampling used when computing vmaf.", OFFSET(n_subsample), AV_OPT_TYPE_INT, {.i64=1}, 1, UINT_MAX, FLAGS},
+ {"enable_conf_interval", "Enables confidence interval.", OFFSET(enable_conf_interval), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS},
{ NULL }
};
const type *main_ptr = (const type *) s->gmain->data[0]; \
\
float *ptr = ref_data; \
+ float factor = 1.f / (1 << (bits - 8)); \
\
int h = s->height; \
int w = s->width; \
\
for (i = 0; i < h; i++) { \
for ( j = 0; j < w; j++) { \
- ptr[j] = (float)ref_ptr[j]; \
+ ptr[j] = ref_ptr[j] * factor; \
} \
ref_ptr += ref_stride / sizeof(*ref_ptr); \
ptr += stride / sizeof(*ptr); \
\
for (i = 0; i < h; i++) { \
for (j = 0; j < w; j++) { \
- ptr[j] = (float)main_ptr[j]; \
+ ptr[j] = main_ptr[j] * factor; \
} \
main_ptr += main_stride / sizeof(*main_ptr); \
ptr += stride / sizeof(*ptr); \
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->ms_ssim, s->pool,
+ s->n_threads, s->n_subsample, s->enable_conf_interval);
}
static void *call_vmaf(void *ctx)
s->gref = av_frame_alloc();
s->gmain = av_frame_alloc();
+ if (!s->gref || !s->gmain)
+ return AVERROR(ENOMEM);
+
s->error = 0;
+ s->vmaf_thread_created = 0;
pthread_mutex_init(&s->lock, NULL);
pthread_cond_init (&s->cond, NULL);
av_log(ctx, AV_LOG_ERROR, "Thread creation failed.\n");
return AVERROR(EINVAL);
}
+ s->vmaf_thread_created = 1;
return 0;
}
pthread_cond_signal(&s->cond);
pthread_mutex_unlock(&s->lock);
- pthread_join(s->vmaf_thread, NULL);
+ if (s->vmaf_thread_created)
+ {
+ pthread_join(s->vmaf_thread, NULL);
+ s->vmaf_thread_created = 0;
+ }
av_frame_free(&s->gref);
av_frame_free(&s->gmain);