1cc1dc7a3Sopenharmony_ci#!/usr/bin/env python3 2cc1dc7a3Sopenharmony_ci# SPDX-License-Identifier: Apache-2.0 3cc1dc7a3Sopenharmony_ci# ----------------------------------------------------------------------------- 4cc1dc7a3Sopenharmony_ci# Copyright 2021-2022 Arm Limited 5cc1dc7a3Sopenharmony_ci# 6cc1dc7a3Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); you may not 7cc1dc7a3Sopenharmony_ci# use this file except in compliance with the License. You may obtain a copy 8cc1dc7a3Sopenharmony_ci# of the License at: 9cc1dc7a3Sopenharmony_ci# 10cc1dc7a3Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 11cc1dc7a3Sopenharmony_ci# 12cc1dc7a3Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 13cc1dc7a3Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14cc1dc7a3Sopenharmony_ci# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15cc1dc7a3Sopenharmony_ci# License for the specific language governing permissions and limitations 16cc1dc7a3Sopenharmony_ci# under the License. 17cc1dc7a3Sopenharmony_ci# ----------------------------------------------------------------------------- 18cc1dc7a3Sopenharmony_ci""" 19cc1dc7a3Sopenharmony_ciA benchmarking sweep helper, which can generate a performance-vs-quality sweep 20cc1dc7a3Sopenharmony_cifor a single input images. Like other test functionality, this uses structured 21cc1dc7a3Sopenharmony_ciimage directory layouts for determining image settings to pass to the codec. 22cc1dc7a3Sopenharmony_ci""" 23cc1dc7a3Sopenharmony_ci 24cc1dc7a3Sopenharmony_ciimport argparse 25cc1dc7a3Sopenharmony_ciimport os 26cc1dc7a3Sopenharmony_ciimport platform 27cc1dc7a3Sopenharmony_ciimport sys 28cc1dc7a3Sopenharmony_ci 29cc1dc7a3Sopenharmony_ciimport testlib.encoder as te 30cc1dc7a3Sopenharmony_ciimport testlib.image as ti 31cc1dc7a3Sopenharmony_ci 32cc1dc7a3Sopenharmony_ci 33cc1dc7a3Sopenharmony_cidef parse_command_line(): 34cc1dc7a3Sopenharmony_ci """ 35cc1dc7a3Sopenharmony_ci Parse the command line. 36cc1dc7a3Sopenharmony_ci 37cc1dc7a3Sopenharmony_ci Returns: 38cc1dc7a3Sopenharmony_ci Namespace: The parsed command line container. 39cc1dc7a3Sopenharmony_ci """ 40cc1dc7a3Sopenharmony_ci parser = argparse.ArgumentParser() 41cc1dc7a3Sopenharmony_ci 42cc1dc7a3Sopenharmony_ci # All reference encoders 43cc1dc7a3Sopenharmony_ci parser.add_argument("--step", dest="step", default="10", type=int, help="step size") 44cc1dc7a3Sopenharmony_ci parser.add_argument("--repeats", dest="repeats", type=int, default=1, help="repeats") 45cc1dc7a3Sopenharmony_ci 46cc1dc7a3Sopenharmony_ci parser.add_argument(dest="image", default=None, 47cc1dc7a3Sopenharmony_ci help="select the test image to run") 48cc1dc7a3Sopenharmony_ci 49cc1dc7a3Sopenharmony_ci args = parser.parse_args() 50cc1dc7a3Sopenharmony_ci return args 51cc1dc7a3Sopenharmony_ci 52cc1dc7a3Sopenharmony_ci 53cc1dc7a3Sopenharmony_cidef main(): 54cc1dc7a3Sopenharmony_ci """ 55cc1dc7a3Sopenharmony_ci The main function. 56cc1dc7a3Sopenharmony_ci 57cc1dc7a3Sopenharmony_ci Returns: 58cc1dc7a3Sopenharmony_ci int: The process return code. 59cc1dc7a3Sopenharmony_ci """ 60cc1dc7a3Sopenharmony_ci # Parse command lines 61cc1dc7a3Sopenharmony_ci args = parse_command_line() 62cc1dc7a3Sopenharmony_ci 63cc1dc7a3Sopenharmony_ci blockSizes = ["4x4", "5x5", "6x6", "8x8", "10x10"] 64cc1dc7a3Sopenharmony_ci repeats = max(args.repeats, 1) 65cc1dc7a3Sopenharmony_ci step = max(args.step, 1) 66cc1dc7a3Sopenharmony_ci 67cc1dc7a3Sopenharmony_ci image = ti.TestImage(args.image) 68cc1dc7a3Sopenharmony_ci codec = te.Encoder2x("avx2") 69cc1dc7a3Sopenharmony_ci 70cc1dc7a3Sopenharmony_ci print("Block Size, Quality, PSNR (dB), Coding Time (s), Coding Rate (MT/s)") 71cc1dc7a3Sopenharmony_ci 72cc1dc7a3Sopenharmony_ci for blockSize in blockSizes: 73cc1dc7a3Sopenharmony_ci for quality in range(0, 101, args.step): 74cc1dc7a3Sopenharmony_ci localRepeats = repeats 75cc1dc7a3Sopenharmony_ci if quality < 20: 76cc1dc7a3Sopenharmony_ci localRepeats = localRepeats * 2 77cc1dc7a3Sopenharmony_ci if quality < 40: 78cc1dc7a3Sopenharmony_ci localRepeats = localRepeats * 2 79cc1dc7a3Sopenharmony_ci 80cc1dc7a3Sopenharmony_ci results = codec.run_test(image, blockSize, f"{quality}", localRepeats, False) 81cc1dc7a3Sopenharmony_ci psnr = results[0] 82cc1dc7a3Sopenharmony_ci codingTime = results[2] 83cc1dc7a3Sopenharmony_ci mts = results[3] 84cc1dc7a3Sopenharmony_ci 85cc1dc7a3Sopenharmony_ci print(f"{blockSize}, {quality}, {psnr}, {codingTime}, {mts}") 86cc1dc7a3Sopenharmony_ci 87cc1dc7a3Sopenharmony_ci return 0 88cc1dc7a3Sopenharmony_ci 89cc1dc7a3Sopenharmony_ci 90cc1dc7a3Sopenharmony_ciif __name__ == "__main__": 91cc1dc7a3Sopenharmony_ci sys.exit(main()) 92