This testing framework is initially developed by Intel for convex hull study.
It is contributed to Alliance for Open Media for convex hull study and future AV2
Common Test Condition (CTC) testing.

For questions and technical support, please contact ryanlei@fb.com or
maggie.sun@intel.com

This readme file provides a simple introduction of the framework and steps to
use it for different studies.

Prerequisites
1. Inside ./bin folder, make sure you have executables for all external tools,
   such as vmaf(version v2.1.1+), HDRConvert, encoder, decoder, etc. You can get
   the pre-build binaries or source code for the following tools that are needed:
   vmaf tools: https://github.com/Netflix/vmaf/releases/tag/v2.1.1
   HDRConvert: https://gitlab.com/standards/HDRTools 0.22 branch
   libaom research branch encoder/decoder: https://gitlab.com/AOMediaCodec/avm
   SVT AV1 encoder: https://github.com/OpenVisualCloud/SVT-AV1
   Please always follow the manual of these tools to update the command
   parameters used in the script.
   when EnableTimingInfo is enabled, ptime utility is used on Windows to capture
   the run time information for encode and decode. On Linux, time utility from
   Linux system is used to capture run time information.

2. AV2 CTC has adopted VMAF tool as the reference implementation of all quality
   metrics required. Using the versioned '--aom_ctc v1.0' at the command line
   will generate all quality metrics for AV2 CTC.

3. HDRConvert is used to perform downscale and upscale operation. It requires
   a template config file (HDRConvScalerY4MFile.cfg). It is also located under
   the ./bin folder. Test framework will generate individual config file based
   on this template.

4. VBA macro binary file (vbaProject-AV2.bin) for bdrate calculation is also
   stored under ./bin folder, which is needed for BDRATE calculation inside the
   excel file.

5. Test framework is implemented in python 3. It requires few extra python
   packages, such as xlrd, xlsxwriter, argparse, etc.

Things you need to update to configure the test.
1. Update the test clips table in AV2CTCVideo.py file following the existing
   example to provide the list and classes of video sequences that you want to
   test. Currently, only .y4m files are supported. Test script will parse the
   y4m file header to get the basic information of the video clip, such as
   resolution, frame rate, bit depth and color format, etc.

2. Update the test configuration list in ./src/Config.py to specify the test
   configurations. Currently, supported test configurations include Random Access
   (RA), Low Delay (LD), All Intra(AI) and Adaptive Streaming (AS).

3. Update FrameNum in ./src/Config.py to specify number of frames you want to
   process for different test configurations.

4. Update DnScaleRatio list in ./src/Config.py to provide the list of downscaling
   ratios used for adaptive streaming (convex hull) test configuration.

5. Update DnScalingAlgos and UpScalingAlgos list in ./src/Config.py to specify
   downscaling/upscaling filter types that you want to test. The name of the
   filter types is that supported by HDRConvert. The size of these two lists
   must be the same. Filter types for downscaling and upscaling can be different.
   Right now, only the lanczos filter is supported.

6. Update QPs list in ./src/Config.py to specify the list of QPs you want to
   test for different test configurations. QPs must be in the valid QP range for
   different coding standards. For example, [0, 63] for AV1, and [0, 255] for AV2.

7. Update QualityList in ./src/Config.py to specify quality metrics you want to
   calculate. Currently, only VMAF is supported for quality metrics calculation.

8. Update SMOKE_TEST flag, It is used for sanity check purpose, in which only
   few frames are processed to reduce the test time.

Sample command lines for running the adaptive streaming (convex hull) test:
"python ConvexHullTest.py [options]"
below is the full command line options in help message:
  -h, --help                   show this help message and exit
  -f, --function               function to run: clean, scaling, sumscaling,
                               encode, convexhull, summary
  -k, --KeepUpscaleOutput      [0|1] in function clean, if keep upscaled yuv
                               files. It is false by default
  -s, --SaveMemory             [0|1] save memory mode will delete most files in
                               intermediate steps and keeps only necessary ones
                               for RD calculation. It is false by default
  -CmdOnly, --LogCmdOnly       LogCmdOnly mode will only capture the command
                               sequences in the command log file instead of
                               actually run it. It is false by default
  -l, --LoggingLevel           logging level: 0:No Logging, 1: Critical, 2: Error,
                               3:Warning, 4: Info, 5: Debug
  -c, --CodecName              CodecName: av1, av2
  -m, --EncodeMethod           EncodeMethod: aom, svt
  -p, --EncodePreset           EncodePreset: 0,1,2... for aom and svt

when LogCmdOnly is set to True, the test framework will only capture all process
command sequences into a log file (under ./test/testLogs folder with time stamp)
without actually running it on your system. This feature is to support the use
case in which actual processing tasks need to distributed on to a server cluster
and executed in parallel.

Sample command for typical operations:
1.  python ConvexHullTest.py -f clean
    This command will clean up all intermediate files under ./test folder

