| // 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(); | |
| } |