Skip to content

Commit

Permalink
Make additional changes related to wrapper.
Browse files Browse the repository at this point in the history
  • Loading branch information
li-zhi committed Oct 5, 2019
1 parent ee7bcc3 commit e4da5df
Show file tree
Hide file tree
Showing 18 changed files with 60 additions and 49 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ RUN pip install numpy scipy matplotlib notebook pandas sympy nose scikit-learn s
RUN git clone --depth 1 https://github.com/Netflix/vmaf.git vmaf
WORKDIR vmaf/
ENV PYTHONPATH=/vmaf/python/src:/vmaf:$PYTHONPATH
ENV PATH=/vmaf:/vmaf/wrapper:$PATH
ENV PATH=/vmaf:/vmaf/src/wrapper:$PATH
RUN make
WORKDIR /root/
2 changes: 1 addition & 1 deletion FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ A: VMAF does not guarantee that you get a perfect score in this case, but you sh

#### Q: How is the VMAF package versioned?

A: Since the package has been growing and there were confusion on what this VMAF number should be in the VERSION file, it is decided to stick to the convention that this VMAF version should only be related to the version of the default model for the `VmafQualityRunner`. Whenever there is a numerical change to the VMAF result in running the default model, this number is going to be updated. For anything else, we are going to use the VDK version number. For `libvmaf`, whenever there is an interface change or numerical change to the VMAF result, the version number at `https://github.com/Netflix/vmaf/blob/master/wrapper/libvmaf.pc` is going to be updated to the latest VDK number.
A: Since the package has been growing and there were confusion on what this VMAF number should be in the VERSION file, it is decided to stick to the convention that this VMAF version should only be related to the version of the default model for the `VmafQualityRunner`. Whenever there is a numerical change to the VMAF result in running the default model, this number is going to be updated. For anything else, we are going to use the VDK version number. For `libvmaf`, whenever there is an interface change or numerical change to the VMAF result, the version number at `https://github.com/Netflix/vmaf/blob/master/src/wrapper/libvmaf.pc` is going to be updated to the latest VDK number.

#### Q: If I train a model using the `run_vmaf_training` process with some dataset, and then I run the `run_testing` process with that trained model and the same dataset, why wouldn't I get the same results (SRCC, PCC, and RMSE)? [Issue #191](https://github.com/Netflix/vmaf/issues/191)

Expand Down
10 changes: 5 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@ all:
cd src/ptools; $(MAKE); cd ../..;
cd src/libsvm; $(MAKE); cd ../..;
cd src/libsvm; $(MAKE) lib; cd ../..;
cd wrapper; $(MAKE); cd ..;
cd src/wrapper; $(MAKE); cd ../..;
cd feature; $(MAKE); cd ..;


clean:
cd src/ptools; $(MAKE) clean; cd ../..;
cd src/libsvm; $(MAKE) clean; cd ../..;
cd wrapper; $(MAKE) clean; cd ..;
cd src/wrapper; $(MAKE) clean; cd ../..;
cd feature; $(MAKE) clean; cd ..;

test:
@echo hello;

install:
cd wrapper; $(MAKE) install; cd ..;
cd src/wrapper; $(MAKE) install; cd ../..;

uninstall:
cd wrapper; $(MAKE) uninstall; cd ..;
cd src/wrapper; $(MAKE) uninstall; cd ../..;

testlib:
cd wrapper; $(MAKE) testlib; cd ..;
cd src/wrapper; $(MAKE) testlib; cd ../..;

.PHONY: all clean $(TARGETS)

Expand Down
2 changes: 1 addition & 1 deletion feature/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ TOP = $(shell pwd)
SRCDIR = $(TOP)/src
OBJDIR = $(TOP)/obj
TOOLDIR = $(TOP)/tool
LIBVMAF = $(TOP)/../wrapper/libvmaf.a
LIBVMAF = $(TOP)/../src/wrapper/libvmaf.a