2.  python ConvexHullTest.py -f scaling
    This command will run the standalone downscaling and upscaling tests.
    Downscaled YUV files are stored under ./test/downscaledYUVs folder.
    Upscaled YUV files are stored under ./test/upscaledYUVs folder.
    Quality metrics log files are stored under ./test/qualityLogs folder.
    Other processing logs and command logs are stored under ./test/testLogs folder.
    For using HDRConvert, individual config files are generated and stored under
    ./test/configFiles folder. All intermediate file names indicate the input,
    output resolution and filter types that are used.

3.  python ConvexHullTest.py -f sumscaling
    This command will summarize the quality metrics for the scaling test into
    excel files under ./analysis/scalingresult folder. There are excel files for
    each individual test sequence and also excel file that summarizes quality
    result for all test sequences based on classes.

4.  python ConvexHullTest.py -f encode -c av2 -m aom -p 1
    This command will run the encoding test. It actually contains downscale
    (optional), encode, decode, upscale, quality metrics steps. Right now, only
    av2 encoding/decoding with libaom is supported. Downscale step will be skipped
    if downscaled yuv files already generated in ./test/downscaledYUVs. Encoded
    bitstreams are stored under ./test/bitstreams folder. Decoded YUV files are
    stored under ./test/decodedYUVs folder. Decoded and then upscaled YUV files
    are stored under ./test/decUpscaledYUVs folder. Quality logs are stored under
    ./test/qualityLogs folder.

5.  python ConvexHullTest.py -f convexhull -c av2 -m aom -p 1
    This command will summarize the per sequence quality result based on
    different scaling ratios and scaling filter types.
    Please make sure the same encoding method/codec name/preset are used as the
    previous steps. Output excel files are stored under ./analysis/rdresult
    folder. For each sequence and downscaling/upscaling filter type, an excel
    sheet is generated that contains the bitrate and quality metric for different
    downscaled resolutions. Rate distortion curve for all quality metrics will
    be drawn in a scatter plot. Convex hull will be calculated and draw on top
    of the rate distortion curve.
    In this step, a summary excel file is also generated, which include the
    convex hull rate distortion points for all test content and downscaling and
    upscaling algorithm pair. This excel file is needed when you want to
    calculate bdrate between two encoding runs to evaluate the quality impact on
    overall convex hull from a coding tool.

6.  python ConvexHullTest.py -f summary -c av2 -m aom -p 1
    This command will summarize the quality metrics across all test sequences
    into an excel file stored under the ./analysis/summary folder. BDRATE between
    different resolutions will be calculated. Average result based on content
    classes will be calculated.

In order to calculate BDRATE between convex hull from two encoding test runs
with different codec or different encoding preset, ./src/ConvexHullBDRate.py
script is needed. Command line options for this script is as following:

usage: ConvexHullBDRate.py [options]

optional arguments:
  -h, --help       show this help message and exit
  -i1 , --input1   convex hull summary excel file for base mode
  -i2 , --input2   convex hull summary excel file for target mode
  -o , --output    output excel file with BDRATE for base and target modes

To use this script, the convex hull summary excel files for base and target
modes are needed. Script will parse the rate distortion data from the convex hull
for each individual test content, then it will use the bdrate macro to calculate
the bdrate between two convex hulls.

a sample command is:
python ConvexHullBDRate.py -i1 ConvexHullRD_ffmpeg_hevc_medium.xlsx
-i2 ConvexHullRD_ffmpeg_hevc_veryslow.xlsx -o ConvexHullBDRate.xlsm

Sample command lines for running the regular AV2 CTC test for All Intra(AI),
Low Delay(LD) and Random Access (RA) configurations:
"python AV2CTCTest.py [options]"

below is the full command line options in help message:

  -h, --help                   show this help message and exit
  -f, --function               function to run: clean, encode, summary
  -s, --SaveMemory             [0|1] save memory mode will delete most files in
                               intermediate steps and keeps only necessary ones
                               for RD calculation. It is false by default
  -CmdOnly, --LogCmdOnly       LogCmdOnly mode will only capture the command
                               sequences in the command log file instead of
                               actually run it. It is false by default
  -l, --LoggingLevel           logging level: 0:No Logging, 1: Critical, 2: Error,
                               3:Warning, 4: Info, 5: Debug
  -p, --EncodePreset           EncodePreset: 0,1,2... for aom

Sample command for typical operations:
1.  python AV2CTCTest.py -f clean
    This command will clean up all intermediate files under ./test folder

2.  python AV2CTCTest.py -f encode -p 1
    This command will run the encoding test. It actually contains encode, decode,
    and quality metrics steps. Right now, only av2 encoding/decoding with libaom
    is supported. Encoded bitstreams are stored under ./test/bitstreams folder.
    Decoded YUV files are stored under ./test/decodedYUVs folder. Quality logs
    are stored under ./test/qualityLogs folder. Timing information logs are stored
    under ./test/perfLogs floder.

3.  python AV2CTCTest.py -f summary -p 1
    This command will summarize the quality metrics across all test sequences
    into an csv file stored under the ./analysis/summary folder.

4.  after getting the csv file for two tests (reference and target), content of
    the csv files can be directly copied into the excel template
    (AV2Template_Vx.xlsm under the bin folder), which can calculate the BDRATE
    of the two tests.
