11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/time/time.h" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "media/base/audio_converter.h" 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "media/base/fake_audio_render_callback.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "testing/perf/perf_test.h" 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace media { 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const int kBenchmarkIterations = 200000; 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// InputCallback that zero's out the provided AudioBus. 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class NullInputProvider : public AudioConverter::InputCallback { 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NullInputProvider() {} 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual ~NullInputProvider() {} 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual double ProvideInput(AudioBus* audio_bus, 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::TimeDelta buffer_delay) OVERRIDE { 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) audio_bus->Zero(); 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return 1; 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RunConvertBenchmark(const AudioParameters& in_params, 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const AudioParameters& out_params, 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool fifo, 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& trace_name) { 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NullInputProvider fake_input1; 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NullInputProvider fake_input2; 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NullInputProvider fake_input3; 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<AudioBus> output_bus = AudioBus::Create(out_params); 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioConverter converter(in_params, out_params, !fifo); 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) converter.AddInput(&fake_input1); 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) converter.AddInput(&fake_input2); 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) converter.AddInput(&fake_input3); 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::TimeTicks start = base::TimeTicks::HighResNow(); 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < kBenchmarkIterations; ++i) { 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) converter.Convert(output_bus.get()); 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) double runs_per_second = kBenchmarkIterations / 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (base::TimeTicks::HighResNow() - start).InSecondsF(); 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) perf_test::PrintResult( 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "audio_converter", "", trace_name, runs_per_second, "runs/s", true); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(AudioConverterPerfTest, ConvertBenchmark) { 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Create input and output parameters to convert between the two most common 541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // sets of parameters (as indicated via UMA data). 551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters input_params( 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, 48000, 16, 2048); 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters output_params( 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, 44100, 16, 440); 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunConvertBenchmark(input_params, output_params, false, "convert"); 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST(AudioConverterPerfTest, ConvertBenchmarkFIFO) { 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Create input and output parameters to convert between common buffer sizes 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // without any resampling for the FIFO vs no FIFO benchmarks. 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters input_params(AudioParameters::AUDIO_PCM_LINEAR, 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CHANNEL_LAYOUT_STEREO, 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 44100, 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 16, 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2048); 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters output_params( 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, 44100, 16, 440); 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunConvertBenchmark(input_params, output_params, true, "convert_fifo_only"); 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunConvertBenchmark(input_params, output_params, false, 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) "convert_pass_through"); 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace media 80