audio_converter_perftest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time/time.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_converter.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/fake_audio_render_callback.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/perf/perf_test.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kBenchmarkIterations = 500000; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InputCallback that zero's out the provided AudioBus. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NullInputProvider : public AudioConverter::InputCallback { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NullInputProvider() {} 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~NullInputProvider() {} 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual double ProvideInput(AudioBus* audio_bus, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta buffer_delay) OVERRIDE { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_bus->Zero(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunConvertBenchmark(const AudioParameters& in_params, 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const AudioParameters& out_params, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool fifo, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& trace_name) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NullInputProvider fake_input1; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NullInputProvider fake_input2; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NullInputProvider fake_input3; 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<AudioBus> output_bus = AudioBus::Create(out_params); 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AudioConverter converter(in_params, out_params, !fifo); 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch converter.AddInput(&fake_input1); 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch converter.AddInput(&fake_input2); 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch converter.AddInput(&fake_input3); 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::TimeTicks start = base::TimeTicks::HighResNow(); 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (int i = 0; i < kBenchmarkIterations; ++i) { 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch converter.Convert(output_bus.get()); 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) double runs_per_second = kBenchmarkIterations / 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (base::TimeTicks::HighResNow() - start).InSecondsF(); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) perf_test::PrintResult( 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "audio_converter", "", trace_name, runs_per_second, "runs/s", true); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(AudioConverterPerfTest, ConvertBenchmark) { 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Create input and output parameters to convert between the two most common 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // sets of parameters (as indicated via UMA data). 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AudioParameters input_params( 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, 48000, 16, 2048); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AudioParameters output_params( 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, 44100, 16, 440); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RunConvertBenchmark(input_params, output_params, false, "convert"); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST(AudioConverterPerfTest, ConvertBenchmarkFIFO) { 640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Create input and output parameters to convert between common buffer sizes 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // without any resampling for the FIFO vs no FIFO benchmarks. 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch AudioParameters input_params(AudioParameters::AUDIO_PCM_LINEAR, 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) CHANNEL_LAYOUT_STEREO, 680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 44100, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2048); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters output_params( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, 44100, 16, 440); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunConvertBenchmark(input_params, output_params, true, "convert_fifo_only"); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunConvertBenchmark(input_params, output_params, false, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "convert_pass_through"); 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)