blob: cc629b5cdee07c2428e0c76b49d0e9997835816c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/tests/test_audio_encoder.h"
#include "ppapi/c/pp_codecs.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/cpp/audio_encoder.h"
#include "ppapi/tests/testing_instance.h"
REGISTER_TEST_CASE(AudioEncoder);
bool TestAudioEncoder::Init() {
audio_encoder_interface_ = static_cast<const PPB_AudioEncoder_0_1*>(
pp::Module::Get()->GetBrowserInterface(PPB_AUDIOENCODER_INTERFACE_0_1));
return audio_encoder_interface_ && CheckTestingInterface();
}
void TestAudioEncoder::RunTests(const std::string& filter) {
RUN_CALLBACK_TEST(TestAudioEncoder, AvailableCodecs, filter);
RUN_CALLBACK_TEST(TestAudioEncoder, IncorrectParametersFails, filter);
RUN_CALLBACK_TEST(TestAudioEncoder, InitializeTwiceFails, filter);
RUN_CALLBACK_TEST(TestAudioEncoder, InitializeOpusMono, filter);
RUN_CALLBACK_TEST(TestAudioEncoder, InitializeOpusStereo, filter);
}
std::string TestAudioEncoder::TestAvailableCodecs() {
// Test that we get results for supported formats. We should at
// least get the software supported formats.
pp::AudioEncoder audio_encoder(instance_);
ASSERT_FALSE(audio_encoder.is_null());
TestCompletionCallbackWithOutput<std::vector<PP_AudioProfileDescription> >
callback(instance_->pp_instance(), false);
callback.WaitForResult(
audio_encoder.GetSupportedProfiles(callback.GetCallback()));
ASSERT_GE(callback.result(), 1U);
const std::vector<PP_AudioProfileDescription> audio_profiles =
callback.output();
ASSERT_GE(audio_profiles.size(), 1U);
bool found_opus_48hz = false;
for (uint32_t i = 0; i < audio_profiles.size(); ++i) {
const PP_AudioProfileDescription& description = audio_profiles[i];
if (description.profile == PP_AUDIOPROFILE_OPUS &&
description.sample_rate == PP_AUDIOBUFFER_SAMPLERATE_48000 &&
description.max_channels >= 2)
found_opus_48hz = true;
}
ASSERT_TRUE(found_opus_48hz);
PASS();
}
std::string TestAudioEncoder::TestIncorrectParametersFails() {
// Test that initializing the encoder with incorrect size fails.
pp::AudioEncoder audio_encoder(instance_);
ASSERT_FALSE(audio_encoder.is_null());
// Invalid number of channels.
TestCompletionCallback callback(instance_->pp_instance(), false);
callback.WaitForResult(audio_encoder.Initialize(
42, PP_AUDIOBUFFER_SAMPLERATE_48000, PP_AUDIOBUFFER_SAMPLESIZE_16_BITS,
PP_AUDIOPROFILE_OPUS, 10000, PP_HARDWAREACCELERATION_WITHFALLBACK,
callback.GetCallback()));
ASSERT_EQ(PP_ERROR_NOTSUPPORTED, callback.result());
// Invalid sampling rate.
callback.WaitForResult(audio_encoder.Initialize(
2, static_cast<PP_AudioBuffer_SampleRate>(123456),
PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, PP_AUDIOPROFILE_OPUS, 10000,
PP_HARDWAREACCELERATION_WITHFALLBACK, callback.GetCallback()));
ASSERT_EQ(PP_ERROR_NOTSUPPORTED, callback.result());
// Invalid sample size.
callback.WaitForResult(audio_encoder.Initialize(
2, static_cast<PP_AudioBuffer_SampleRate>(48000),
static_cast<PP_AudioBuffer_SampleSize>(72), PP_AUDIOPROFILE_OPUS, 10000,
PP_HARDWAREACCELERATION_WITHFALLBACK, callback.GetCallback()));
ASSERT_EQ(PP_ERROR_NOTSUPPORTED, callback.result());
PASS();
}
std::string TestAudioEncoder::TestInitializeTwiceFails() {
// Test that initializing the encoder with incorrect size fails.
pp::AudioEncoder audio_encoder(instance_);
ASSERT_FALSE(audio_encoder.is_null());
TestCompletionCallback callback(instance_->pp_instance(), false);
callback.WaitForResult(audio_encoder.Initialize(
2, PP_AUDIOBUFFER_SAMPLERATE_48000, PP_AUDIOBUFFER_SAMPLESIZE_16_BITS,
PP_AUDIOPROFILE_OPUS, 10000, PP_HARDWAREACCELERATION_WITHFALLBACK,
callback.GetCallback()));
ASSERT_EQ(PP_OK, callback.result());
callback.WaitForResult(audio_encoder.Initialize(
2, PP_AUDIOBUFFER_SAMPLERATE_48000, PP_AUDIOBUFFER_SAMPLESIZE_16_BITS,
PP_AUDIOPROFILE_OPUS, 10000, PP_HARDWAREACCELERATION_WITHFALLBACK,
callback.GetCallback()));
ASSERT_EQ(PP_ERROR_FAILED, callback.result());
PASS();
}
std::string TestAudioEncoder::TestInitializeOpusMono() {
return TestInitializeCodec(1, PP_AUDIOBUFFER_SAMPLERATE_48000,
PP_AUDIOBUFFER_SAMPLESIZE_16_BITS,
PP_AUDIOPROFILE_OPUS);
}
std::string TestAudioEncoder::TestInitializeOpusStereo() {
return TestInitializeCodec(2, PP_AUDIOBUFFER_SAMPLERATE_48000,
PP_AUDIOBUFFER_SAMPLESIZE_16_BITS,
PP_AUDIOPROFILE_OPUS);
}
std::string TestAudioEncoder::TestInitializeCodec(
uint32_t channels,
PP_AudioBuffer_SampleRate input_sample_rate,
PP_AudioBuffer_SampleSize input_sample_size,
PP_AudioProfile output_profile) {
pp::AudioEncoder audio_encoder(instance_);
ASSERT_FALSE(audio_encoder.is_null());
pp::Size audio_size(640, 480);
TestCompletionCallback callback(instance_->pp_instance(), false);
callback.WaitForResult(audio_encoder.Initialize(
channels, input_sample_rate, input_sample_size, output_profile, 10000,
PP_HARDWAREACCELERATION_WITHFALLBACK, callback.GetCallback()));
ASSERT_EQ(PP_OK, callback.result());
ASSERT_GE(audio_encoder.GetNumberOfSamples(), 2U);
TestCompletionCallbackWithOutput<pp::AudioBuffer> get_buffer(
instance_->pp_instance(), false);
get_buffer.WaitForResult(audio_encoder.GetBuffer(get_buffer.GetCallback()));
ASSERT_EQ(PP_OK, get_buffer.result());
PASS();
}