71 #define OFFSET(x) offsetof(LIBVMAFContext, x)
72 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
75 {
"model_path",
"Set the model to be used for computing vmaf.",
OFFSET(model_path),
AV_OPT_TYPE_STRING, {.str=
"/usr/local/share/model/vmaf_v0.6.1.pkl"}, 0, 1,
FLAGS},
79 {
"phone_model",
"Invokes the phone model that will generate higher VMAF scores.",
OFFSET(phone_model),
AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1,
FLAGS},
84 {
"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},
85 {
"n_subsample",
"Set interval for frame subsampling used when computing vmaf.",
OFFSET(n_subsample),
AV_OPT_TYPE_INT, {.i64=1}, 1, UINT_MAX,
FLAGS},
92 #define read_frame_fn(type, bits) \
93 static int read_frame_##bits##bit(float *ref_data, float *main_data, \
94 float *temp_data, int stride, void *ctx) \
96 LIBVMAFContext *s = (LIBVMAFContext *) ctx; \
99 pthread_mutex_lock(&s->lock); \
101 while (!s->frame_set && !s->eof) { \
102 pthread_cond_wait(&s->cond, &s->lock); \
105 if (s->frame_set) { \
106 int ref_stride = s->gref->linesize[0]; \
107 int main_stride = s->gmain->linesize[0]; \
109 const type *ref_ptr = (const type *) s->gref->data[0]; \
110 const type *main_ptr = (const type *) s->gmain->data[0]; \
112 float *ptr = ref_data; \
119 for (i = 0; i < h; i++) { \
120 for ( j = 0; j < w; j++) { \
121 ptr[j] = (float)ref_ptr[j]; \
123 ref_ptr += ref_stride / sizeof(*ref_ptr); \
124 ptr += stride / sizeof(*ptr); \
129 for (i = 0; i < h; i++) { \
130 for (j = 0; j < w; j++) { \
131 ptr[j] = (float)main_ptr[j]; \
133 main_ptr += main_stride / sizeof(*main_ptr); \
134 ptr += stride / sizeof(*ptr); \
138 ret = !s->frame_set; \
140 av_frame_unref(s->gref); \
141 av_frame_unref(s->gmain); \
144 pthread_cond_signal(&s->cond); \
145 pthread_mutex_unlock(&s->lock); \
159 int (*
read_frame)(
float *ref_data,
float *main_data,
float *temp_data,
215 "libvmaf encountered an error, check log for details\n");
302 outlink->
w = mainlink->
w;
303 outlink->
h = mainlink->
h;
367 .preinit = libvmaf_framesync_preinit,
373 .priv_class = &libvmaf_class,
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
static const char * format[]
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
This structure describes decoded (raw) audio or video data.
#define pthread_mutex_lock(a)
static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
static int do_vmaf(FFFrameSync *fs)
static int query_formats(AVFilterContext *ctx)
planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Main libavfilter public API header.
const AVPixFmtDescriptor * desc
int h
agreed upon image height
int(* on_event)(struct FFFrameSync *fs)
Callback called when a frame event is ready.
static const AVFilterPad libvmaf_outputs[]
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
const char * name
Pad name.
AVFilterContext * parent
Parent filter context.
AVFilterLink ** inputs
array of pointers to input links
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define fs(width, name, subs,...)
int ff_framesync_init_dualinput(FFFrameSync *fs, AVFilterContext *parent)
Initialize a frame sync structure for dualinput.
int ff_framesync_dualinput_get(FFFrameSync *fs, AVFrame **f0, AVFrame **f1)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
static double psnr(double d)
static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
A filter pad used for either input or output.
A link between two filters.
planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable; if left to 0/0, will be automatically copied from the first input of the source filter if it exists.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void * priv
private data for use by the filter
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link...
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
int w
agreed upon image width
static const AVOption libvmaf_options[]
static av_cold int init(AVFilterContext *ctx)
static int read_frame(AVFilterContext *ctx, FPSContext *s, AVFilterLink *inlink, AVFilterLink *outlink)
#define read_frame_fn(type, bits)
static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
static int activate(AVFilterContext *ctx)
AVFilterContext * src
source filter
#define pthread_mutex_unlock(a)
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
int format
agreed upon media format
static av_cold void uninit(AVFilterContext *ctx)
static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
#define AV_LOG_INFO
Standard information.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Describe the class of an AVClass context structure.
static const AVFilterPad libvmaf_inputs[]
const char * name
Filter name.
AVRational sample_aspect_ratio
agreed upon sample aspect ratio
AVFilterLink ** outputs
array of pointers to output links
static enum AVPixelFormat pix_fmts[]
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static void compute_vmaf_score(LIBVMAFContext *s)
static int ref[MAX_W *MAX_W]
static void * call_vmaf(void *ctx)
static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
AVFilterContext * dst
dest filter
FRAMESYNC_DEFINE_CLASS(libvmaf, LIBVMAFContext, fs)
static int config_output(AVFilterLink *outlink)
int depth
Number of bits in the component.
static int config_input_ref(AVFilterLink *inlink)
AVPixelFormat
Pixel format.