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.