Skip to content

Commit

Permalink
Avoid running starboard code during nplb init
Browse files Browse the repository at this point in the history
b/373491347
  • Loading branch information
jasonzhangxx committed Feb 25, 2025
1 parent 7a22759 commit 27b6950
Show file tree
Hide file tree
Showing 10 changed files with 199 additions and 251 deletions.
3 changes: 1 addition & 2 deletions starboard/evergreen/x64/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@
# pylint: disable=line-too-long
_FILTERED_TESTS = {
'nplb': [
'MultiplePlayerTests/*/*sintel_329_ec3_dmp*',
'MultiplePlayerTests/*/*sintel_381_ac3_dmp*',
'MultiplePlayerTests/*',
'SbPlayerGetAudioConfigurationTests/*audio_sintel_329_ec3_dmp_*',
'SbPlayerGetAudioConfigurationTests/*audio_sintel_381_ac3_dmp_*',
'SbPlayerGetMediaTimeTests/*audio_sintel_329_ec3_dmp_*',
Expand Down
3 changes: 1 addition & 2 deletions starboard/linux/shared/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@
# pylint: disable=line-too-long
_MODULAR_BUILD_FILTERED_TESTS = {
'nplb': [
'MultiplePlayerTests/*/*sintel_329_ec3_dmp*',
'MultiplePlayerTests/*/*sintel_381_ac3_dmp*',
'MultiplePlayerTests/*',
'PosixDirectoryCanOpenTest.FailureMissingStaticContent',
'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.WriteSingleBatch/audio_sintel_329_ec3_dmp_*',
'SbPlayerWriteSampleTests/SbPlayerWriteSampleTest.WriteSingleBatch/audio_sintel_381_ac3_dmp_*',
Expand Down
20 changes: 15 additions & 5 deletions starboard/nplb/media_set_audio_write_duration_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,19 @@ class SbMediaSetAudioWriteDurationTest
public:
SbMediaSetAudioWriteDurationTest() : dmp_reader_(GetParam()) {}

void SetUp() override {
SbMediaAudioCodec audio_codec = dmp_reader_.audio_codec();
PlayerCreationParam creation_param = CreatePlayerCreationParam(
audio_codec, kSbMediaVideoCodecNone, kSbPlayerOutputModeInvalid);
SbPlayerCreationParam param = {};
creation_param.ConvertTo(&param);
creation_param.output_mode = SbPlayerGetPreferredOutputMode(&param);

SbPlayerTestConfig test_config(GetParam(), "", creation_param.output_mode,
"");
SkipTestIfUnsupported(test_config);
}

void TryToWritePendingSample() {
{
starboard::ScopedSpinLock lock(&pending_decoder_status_lock_);
Expand Down Expand Up @@ -286,10 +299,7 @@ std::vector<const char*> GetSupportedTests() {
for (auto filename : kFilenames) {
VideoDmpReader dmp_reader(filename, VideoDmpReader::kEnableReadOnDemand);
SB_DCHECK(dmp_reader.number_of_audio_buffers() > 0);
if (SbMediaCanPlayMimeAndKeySystem(dmp_reader.audio_mime_type().c_str(),
"")) {
test_params.push_back(filename);
}
test_params.push_back(filename);
}

SB_DCHECK(!test_params.empty());
Expand All @@ -298,7 +308,7 @@ std::vector<const char*> GetSupportedTests() {

INSTANTIATE_TEST_CASE_P(SbMediaSetAudioWriteDurationTests,
SbMediaSetAudioWriteDurationTest,
ValuesIn(GetSupportedTests()));
ValuesIn(GetAudioTestFiles()));
} // namespace
} // namespace nplb
} // namespace starboard
252 changes: 114 additions & 138 deletions starboard/nplb/multiple_player_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,123 @@ class PlayerThread : public posix::AbstractTestThread {
std::function<void()> functor_;
};

class MultiplePlayerTest
: public ::testing::TestWithParam<SbPlayerMultiplePlayerTestConfig> {
std::string GetMultipleSbPlayerTestConfigDescription(
SbPlayerMultiplePlayerTestConfig multiplayer_test_config) {
SB_DCHECK(multiplayer_test_config.size() > 0);
const SbPlayerOutputMode output_mode = multiplayer_test_config[0].output_mode;
const char* key_system = multiplayer_test_config[0].key_system;

std::string description;
for (int i = 0; i < multiplayer_test_config.size(); i++) {
const SbPlayerTestConfig& config = multiplayer_test_config[i];
const char* audio_filename = config.audio_filename;
const char* video_filename = config.video_filename;

if (i > 0) {
description += "_";
}
description += FormatString(
"audio%d_%s_video%d_%s", i,
audio_filename && strlen(audio_filename) > 0 ? audio_filename : "null",
i,
video_filename && strlen(video_filename) > 0 ? video_filename : "null");
}

description += FormatString("_output_%s_key_system_%s",
output_mode == kSbPlayerOutputModeDecodeToTexture
? "decode_to_texture"
: "punch_out",
strlen(key_system) > 0 ? key_system : "null");
std::replace(description.begin(), description.end(), '.', '_');
std::replace(description.begin(), description.end(), '(', '_');
std::replace(description.begin(), description.end(), ')', '_');
return description;
}

class MultiplePlayerTest : public ::testing::Test {
protected:
void RunTest(const MultiplePlayerTestFunctor& functor);
void SetUp() override {
const int kMaxPlayerInstancesPerConfig = 3;
const int kMaxTotalPlayerInstances = 5;

const std::vector<const char*>& audio_test_files = GetAudioTestFiles();
const std::vector<const char*>& video_test_files = GetVideoTestFiles();
const std::vector<SbPlayerOutputMode>& output_modes =
GetPlayerOutputModes();
const std::vector<const char*>& key_systems = GetKeySystems();

for (auto key_system : key_systems) {
std::vector<SbPlayerTestConfig> supported_configs;
for (auto video_filename : video_test_files) {
VideoDmpReader dmp_reader(video_filename,
VideoDmpReader::kEnableReadOnDemand);
SB_DCHECK(dmp_reader.number_of_video_buffers() > 0);
if (SbMediaCanPlayMimeAndKeySystem(dmp_reader.video_mime_type().c_str(),
key_system)) {
supported_configs.push_back({nullptr, video_filename,
kSbPlayerOutputModeInvalid, key_system});
}
}

if (supported_configs.empty()) {
continue;
}

std::vector<const char*> supported_audio_files;
for (auto audio_filename : audio_test_files) {
VideoDmpReader dmp_reader(audio_filename,
VideoDmpReader::kEnableReadOnDemand);
SB_DCHECK(dmp_reader.number_of_audio_buffers() > 0);
if (SbMediaCanPlayMimeAndKeySystem(dmp_reader.audio_mime_type().c_str(),
key_system)) {
supported_audio_files.push_back(audio_filename);
}
}

// TODO: use SbPlayerGetPreferredOutputMode() to choose output mode.
for (auto output_mode : output_modes) {
for (auto& config : supported_configs) {
config.output_mode = output_mode;
}

MaximumPlayerConfigurationExplorer explorer(
supported_configs, kMaxPlayerInstancesPerConfig,
kMaxTotalPlayerInstances, &fake_graphics_context_provider_);
std::vector<SbPlayerMultiplePlayerTestConfig> explorer_output =
explorer.CalculateMaxTestConfigs();

// Add audio codec to configs using round robin algorithm.
for (auto& multi_player_test_config : explorer_output) {
int audio_file_index = 0;
for (auto& config : multi_player_test_config) {
config.audio_filename = supported_audio_files[audio_file_index];
audio_file_index =
(audio_file_index + 1) % supported_audio_files.size();
}
}

multiplayer_test_configs_.insert(multiplayer_test_configs_.end(),
explorer_output.begin(),
explorer_output.end());
}
}
}

void RunTest(const MultiplePlayerTestFunctor& functor,
const SbPlayerMultiplePlayerTestConfig& multiplayer_test_config);

std::vector<SbPlayerMultiplePlayerTestConfig> multiplayer_test_configs_;
FakeGraphicsContextProvider fake_graphics_context_provider_;
};

void MultiplePlayerTest::RunTest(const MultiplePlayerTestFunctor& functor) {
void MultiplePlayerTest::RunTest(
const MultiplePlayerTestFunctor& functor,
const SbPlayerMultiplePlayerTestConfig& multiplayer_test_config) {
// TODO(b/368228941): Skip test case(s) not applicable to Android.
if (GetRuntimePlatform() == PlatformType::kPlatformTypeAndroid) {
GTEST_SKIP() << "Not applicable on Android";
}

const SbPlayerMultiplePlayerTestConfig& multiplayer_test_config = GetParam();
std::list<PlayerThread> player_threads;
for (const SbPlayerTestConfig& player_config : multiplayer_test_config) {
player_threads.emplace_back(
Expand All @@ -75,29 +178,6 @@ void MultiplePlayerTest::RunTest(const MultiplePlayerTestFunctor& functor) {
}
}

void NoInput(const SbPlayerTestConfig& player_config,
FakeGraphicsContextProvider* fake_graphics_context_provider) {
SbPlayerTestFixture player_fixture(player_config,
fake_graphics_context_provider);
if (::testing::Test::HasFatalFailure()) {
return;
}

GroupedSamples samples;
if (player_fixture.HasAudio()) {
samples.AddAudioEOS();
}
if (player_fixture.HasVideo()) {
samples.AddVideoEOS();
}
ASSERT_NO_FATAL_FAILURE(player_fixture.Write(samples));
ASSERT_NO_FATAL_FAILURE(player_fixture.WaitForPlayerEndOfStream());
}

TEST_P(MultiplePlayerTest, NoInput) {
RunTest(NoInput);
}

void WriteSamples(const SbPlayerTestConfig& player_config,
FakeGraphicsContextProvider* fake_graphics_context_provider) {
SbPlayerTestFixture player_fixture(player_config,
Expand All @@ -124,119 +204,15 @@ void WriteSamples(const SbPlayerTestConfig& player_config,
ASSERT_NO_FATAL_FAILURE(player_fixture.WaitForPlayerEndOfStream());
}

TEST_P(MultiplePlayerTest, WriteSamples) {
RunTest(WriteSamples);
}

std::string GetMultipleSbPlayerTestConfigName(
::testing::TestParamInfo<SbPlayerMultiplePlayerTestConfig> info) {
const SbPlayerMultiplePlayerTestConfig& multiplayer_test_config = info.param;

SB_DCHECK(multiplayer_test_config.size() > 0);
const SbPlayerOutputMode output_mode = multiplayer_test_config[0].output_mode;
const char* key_system = multiplayer_test_config[0].key_system;

std::string name;
for (int i = 0; i < multiplayer_test_config.size(); i++) {
const SbPlayerTestConfig& config = multiplayer_test_config[i];
const char* audio_filename = config.audio_filename;
const char* video_filename = config.video_filename;

if (i > 0) {
name += "_";
}
name += FormatString(
"audio%d_%s_video%d_%s", i,
audio_filename && strlen(audio_filename) > 0 ? audio_filename : "null",
i,
video_filename && strlen(video_filename) > 0 ? video_filename : "null");
}

name += FormatString("_output_%s_key_system_%s",
output_mode == kSbPlayerOutputModeDecodeToTexture
? "decode_to_texture"
: "punch_out",
strlen(key_system) > 0 ? key_system : "null");
std::replace(name.begin(), name.end(), '.', '_');
std::replace(name.begin(), name.end(), '(', '_');
std::replace(name.begin(), name.end(), ')', '_');
return name;
}

std::vector<SbPlayerMultiplePlayerTestConfig> GetMultiplePlayerTestConfigs() {
const int kMaxPlayerInstancesPerConfig = 3;
const int kMaxTotalPlayerInstances = 5;

const std::vector<const char*>& audio_test_files = GetAudioTestFiles();
const std::vector<const char*>& video_test_files = GetVideoTestFiles();
const std::vector<SbPlayerOutputMode>& output_modes = GetPlayerOutputModes();
const std::vector<const char*>& key_systems = GetKeySystems();

FakeGraphicsContextProvider fake_graphics_context_provider;
std::vector<SbPlayerMultiplePlayerTestConfig> configs_to_return;

for (auto key_system : key_systems) {
std::vector<SbPlayerTestConfig> supported_configs;
for (auto video_filename : video_test_files) {
VideoDmpReader dmp_reader(video_filename,
VideoDmpReader::kEnableReadOnDemand);
SB_DCHECK(dmp_reader.number_of_video_buffers() > 0);
if (SbMediaCanPlayMimeAndKeySystem(dmp_reader.video_mime_type().c_str(),
key_system)) {
supported_configs.push_back(
{nullptr, video_filename, kSbPlayerOutputModeInvalid, key_system});
}
}

if (supported_configs.empty()) {
continue;
}

std::vector<const char*> supported_audio_files;
for (auto audio_filename : audio_test_files) {
VideoDmpReader dmp_reader(audio_filename,
VideoDmpReader::kEnableReadOnDemand);
SB_DCHECK(dmp_reader.number_of_audio_buffers() > 0);
if (SbMediaCanPlayMimeAndKeySystem(dmp_reader.audio_mime_type().c_str(),
key_system)) {
supported_audio_files.push_back(audio_filename);
}
}

// TODO: use SbPlayerGetPreferredOutputMode() to choose output mode.
for (auto output_mode : output_modes) {
for (auto& config : supported_configs) {
config.output_mode = output_mode;
}

MaximumPlayerConfigurationExplorer explorer(
supported_configs, kMaxPlayerInstancesPerConfig,
kMaxTotalPlayerInstances, &fake_graphics_context_provider);
std::vector<SbPlayerMultiplePlayerTestConfig> explorer_output =
explorer.CalculateMaxTestConfigs();

// Add audio codec to configs using round robin algorithm.
for (auto& multi_player_test_config : explorer_output) {
int audio_file_index = 0;
for (auto& config : multi_player_test_config) {
config.audio_filename = supported_audio_files[audio_file_index];
audio_file_index =
(audio_file_index + 1) % supported_audio_files.size();
}
}

configs_to_return.insert(configs_to_return.end(), explorer_output.begin(),
explorer_output.end());
}
TEST_F(MultiplePlayerTest, SunnyDay) {
for (auto multiplayer_test_config : multiplayer_test_configs_) {
SB_LOG(INFO) << "Start testing: "
<< GetMultipleSbPlayerTestConfigDescription(
multiplayer_test_config);
RunTest(WriteSamples, multiplayer_test_config);
}
return configs_to_return;
}

INSTANTIATE_TEST_CASE_P(MultiplePlayerTests,
MultiplePlayerTest,
ValuesIn(GetMultiplePlayerTestConfigs()),
GetMultipleSbPlayerTestConfigName);

} // namespace
} // namespace nplb
} // namespace starboard
6 changes: 4 additions & 2 deletions starboard/nplb/player_get_audio_configuration_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@
#include <vector>

#include "starboard/nplb/player_test_fixture.h"
#include "starboard/nplb/testcase_helpers.h"
#include "starboard/string.h"
#include "starboard/testing/fake_graphics_context_provider.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "starboard/nplb/testcase_helpers.h"

#if SB_API_VERSION >= 15

Expand All @@ -39,6 +39,8 @@ typedef SbPlayerTestFixture::GroupedSamples GroupedSamples;
class SbPlayerGetAudioConfigurationTest
: public ::testing::TestWithParam<SbPlayerTestConfig> {
public:
void SetUp() override { SkipTestIfUnsupported(GetParam()); }

void ReadAudioConfigurations(
const SbPlayerTestFixture& player_fixture,
std::vector<SbMediaAudioConfiguration>* configurations) const {
Expand Down Expand Up @@ -275,7 +277,7 @@ TEST_P(SbPlayerGetAudioConfigurationTest, MultipleSeeks) {

INSTANTIATE_TEST_CASE_P(SbPlayerGetAudioConfigurationTests,
SbPlayerGetAudioConfigurationTest,
ValuesIn(GetSupportedSbPlayerTestConfigs()),
ValuesIn(GetAllPlayerTestConfigs()),
GetSbPlayerTestConfigName);

} // namespace
Expand Down
Loading

0 comments on commit 27b6950

Please sign in to comment.