1#!/usr/bin/env python3 2# SPDX-License-Identifier: Apache-2.0 3# ----------------------------------------------------------------------------- 4# Copyright 2022 Arm Limited 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); you may not 7# use this file except in compliance with the License. You may obtain a copy 8# of the License at: 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15# License for the specific language governing permissions and limitations 16# under the License. 17# ----------------------------------------------------------------------------- 18""" 19This script is a simple test runner for sweeps on multiple compressors. 20""" 21 22import os 23import subprocess as sp 24import re 25import sys 26 27LOG_COMMANDS = False 28LOG_PATTERN = re.compile(r"\s*Coding rate:\s*(.*)\s*MT/s") 29 30ISPC_BIN = "./Binaries/ISPC/ispc_astc.exe" 31ISPC_QUALITY = ["rgba", "rgb"] 32 33ASTC_BIN = "./bin/astcenc-avx2" 34ASTC_QUALITY = ["0", "8", "10", "20", "30", "40", "50", "60"] 35 36TEST_BLOCK_SIZES = ["4x4", "6x6", "8x8"] 37 38TEST_IMAGE = "./Test/Images/Kodak/LDR-RGB/ldr-rgb-kodak%02u.png" 39TEST_RANGE = 24 40TEST_REPEATS = 5 41 42OUT_CIMAGE = "out.astc" 43OUT_DIMAGE = "out.png" 44 45 46def run(command): 47 if LOG_COMMANDS: 48 print(" ".join(command)) 49 50 return sp.run(command, capture_output=True, universal_newlines=True) 51 52 53def run_astcenc(in_image, out_image, block_size, quality): 54 args = [ASTC_BIN, "-tl", in_image, out_image, block_size, quality, "-j", "1"] 55 result = run(args) 56 return float(LOG_PATTERN.search(result.stdout).group(1)) 57 58 59def run_ispc(in_image, out_image, block_size, quality): 60 args = [ISPC_BIN, in_image, out_image, block_size, quality] 61 result = run(args) 62 return float(LOG_PATTERN.search(result.stdout).group(1)) 63 64 65def decompress(in_image, out_image): 66 args = [ASTC_BIN, "-dl", in_image, out_image] 67 result = run(args) 68 os.remove(in_image) 69 70 71def compare(in_image, out_image): 72 args = ["compare", "-metric", "PSNR", in_image, out_image, "diff.png"] 73 result = run(args) 74 os.remove("diff.png") 75 os.remove(out_image) 76 return float(result.stderr) 77 78 79def main(): 80 """ 81 The main function. 82 83 Returns: 84 int: The process return code. 85 """ 86 # ISPC Tests 87 for block_size in TEST_BLOCK_SIZES: 88 for quality in ISPC_QUALITY: 89 print(f"ISPC {quality} {block_size}") 90 print(f"ISPC {quality} {block_size}", file=sys.stderr) 91 for index in range(1, TEST_RANGE + 1): 92 result_rate = 0.0 93 for repeat in range(0, TEST_REPEATS): 94 image = TEST_IMAGE % index 95 result_rate += run_ispc(image, OUT_CIMAGE, block_size, quality) 96 decompress(OUT_CIMAGE, OUT_DIMAGE) 97 result_error = compare(image, OUT_DIMAGE) 98 result_rate /= TEST_REPEATS 99 100 print("%s,Kodak%02u,%0.4f,%0.4f" % (block_size, index, result_rate, result_error)) 101 102 # ASTCENC Tests 103 for block_size in TEST_BLOCK_SIZES: 104 for quality in ASTC_QUALITY: 105 print(f"ASTC {quality} {block_size}") 106 print(f"ASTC {quality} {block_size}", file=sys.stderr) 107 for index in range(1, TEST_RANGE + 1): 108 result_rate = 0.0 109 for repeat in range(0, TEST_REPEATS): 110 image = TEST_IMAGE % index 111 result_rate += run_astcenc(image, OUT_DIMAGE, block_size, quality) 112 result_error = compare(image, OUT_DIMAGE) 113 result_rate /= TEST_REPEATS 114 115 print("%s,Kodak%02u,%0.4f,%0.4f" % (block_size, index, result_rate, result_error)) 116 117 return 0 118 119 120if __name__ == "__main__": 121 try: 122 sys.exit(main()) 123 except sp.CalledProcessError as ex: 124 print(ex.stdout) 125 print(ex.stderr) 126