210 lines
10 KiB
C++
210 lines
10 KiB
C++
/*
|
|
* Copyright 2021 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <audio_utils/ChannelMix.h>
|
|
|
|
#include <random>
|
|
#include <vector>
|
|
|
|
#include <benchmark/benchmark.h>
|
|
#include <log/log.h>
|
|
|
|
static constexpr audio_channel_mask_t kChannelPositionMasks[] = {
|
|
AUDIO_CHANNEL_OUT_FRONT_LEFT,
|
|
AUDIO_CHANNEL_OUT_FRONT_CENTER,
|
|
AUDIO_CHANNEL_OUT_STEREO,
|
|
AUDIO_CHANNEL_OUT_2POINT1,
|
|
AUDIO_CHANNEL_OUT_2POINT0POINT2,
|
|
AUDIO_CHANNEL_OUT_QUAD, // AUDIO_CHANNEL_OUT_QUAD_BACK
|
|
AUDIO_CHANNEL_OUT_QUAD_SIDE,
|
|
AUDIO_CHANNEL_OUT_SURROUND,
|
|
AUDIO_CHANNEL_OUT_2POINT1POINT2,
|
|
AUDIO_CHANNEL_OUT_3POINT0POINT2,
|
|
AUDIO_CHANNEL_OUT_PENTA,
|
|
AUDIO_CHANNEL_OUT_3POINT1POINT2,
|
|
AUDIO_CHANNEL_OUT_5POINT1, // AUDIO_CHANNEL_OUT_5POINT1_BACK
|
|
AUDIO_CHANNEL_OUT_5POINT1_SIDE,
|
|
AUDIO_CHANNEL_OUT_6POINT1,
|
|
AUDIO_CHANNEL_OUT_5POINT1POINT2,
|
|
AUDIO_CHANNEL_OUT_7POINT1,
|
|
AUDIO_CHANNEL_OUT_5POINT1POINT4,
|
|
AUDIO_CHANNEL_OUT_7POINT1POINT2,
|
|
AUDIO_CHANNEL_OUT_7POINT1POINT4,
|
|
AUDIO_CHANNEL_OUT_13POINT_360RA,
|
|
AUDIO_CHANNEL_OUT_22POINT2,
|
|
};
|
|
|
|
/*
|
|
$ adb shell /data/benchmarktest64/channelmix_benchmark/channelmix_benchmark
|
|
Pixel 7 arm64 benchmark
|
|
|
|
-----------------------------------------------------------
|
|
Benchmark Time CPU Iterations
|
|
-----------------------------------------------------------
|
|
channelmix_benchmark:
|
|
#BM_ChannelMix_Stereo/0 2266 ns 2251 ns 310903
|
|
#BM_ChannelMix_Stereo/1 2262 ns 2251 ns 310898
|
|
#BM_ChannelMix_Stereo/2 255 ns 254 ns 2754285
|
|
#BM_ChannelMix_Stereo/3 2969 ns 2954 ns 235901
|
|
#BM_ChannelMix_Stereo/4 3350 ns 3334 ns 209901
|
|
#BM_ChannelMix_Stereo/5 814 ns 810 ns 863246
|
|
#BM_ChannelMix_Stereo/6 814 ns 810 ns 863255
|
|
#BM_ChannelMix_Stereo/7 3349 ns 3328 ns 210234
|
|
#BM_ChannelMix_Stereo/8 3671 ns 3654 ns 191555
|
|
#BM_ChannelMix_Stereo/9 3680 ns 3654 ns 191583
|
|
#BM_ChannelMix_Stereo/10 3667 ns 3650 ns 191738
|
|
#BM_ChannelMix_Stereo/11 4109 ns 4089 ns 171118
|
|
#BM_ChannelMix_Stereo/12 1209 ns 1203 ns 581812
|
|
#BM_ChannelMix_Stereo/13 1209 ns 1203 ns 581666
|
|
#BM_ChannelMix_Stereo/14 4694 ns 4674 ns 149798
|
|
#BM_ChannelMix_Stereo/15 1306 ns 1301 ns 537843
|
|
#BM_ChannelMix_Stereo/16 1307 ns 1301 ns 537898
|
|
#BM_ChannelMix_Stereo/17 2059 ns 2050 ns 341145
|
|
#BM_ChannelMix_Stereo/18 2053 ns 2043 ns 342709
|
|
#BM_ChannelMix_Stereo/19 2462 ns 2451 ns 285554
|
|
#BM_ChannelMix_Stereo/20 7889 ns 7853 ns 89005
|
|
#BM_ChannelMix_Stereo/21 6133 ns 6104 ns 114499
|
|
#BM_ChannelMix_5Point1/0 1676 ns 1665 ns 420195
|
|
#BM_ChannelMix_5Point1/1 1675 ns 1667 ns 419527
|
|
#BM_ChannelMix_5Point1/2 537 ns 535 ns 1310551
|
|
#BM_ChannelMix_5Point1/3 3039 ns 3024 ns 231306
|
|
#BM_ChannelMix_5Point1/4 3763 ns 3744 ns 186929
|
|
#BM_ChannelMix_5Point1/5 698 ns 695 ns 990457
|
|
#BM_ChannelMix_5Point1/6 661 ns 657 ns 1058724
|
|
#BM_ChannelMix_5Point1/7 3766 ns 3748 ns 186771
|
|
#BM_ChannelMix_5Point1/8 4395 ns 4374 ns 159819
|
|
#BM_ChannelMix_5Point1/9 4389 ns 4369 ns 160144
|
|
#BM_ChannelMix_5Point1/10 4390 ns 4369 ns 160196
|
|
#BM_ChannelMix_5Point1/11 5111 ns 5084 ns 137574
|
|
#BM_ChannelMix_5Point1/12 652 ns 649 ns 1086857
|
|
#BM_ChannelMix_5Point1/13 653 ns 649 ns 1072477
|
|
#BM_ChannelMix_5Point1/14 5762 ns 5734 ns 122129
|
|
#BM_ChannelMix_5Point1/15 778 ns 774 ns 903415
|
|
#BM_ChannelMix_5Point1/16 778 ns 775 ns 903085
|
|
#BM_ChannelMix_5Point1/17 1220 ns 1214 ns 575908
|
|
#BM_ChannelMix_5Point1/18 1015 ns 1006 ns 694142
|
|
#BM_ChannelMix_5Point1/19 1382 ns 1373 ns 509721
|
|
#BM_ChannelMix_5Point1/20 10184 ns 10076 ns 69550
|
|
#BM_ChannelMix_5Point1/21 5401 ns 5362 ns 130580
|
|
#BM_ChannelMix_7Point1/0 1644 ns 1632 ns 428673
|
|
#BM_ChannelMix_7Point1/1 1640 ns 1633 ns 428639
|
|
#BM_ChannelMix_7Point1/2 722 ns 719 ns 973262
|
|
#BM_ChannelMix_7Point1/3 3076 ns 3062 ns 228509
|
|
#BM_ChannelMix_7Point1/4 3902 ns 3884 ns 180207
|
|
#BM_ChannelMix_7Point1/5 727 ns 723 ns 968505
|
|
#BM_ChannelMix_7Point1/6 3905 ns 3886 ns 180132
|
|
#BM_ChannelMix_7Point1/7 3903 ns 3886 ns 180110
|
|
#BM_ChannelMix_7Point1/8 4723 ns 4700 ns 148911
|
|
#BM_ChannelMix_7Point1/9 4727 ns 4704 ns 148850
|
|
#BM_ChannelMix_7Point1/10 4723 ns 4702 ns 148944
|
|
#BM_ChannelMix_7Point1/11 5518 ns 5492 ns 127454
|
|
#BM_ChannelMix_7Point1/12 723 ns 720 ns 971533
|
|
#BM_ChannelMix_7Point1/13 5520 ns 5492 ns 127444
|
|
#BM_ChannelMix_7Point1/14 6299 ns 6270 ns 111619
|
|
#BM_ChannelMix_7Point1/15 561 ns 559 ns 1266804
|
|
#BM_ChannelMix_7Point1/16 563 ns 559 ns 1254781
|
|
#BM_ChannelMix_7Point1/17 1240 ns 1234 ns 561452
|
|
#BM_ChannelMix_7Point1/18 1100 ns 1095 ns 638789
|
|
#BM_ChannelMix_7Point1/19 1525 ns 1518 ns 460122
|
|
#BM_ChannelMix_7Point1/20 10998 ns 10950 ns 63928
|
|
#BM_ChannelMix_7Point1/21 4656 ns 4621 ns 151487
|
|
#BM_ChannelMix_7Point1Point4/0 2301 ns 2290 ns 305500
|
|
#BM_ChannelMix_7Point1Point4/1 2301 ns 2290 ns 305620
|
|
#BM_ChannelMix_7Point1Point4/2 913 ns 908 ns 770049
|
|
#BM_ChannelMix_7Point1Point4/3 4232 ns 4212 ns 166032
|
|
#BM_ChannelMix_7Point1Point4/4 5241 ns 5216 ns 134179
|
|
#BM_ChannelMix_7Point1Point4/5 1084 ns 1079 ns 648761
|
|
#BM_ChannelMix_7Point1Point4/6 5243 ns 5219 ns 134126
|
|
#BM_ChannelMix_7Point1Point4/7 5250 ns 5226 ns 133968
|
|
#BM_ChannelMix_7Point1Point4/8 6225 ns 6194 ns 112973
|
|
#BM_ChannelMix_7Point1Point4/9 6223 ns 6193 ns 112985
|
|
#BM_ChannelMix_7Point1Point4/10 6223 ns 6193 ns 113047
|
|
#BM_ChannelMix_7Point1Point4/11 7416 ns 7380 ns 94840
|
|
#BM_ChannelMix_7Point1Point4/12 903 ns 899 ns 778228
|
|
#BM_ChannelMix_7Point1Point4/13 7414 ns 7380 ns 94835
|
|
#BM_ChannelMix_7Point1Point4/14 8354 ns 8314 ns 84219
|
|
#BM_ChannelMix_7Point1Point4/15 818 ns 815 ns 865119
|
|
#BM_ChannelMix_7Point1Point4/16 820 ns 816 ns 854456
|
|
#BM_ChannelMix_7Point1Point4/17 1106 ns 1100 ns 636240
|
|
#BM_ChannelMix_7Point1Point4/18 1104 ns 1099 ns 636313
|
|
#BM_ChannelMix_7Point1Point4/19 1151 ns 1145 ns 611497
|
|
#BM_ChannelMix_7Point1Point4/20 14454 ns 14385 ns 48561
|
|
#BM_ChannelMix_7Point1Point4/21 5982 ns 5954 ns 117562
|
|
*/
|
|
|
|
template<audio_channel_mask_t OUTPUT_CHANNEL_MASK>
|
|
static void BenchmarkChannelMix(benchmark::State& state) {
|
|
const audio_channel_mask_t channelMask = kChannelPositionMasks[state.range(0)];
|
|
using namespace ::android::audio_utils::channels;
|
|
ChannelMix<OUTPUT_CHANNEL_MASK> channelMix(channelMask);
|
|
const size_t outChannels = audio_channel_count_from_out_mask(OUTPUT_CHANNEL_MASK);
|
|
constexpr size_t frameCount = 1024;
|
|
size_t inChannels = audio_channel_count_from_out_mask(channelMask);
|
|
std::vector<float> input(inChannels * frameCount);
|
|
std::vector<float> output(outChannels * frameCount);
|
|
constexpr float amplitude = 0.01f;
|
|
|
|
std::minstd_rand gen(channelMask);
|
|
std::uniform_real_distribution<> dis(-amplitude, amplitude);
|
|
for (auto& in : input) {
|
|
in = dis(gen);
|
|
}
|
|
|
|
assert(channelMix.getInputChannelMask() != AUDIO_CHANNEL_NONE);
|
|
// Run the test
|
|
for (auto _ : state) {
|
|
benchmark::DoNotOptimize(input.data());
|
|
benchmark::DoNotOptimize(output.data());
|
|
channelMix.process(input.data(), output.data(), frameCount, false /* accumulate */);
|
|
benchmark::ClobberMemory();
|
|
}
|
|
|
|
state.SetComplexityN(inChannels);
|
|
state.SetLabel(audio_channel_out_mask_to_string(channelMask));
|
|
}
|
|
|
|
static void BM_ChannelMix_Stereo(benchmark::State& state) {
|
|
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_STEREO>(state);
|
|
}
|
|
|
|
static void BM_ChannelMix_5Point1(benchmark::State& state) {
|
|
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_5POINT1>(state);
|
|
}
|
|
|
|
static void BM_ChannelMix_7Point1(benchmark::State& state) {
|
|
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_7POINT1>(state);
|
|
}
|
|
|
|
static void BM_ChannelMix_7Point1Point4(benchmark::State& state) {
|
|
BenchmarkChannelMix<AUDIO_CHANNEL_OUT_7POINT1POINT4>(state);
|
|
}
|
|
|
|
static void ChannelMixArgs(benchmark::internal::Benchmark* b) {
|
|
for (int i = 0; i < (int)std::size(kChannelPositionMasks); i++) {
|
|
b->Args({i});
|
|
}
|
|
}
|
|
|
|
BENCHMARK(BM_ChannelMix_Stereo)->Apply(ChannelMixArgs);
|
|
|
|
BENCHMARK(BM_ChannelMix_5Point1)->Apply(ChannelMixArgs);
|
|
|
|
BENCHMARK(BM_ChannelMix_7Point1)->Apply(ChannelMixArgs);
|
|
|
|
BENCHMARK(BM_ChannelMix_7Point1Point4)->Apply(ChannelMixArgs);
|
|
|
|
BENCHMARK_MAIN();
|