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