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)