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