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