CFLAGS_COMMON = -g -O3 -fPIC -w -Wextra -pedantic
# CFLAGS_COMMON = -g -O0 -fPIC -Wall -Wextra -pedantic
Expand Down
2 changes: 1 addition & 1 deletion feature/msvc/moment.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
<ClCompile Include="..\src\moment_main.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\wrapper\libvmaf.vcxproj">
<ProjectReference Include="..\..\src\wrapper\libvmaf.vcxproj">
<Project>{5f5103f4-e473-4476-8e7b-fd3465e872b1}</Project>
</ProjectReference>
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion feature/msvc/ms_ssim.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
<ClCompile Include="..\src\ms_ssim_main.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\wrapper\libvmaf.vcxproj">
<ProjectReference Include="..\..\src\wrapper\libvmaf.vcxproj">
<Project>{5f5103f4-e473-4476-8e7b-fd3465e872b1}</Project>
</ProjectReference>
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion feature/msvc/psnr.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
<ClCompile Include="..\src\psnr_main.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\wrapper\libvmaf.vcxproj">
<ProjectReference Include="..\..\src\wrapper\libvmaf.vcxproj">
<Project>{5f5103f4-e473-4476-8e7b-fd3465e872b1}</Project>
</ProjectReference>
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion feature/msvc/ssim.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
<ClCompile Include="..\src\ssim_main.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\wrapper\libvmaf.vcxproj">
<ProjectReference Include="..\..\src\wrapper\libvmaf.vcxproj">
<Project>{5f5103f4-e473-4476-8e7b-fd3465e872b1}</Project>
</ProjectReference>
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion feature/msvc/vmaf.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
<ClCompile Include="..\src\vmaf_main.c" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\wrapper\libvmaf.vcxproj">
<ProjectReference Include="..\..\src\wrapper\libvmaf.vcxproj">
<Project>{5f5103f4-e473-4476-8e7b-fd3465e872b1}</Project>
</ProjectReference>
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ ptools_shared_lib = shared_library(
# Build libvmaf

feature_src_dir = './feature/src/'
src_dir = './wrapper/src/'
src_dir = './src/wrapper/src/'

vmaf_base_include = include_directories('./feature/src', './feature/src/common')

Expand Down
18 changes: 12 additions & 6 deletions python/src/vmaf/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
# Path to folder containing this file
VMAF_LIB_FOLDER = os.path.dirname(os.path.abspath(__file__))


# Assuming vmaf source checkout, path to top checked out folder
VMAF_PROJECT = os.path.abspath(os.path.join(VMAF_LIB_FOLDER, '../../..',))


def to_list(value):
"""
TODO python3: map() and filter() return a generator in python3, however vmaf assumes list
Expand All @@ -33,6 +35,7 @@ def to_list(value):
return value
return list(value)


def run_process(cmd, **kwargs):
ret = subprocess.call(cmd, **kwargs)
assert ret == 0, 'Process returned {ret}, cmd: {cmd}'.format(ret=ret, cmd=cmd)
Expand All @@ -43,22 +46,25 @@ def project_path(relative_path):
path = os.path.join(VMAF_PROJECT, relative_path)
return path


def required(path):
if not os.path.exists(path):
raise AssertionError("%s does not exist, did you build?" % (path))
return path


class ExternalProgram(object):
"""
External C programs relied upon by the python vmaf code
These external programs should be compiled before vmaf is ran, as per instructions in README
"""
psnr = project_path("feature/psnr")
moment = project_path("feature/moment")
ssim = project_path("feature/ssim")
ms_ssim = project_path("feature/ms_ssim")
vmaf = project_path("feature/vmaf")
vmafossexec = project_path("wrapper/vmafossexec")
psnr = project_path(os.path.join("feature", "psnr"))
moment = project_path(os.path.join("feature", "moment"))
ssim = project_path(os.path.join("feature", "ssim"))
ms_ssim = project_path(os.path.join("feature", "ms_ssim"))
vmaf = project_path(os.path.join("feature", "vmaf"))
vmafossexec = project_path(os.path.join("src", "wrapper", "vmafossexec"))


class ExternalProgramCaller(object):
"""
Expand Down
29 changes: 16 additions & 13 deletions python/test/command_line_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
__copyright__ = "Copyright 2016-2019, Netflix, Inc."
__license__ = "Apache, Version 2.0"


class CommandLineTest(unittest.TestCase):

def setUp(self):
Expand Down Expand Up @@ -139,6 +140,7 @@ def test_run_cleaning_cache_psnr(self):
ret = run_process(cmd, shell=True)
self.assertEquals(ret, 0)


class VmafossexecCommandLineTest(unittest.TestCase):

RC_SUCCESS = 0
Expand All @@ -150,108 +152,109 @@ class VmafossexecCommandLineTest(unittest.TestCase):
RC_MORE_ARGUMENT_ISSUE = 256 - 1

def test_run_vmafossexec(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model} --thread 1 --subsample 2".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_SUCCESS)

def test_run_vmafossexec_nonexist_model_file(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl_XXX"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_VMAF_EXCEPTION)

def test_run_vmafossexec_wrong_model_fmt(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl.model"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_LOGIC_ERROR)

def test_run_vmafossexec_nonexist_ref_file(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324_XXX.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_ARGUMENT_ISSUE)

def test_run_vmafossexec_nonexist_dis_file(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324_XXX.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_ARGUMENT_ISSUE)

def test_run_vmafossexec_unknown_yuv_fmt(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p_XXX 576 324 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_ARGUMENT_ISSUE)

def test_run_vmafossexec_odd_resolution(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 575 323 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_ARGUMENT_ISSUE)

def test_run_vmafossexec_wrong_wh_format(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 abc {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_MORE_ARGUMENT_ISSUE)

def test_run_vmafossexec_wrong_width_value(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 0 324 {ref} {dis} {model}".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_MORE_ARGUMENT_ISSUE)

def test_run_vmafossexec_unknown_log_fmt(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model} --log-fmt xml_XXX".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_MORE_ARGUMENT_ISSUE)

def test_run_vmafossexec_unknown_pooling(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model} --pool mean_XXX".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_MORE_ARGUMENT_ISSUE)

def test_run_vmafossexec_wrong_thread(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model} --thread -1 --subsample 2".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_MORE_ARGUMENT_ISSUE)

def test_run_vmafossexec_wrong_subsample(self):
exe = VmafConfig.root_path('wrapper', 'vmafossexec')
exe = VmafConfig.root_path('src', 'wrapper', 'vmafossexec')
cmd = "{exe} yuv420p 576 324 {ref} {dis} {model} --thread 0 --subsample 0".format(
exe=exe, ref=VmafConfig.test_resource_path("yuv", "src01_hrc00_576x324.yuv"),
dis=VmafConfig.test_resource_path("yuv", "src01_hrc01_576x324.yuv"), model=VmafConfig.model_path("other_models", "vmaf_v0.6.0.pkl"))
ret = subprocess.call(cmd, shell=True)
self.assertEquals(ret, self.RC_MORE_ARGUMENT_ISSUE)


if __name__ == '__main__':
unittest.main()
4 changes: 3 additions & 1 deletion python/test/lib/libvmaf_libtest.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import unittest
import os

from vmaf import project_path, required
from vmaf.config import VmafConfig
from vmaf.core.asset import Asset
Expand All @@ -14,7 +16,7 @@ class LibRunner(VmafossExecQualityRunner):
TYPE = "TESTLIB"

def _get_exec(self):
return required(project_path("wrapper/testlib"))
return required(project_path(os.path.join("src", "wrapper", "testlib")))


class QualityRunnerTest(unittest.TestCase):
Expand Down
2 changes: 1 addition & 1 deletion resource/doc/conf_interval.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ There are two ways to perform bootstrapping on VMAF. The first one is called pla

### Run in Command Line

To enable CI, use the option `--ci` in the command line tools with a bootstrapping model such as `model/vmaf_rb_v0.6.2/vmaf_rb_v0.6.2.pkl`. The `--ci` option is available for both `./run_vmaf` and `./wrapper/vmafossexec`. In [libvmaf](libvmaf.md), CI can be enabled by setting the argument `enable_conf_interval` to 1.
To enable CI, use the option `--ci` in the command line tools with a bootstrapping model such as `model/vmaf_rb_v0.6.2/vmaf_rb_v0.6.2.pkl`. The `--ci` option is available for both `./run_vmaf` and `./src/wrapper/vmafossexec`. In [libvmaf](libvmaf.md), CI can be enabled by setting the argument `enable_conf_interval` to 1.

For example, running

Expand Down
10 changes: 5 additions & 5 deletions resource/doc/libvmaf.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
`libvmaf.a` -- A Static Library of VMAF
===================

VMAF is now packaged into a static library called `libvmaf.a`, built using object files under `wrapper/obj` and `ptools` (10/4/2019 TO BE UPDATED).
VMAF is now packaged into a static library called `libvmaf.a`, built using object files under `src/wrapper/obj` and `src/ptools` (10/4/2019 TO BE UPDATED).

To build `libvmaf.a`, make the `ptools` library first, followed by `wrapper`:

```
cd ptools; make; cd ../wrapper; make; cd ..;
cd src/ptools; make; cd ../../src/wrapper; make; cd ../..;
```

The static library built is at `wrapper/libvmaf.a`. To install the library, run:
The static library built is at `src/wrapper/libvmaf.a`. To install the library, run:

```
sudo make install
Expand All @@ -25,15 +25,15 @@ int disable_avx, int enable_transform, int phone_model, int do_psnr, int do_ssim
int do_ms_ssim, char *pool_method, int thread, int subsample, int enable_conf_interval);
```

Here, `read_frame` is a callback function which can be used to pass data from a program to VMAF. `user_data` is a program specific data that can be used by the callback function. For sample usage of `compute_vmaf`, refer to [`wrapper/src/main.cpp`](../../wrapper/src/main.cpp).
Here, `read_frame` is a callback function which can be used to pass data from a program to VMAF. `user_data` is a program specific data that can be used by the callback function. For sample usage of `compute_vmaf`, refer to [`src/wrapper/src/main.cpp`](../../wrapper/src/main.cpp).

To test the library, run:

```
make testlib
```

This command will build an executable `testlib` using this library together with [`wrapper/src/main.cpp`](../../wrapper/src/main.cpp).
This command will build an executable `testlib` using this library together with [`src/wrapper/src/main.cpp`](../../wrapper/src/main.cpp).

To uninstall the library run:

Expand Down
6 changes: 3 additions & 3 deletions resource/doc/vmafossexec.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
`vmafossexec` -- a C++ "Wrapper" Executable
===================

The VDK package combines feature extraction implementation in C and the rest scripting code in Python. The Python layer allows fast prototyping, but sometimes deploying the Python dependency in production is a pain. Under [`wrapper`](../../wrapper), we provide a C++ implementation `vmafossexec` that has no dependency on Python.
The VDK package combines feature extraction implementation in C and the rest scripting code in Python. The Python layer allows fast prototyping, but sometimes deploying the Python dependency in production is a pain. Under [`src/wrapper`](../../src/wrapper), we provide a C++ implementation `vmafossexec` that has no dependency on Python.

To build `vmafossexec`, make the `ptools` library first, followed by the executable itself:

```
cd ptools; make; cd ../wrapper; make; cd ..;
cd src/ptools; make; cd ../../src/wrapper; make; cd ../..;
```

Under root, run `vmafossexec` as:

```
wrapper/vmafossexec yuv420p 576 324 \
src/wrapper/vmafossexec yuv420p 576 324 \
python/test/resource/yuv/src01_hrc00_576x324.yuv \
python/test/resource/yuv/src01_hrc01_576x324.yuv \
model/vmaf_v0.6.1.pkl \
Expand Down
Loading

0 comments on commit e4da5df

Please sign in to comment.