blob: 775d76c0a545a410818a0e338cf05031eba06dc8 [file] [log] [blame]
// Copyright 2023 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <string>
#include "starboard/drm.h"
#include "starboard/media.h"
#include "starboard/player.h"
#include "starboard/shared/starboard/drm/drm_test_helpers.h"
#include "testing/gtest/include/gtest/gtest.h"
// The Android TV `SbPlayerGetPreferredOutputMode()` implementation has special
// constraints that requires it own tests.
namespace starboard {
namespace android {
namespace shared {
namespace {
using ::starboard::shared::starboard::drm::CreateDummyDrmSystem;
SbPlayerCreationParam GetDefaultPlaybackParam() {
SbPlayerCreationParam creation_param = {
kSbDrmSystemInvalid,
{
kSbMediaAudioCodecAac,
},
{
kSbMediaVideoCodecVp9,
},
};
creation_param.audio_stream_info.mime = "";
creation_param.audio_stream_info.number_of_channels = 2;
creation_param.audio_stream_info.samples_per_second = 48000;
creation_param.audio_stream_info.bits_per_sample = 16;
auto& video_stream_info = creation_param.video_stream_info;
video_stream_info.mime = "";
video_stream_info.max_video_capabilities = "";
video_stream_info.frame_width = 640;
video_stream_info.frame_height = 480;
video_stream_info.color_metadata.bits_per_channel = 8;
video_stream_info.color_metadata.primaries = kSbMediaPrimaryIdBt709;
video_stream_info.color_metadata.transfer = kSbMediaTransferIdBt709;
video_stream_info.color_metadata.matrix = kSbMediaMatrixIdBt709;
return creation_param;
}
SbPlayerCreationParam GetSdrPlaybackParam() {
return GetDefaultPlaybackParam();
}
SbPlayerCreationParam GetHdrPlaybackParam() {
SbPlayerCreationParam creation_param = GetDefaultPlaybackParam();
auto& video_stream_info = creation_param.video_stream_info;
video_stream_info.color_metadata.bits_per_channel = 10;
video_stream_info.color_metadata.primaries = kSbMediaPrimaryIdBt2020;
video_stream_info.color_metadata.transfer = kSbMediaTransferId10BitBt2020;
video_stream_info.color_metadata.matrix =
kSbMediaMatrixIdBt2020ConstantLuminance;
return creation_param;
}
TEST(SbPlayerGetPreferredOutputModeTest, HdrPlaybackRequiresPunchOut) {
SbPlayerCreationParam creation_param = GetHdrPlaybackParam();
creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModePunchOut);
}
TEST(SbPlayerGetPreferredOutputModeTest,
SecondaryPlayerRequiresDecodeToTexture) {
SbPlayerCreationParam creation_param = GetSdrPlaybackParam();
creation_param.video_stream_info.max_video_capabilities =
"width=640; height=480";
creation_param.output_mode = kSbPlayerOutputModePunchOut;
auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeDecodeToTexture);
}
TEST(SbPlayerGetPreferredOutputModeTest, SecondaryPlayerCannotBeHdr) {
SbPlayerCreationParam creation_param = GetHdrPlaybackParam();
creation_param.video_stream_info.max_video_capabilities =
"width=640; height=480";
creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeInvalid);
}
TEST(SbPlayerGetPreferredOutputModeTest, SecuredDrmRequiresPunchOut) {
SbPlayerCreationParam creation_param = GetSdrPlaybackParam();
SbDrmSystem drm_system = CreateDummyDrmSystem("com.widevine");
ASSERT_TRUE(SbDrmSystemIsValid(drm_system));
creation_param.drm_system = drm_system;
creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModePunchOut);
SbDrmDestroySystem(drm_system);
}
TEST(SbPlayerGetPreferredOutputModeTest,
SecuredDrmWithDecodeToTextureIsInvalid) {
SbPlayerCreationParam creation_param = GetSdrPlaybackParam();
SbDrmSystem drm_system = CreateDummyDrmSystem("com.widevine");
ASSERT_TRUE(SbDrmSystemIsValid(drm_system));
creation_param.drm_system = drm_system;
creation_param.video_stream_info.max_video_capabilities =
"width=640; height=480";
creation_param.output_mode = kSbPlayerOutputModePunchOut;
auto preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeInvalid);
creation_param.output_mode = kSbPlayerOutputModeDecodeToTexture;
preferred_output_mode = SbPlayerGetPreferredOutputMode(&creation_param);
EXPECT_EQ(preferred_output_mode, kSbPlayerOutputModeInvalid);
SbDrmDestroySystem(drm_system);
}
} // namespace
} // namespace shared
} // namespace android
} // namespace starboard