1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
2 //
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file.
5
6 #include "benchmark/benchmark.h"
7 #include "lib/jxl/dec_external_image.h"
8 #include "lib/jxl/image_ops.h"
9
10 namespace jxl {
11 namespace {
12
13 // Decoder case, interleaves an internal float image.
BM_DecExternalImage_ConvertImageRGBA(benchmark::State & state)14 void BM_DecExternalImage_ConvertImageRGBA(benchmark::State& state) {
15 const size_t kNumIter = 5;
16 size_t xsize = state.range();
17 size_t ysize = state.range();
18 size_t num_channels = 4;
19
20 ImageMetadata im;
21 im.SetAlphaBits(8);
22 ImageBundle ib(&im);
23 Image3F color(xsize, ysize);
24 ZeroFillImage(&color);
25 ib.SetFromImage(std::move(color), ColorEncoding::SRGB());
26 ImageF alpha(xsize, ysize);
27 ZeroFillImage(&alpha);
28 ib.SetAlpha(std::move(alpha), /*alpha_is_premultiplied=*/false);
29
30 const size_t bytes_per_row = xsize * num_channels;
31 std::vector<uint8_t> interleaved(bytes_per_row * ysize);
32
33 for (auto _ : state) {
34 for (size_t i = 0; i < kNumIter; ++i) {
35 JXL_CHECK(ConvertToExternal(
36 ib,
37 /*bits_per_sample=*/8,
38 /*float_out=*/false, num_channels, JXL_NATIVE_ENDIAN,
39 /*stride*/ bytes_per_row,
40 /*thread_pool=*/nullptr, interleaved.data(), interleaved.size(),
41 /*out_callback=*/nullptr, /*out_opaque=*/nullptr,
42 /*undo_orientation=*/jxl::Orientation::kIdentity));
43 }
44 }
45
46 // Pixels per second.
47 state.SetItemsProcessed(kNumIter * state.iterations() * xsize * ysize);
48 state.SetBytesProcessed(kNumIter * state.iterations() * interleaved.size());
49 }
50
51 BENCHMARK(BM_DecExternalImage_ConvertImageRGBA)
52 ->RangeMultiplier(2)
53 ->Range(256, 2048);
54
55 } // namespace
56 } // namespace jxl
57